kapitel 6: anweisungen -...

43
Kapitel 6: Anweisungen Grundlagen der Programmierung 1 Holger Karl Wintersemester 2018/2018 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 ...................... 35 1

Upload: trannhi

Post on 17-Aug-2019

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

Kapitel 6: AnweisungenGrundlagen der Programmierung 1

Holger Karl

Wintersemester 2018/2018

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 . . . . . . . . . . . . . . . . . . . . . . 35

1

Page 2: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.8 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . 42

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

Liste von Definitionen u.ä.

6.1 Definition (Block) . . . . . . . . . . . . . . . . . . . . . . . . . 46.2 Definition (pass) . . . . . . . . . . . . . . . . . . . . . . . . . . 106.3 Definition (Anweisung: if/elif/else) . . . . . . . . . . . . 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

Page 3: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 verweisen

* 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 (oder Ausdrücken)– 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

Page 4: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene 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 Definition: Block

Definition 6.1 (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.

Page 5: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.3. Bedingte Ausführung: if 5

6.3.3 if: Syntax

1 if Ausdruck:2 Anweisung13 Anweisung24 usw.5

6 # if hier zu Ende7 Anweisung nach if

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.4 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.5 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.6 Alternative: Wahr oder falsch?

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

Page 6: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6 Liste von Definitionen u.ä.

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

12 # Anweisungen nach if/else13 Anweisung114 ...

Achtung

Doppelpunkt nach else!

6.3.7 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.8 if: Beispiele

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

Ja!

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

Nein!

Page 7: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.3. Bedingte Ausführung: if 7

6.3.9 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 ???7

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

6.3.10 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.11 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")

Page 8: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

8 Liste von Definitionen u.ä.

6.3.12 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

6.3.13 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.14 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

Page 9: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.3. Bedingte Ausführung: if 9

6.3.15 Geschachtelte if/else: Einfachere Fälle

• Braucht man alle Teilböcke?• Leerer Teilblock nach else?

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

6.3.16 Leerer Teilblock nach if?

Würde das gehen?

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.17 pass: Beispiel

Angenommen, Sie wollen den Wert des Namens laenge auf mindestens 100aber hö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

Page 10: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

10 Liste von Definitionen u.ä.

6.3.18 Anweisung: pass

Definition 6.2 (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.19 Eindeutigkeit von else?

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

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.

Page 11: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.3. Bedingte Ausführung: if 11

6.3.20 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:8 Anweisung39 else:10 Anweisung4

6.3.21 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.22 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")

Page 12: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

12 Liste von Definitionen u.ä.

6 elif len(L) == 4:7 print("ausgereizt")8 else:9 print("knapp")

ausgereizt

6.3.23 Definition: if/elif/else

Definition 6.3 (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.

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

1 a=02 b=5

Page 13: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.4. Schleifen: while 13

Abbildung 6.1: Flussdiagramm einer einfachen While-Schleife

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

6.4.4 Beobachtung: Sichtbarkeit von Namen

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

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

6.4.5 Beobachtung: Sichtbarkeit von Namen (2)

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

1 i = 02 while i < 2:3 i += 14 x = 2*i5 print(x)

Page 14: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

14 Liste von Definitionen u.ä.

4

Name nach Schleife sichtbar

• Name bleibt nach der Schleife erhalten und zeigt auf entsprechendenWert

• Also: Schleife schafft keinenNamensraum (imGegensatz zu Funktionen)

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

• einen Wert gibt, der in jedem Schleifendurchlauf streng monoton wächstund

• der Wert diskret wächst und• die Schleifenbedingung eine obere Schranke für den Wert darstellt

Analog: Wert 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

Terminiert für alle Eingaben?

Page 15: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.4. Schleifen: while 15

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 = True8 i = i + 19 return gefunden

Page 16: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

16 Liste von Definitionen u.ä.

10

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?

Page 17: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Wert/Namen explizit darstellen

Page 18: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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

Page 19: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von 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!

Page 20: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Namen für Test-Wert 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

Page 21: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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

Page 22: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Namen gebunden an die neuen Werten) ausgewertet undggf. der Rumpf ausgefü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:]

Page 23: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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]

Page 24: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Schlei-fenvariable (auch Laufvariable, Laufname?) zugewiesen (im Beispiel:element; Name ist 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 ein verborgener Name für die Aufzäh-lung angelegt– Anhand diesen Namens wird iteriert!

• Weißt man also einem Namen, der 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

Page 25: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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]

Page 26: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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("Wert von i nach Schleife: ", i)

in schleifein schleifein schleife('Wert von 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=" ")

Page 27: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 dieSchleifenvariable

• 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)---

Page 28: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Namen k (für key) undv (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 Namen key und value der Schleife ver-weisen dabei auf Werte aus dem Dictionary D.

6.5.16 for über Folge von Zahlen: range

• Häufig: Liste über eine Folge Zahlen

Page 29: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Name 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?

Page 30: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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!

Page 31: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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]

Page 32: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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']

Page 33: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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 Namen als xmöglich

6.6.6 List comprehension – Beispiel 1

Verdopple Eintrag nur wenn gerade Zahl:

Page 34: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

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.6.8 List comprehsion mit Wahrheitswerten

• Man kann natürlich True, False als Ausdruck berechnen

1 ergebnis = [x % 2 == 02 for x in [1, 2, 3, 17, 42, 99]3 ]4 print(ergebnis)

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

6.6.9 List comprehsion mit Wahrheitswerten: Reduzieren?

• Schön wäre: Und bzw. Oder-Verknüpfung für solche Listen mit Wahr-heitswerten

• Eingebaute Funktionen: any, all

Page 35: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.7. Geschachtelte Schleifen 35

– any: True wenn mindestens ein Element True ist– all: True wenn alle Elemente True sind

1 ergebnis = [x % 2 == 02 for x in [1, 2, 3, 17, 42, 99]3 ]4 print(any(ergebnis))

True

• Anmerkung: Mit short-circuit Auswertung

6.6.10 Damit: Suchschleife ganz pythonisch

1 def ungerade_in_liste(L):2 return any([x % 2 == 1 or x in L])

(Mit einer noch fehlenden Modifikation, siehe später)

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– Schleife 2 (innere Schleife): In jeder Iteration der äußeren Schleife,iteriere über die zweite Schleife* Führe Operation durch

Page 36: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

36 Liste von Definitionen u.ä.

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

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

Page 37: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.7. Geschachtelte Schleifen 37

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(5)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.8 Beispiel: Sortieren

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

Page 38: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

38 Liste von Definitionen u.ä.

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)

Visualisierung

Abbildung 6.6 visualisiert einen Zwischenstand beim Ablauf von SelectionSort.

Page 39: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.7. Geschachtelte Schleifen 39

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 = 06 bindex = 07

8 while (aindex < len(a)) and (bindex < len(b)):9 print("Index a und b:", aindex, bindex)

Page 40: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

40 Liste von Definitionen u.ä.

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]:7 r.append(a[0])8 a = a[1:]9 else:10 r.append(b[0])

Page 41: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.7. Geschachtelte Schleifen 41

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

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

Page 42: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

42 Liste von Definitionen u.ä.

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

– 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)

Page 43: Kapitel 6: Anweisungen - groups.uni-paderborn.degroups.uni-paderborn.de/fg-karl/lehre/ws1819/gp1/vorlesung/ch6-statements/ch6... · • Semantik: die angegebene Folge von Anweisungen

6.8. Zusammenfassung 43

• 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