12. Sequenzen und Iteration

Eine Sequenz ist eine Datenstruktur, in der mehrere Dinge stehen, wobei jede einen Index hat, der von 0 bis zur (Länge der Sequenz)-1 geht. Strings sind Sequenzen.

Über eine Sequenz kann man iterieren, d.h. für jedes Ding in der Sequenz eine Aktion machen:

>>> count = 0                    0       M
>>> for ch in "Markus":          1       a
...     print count, "\t", ch    2       r
...     count = count+1          3       k
...                              4       u
                                 5       s

Python hat von C geerbt, dass die Indizes mit 0 anfangen. Falle: Markus hat sechs Buchstaben, der letzte Index ist aber 5.

Man kann auch direkt auf Teile einer Sequenz zugreifen:

>>> "Markus"[2]    >>> "Markus"[-1]
'r'                's'

Negative Indizes werden von Python als “von hinten gezählt” interpretiert.

Ein zweiter wichtiger Sequenztyp in Python ist die Liste. In Strings stehen nur Zeichen, in Listen können beliebige Daten stehen. Außerdem können in Listen die einzelnen Elemente geändert werden, in Strings nicht. Im Jargon: Listen sind mutable, Strings sind immutable.

Diese Unterscheidung ist recht fundamental. Dass sie gemacht wird, hat vor allem Gründe in der Implementation – es ist für die AutorInnen des Python-Laufzeitsystems viel einfacher, mit Daten umzugehen, die sich nicht ändern können. Auch aus Sicht eines/r Python-ProgrammiererIn sind unveränderbare Werte unkritischer, wie ihr spätestens sehen werdet, wenn wir das Aliasing diskutieren werden.

Listen werden in eckigen Klammern notiert:

>>> eineListe = ["eins", "zwei", 3]
>>> eineListe[1]
'zwei'
>>> eineListe[1] = 2
>>> eineListe[1]
2

Listen mit Zahlen von 0 bis zu einer Grenze-1 kann man mit der eingebauten Funktion range erzeugen:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   #
>>> for i in range(10):          ##
...     print "#"*i              ###
...                              ####
                                 #####
                                 ######
                                 #######
                                 ########
                                 #########

Mit for ... in range ... kann man die Standardanwendungen des for-Statements in Sprachen wie C, Pascal oder Basic nachbilden. Meistens kommen dabei aber “falsche Freunde” raus, Programme, die unpythonesk, unübersichtlich und ungeschickt sind. Wenn ihr meint, sowas zu brauchen, denkt nochmal nach.

Der dritte eingebaute Sequenztyp von Python sind Tupel. Sie verhalten sich wie Listen, indem sie alle möglichen Daten enthalten können (und nicht nur Zeichen), aber wie Strings, indem sie nicht veränderbar sind. Sie werden in runden Klammern notiert:

>>> a = (5, "haha")
>>> a[1]
'haha'
>>> for x in a:
...     print x
...
5
haha

Ihre genauere Untersuchung verschieben wir auf später.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Warum gibt der folgende Code einen IndexError?

toy = "Teddy"
length = len(toy)
number = toy[length]

(2)

Löst die Wahrheitstafelaufgabe von der letzten Folie noch einmal mit Schleifen.

(3)

Wandelt das Beispielprogramm mit for ch in "Markus" so um, dass es eine Funktion wird, die einen String nimmt. Zusätzlich soll jetzt nicht über den String iteriert werden, sondern über die Indizes im String. Alle Indizes in einem String s liefert z.B. range(len(s)) (Warum?). Vergleicht die Programme. Könnt ihr euch schon denken, warum ich von Schleifen über range abrate?

(4)

Warum hat Python keine Probleme mit

>>> l = ["eins", 2, 3, "leipzig"]
>>> l[2] = "gobbel"

wirft aber bei

>>> s = "eins, 2, 3, leipzig"
>>> s[2] = "g"

einen Fehler?


Markus Demleitner

Copyright Notice