====== For-Schleifen ======
===== - Einfache for-Schleife =====
Bisher haben wir (offiziell) nur mit **while-Schleifen** gearbeitet, wie der folgenden:
i = 0 # benoetigen eine Variable (genannt Index), setzte auf Startwert
while i < 10: # solange Bedingung x < 10 erfuellt ist ...
print(i) # gebe Variable aus
i = i + 1 # erhoehe Variable, so dass Bedingung irgendwann nicht mehr erfuellt (sonst Endlosschleife!)
Die Schleife gibt alle Zahlen von $0,1,\ldots$ bis und mit $10$ aus. Genau das *Gleiche* kann man auch mit einer **for-Schleife** machen:
for i in range(0,10,1): # 1. Zahl: Startwert, 2. Zahl: Schlusswert+1, 3. Zahl: Schrittgroesse
print(i)
# Ausgabe: 0,1,2,3,4,5,6,7,8,9
Beachte dabei:
* Der Index (Variable) wird *automatisch in der Schleife erstellt*.
* Man muss nicht explizit dafür sorgen, dass Index erhöht wird, also *kein* `i = i + 1`.
Die **Vorteile** der for-Schleife liegen auf der Hand:
* weniger Code
* unmöglich, aus Versehen Endlosschleife zu programmieren.
Doch **warum** gibt es überhaupt while-Schleifen, wenn die Vorteile der for-Schleife so überwiegen?
* Es gibt Dinge, die man *nur mit while-Schleifen* umsetzen kann und *nicht* mit for-Schleifen.
* Zum Beispiel Endlosschleifen (sind manchmal tatsächlich erwünscht!).
* while-Schleifen sind einfacher zu verstehen und deshalb besser geeignet für den Einstieg.
Die for-Schleife im Beispiel oben kann man sogar noch kürzer schreiben:
for i in range(10):
print(i)
# Ausgabe: 0,1,2,3,4,5,6,7,8,9
Falls der Startwert des Index $0$ und die Schrittgrösse $1$ ist, muss man dies nicht explizit angeben.
==== Aufgaben A ====
=== Aufgabe A1 ===
1. Schaue dir die Beispiele mit den for-Schleifen unten an und ...
1. versuche herauszufinden, was sie machen/ausgeben.
1. Tippe nachher die Beispiele ab und überprüfe, ob du richtig gelegen hast.
**Beispiel 1**
for k in range(5):
print(k)
**Beispiel 2**
for k in range(15,3):
print(k)
**Beispiel 3**
for j in range(5,6,10):
print(j)
**Beispiel 3**
for i in range(8):
print(3*i)
=== Aufgabe A2 ===
In jedem der Beispiele unten hat es einen Fehler, resp. etwas, was unschön ist. Wie müsste der Code ausschauen?
**Beispiel 1**
i = 0
for i in range(4,12):
print(2*i)
++++Lösung|
$i = 0$ ist völlig überflüssig, wird in for-Schleife von Startwert $4$ gleich überschrieben.
Verbesserung:
for i in range(4,12):
print(2*i)
++++
**Beispiel 2**
for j in range(15):
print(5*i)
i = i + 3
++++Lösung|
$i = i + 3$ hat keine Relevanz, da sich die for-Schleife selbst um das erhöhen des Index kümmert. Da in der range-Funktion *keine* Schrittweite explizit angegeben wird, ist sie $1$. Möchte man eine Schrittweite von $3$ haben, muss man dies wie folgt umsetzen:
for j in range(0,15,3):
print(5*i)
++++
=== Aufgabe A3 ===
1. Wandle die while-Schleife in eine for-Schleife um (muss gleichen Output erzeugen):
i = 6
while i < 42:
print(i)
i = i + 4
2. Wandle die for-Schleife in eine while-Schleife um:
for a in range(10):
print(4*a)
++++Lösungen|
1. Variante I:
for i in range(6,42,4):
print(i)
1. Variante II:
for i in range(9):
print(6 + 4*i)
2. Variante I:
i = 0
while i < 10:
print(4*i)
i = i + 1
2. Variante II:
i = 0
while i < 37:
print(i)
i = i + 4
++++
=== Aufgabe A4 ===
Löse die folgenden kurzen Aufgaben mithilfe von for-Schleifen:
1. Schreibe eine for-Schleife, die die geraden Zahlen von 1 bis 20 ausgibt.
1. Schreibe eine for-Schleife, die die Quadratzahlen von 1 bis 10 ausgibt, also $1, 4, 9, \ldots $
++++Lösungen|
# 1. Variante I
for i in range(2,21,2):
print(i)
# 1. Variante II
for i in range(10):
print(2*i+2)
# 2.
for i in range(1,11):
print(i*i)
++++
===== - for-Schleifen für Listen =====
Im ersten Kapitel hier haben wir gesehen, dass man for- anstelle von while-Schleifen verwenden kann, um zum Beispiel hoch zu zählen: $0,1,2,...,10$. Besonders praktisch sind for-Schleifen aber, wenn man mit Listen arbeitet.
Wenn wir eine Liste, z.B. `li = ['Anna','Christian','Kunibert','Petra','Xavier']` haben, können wir mit einer while-Schleife die Elemente der Liste durchgehen:
i = 0
while i < len(li):
print(li[i])
i = i + 1
Das Gleiche können wir auch mit einer for-Schleife erreichen:
for i in range(len(li)):
print(li[i])
Vorteile:
* Kürzer
* muss sich nicht selbst um Erhöhung von Index `i` kümmern (Endlosschleife unmöglich!)
Im Beispiel oben interessieren wir uns nur für die *Elemente* und nicht deren Positionen in der Liste. Wir können deshalb mit einer for-Schleife auch die **Elemente direkt durchgehen**:
for el in li:
print(el)
==== Aufgaben B ====
=== Aufgabe B1 ===
Für diese mehrteilige Aufgabe arbeiten wir mit den folgenden zwei Listen.
animals = ['Hund', 'Katze', 'Kuh', 'Schwein', 'Vogel', 'Loewe', 'Elefant', 'Frosch', 'Pferd', 'Affe', 'Gans', 'Eule', 'Schaf', 'Ente', 'Hahn', 'Maus', 'Tiger', 'Baer', 'Biene', 'Delfin']
sounds = ['Wuff!', 'Miau!', 'Muh!', 'Oink!', 'Zwitscher!', 'Bruell!', 'Toeroeoe!', 'Quak!', 'Wieher!', 'Uh-uh!', 'Gaggel!', 'Hu-hu!', 'Maeh!', 'Quack!', 'Kikeriki!', 'Piep!', 'Grrr!', 'Grrr!', 'Summ!', 'Klack!']
Löse alle Aufgaben mithilfe von for-Schleifen.
== Teil 1 ==
Schreibe ein Programm, welches alle Tiere der Reihe nach ausgibt.
++++Lösung|
for animal in animals:
print(animal)
Beachte: Da die Liste `animals` heisst, macht es Sinn, dass man als Variable für ein einzelnes Element der Liste `animal` verwendet. Gewöhne dir an, sinnvolle Variablennamen zu verwenden.
++++
== Teil 2 ==
Schreibe ein Programm, welches immer ein Tier zusammen mit dem passenden Geräusch ausgibt:
Hund: Wuff!
Katze: Miau!
Kuh: Muh!
...
== Teil 3 ==
Schreibe ein Programm, welches ermittelt, an welcher Stelle die 'Gans' in der Liste `animals` steht.
== Teil 4 ==
Schreibe ein Programm, in dem die Benutzerin aufgefordert wird, ein Tier einzugeben. Der Code gibt dann aus, wie das Tier macht. Verwende for-Schleifen anstelle von while-Schleifen.
== Teil 5 ==
Schreibe ein Programm, welches ...
1. Ermittelt, welches Tier 'Bruell' macht.
1. Welche Tiere 'Grrr!' machen und diese in einer Liste speichert. Der Code soll auch noch funktionieren, wenn weitere Tiere eingetragen werden, die 'Grrr!' machen.
++++Lösungen|
animals = ['Hund', 'Katze', 'Kuh', 'Schwein', 'Vogel', 'Loewe', 'Elefant', 'Frosch', 'Pferd', 'Affe', 'Gans', 'Eule', 'Schaf', 'Ente', 'Hahn', 'Maus', 'Tiger', 'Baer', 'Biene', 'Delfin']
sounds = ['Wuff!', 'Miau!', 'Muh!', 'Oink!', 'Zwitscher!', 'Bruell!', 'Toeroeoe!', 'Quak!', 'Wieher!', 'Uh-uh!', 'Gaggel!', 'Hu-hu!', 'Maeh!', 'Quack!', 'Kikeriki!', 'Piep!', 'Grrr!', 'Grrr!', 'Summ!', 'Klack!']
print("### Teil 1 ###")
for animal in animals:
print(animal)
print("\n### Teil 2 ###")
for i in range(len(animals)): # oder ...range(len(sounds)), spielt keine Rolle, beide Listen sind gleich lang
print(animals[i] + ' : ' + sounds[i])
print("\n### Teil 3 ###")
for i in range(len(animals)):
if animals[i] == 'Gans':
print(i)
break # optional, bricht Schleife ab, sobald hier angelangt ist
print("\n### Teil 4 (V1) ###")
inp = input("Gib ein Tier ein")
for i in range(len(animals)):
if animals[i] == inp:
print(inp + " macht: " + sounds[i])
print("\n### Teil 4 (V2) ###")
inp = input("Gib ein Tier ein")
animal_found = False
for i in range(len(animals)):
if animals[i] == inp:
print(inp + " macht: " + sounds[i])
animal_found = True
if not animal_found: # oder: if animal_found == False:
print("Tier " + inp + " leider nicht gefunden!")
print("\n### Teil 5.1 ###")
for i in range(len(animals)):
if sounds[i] == 'Bruell!':
print(animals[i])
break
print("\n### Teil 5.1 ###")
animals_grrr = []
for i in range(len(animals)):
if sounds[i] == 'Grrr!':
animals_grrr.append(animals[i])
print(animals_grrr)
++++
=== Aufgabe B2 ===
Kunst mit verschachtelten for-Schleifen!
Betrachte das folgende Beispiel, welches ein Muster in der Konsole erzeugt.
for i in range(5):
for j in range(i+1):
print('*', end='')
print()
Schreibe nun einen Code, auch mit zwei ineinander verschachtelten for-Schleifen, die das folgende Schachbrett.Muster erzeugen:
o o o o
o o o o
o o o o
o o o o
o o o o
o o o o
o o o o
o o o o
Tipp: Fügt man dem print-Befehl die Option `end=''` an, wird am Ende **kein Zeilenumbruch** gemacht.
print(1,end='')
print(2,end='')
print(3,end='')
"""
Ausgabe: 123
Anstelle von:
1
2
3
"""