42
Kapitel 6: Anweisungen Grundlagen der Programmierung 1 Holger Karl Wintersemester 2016/2017 Inhaltsverzeichnis Inhaltsverzeichnis 1 Abbildungsverzeichnis 2 Liste von Definitionen u.ä. 2 6.1 Überblick ............................... 3 6.2 Programm .............................. 3 6.3 Bedingte Ausführung: if ...................... 4 6.4 Schleifen: while ........................... 12 6.5 Schleifen: for ............................ 22 6.6 List comprehensions ........................ 32 6.7 Geschachtelte Schleifen ...................... 34 1

Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1617/gp1/vorlesung/ch6-statements/ch6... · 6.1. Überblick 3 6.1 Überblick 6.1.1 Was bisher

  • Upload
    hakiet

  • View
    227

  • Download
    0

Embed Size (px)

Citation preview

Kapitel 6: AnweisungenGrundlagen der Programmierung 1

Holger Karl

Wintersemester 2016/2017

Inhaltsverzeichnis

Inhaltsverzeichnis 1

Abbildungsverzeichnis 2

Liste von Definitionen u.ä. 26.1 Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36.2 Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36.3 Bedingte Ausführung: if . . . . . . . . . . . . . . . . . . . . . . 46.4 Schleifen: while . . . . . . . . . . . . . . . . . . . . . . . . . . . 126.5 Schleifen: for . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226.6 List comprehensions . . . . . . . . . . . . . . . . . . . . . . . . 326.7 Geschachtelte Schleifen . . . . . . . . . . . . . . . . . . . . . . 34

1

6.8 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . 41

Abbildungsverzeichnis

6.1 Flussdiagramm einer einfachen While-Schleife . . . . . . . . . 136.2 goto considered harmful . . . . . . . . . . . . . . . . . . . . . . 216.3 Flussdiagramm einer While-Schleife mit continue , break und

else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.4 Zuweisung an Aufzählung während while-Schleife . . . . . . . 256.5 Zwischenstand bei einer Iteration über ein Dict D.items() . . 296.6 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Liste von Definitionen u.ä.

6.1 Definition (pass) . . . . . . . . . . . . . . . . . . . . . . . . . . 96.2 Definition (Anweisung: if/elif/else) . . . . . . . . . . . . 126.3 Definition (Block) . . . . . . . . . . . . . . . . . . . . . . . . . 126.1 Achtung (Nicht pythonisch) . . . . . . . . . . . . . . . . . . . . 156.2 Achtung (Bedingung genau beachten) . . . . . . . . . . . . . . 196.4 Definition (while) . . . . . . . . . . . . . . . . . . . . . . . . . 226.3 Achtung (Keine korrekte Schleife!) . . . . . . . . . . . . . . . . 236.5 Definition (for-Schleife) . . . . . . . . . . . . . . . . . . . . . 246.6 Definition (Hilfsfunktion: range) . . . . . . . . . . . . . . . . 29

2

6.1. Überblick 3

6.1 Überblick

6.1.1 Was bisher geschah

• Wir können bis jetzt– Werte aufschreiben, was Objekte erzeugt– aus Objekten Ausdrücke für neue Objekte bilden

* mit Aufruf von Funktionen als Beispiel– mit Namen auf Objekte referenzieren (zuweisen)

* mit der Definition einer Funktion als Sonderfall• Also: Folgen von Zuweisungen

– Die eine nach der anderen ausgeführt werden

Aber: Kein Einfluss auf Reihenfolge der Ausführung!

6.1.2 Dieses Kapitel

• Wir nehmen Einfluss auf die Reihenfolge der Ausführung von Anwei-sungen

• Dazu brauchen wir weitere Anweisungen– Bedingungen, Schleifen

• Wir verallgemeinern die Vorstellung, was eine Anweisung ist

6.2 Programm

6.2.1 Ein Programm

• Ein Programm ist eine Folge von Anweisungen– Ausgeführt entsprechend des Ausführungsmodells– Bis jetzt: Sequentiell, Funktionsaufruf

• Um die Reihenfolge der Anweisungen zu beeinflussen, müssen wir dasAusführungsmodell erweitern

6.2.2 Anweisungen – bis jetzt

• Die Zuweisung =• Die Funktionsdefinition def• Die Rückkehr aus einer Funktion return

Und die Folge von Anweisungen

4 Liste von Definitionen u.ä.

• Erinnerung: Eine Zeile, eine Anweisung!

6.2.3 Bedingte Folge von Anweisungen

Idee:

• Programms nicht immer bei der nächsten Anweisung fortsetzen• Sondern die Wahl der nächsten auszuführenden Anweisung von demWert eines Ausdrucks abhängig machen

• Alternativen im Programm vorsehen

6.2.4 Schleifen von Anweisungen

Idee:

• In der Fortsetzung des Programms erlauben, zu vorherigenAnweisungenzurückzukehren

• Meist (nicht unbedingt) abhängig vomWert eines Ausdrucks• Wiederholungen oder Schleifen erlauben

6.3 Bedingte Ausführung: if

6.3.1 Neue Anweisung: if

• Die Anweisung if besteht aus zwei Teilen:– Einem Ausdruck, der auf wahr oder falsch ausgewertet wird– Eine Folge von Anweisungen – der so genannte block

• Semantik: die angegebene Folge von Anweisungen nur ausführen, wennder Ausdruck zum Zeitpunkt der Ausführung den Wert wahr hat– Auswertung des Ausdrucks einmal vor Ausführung des Blocks

6.3.2 if: Syntax

1 if Ausdruck:2 Anweisung13 Anweisung24 usw.5

6 # if hier zu Ende7 Anweisung nach if

6.3. Bedingte Ausführung: if 5

Beobachtung

• Das Ende des Ausdrucks wird durch Doppelpunkt :markiert• Die durch if kontrollierten Anweisungen werden unterhalb von if ein-gerückt aufgeschrieben

• Der Block endet dort, wo die Einrückung endet

6.3.3 if: Syntax im Vergleich mit def

• Syntax ist der von def sehr ähnlich– Schlüsselwort, dann ein Ausdruck, dann ein Doppelpunkt– Dann eingerückt die kontrollierten Anweisungen– Ende der Einrückung = Ende des Blocks (if, def, etc.)

• Typisches Muster der Syntax von Python!

6.3.4 Warum Einrückung?

