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.

black box

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.

black box

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.

X

Fehler melden

X

Suche