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.