• Einrückung ist kompakt, leicht lesbar• Erzwingt ordentliche Struktur des Codes

– Keine Variationsmöglichkeiten wie in anderen Sprachen• Readability counts (PEP 20)

Vergleich mit anderen Sprachen

WennSie andere Sprachenwie C oder Java kennen,wird Ihnen die Kompaktheitdieser Formulierung auffallen. Keine runden Klammern um den Ausdruckerforderlich, keine geschweiften Klammen, um den Beginn und das Ende derkontrollierten Anweisungen zu kontrollieren. Kein überflüssiges Wort then,was in manchen Sprachen vorkommt. Insgesamt ist die Syntax von Pythonsehr knapp und frugal.

6.3.5 Alternative: Wahr oder falsch?

• Erweiterung: Zwei Code-Blöcke, für den Wahr- und den Falsch-Fall

1 if Ausdruck:2 # Block für wahr:3 Anweisung14 Anweisung25 ...6 else:7 # Block für falsch:8 Anweisung19 Anweisung2

6 Liste von Definitionen u.ä.

10 ...11

12 # Anweisungen nach if/else13 Anweisung114 ...

Achtung

Doppelpunkt nach else!

6.3.6 Alternative: Semantik

• Der Ausdruck wird einmal ausgewertet und auf wahr oder falsch über-prüft

• Danach wird entweder der Wahr-Block oder der Falsch-Block ausgeführt

6.3.7 if: Beispiele

1 if True:2 print("Ja!")

Ja!

1 if not True:2 print("Ja!")3 else:4 print("Nein!")

Nein!

6.3.8 if: Beispiel Betrag

Wie Code ergänzen, um den Betrag einer Zahl zu bestimmen?

1 def betrag(x):2 """Liefere Absolutbetrag von x"""3 if (???):4 return ???5 else:6 return ???

6.3. Bedingte Ausführung: if 7

7

8 print("Betrag von 5: ", betrag(5))9 print("Betrag von -3: ", betrag(-3))

6.3.9 Ausflug: Code testen

Wie sind Sie sicher, dass Ihre Lösung stimmt?

• Erste Idee: Testfälle ausprobieren• Von Hand? Automatisch!• Insbesondere: Randfälle

Aber: sicher? Nein. . .

6.3.10 Test-Anweisung: assert

assert: Anweisung, der ein Ausdruck folgt

• Wenn Ausdruck wahr, weitermachen• Wenn Ausdruck falsch, mit Fehler abbrechen

1 def betrag(x):2 if (x>0):3 return x4 else:5 return -1 * x6

7 assert 5 == betrag(5)8 assert 7 == betrag(-7)9 assert 0 == betrag(0)10 assert "abc" == betrag("abc")

6.3.11 Tests für quersumme3

Was wären gute assert-Anweisungen für die Funktion quersumme3 ausvorherigem Kapitel?

1 def quersumme3(t):2 return t[0] + t[1] + t[2]3

4 # Nuetzliche asserts?5 assert True

8 Liste von Definitionen u.ä.

6.3.12 Geschachtelte if/else

Beobachtung:

• if/else ist eine Anweisung• Im Block von if bzw. else dürfen Anweisungen stehen

Darf dann da auch ein if/else stehen ?

• Die Logik der Syntax gibt das her• Also: JA!

6.3.13 Geschachtelte if/else: Allgemeiner Fall

1 if Bedingung1:2 Teilblock13 if Bedingung2:4 Teilblock25 else:6 Teilblock37 # Ende des inneren if8 Teilblock49 else:10 Teilblock511 if Bedingung3:12 Teilblock613 else:14 Teilblock715 # Ende des zweiten inneren if16 Teilblock817 # Ende von if

6.3.14 Geschachtelte if/else: Einfachere Fälle

• Die ganzen Teilblöcke dürfen auch leer sein• Leerer Teilblock nach else?

– Dann kannman das else auch weglassen und nur das if schreiben

6.3.15 Leerer Teilblock nach if?

Würde das gehen?

6.3. Bedingte Ausführung: if 9

1 if Bedingung:2 else:3 Anweisung

Kein leerer Block nach if!

Nein, nach ifmuss Anweisung folgen!

• Aber wenn da nichts zu tun ist?– Weil Code noch kommt, . . . ?

• Sonderanweisung: pass

6.3.16 pass: Beispiel

Angenommen, Sie wollen Wert der Variable laenge auf mindestens 100 aberhöchstens 200 eingrenzen:

1 laenge = 2522 if laenge >= 100:3 if laenge <= 200:4 pass5 else:6 laenge = 2007 else:8 laenge = 1009 print(laenge)

200

6.3.17 Anweisung: pass

Definition 6.1 (pass). pass ist die leere Anweisung: Sie verändert denZustand des Programms nicht und geht zur folgenden Anweisung über.

pass wird typischerweise benutzt• wodie Syntax eineAnweisung vorschreibt aber keine sinnvolleHandlungmöglich ist oder

• als ein Platzhalter für noch zu ergänzenden Code.

6.3.18 Eindeutigkeit von else?

Ist immer eindeutig klar, zu welchem if ein else gehört?

10 Liste von Definitionen u.ä.

Beispiel 1

1 if Bedingung1:2 if Bedingung 2:3 Block14 else:5 Block2

Beispiel 2

1 if Bedingung1:2 if Bedingung 2:3 Block14 else:5 Block2

Unproblematisch

Dank Einrückung ist die Syntax eindeutig

Verschachtelte if/else in anderen Sprachen

Auch hier wieder: in anderen Sprachen werden die Blöcke häufig durch Kon-strukte wie geschweifte Klammernmarkiert. Das ist zwar semantisch ebenfallseindeutig, für einenMenschen aber ggf. viel schwerer zu lesen und verwirrend,wenn die optische Einrückung nicht mit der Klammerstruktur übereinstimmt.Wir werden uns im Java-Teil der Vorlesung hier noch einige unschöne Beispieleanschauen.

6.3.19 Häufiger Fall: Nach else wieder ein if

• Szenario:Wenn nicht das, ist dann das der Fall? Und wenn das nicht, danndas? . . . ?

• Mit if/else ausdrückbar, aber schrecklich lesbar

1 if Bedingung1:2 Anweisung13 else:4 if Bedingung2:5 Anweisung26 else:7 if Bedingung3:

6.3. Bedingte Ausführung: if 11

