Routineaufgaben mit Python automatisieren. Al Sweigart

Читать онлайн книгу.

Routineaufgaben mit Python automatisieren - Al Sweigart


Скачать книгу
5, 6]

      Abb. 4–2Wenn eggs = [4, 5, 6] ausgeführt wird, dann wird der Inhalt von eggs durch eine neue Liste ersetzt.

      In diesem Beispiel steht in eggs am Ende noch die gleiche Liste wie zu Anfang; sie wurde lediglich geändert, aber nicht überschrieben. In Abb. 4–3 können Sie die sieben Schritte sehen, die in den ersten sieben Zeilen dieses Beispiels ablaufen.

      Abb. 4–3Die Anweisung del und die Methode append() ändern den Listenwert unmittelbar.

      Wenn Sie den Wert eines veränderbaren Datentyps ändern (z. B. wie in dem vorstehenden Beispiel mit der Anweisung del und der Methode append()), werden die Werte unmittelbar ausgetauscht. Der Wert der Variablen wird aber nicht durch einen neuen Listenwert ersetzt.

      Die Unterscheidung zwischen veränderbaren und unveränderbaren Typen mag wie sinnlose Haarspalterei wirken, aber im Abschnitt »Verweise übergeben« weiter hinten in diesem Kapitel lernen Sie die unterschiedlichen Verhaltensweisen kennen, die sich je nachdem ergeben, ob Sie eine Funktion mit veränderbaren oder unveränderbaren Argumenten aufrufen. Bevor wir dorthin kommen, sehen wir uns jedoch noch den Datentyp für Tupel an, der eine unveränderbare Form des Listendatentyps darstellt.

       Der Datentyp für Tupel

      Der Datentyp für Tupel ist fast identisch mit dem für Listen, wobei jedoch zwei wichtige Unterschiede bestehen. Erstens werden Tupel in runden statt in eckigen Klammern angegeben, wie das folgende Beispiel zeigt:

      >>> eggs = ('hello', 42, 0.5)

      >>> eggs[0]

      'hello'

      >>> eggs[1:3]

      (42, 0.5)

      >>> len(eggs)

      3

      Der Hauptunterschied zwischen Listen und Tupeln besteht jedoch darin, dass Tupel ebenso wie Strings unveränderbar sind. Es ist nicht möglich, ihre Werte zu bearbeiten, zu entfernen oder neue Werte anzuhängen. Der folgende Code führt daher zu der Fehlermeldung TypeError:

      >>> eggs = ('hello', 42, 0.5)

      >>> eggs[1] = 99

      Traceback (most recent call last):

      File "<pyshell#5>", line 1, in <module>

      eggs[1] = 99

      TypeError: 'tuple' object does not support item assignment

      Wenn sich in dem Tupel nur ein einziger Wert befindet, können Sie das dadurch kennzeichnen, dass Sie in den Klammern ein Komma hinter diesem Wert angeben. Anderenfalls würde Python davon ausgehen, dass Sie einfach nur einen Wert in Klammern geschrieben haben. Anhand des Kommas kann Python erkennen, dass es sich um einen Tupelwert handelt. (Im Gegensatz zu anderen Programmiersprachen ist es in Python zulässig, ein Komma hinter das letzte Element in einer Liste oder einem Tupel zu setzen.) Um den Unterschied zu erkennen, geben Sie in der interaktiven Shell folgende type()-Funktionen ein:

      >>> type(('hello',))

      <class 'tuple'>

      >>> type(('hello'))

      <class 'str'>

      Mithilfe von Tupeln machen Sie für die Leser des Codes deutlich, dass diese Folge von Werten nicht geändert werden soll. Wenn Sie also eine geordnete Folge von Werten brauchen, die sich nie ändern, dann verwenden Sie dafür ein Tupel. Der zweite Vorteil von Tupeln gegenüber Listen besteht darin, dass Python aufgrund ihrer Unveränderbarkeit einige Optimierungen vornehmen kann, sodass der Code ein wenig schneller ausgeführt wird als bei der Verwendung von Listen.

       Typen mit den Funktionen list() und tuple() umwandeln

      So wie str(42) die Stringdarstellung '42' des Integerwertes 42 zurückgibt, so geben die Funktionen list() und tuple() die Listen- bzw. Tupelversionen der übergebenen Werte zurück. In den folgenden Beispielen weisen die Rückgabewerte einen anderen Datentyp auf als die übergebenen Werte:

      >>> tuple(['cat', 'dog', 5])

      ('cat', 'dog', 5)

      >>> list(('cat', 'dog', 5))

      ['cat', 'dog', 5]

      >>> list('hello')

      ['h', 'e', 'l', 'l', 'o']

      Die Umwandlung eines Tupels in eine Liste ist praktisch, wenn Sie eine veränderbare Version eines Tupelwertes benötigen.

       Verweise

      Wie Sie bereits wissen, lassen sich Strings und Integerwerte in Variablen »speichern«. Diese Beschreibung stellt jedoch eine Vereinfachung der wahren Vorgänge dar. In Wirklichkeit werden in den Variablen Verweise auf die Speicherorte festgehalten, an denen sich die Werte befinden. Geben Sie Folgendes in die interaktive Shell ein:

      >>> spam = 42

      >>> cheese = spam

      >>> spam = 100

      >>> spam

      100

      >>> cheese

      42

      Wenn Sie der Variablen spam den Wert 42 zuweisen, erstellen Sie in Wirklichkeit den Wert 42 im Arbeitsspeicher des Computers und speichern lediglich einen Verweis (oder eine Referenz) auf diesen Speicherort in der Variablen. Beim Zuweisen des Wertes in spam zu der Variablen cheese kopieren Sie diesen Verweis. Die Variablen spam und cheese verweisen jetzt beide auf den Wert 42 im Arbeitsspeicher. Wenn Sie den Wert in spam später auf 100 ändern, legen Sie einen neuen Wert 100 an und speichern einen Verweis darauf in spam. Das hat aber keinen Einfluss auf den Wert in cheese. Integer sind unveränderbare Werte. Wenn Sie die Variable spam ändern, lassen Sie sie in Wirklichkeit auf einen ganz anderen Wert im Arbeitsspeicher verweisen.

      Listen funktionieren nicht auf diese Weise, da sie veränderbar sind. Der folgende Code macht diesen Unterschied deutlich:

      >>> spam = [0, 1, 2, 3, 4, 5] image

      >>> cheese = spam # Kopiert den Verweis, nicht die Liste image

      >>> cheese[1] = 'Hello!' # Ändert den Listenwert image

      >>> spam

      [0, 'Hello!', 2, 3, 4, 5]

      >>> cheese # Die Variable cheese verweist auf dieselbe Liste

      [0, 'Hello!',


Скачать книгу