184
Schleifen, die zählen
Kapitel
7
dann wird der
Anweisungsblock
ausgeführt. Dann wird
ding
das
zweite Element des
Wertevorrat
s zugewiesen und der
Anweisungs-
block
neuerlich ausgeführt. Und so weiter, mit allen Elementen von
Wertevorrat
.
Unabhängig davon, ob
ding
bei der Ausführung des Schleifenkörpers
eine Rolle spielt oder nicht, wird die Schleife so oft ausgeführt, wie Ele-
mente in
Wertevorrat
vorhanden sind.
Im Weiteren werden
for
-Schleifen in vielen Beispielen auftreten. Auch
wenn dir diese Erklärungen ein bisschen abstrakt vorgekommen sind, wirst
du mit ihnen bald recht vertraut sein.
Wir haben jetzt noch ein Problem: Was ist, wenn wir eine Schleife mit 20
oder 100 oder noch mehr Wiederholungen brauchen? Sollen wir ein Tupel
mit 100 Elementen direkt anschreiben? Oft weißt du ja beim Schreiben
eines Programms noch gar nicht, wie oft eine Schleife ausgeführt werden
soll.
Bei einer Funktion, die eine gestrichelte Linie zeichnen soll, werden wir die
Anzahl der Wiederholungen – das ist die Anzahl der Striche – je nach Län-
ge der Linie wählen.
Python hat eine Funktion eingebaut, die einen Wertevorrat vorgegebener
Länge erzeugt, die Funktion
range()
. Das englische Wort »range« bedeutet
so viel wie Bereich. Diese Funktion ist für unsere Zwecke gut zu gebrau-
chen.
Faule Typen
Python hat einige spezielle Typen von Objekten eingebaut, die die Elemente
eines Wertevorrats erzeugen. Aber nicht statisch alle auf einmal, sondern
dynamisch eines nach dem anderen immer erst dann, wenn es gebraucht
wird. Im Englischen wird diese Form der Erzeugung von Werten als »lazy
evaluation« bezeichnet. Solche Objekte sind also gewissermaßen »faule
Typen«, die die Arbeit so lange aufschieben, bis es nicht mehr anders geht.
Weil das aber nicht so super sympathisch klingt, will ich diese Typen lieber
als »dynamischen Wertevorrat« bezeichnen.
Ich will dir kurz erklären, wozu das gut ist: Stelle dir vor, eine
for
-Schleife
soll im Bereich der natürlichen Zahlen von 0 bis 999999 die erste finden,
die eine bestimmte Eigenschaft hat. (Zum Beispiel, dass sie auf zwei ver-
schiedene Arten als Summe von zwei dritten Potenzen darstellbar ist.) Nun
könnte Python eine Liste dieser Zahlen erzeugen – immerhin eine Million
185
Faule Typen
Zahlen – und diese dann auf die genannte Eigenschaft prüfen. Da die erste
Zahl dieser Art aber 1729 ist, wären alle Zahlen ab 1730 – und das sind
immerhin 988270 Zahlen – für nichts und wieder nichts erzeugt worden.
Dafür wäre eine Menge Speicherplatz und auch Rechenzeit vergeudet wor-
den. Daher ist es viel günstiger, einen dynamischen Wertevorrat zu verwen-
den.
Python stellt dafür den
range()
-Typ zur Verfügung. Er arbeitet viel öko-
nomischer, denn selbst wenn alle Werte gebraucht werden, müssen sie
nicht alle auf einmal erzeugt werden und brauchen somit viel weniger
Speicher.
Wir wollen diesen dynamischen
range()
-Typ nun ein bisschen untersu-
chen. In den folgenden Beispielen verwenden wir natürlich nur kleine Wer-
tebereiche.
>
Mach mit:
Wir sehen uns das mit dem IPI an:
>
Mach mit!
>>> range(3)
range(0, 3)
>>> range(10)
range(0, 10)
Das ist nicht besonders erhellend. Aber was will man von einem dynami-
schen Wertevorrat? Die Werte sind eben noch nicht da! Erst wenn man sie
braucht! Zum Beispiel in einer
for
-Schleife:
>>> for i in range(3):
print(i)
0
1
2
Da haben wir’s!
Wenn diese Bereiche nicht zu groß sind, können wir Python dazu bringen,
aus dem dynamischen einen statischen Wertevorrat zu machen, sprich zum
Beispiel ein Tupel. Dafür gibt es die eingebaute Funktion
tuple()
. Sie er-
zeugt aus einem
range()
-Objekt ein Tupel, also ein fixes »statisches« Ob-
jekt:
>>> tuple(range(3))
(0, 1, 2)
>>> tuple(range(7))

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.