8 Anweisung39 else:10 Anweisung4

6.3.20 Allgemeine Form: if/elif/else

Gleicher Effekt, aber knapper: elif

1 if Bedingung1:2 Anweisung13 elif Bedingung2:4 Anweisung25 elif Bedingung3:6 Anweisung37 else:8 Anweisung4

Doppelpunkt

Auf Doppelpunkt nach elif-Bedingung achten!

6.3.21 if/elif/else: Beispiel

1 L = [1, 2, 17, 42]2 if len(L) < 3:3 print("zu kurz")4 elif len(L) > 5:5 print("zu lang")6 elif len(L) == 4:7 print("ausgereizt")8 else:9 print("knapp")

ausgereizt

12 Liste von Definitionen u.ä.

6.3.22 Definition: if/elif/else

Definition 6.2 (Anweisung: if/elif/else). Die Anweisungif/elif/else ermöglichen die alternative Ausführung einer Folgevon Anweisungen – eines Blocks – in Abhängigkeit desWahrheitswertes einesAusdrucks (if) bzw. mehrerer Ausrücke (if und folgende elif Ausdrücke).Dem if kann optional ein oder mehrere elif und optional höchstens einelse-Teil folgen.

Die Blöcke werden durch Einrückung den jeweiligen Bedingungen bzw.dem else zugeordnet.

Definition: Block

Definition 6.3 (Block). Ein Block ist eine Folge beliebiger Anweisungen(mindestens eine Anweisung). Die Zustandsänderung, die ein Block bewirkt,ist die Zustandsänderung, die sich durch die sequentielle Ausführung der An-weisungen des Blocks ergibt. Sequentiell bezieht sich hier auf die Reihenfolgeder Anweisung im Programmcode.

6.4 Schleifen: while

6.4.1 Allgemeine Schleifen

• Idee: Wiederhole einen Block solange, wie eine Bedingung wahr ist• Typisch: Anweisungen im Block werden Einfluss auf den Test haben• Grundform:

1 while Test2 Block

6.4.2 while: Flussdiagramm

Abbildung 6.1 zeigt eine erste Vorstellung einer while-Schleife in Python alsFlussdiagramm.

6.4.3 while: Beispiel Zählschleife

6.4. Schleifen: while 13

Abbildung 6.1: Flussdiagramm einer einfachen While-Schleife

1 a=02 b=53 while a < b:4 print(a, end=" ")5 a += 1

6.4.4 Beobachtung: Sichtbarkeit von Variablen

• Vorheriges Beispiel: Auf Variable a wurde innerhalb der Schleife zuge-griffen

• Offenbar unproblematisch• Regel: Schon vor der Schleife bekannte Variablen bleiben innerhalb desBlocks sichtbar– Sie sind im gleichen Scope (und auch im gleichen Namensraum)

6.4.5 Beobachtung: Sichtbarkeit von Variablen (2)

• Was ist umgekehrt? Variable wird erst in Schleife erzeugt?

1 i = 02 while i < 2:3 i += 1

14 Liste von Definitionen u.ä.

4 x = 2*i5 print(x)

4

Variable nach Schleife sichtbar

• Variable bleibt nach der Schleife erhalten und zeigt auf entsprechendenWert

6.4.6 Schleifen: Terminierung

Gefahr: Schleifenbedingung stets wahr

• Schleife wird nicht verlassen• Programm in Endlosschleife

6.4.7 Einfache Regeln für Terminierung

Schleife terminiert bestimmt, wenn es

• eineVariable gibt, die in jedemSchleifendurchlauf strengmonotonwächstund

• die Variable diskret wächst und• die Schleifenbedingung eine obere Schranke darstellt

Analog: Variable schrumpft, untere Schranke

6.4.8 Terminierung ist kritisch!

Q. How did the programmer die in the shower?

A. He read the shampoo bottle instructions: Lather. Rinse. Repeat.

6.4.9 Beispiel: GGT

Bestimme den größten gemeinsamen Teiler

1 a = 182 b = 123 while (a != b):4 if a>b:5 a = a-b6 else:7 b = b-a

6.4. Schleifen: while 15

Terminiert für alle Eingaben?

6.4.10 while: Schleife über Feld

Beispiel: Werte in einer Liste aufaddieren

1 L = [1, 2, 3, 4]2 i = 03 sum = 04 while i < len(L):5 sum = sum + L[i]6 i = i + 17 print(sum)

10

Achtung 6.1 (Nicht pythonisch). Das ist nicht Python-Style (pythonic). Hiernur als didaktischer Zwischenschritt!

6.4.11 while: Beispiel Suchschleife

Szenario:

• Wir haben eine Liste (oder Tuple)• Wir suchen ein Element mit einer bestimmten Eigenschaft

– Allgemeiner als mit index machbar: da nur Identität als Eigen-schaft möglich

Idee:

• Mit einer Schleife die Elemente ablaufen• Testen, ob Eigenschaft erfüllt

– Merken, dass gefunden

6.4.12 while: Beispiel Suchschleife (2)

1 # ist eine ungerade Zahl in L?2 def ungerade_in_liste(L):3 gefunden = False4 i = 05 while i < len(L):6 if L[i] % 2 == 1:7 gefunden = True

16 Liste von Definitionen u.ä.

8 i = i + 19 return gefunden10

11 print(ungerade_in_liste([2, 18, 6, 5, 9]))12 print(ungerade_in_liste([2, 18, 6, 10, 22]))

TrueFalse

Beobachtung

• Alle Elemente untersuchen?– Nein, nach erstem Finden aufhören?

6.4.13 while: Beispiel Suchschleife (3)

Zusätzliches Abbruchkriterium: not gefunden

1 # ist eine ungerade Zahl in L?2 def ungerade_in_liste(L):3 gefunden = False4 i = 05 while (not gefunden) and (i < len(L)):6 if L[i] % 2 == 1:7 gefunden = True8 i = i + 19 return gefunden10

11 print(ungerade_in_liste([2, 18, 6, 5, 9]))12 print(ungerade_in_liste([2, 18, 6, 10, 22]))

TrueFalse

6.4.14 Schleifenbedingungen finden?

Inspiration? Oder strukturiertes Vorgehen?

• Idee: Nach der Schleife soll irgendeine Zielbedingung gelten• Während der Schleife gilt die Schleifenbedingung• Schön wäre: Negation der Schleifenbedingung ist Zielbedingung?

