Exkurs - Listen als Objekte
Objekte mit vordefinierten Operationen
Listen sind - in Python - Objekte der Klasse list
.
Listen bringen daher eine Reihe vordefinierter Operationen (man sagt auch Methoden)
zur Verarbeitung mit.
Das folgende Klassendiagramm zeigt einiger dieser Operationen.
Im folgenden Python-Dialog werden diese Operationen benutzt.
>>> listeAdressen = [ 'amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de', 'ewen@t-online.de', 't_schmidt@web.de', 'nicole.weber@gmx.de' ] >>> listeAdressen.append('tom.brand@schule.de') >>> listeAdressen ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de', 'ewen@t-online.de', 't_schmidt@web.de', 'nicole.weber@gmx.de', 'tom.brand@schule.de'] >>> listeAdressen.insert(3, 'katrin12@yahoo.com') >>> listeAdressen ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'katrin12@yahoo.com', 'petra@dahm.de', 'ewen@t-online.de', 't_schmidt@web.de', 'nicole.weber@gmx.de', 'tom.brand@schule.de'] >>> listeAdressen.remove('carla2@hotmail.org') >>> listeAdressen ['amueller@gmx.de', 'herbert.fluhr@web.de', 'katrin12@yahoo.com', 'petra@dahm.de', 'ewen@t-online.de', 't_schmidt@web.de', 'nicole.weber@gmx.de', 'tom.brand@schule.de'] >>> listeAdressen.extend(['carla2@hotmail.org', 'carl3@hotmail.org']) >>> listeAdressen ['amueller@gmx.de', 'herbert.fluhr@web.de', 'katrin12@yahoo.com', 'petra@dahm.de', 'ewen@t-online.de', 't_schmidt@web.de', 'nicole.weber@gmx.de', 'tom.brand@schule.de', 'carla2@hotmail.org', 'carl3@hotmail.org']
Beachte die Schreibweise liste.operation
, die typisch für die Aktivierung
einer Operation bei einem Objekt ist.
Aufgabe 1
Teste die gezeigten Listenoperationen mit selbst gewählten Daten.
Veränderung bestehender Listenobjekte / Erzeugung neuer Listenobjekte
Beim Aufruf einer vordefinierten Listenoperation wird der Wert eines Listenobjekts evtl. verändert, das Objekt selbst behält aber seine Identität (bzw. seine Adresse im Speicher).
>>> liste = ['a', 'b'] >>> liste ['a', 'b'] >>> id(liste) 20306640 >>> liste.append('c') >>> liste ['a', 'b', 'c'] >>> id(liste) 20306640
Entsprechendes gilt für Zuweisungen der Gestalt liste[i] = ...
.
Solche Zuweisungen verändern den Wert des von liste
verwalteten Listenobjekts. Das Listenobjekt selbst bewahrt aber seine Identität, wie der
folgende Python-Dialog zeigt.
>>> liste = ['a', 'b'] >>> liste ['a', 'b'] >>> id(liste) 20306120 >>> liste[0] = 'c' >>> liste ['c', 'b'] >>> id(liste) 20306120
Anders verhält es sich, wenn man Listen mit dem Konkatenationsoperator oder mit dem Teillistenoperator bildet. Hier werden jeweils neue Listenobjekte erzeugt.
>>> liste = ['a', 'b'] >>> liste ['a', 'b'] >>> id(liste) 10126560 >>> liste + ['c'] ['a', 'b', 'c'] >>> id(liste + ['c']) 20307000 >>> liste ['a', 'b'] >>> id(liste) 10126560 >>> liste[0:2] ['a', 'b'] >>> id(liste[0:2]) 19981656 >>> liste ['a', 'b'] >>> id(liste) 10126560
Aufgabe 2
Führe selbst entsprechende Experimente durch.
Listenoperationen - funktional oder objektorientiert
Wir betrachten noch einmal die selbst definierte Funktion mitElementMitIndex
,
die im Wesentlichen dasselbe leistet wie die vordefinierte Listenoperation insert
.
Diese Funktion mitElementMitIndex
lässt sich z.B. so definieren:
def mitElementMitIndex(element, index, liste):
"""
>>> mitElementMitIndex(3, 2, [25, 40, 44, 1, 45, 21])
[25, 40, 3, 44, 1, 45, 21]
>>> mitElementMitIndex(3, 6, [25, 40, 44, 1, 45, 21])
[25, 40, 44, 1, 45, 21, 3]
>>> mitElementMitIndex(3, 10, [25, 40, 44, 1, 45, 21])
[25, 40, 44, 1, 45, 21]
"""
listeBisIndex = liste[:index]
listeAbIndex = liste[index:]
if index <= len(liste):
neueListe = listeBisIndex + [element] + listeAbIndex
else:
neueListe = liste
return neueListe
Unterschiede zwischen der selbstdefinierten Funktion mitElementMitIndex
und
der vordefinierten Listenoperation insert
zeigen sich bei ihrer Verwendung.
Funktionale Listenverarbeitung mit der Funktion mitElementMitIndex
:
>>> liste = [25, 40, 44, 1, 45, 21] >>> id(liste) 20819000 >>> liste = mitElementMitIndex(3, 2, [25, 40, 44, 1, 45, 21]) >>> liste [25, 40, 3, 44, 1, 45, 21] >>> id(liste) 20306360
Objektorientierte Listenverarbeitung mit der Listenoperation insert
:
>>> liste = [25, 40, 44, 1, 45, 21] >>> id(liste) 20818760 >>> liste.insert(2, 3) >>> liste [25, 40, 3, 44, 1, 45, 21] >>> id(liste) 20818760
Aufgabe 3
Beschreibe und erläutere sämtliche Unterschiede zwischen den beiden Listenverarbeitungsoperationen.