– Oder: impliziert Zielbedingung?

6.4. Schleifen: while 17

1 while SCHLEIFENBEDINGUNG == True:2 ...3

4 # Es gilt: ZIELBEDINGUNG == True

6.4.15 Schleifenbedingungen finden? (2)

Oft praktisch: Schleifenbedingung konstruieren aus zwei Teilen

• Die Zielbedingung an sich: Was wollen wir nach der Schleife erreichthaben?– Oder eine stärkere Variante davon

• Eine Invariante: Gilt vor, während, nach der Schleife– Stellt sicher, dass alle Anweisungen innerhalb der Anweisung kor-rekt ausgeführt werden können

– Beispiel: Index für Listenzugriffe gültig

Schleifenbedingung zusammensetzen

Schleifenbedingung = (not Zielbedingung) and Invariante

• Invariante kann oft entfallen, aber hilfreich zum Nachdenken

6.4.16 Schleifenbedingung finden? (3)

MitSchleifenbedingung = (not Zielbedingung) and Invariantenach Schleife gilt:

Zielbedingung or (not Invariante)

Was gilt also?

D.h.: Nach Schleife nicht klar, was eigentlich der Fall ist!?

• Es könnte die Zielbedingung gelten• Es könnte aber auch die Invariante verletzt sein

Also unklar!

6.4.17 Nach Schleife: Prüfen!

Wenn also unklar ist, weswegen die Schleife beendet wurde

• also wegen Erreichen der Zielbedingung• oder Verletzten der Invariante

Dann muss man ggf. nach der Schleife nachprüfen!

• Häufiges Muster: Zielbedingung durch Variable explizit darstellen

18 Liste von Definitionen u.ä.

• Wie im Beispiel oben: gefunden

6.4.18 Beispiel umformuliert

1 # ist eine ungerade Zahl in L?2 def ungerade_in_liste(L):3 i = 04

5 ZIELBEDINGUNG = False6 INVARIANTE = i < len(L)7

8 while (not ZIELBEDINGUNG) and INVARIANTE:9 ZIELBEDINGUNG = (L[i] % 2 == 1)10 i = i + 111 INVARIANTE = i < len(L)12

13 return ZIELBEDINGUNG14

15 print(ungerade_in_liste([2, 18, 6, 5, 9]))16 print(ungerade_in_liste([2, 18, 6, 10, 22]))

TrueFalse

6.4.19 Schleifen: Hilfskonstrukte

Innerhalb einer Schleife kann viel passieren

• Wirklich jede Iteration komplett durchlaufen?• Eine Schleife abbrechen?

6.4.20 Schleifeniterationen nicht komplett durchlaufen

Typisches Muster: Umständlich

1 while Schleifenbedingung:2 Anweisungen3 if Andere_Bedingung:4 # Lasse den Rest der Schleife aus5 pass6 else:7 Restliche Anweisungen

6.4. Schleifen: while 19

6.4.21 Schleifeniterationen nicht komplett durchlaufen: continue

Gleich, aber knapper:

1 while Schleifenbedingung:2 Anweisungen3 if Andere_Bedingung:4 continue5 Restliche Anweisungen

6.4.22 Schleife abbrechen

Typisches Muster: Umständlich

1 while (not Abbruchsbedingung) and WeitereBedingung:2 Anweisungen3 if Abbruchsbedingung:4 pass5 else:6 Restliche Anweisungen

6.4.23 Schleife abbrechen: break

Gleich, aber knapper:

1 while WeitereBedingung:2 Anweisungen3 if Abbruchsbedingung:4 break5 Restliche Anweisungen

Achtung 6.2 (Bedingung genau beachten). Vorsicht, das Weglassen der Ab-bruchsbedingung aus der Schleifenbedingung im Einzelfall genau überlegen.

6.4.24 Reguläre Beendigung vs. break: Reaktion

Unterschiedliches Beenden einer Schleife kann unterschiedliche Reaktionenerfordern – siehe oben

Unterstützung: else für Schleife!

20 Liste von Definitionen u.ä.

6.4.25 else bei Schleifen

Beispiel:

1 def is_prime(n):2 """Ist n eine Primzahl?"""3 x = n // 2 # For some n > 14 while x > 1:5 if n % x == 0: # Remainder6 print(n, ’hat Teiler’, x)7 break # Skip else8 x -= 19 else: # Normal exit10 print(n, ’ist eine Primzahl’)11

12 print("Ist 5 eine Primzahl?")13 is_prime(5)14 print("Ist 9 eine Primzahl?")15 is_prime(9)

6.4.26 else bei Schleifen (2)

• Vorteil: Keine Test-Variable nötig– Vereinfacht Schleifenbedingung– Vereinfacht Anweisungen in der Schleife– Wohldefinierte Art, Anweisungen für einen typischen Fall zu plat-zieren – leichte Lesbarkeit durch Konvention

6.4.27 while: Suchschleife mit else

1 # ist eine ungerade Zahl in L?2 def ungerade_in_liste(L):3 i = 04 while (i < len(L)):5 if L[i] % 2 == 1:6 break7 i = i + 18 else:9 print("nix ungerades!")10 return False11

12 return True13

6.4. Schleifen: while 21

14 print(ungerade_in_liste([2, 18, 6, 5, 9]))15 print(ungerade_in_liste([2, 18, 6, 10, 22]))

Truenix ungerades!False

while und else: Sinnvoll?

In den hier gezeigten, kleinen Beispielen ist der Einsatz von elsemöglicher-weise nicht vollständig überzeugend. Der Nutzen wird wirklich klar, wennim else-Teil einer Schleife nicht-triviale Operationen durchlaufen werdenmüssen, zum Beispiel eine Fehlerbehandlung, weitere Verarbeitungsschritte,etc. Wir kommen in den Übungsaufgaben darauf zurück.

6.4.28 Stil: continue, break ?

Ist das überhaupt guter Stil? Wird das Programm unstrukturiert?

• Das ist beinahe Glaubenssache• Aber break und continue haben klar definiertes Verhalten• Insbesondere in Verbindung mit else alle Fälle eines Schleifenendesim Programmcode klar identifizierbar

Also: Ja, das ist ok! Mit Verständnis!

6.4.29 Stil: goto

• In alten Sprachen (und in Maschinensprache): goto– Springe an beliebige Stelle im Programm

• Aber: Goto considered harmful

Abbildung 6.2: goto considered harmful

22 Liste von Definitionen u.ä.

6.4.30 Definition: while

Definition 6.4 (while). Eine while-Schleife besteht aus einem Ausdruckals Test (Schleifenbedingung) und einem Rumpf (Schleifenrumpf, Schleifenkör-per). Beim Einreichen der while-Anweisung wird der Test-Ausdruck ausge-wertet und mit dem booleschen Wert True verglichen. Ist der Test-Ausdruckwahr, wird der Rumpf einmal ausgeführt. Das Testen des Ausdrucks und eineAusführung des Rumpfes werden als (Schleifen-)Iteration bezeichnet. Die Ver-änderungen des Zustands durch die Anweisungen des Rumpfs sind (natürlich)wirksam.

Danach wird wie beim Erreichen der while-Anweisung verfahren: DerTest wird (mit den neuen Variablen-Werten) ausgewertet und ggf. der Rumpfausgeführt.

Der Rest einer Schleifeniteration kann durch die Anweisung continueübersprungen werden und mit der folgenden Iteration begonnen werden. EineSchleife kann mit der Anweisung break abgebrochen werden.

Am Ende einer regulär (nicht durch break) beendeten Schleife wird einggf. vorhandener Block nach der Anweisung else ausgeführt. Bei Beendungder Schleife durch break wird dieser Block ignoriert.

6.4.31 while: Komplettes Flussdiagramm

Abbildung 6.3 zeigt ein vollständiges Flussdiagramm einer while-Schleife inPython.

6.5 Schleifen: for

6.5.1 Häufiger Fall: Schleife über Aufzählung

Häufig: Eine Aufzählung (Liste, Tuple, usw) Element für Element verarbeiten

Skizze:

1 L = [1, 2, 3, 4, 5]2 while L is not []:3 aktuellesElement = L[0]4 # mache etwas mit aktuellem Element5 # ...6 # betrachte die restlichte Liste:7 L = L[1:]

6.5. Schleifen: for 23

Abbildung 6.3: Flussdiagramm einer While-Schleife mit continue , break undelse

Achtung 6.3 (Keine korrekte Schleife!). Dies ist keine korrekte Schleife; siehat mindestens zwei Probleme. Siehe Details in der Übungsaufgabe.

6.5.2 Häufige Fälle verdienen eigene Anweisung: for

Schleifen über Aufzählungen vereinfacht schreiben

1 # Sei A eine Referenz auf2 # ein Objekt eines Aufzählungsdatentyp3 for element in A:4 Anweisung15 Anweisung26 ...7

8 # Beispiel:9 L = [1, 2, 3]

24 Liste von Definitionen u.ä.

10 for l in L:11 print(l, end=" ")

6.5.3 for: Definition

Definition 6.5 (for-Schleife). • Mit jeder Iteration einer for Schleifewird das jeweils nächste Element der gegeben Aufzählung der Schleifen-variable (auch Laufvariable) zugewiesen (im Beispiel: element; Nameist frei wählbar)

• Nach Bearbeitung des letzten Elements der Aufzählung wird die Schleifeverlassen

• Ist die Aufzählung leer (z.B. []), so wird die Schleife nicht betreten undkeine Iteration ausgeführt

• Die Anweisungen break, continue und else verhalten sich genauwie bei while-Schleifen

6.5.4 Zuweisung an Aufzählung?

Was passiert, wenn der Aufzählung einer neuer Wert zugewiesen wird?

• Ändert das den Schleifenverlauf?• Beispiel:

1 L = [1, 2, 3]2 for l in L:3 print(l, end=" ")4 L = [17, 18, 19]

6.5.5 Zuweisung an Aufzählung – es passiert gar nicht!

• Tatsächlich kann an die Aufzählung, die für die Schleife verwendet wird,gar nicht zugewiesen werden

• Zu Beginn der for-Schleife wird eine weitere, verborgene Variable fürdie Aufzählung angelegt– Anhand dieser wird iteriert

• Weißt man also einer Variable, die im Schleifenkopf benutzt wird, einenneuen Wert zu, so beeinflusst das nicht den Schleifenablauf– Der ursprüngliche Wert steht ja weiterhin zur Verfügung

Visualisierung

Die Visualisierung dieses Effekts durch unsere üblichen Diagramme gelingtleider nicht gut (Abbildung 6.4). Der verborgene Name für die Aufzählung

6.5. Schleifen: for 25

wird durch Pythontutor leider nicht explizit dargestellt. Dennoch hilft diesesDiagramm vielleicht ein wenig.

Abbildung 6.4: Zuweisung an Aufzählung während while-Schleife

6.5.6 Zuweisung an Elemente der Aufzählung?

Was passiert also hier?

1 L = [1, 2, 3]2 for l in L:3 print(l, end=" ")4 L[1] = 17

6.5.7 Zuweisung an Schleifenvariable

Was passiert, wenn der Schleifenvariable etwas zugewiesen wird?

• Ändert das die Aufzählung? Den Schleifenverlauf?• Beispiel:

1 L = [1, 2, 3, 4, 5]2 for x in L:3 x += 14 print(L)

[1, 2, 3, 4, 5]

26 Liste von Definitionen u.ä.

Nein!

Auch hier ist die ursprüngliche Aufzählung nicht betroffen

• Die Schleifenvariable x ist ein Name für den Wert; zeigt nicht in dieAufzählungsstruktur

• x wird bei erneutem Betreten der Schleife einfach den nächsten Wertaus der Aufzählung zugewiesen

6.5.8 Schleifenvariable nach Schleifenende?

Bleibt Schleifenvariable erhalten nach Schleifenende?

1 for i in [1, 2, 3]:2 print("in schleife")3 print("Variable i nach Schleife: ", i)

in schleifein schleifein schleife(’Variable i nach Schleife: ’, 3)

Ja

• Mit Wert des letzten Durchlaufs

6.5.9 for-Schleifen über andere Aufzählungen

• Beispiele bisher: for über Liste• Laut Kapitel 5: Andere Aufzählungen sind str, tuple, set

– Und eigentlich auch dict• for-Schleifen darüber?

6.5.10 for-Schleifen über andere Aufzählungen – Beispiele

1 s = "Hallo GP1"2 for ss in s:3 print(ss, end=" ")

1 t = (1, 2, 3, 4)2 for tt in t:3 print(tt, end=" ")

6.5. Schleifen: for 27

6.5.11 for-Schleifen über andere Aufzählungen – Beispiele

• Überraschend? Nein!– Principle of least surprise

1 s = {1, 2, 3, 4, 2, 3, 4}2 for ss in s:3 print(ss, end=" ")

• Überraschend? Nein!– Semantik einer Menge

6.5.12 for-Schleife über verschachtelte Datentypen

Beispiel: Liste von Tupeln

1 L = [ (1,2), (3, 4), (5, 6)]2 for t in L:3 print(t, end=" ")

6.5.13 for-Schleife mit erweiterter Zuweisung?

• Eigentlich macht ja eine for-Schleife jeweils eine Zuweisung an dieLaufvariable

• Python kennt erweiterte Zuweisungen und unpacking: x, y = (1,2)

• Funktioniert das bei for?

1 L = [ (1,2), (3, 4), (5, 6)]2 for a, b in L:3 print(a, b)4 print("---")

(1, 2)---(3, 4)---(5, 6)---

28 Liste von Definitionen u.ä.

6.5.14 for-Schleife über dict ?

• Iterieren über ein dict liefert die Schlüssel

1 D = {"a": 1, "b": 2, "c": 3, "d": "abc"}2 for key in D:3 print(key, end=" ")

6.5.15 for-Schleife über dict – Key und Value?

Wir bekommen eine Liste von Schlüssel-/Wert-Tuple eines dictsmit Aufrufvon items

• Mit implizitem unpacking der Tuple in separate Variablen k (für key)und v (für value)

1 D = {"a": 1, "b": 2, "c": 3, "d": "abc"}2 for k, v in D.items():3 print(k, v)4 print("----")

(’a’, 1)----(’c’, 3)----(’b’, 2)----(’d’, ’abc’)----

Beobachtung: Reihenfolge

• Es gibt keine Garantie für die Reihenfolge in D.items()!

Visualisierung

Zur Illustration (Abbildung 6.5) hier ein Schnappschuss aus dem zweitenDurchlauf der Schleife. Die beiden Schleifenvariablen key und value refe-renzieren dabei Werte aus dem Dictionary D.

6.5.16 for über Folge von Zahlen: range

• Häufig: Liste über eine Folge Zahlen

6.5. Schleifen: for 29

Abbildung 6.5: Zwischenstand bei einer Iteration über ein Dict D.items()

– Z.B. 1 . . . 10, 1 . . . n für Variable n, usw• Mit for so nicht unmittelbar darstellbar

– Mit while schon, aber umständlich

Definition 6.6 (Hilfsfunktion: range). range(stop) liefert eine Aufzäh-lung der Zahlen von 0 bis (ausschliesslich) stop

6.5.17 range: Beispiel

1 for i in range(11):2 print(i, end=" ")

6.5.18 range: Wie viele Durchläufe?

Fencepost-Problem: Wie viele Pfähle braucht man für einen 100m langenZaun mit Pfählen im Abstand von 10m?

• 9, 10, 11?

6.5.19 Terminierung von for und range

Terminiert das hier?

30 Liste von Definitionen u.ä.

1 for i in range(5):2 i -= 1

Terminierung von range

Natürlich terminiert das. Der Schleifenstruktur ist egal, was innerhalb derSchleife mit dem Namen i gemacht wird (genauer: auf welchen Wert derName i referenziert). Am Ende der Schleife wird der nächste Wert aus derAufzählung verwendet.

6.5.20 range: Aufzählung verändern

Erinnerung: Das hier verändert die Aufzählung L nicht

1 L = [1, 2, 3, 4, 5]2 for x in L:3 x += 14 print(L)

[1, 2, 3, 4, 5]

L verändern?

Was aber, wenn Schleife doch L verändern soll?

6.5.21 range: Aufzählung verändern

Dann brauchen wir eine for-Schleife mit Zugriff auf L durch den Index

1 L = [1, 2, 3, 4, 5]2 for i in range(len(L)):3 L[i] += 14 print(L)

[2, 3, 4, 5, 6]

Muster

Typisches Muster für den Einsatz von range und len in for-Schleifen

• Durch Struktur der for-Schleife Indiz an Leser des Codes!

6.5. Schleifen: for 31

6.5.22 Aufzählung in for – duck typing?

Im Kopf der for-Schleife:

• Muss es eine Aufzählung sein?• Oder – nach duck typing-Prinzip – reicht etwas, dass sich wie eineAufzählung benimmt?– Dafür haben wir noch kein Beispiel – aber vielleicht ein interessan-ter Gedanke!

6.5.23 Beispiel: Sieb des Erathostenes

• Bestimme alle Primzahlen bis zu einer gegebenen Obergrenze n• Idee:

– Schreibe alle Zahlen von 2 bis n– Nimm die erste Zahl (die 2); streiche alle Vielfachen dieser Zahlaus der Tabelle

– Nimm die nächste noch nicht gestrichene Zahl und wiederholeProzedur

– Bis keine nicht gestrichene Zahl mehr übrig

6.5.24 Eratostenes: Umsetzung

• Wie Tabelle repräsentieren?– Als Liste der Zahlen: [2, 3, 4, 5, ... ]

* Möglich, aber dann Suche nach Vielfachen aufwändig– Als Liste von gestrichen/nicht gestrichen Werte, mit Zugriff perIndex* nicht/gestrichen als True oder False repräsentieren

6.5.25 Erathostenes: Code

1 n = 202 prim = [True] * n3 for i in range(n):4 if i==0 or i==1:5 prim[i] = False6 elif prim[i] == True:7 for streich in range(2*i, n, i):8 prim[streich] = False9

10 print(prim)

[False, False, True, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, True]

32 Liste von Definitionen u.ä.

rangemit drei Parametern

Parameter: Start, Stop, Schrittweite!

6.5.26 while oder for ?

• Ist eine Aufzählung abzuarbeiten; ist eine feste Anzahl an Durchläufenbekannt? Dann for

• Ist nur eine Abbruchbedingung bekannt, bei unklarer Anzahl an Durch-läufen? Dann while

6.6 List comprehensions

6.6.1 Listen in Schleife konstruieren

• Häufiges Muster:– Eine Schleife produziert Ergebnis pro Druchlauf– Ergebnisse werden in Liste aufgesammelt

• Einfachster Fall: Einen Ausdruck für jedes Element der Aufzählung be-rechnen

1 # leere Liste zum Ergebnisse sammeln:2 ergebnis = []3 for x in aufzaehlung:4 ergebnis.append(Ausdruck ueber x)

6.6.2 Listen in Schleife konstruieren – Beispiel

Beispiel: Wir verdoppeln jeden Eintrag der Liste

1 ergebnis = []2 for x in [1, 2, 3, "abc", "xyz"]:3 ergebnis.append(x * 2)4 print(ergebnis)

[2, 4, 6, ’abcabc’, ’xyzxyz’]

6.6. List comprehensions 33

6.6.3 Listen in Schleifen bedingt konstruieren

• Auch häufig: Pro Durchlauf Ergbnis nur bei bestimmer Bedingung kon-struieren

1 # leere Liste zum Ergebnisse sammeln:2 ergebnis = []3 for x in aufzaehlung:4 if x erfuellt Bedingung:5 ergebnis.append(Ausdruck ueber x)

6.6.4 Listen in Schleifen bedingt konstruieren – Beispiel

Verdopple Eintrag nur wenn gerade Zahl:

1 ergebnis = []2 for x in [1, 2, 3, 17, 42, 99]:3 if x % 2 == 0:4 ergebnis.append(x * 2)5 print(ergebnis)

[4, 84]

6.6.5 List comprehensions

Wie üblich: Häufige Muster verdienen eigene Syntax!

List comprehension:

• Konstruieren einer Liste aus einer anderen Liste• mit einer kompakten for-Formulierung

1 [Ausdruck ueber x for x in Liste if x erfuellt Bedingung]

Schleifenvariable

Natürlich auch andere Variablennamen als xmöglich

6.6.6 List comprehension – Beispiel 1

Verdopple Eintrag nur wenn gerade Zahl:

34 Liste von Definitionen u.ä.

1 # Zeilenumbruch nur für Lesbarkeit2 ergebnis = [x * 23 for x in [1, 2, 3, 17, 42, 99]4 if x % 2 == 0]5 print(ergebnis)

6.6.7 Beispiel 2

• Liste der Noten von Austauschstudierenden

1 # Liste mit Matrikelnummern:2 austausch = [11, 22, 33]3 # Dict mit Matrikelnummer: Note Abbildung4 noten = {11: 2.0, 17: 1.7, 20: 3.3, 22: 1.0, 27: 5.0, 33: 2.3}5 # Liste der Noten der Austauschstudierenden:6 austauschnoten = [noten[a] for a in austausch]7 print(austauschnoten)

[2.0, 1.0, 2.3]

Fehler?

Was passiert, wenn Matrikelnummer fehlt?

6.7 Geschachtelte Schleifen

6.7.1 Geschachtelte Schleifen

• Schleifenrumpf: Folge von Anweisungen• Schleifen (while und for) sind Anweisungen• Also: Schleifen in Schleifen möglich!?• Na klar!

6.7.2 Paarweise Operation

• Angenommen,wirwollen Elemente zweier Listen paarweisemiteinandervergleichen– Schleife 1 (äußere Schleife): Iteriere über eine Liste

6.7. Geschachtelte Schleifen 35

– Schleife 2 (innere Schleife): In jeder Iteration der äußeren Schleife,iteriere über die zweite Schleife* Führe Operation durch

1 for l1 in liste1:2 for l2 in liste2:3 operation auf l1, l2

6.7.3 Paarweise Operation: Beispiel 1 – Summe der Produkte

Berechne Summe der Produkte jedes Elements von Liste 1 mit jedem Elementvon Liste 2

• Also:∑len(L1)−1

i=0

∑len(L2)−1j=0 L1[i]L2[j]

1 L1 = [1, 2, 3]2 L2 = [17, 18, 19]3 summe = 04 for l1 in L1:5 for l2 in L2:6 summe += l1 * l27 print(summe)

324

6.7.4 Paarweise Operation: Beispiel 2 – Test auf enthalten

Welche Elemente von tests sind in der Liste items?

• Innere Schleife abbrechen wenn Ergebnis feststeht

1 items = ["aaa", 111, (4, 5), 2.01] # Eine Liste von Daten2 tests = [(4, 5), 3.14] # Wonach suchen wir?3

4 for key in tests: # Fuer alle zu suchenden Daten5 for item in items: # Fuer alle vorhandenen Daten6 if item == key: # Gleich?7 print(key, "gefunden in Daten")8 break # Brich die innere Schleife ab9 else:10 print(key, "nicht in Daten") # Nur ausgefuehrt wenn innere Schleife11 # nichts gefunden hat

36 Liste von Definitionen u.ä.

((4, 5), ’gefunden in Daten’)(3.14, ’nicht in Daten’)

6.7.5 Beispiel mit geschachteltem range

Berechne∑10

i=0

∑ij=0 i · j

1 summe = 02 for i in range(11):3 for j in range(i+1):4 summe += i*j5 print(summe)

1705

6.7.6 Beispiel mit geschachteltem range und list comprehension

List comprehensions erlauben direkt geschachtelte Schleifen:

1 quadrate = [i*j2 # aeußere Schleife:3 for i in range(11)4 # innere Schleife:5 for j in range(i+1)6 ]7 print(quadrate)

6.7.7 Eingebaute Funktion: sum

Hilfsfunktion sum: Addiere alle Elemente einer Aufzählung auf

1 summe = sum([i*j2 # aeußere Schleife:3 for i in range(11)4 # innere Schleife:5 for j in range(i+1)6 ])7 print(summe)

6.7. Geschachtelte Schleifen 37

6.7.8 Beispiel: Sortieren

• Gegeben: Eine Liste mit Zahlen• Gesucht: Eine Liste mit den gleichen Zahlen, aber aufsteigend sortiert

Idee: Suche die kleinste Zahl aus Restliste

• Schritt 1: Suche die kleinste Zahl aus der ganzen Liste– Vertausche mit Element am Anfang

• Schritt 2: Genauso, mit der Liste ab Position 2• Usw.

Selection Sort

Sog. Selection Sort

• Achtung: Für Praxis ungeeignet; viel zu langsam; aber schön einfach• Besser: siehe VL Datenstrukturen und Algorithmen

6.7.9 Selection Sort: Vorüberlegung

• Wie viele, welche Schleifen?– Eine Schleife, um das erste, zweite, . . . Element zu bestimmen: for– Um ein Element zu bestimmen, den Rest absuchen: noch eine for,geschachtelt

6.7.10 Selection Sort: Code

1 liste = [17, 1, 42, 99, 33]2 for pos in range(len(liste)):3 tausch = pos4 for such in range(pos+1, len(liste)):5 if liste[such] < liste[tausch]:6 tausch = such7 liste[pos], liste[tausch] = liste[tausch], liste[pos]8

9 print(liste)

[1, 17, 33, 42, 99]

(PT link)

38 Liste von Definitionen u.ä.

Visualisierung

Abbildung 6.6 visualisiert einen Zwischenstand beim Ablauf von SelectionSort.

Abbildung 6.6: Selection Sort

6.7.11 Sortieren in Python: Eingebaut

• Niemand schreibt so eine Sortier-Funktion von Hand• Das ist als eingebaute Funktion verfügbar: l.sort() für eine Liste l

6.7.12 Beispiel: Mischen zweier Listen

• Gegeben: Zwei sortierte Listen (beliebiger Länge)• Gesucht: Eine sortierte Liste, die die Elemente der beiden Listen enthält

6.7.13 Mischen: Vorüberlegung

• Triviale Idee: Listen hintereinander kopieren, dann sortieren– Verschwenderisch – wir können die Sortierung der Listen ja aus-nutzen

• Bessere Idee: Gehe Listen elementweise durch und nimm jeweils daskleinere Element

6.7.14 Mischen konventionell

1 a = [1, 3, 6, 9, 12, 23, 27, 35]2 b = [2, 4, 5, 10, 11, 17, 18]3 r = []4

5 aindex = 0

6.7. Geschachtelte Schleifen 39

6 bindex = 07

8 while (aindex < len(a)) and (bindex < len(b)):9 print("Index a und b:", aindex, bindex)10 if a[aindex] < b[bindex]:11 r.append(a[aindex])12 aindex += 113 else:14 r.append(b[bindex])15 bindex += 116

17 print("Index a und b nach Schleife:", aindex, bindex)18

19 if aindex == len(a):20 r.extend(b[bindex:])21 else:22 r.extend(a[aindex:])23

24 print("Resultat: ", r)

(’Index a und b:’, 0, 0)(’Index a und b:’, 1, 0)(’Index a und b:’, 1, 1)(’Index a und b:’, 2, 1)(’Index a und b:’, 2, 2)(’Index a und b:’, 2, 3)(’Index a und b:’, 3, 3)(’Index a und b:’, 4, 3)(’Index a und b:’, 4, 4)(’Index a und b:’, 4, 5)(’Index a und b:’, 5, 5)(’Index a und b:’, 5, 6)(’Index a und b nach Schleife:’, 5, 7)(’Resultat: ’, [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 17, 18, 23, 27, 35])

6.7.15 Mischen mit Slicing

1 a = [1, 3, 6, 9, 12, 23]2 b = [2, 4, 5, 10, 11, 17, 18]3 r = []4 while (len(a) > 0) and (len(b) > 0):5 print(a, b)6 if a[0] < b[0]:

40 Liste von Definitionen u.ä.

7 r.append(a[0])8 a = a[1:]9 else:10 r.append(b[0])11 b = b[1:]12

13 if len(a) == 0:14 r.extend(b)15 else:16 r.extend(a)17

18 print("Resultat: ", r)

([1, 3, 6, 9, 12, 23], [2, 4, 5, 10, 11, 17, 18])([3, 6, 9, 12, 23], [2, 4, 5, 10, 11, 17, 18])([3, 6, 9, 12, 23], [4, 5, 10, 11, 17, 18])([6, 9, 12, 23], [4, 5, 10, 11, 17, 18])([6, 9, 12, 23], [5, 10, 11, 17, 18])([6, 9, 12, 23], [10, 11, 17, 18])([9, 12, 23], [10, 11, 17, 18])([12, 23], [10, 11, 17, 18])([12, 23], [11, 17, 18])([12, 23], [17, 18])([23], [17, 18])([23], [18])(’Resultat: ’, [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 17, 18, 23])

6.7.16 Beispiel: Binäre Suche

• Gegeben:– Sortierte Liste mit Werten– Gesuchter Wert

• Gesucht:– Index des Wertes in Liste, falls vorhanden– Information dass nicht vorhanden, andernfalls

6.7.17 Binäre Suche, Vorüberlegung

• Liste linear absuchen?– Funktioniert, aber wir können Sortierung ausnutzen!

• Idee:– Prüfe Wert in der Mitte der Liste

* Falls gefunden: fertig* Wenn größer: Suche oben; wenn kleiner: suche unten

6.8. Zusammenfassung 41

– Wenn kein Wert mehr übrig, fertig• Welche Schleifen?

6.7.18 Binäre Suche, Code

1 l = [2, 4, 5, 10, 11, 17, 18]2 wert = 113 gefunden = False4 unten = 05 oben = len(l)6

7 while ((not gefunden) and8 (unten <= oben) and9 (unten < len(l))):10 mitte = int((unten+oben)/2)11 if l[mitte] == wert:12 gefunden = True13 elif l[mitte] < wert:14 unten = mitte + 115 else:16 oben = mitte -117

18 print(gefunden, mitte)

(True, 4)

Frage

Wozu braucht man die Schleifenbedingung unten < len(l) ?

6.8 Zusammenfassung

6.8.1 Zusammenfassung

• Wiederholte Ausführung von Anweisungen ist extrem nützlich• Unterschiedliche Kontrollmechanismen existieren

– while-Schleife: Kontrolle durch einen Ausdruck, der Wahrheits-wert liefert

42 Liste von Definitionen u.ä.

– for-Schleife: In jeder Wiederholung nimmt eine (oder mehrere)Schleifenvariable einen Wert aus einer vorgegebenen Aufzählungan

• Schleifen erlauben Ausnahmen (break, continue) und Code für regu-läres Ende (else)

• Zusammen mit ein paar Hilfsfunktionen (vor allem range) sind insbes.for-Schleifen in Python extrem praktisch

6.8.2 Python-Keywords: Liste bis jetzt

• Bis jetzt:– True, False, and, or, def, return, None– in

• Neu:– if, else, pass, elif, while, for, break, continue, assert

6.8.3 Python: eingebaute Funktionen

• Allgemein– print, range, zip

• Typ-bezogen– len

• Datentypen erzeugen– tuple– list– set– dict