196 lines
6.5 KiB
Markdown
196 lines
6.5 KiB
Markdown
# Kapitel G05: Schleifen & Wiederholungen 🎡🔄
|
||
|
||
Willkommen zu **Kapitel G05** unseres Python-Grundlagen-Lehrpfads!
|
||
Dieses Kapitel entspricht den Modulen **09.1 & 09.2** deines Informatik-Skriptums.
|
||
|
||
Computer sind genial darin, dieselbe Aufgabe tausende oder millionen Male in Millisekunden auszuführen – ohne müde zu werden oder Fehler zu machen. Das Werkzeug dafür sind **Schleifen (Loops)**!
|
||
|
||
---
|
||
|
||
## 🎡 Die Karussell- & Riesenrad-Analogie
|
||
|
||
Stell dir einen Jahrmarkt vor:
|
||
- **`for`-Schleife (Zählschleife):** Wie ein Karussell mit Wertmarken. Du kaufst dir 5 Runden. Der Automat zählt mit: Runde 1, 2, 3, 4, 5. Nach 5 Runden stoppt das Karussell automatisch.
|
||
- **`while`-Schleife (Bedingungsschleife):** Wie ein Riesenrad, das sich dreht, **solange** die Musik spielt. Sobald die Musik stoppt (Bedingung wird `False`), hält das Rad an.
|
||
|
||
```
|
||
[ FOR-SCHLEIFE ] [ WHILE-SCHLEIFE ]
|
||
"Fahre genau 5 Runden!" "Fahre, SOLANGE Musik läuft!"
|
||
┌───────────┐ ┌───────────┐
|
||
│ Runde 1/5 │ │ Musik da? │ ── Nein ──> Stopp
|
||
│ Runde 2/5 │ └─────┬─────┘
|
||
│ Runde 3/5 │ │ Ja
|
||
│ Runde 4/5 │ ┌─────▼─────┐
|
||
│ Runde 5/5 │ │ 1 Runde │
|
||
└─────┬─────┘ └─────┬─────┘
|
||
▼ │
|
||
FERTIG └───────── Wiederholen!
|
||
```
|
||
|
||
---
|
||
|
||
## 1. Die Zählschleife: `for` und die `range()`-Funktion
|
||
|
||
Wenn du im Voraus weißt, **wie oft** etwas wiederholt werden soll, ist die `for`-Schleife die perfekte Wahl.
|
||
|
||
### Wie funktioniert `range()`?
|
||
|
||
Die `range()`-Funktion erzeugt eine Zahlenfolge. **Wichtigste Regel:** Das `stop`-Element ist **immer exklusiv** (wird nicht mehr erreicht)!
|
||
|
||
```
|
||
range(stop) -> 0 bis stop - 1
|
||
range(start, stop) -> start bis stop - 1
|
||
range(start, stop, step) -> start bis stop - 1 mit Schrittweite step
|
||
```
|
||
|
||
#### Visualisierung:
|
||
```
|
||
range(1, 6) ──> [ 1, 2, 3, 4, 5 ] (6 ist NICHT dabei!)
|
||
range(0, 10, 2) ─> [ 0, 2, 4, 6, 8 ] (nur gerade Zahlen!)
|
||
range(5, 0, -1) ─> [ 5, 4, 3, 2, 1 ] (rückwärts zählen!)
|
||
```
|
||
|
||
```python
|
||
# Einfaches Beispiel:
|
||
for i in range(1, 6):
|
||
print(f"Runde {i}")
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Die Bedingungsschleife: `while`
|
||
|
||
Wenn du vorher **nicht genau weißt**, wie viele Durchläufe nötig sind, sondern die Wiederholung an eine **Bedingung** geknüpft ist:
|
||
|
||
```python
|
||
energie = 3
|
||
while energie > 0:
|
||
print(f"Roboter läuft... Energie: {energie}")
|
||
energie -= 1 # ⚠️ WICHTIG: Schleifenzähler verändern!
|
||
|
||
print("Roboter hat keine Energie mehr.")
|
||
```
|
||
|
||
### 🛑 Die Gefahr der Endlosschleife (Infinite Loop)
|
||
|
||
Wenn die Bedingung einer `while`-Schleife niemals `False` wird, läuft das Programm für immer und friert ein:
|
||
|
||
```python
|
||
# 💥 GEFÄHRLICH: Endlosschleife!
|
||
x = 1
|
||
while x > 0:
|
||
print(x)
|
||
# Vergessen, x zu verändern -> x bleibt immer 1 -> Bedingung immer True!
|
||
```
|
||
|
||
> **Tipp zum Abbrechen:** Falls dein Programm in einer Endlosschleife festhängt, drücke im Terminal <kbd>Strg</kbd> + <kbd>C</kbd> (Ctrl+C).
|
||
|
||
---
|
||
|
||
## 3. Schleifen steuern: `break` & `continue`
|
||
|
||
Manchmal möchtest du eine Schleife vorzeitig beenden oder eine Runde überspringen:
|
||
|
||
- **`break` (Die Notbremse):** Verlässt die Schleife **sofort**, egal wie viele Runden noch übrig wären.
|
||
- **`continue` (Nächste Runde):** Bricht nur den **aktuellen Durchlauf** ab und springt direkt zur nächsten Runde.
|
||
|
||
```python
|
||
# Beispiel break:
|
||
for zahl in range(1, 10):
|
||
if zahl == 5:
|
||
print("Treffer! Schleife wird abgebrochen.")
|
||
break
|
||
print(zahl) # Gibt 1, 2, 3, 4 aus
|
||
|
||
# Beispiel continue:
|
||
for zahl in range(1, 6):
|
||
if zahl == 3:
|
||
print("Zahl 3 wird übersprungen!")
|
||
continue
|
||
print(zahl) # Gibt 1, 2, 4, 5 aus
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Das Schleifen-Akkumulator-Muster 🧺
|
||
|
||
Ein **Akkumulator** ist eine Hilfsvariable, die **vor** der Schleife erstellt wird und in jedem Schleifendurchlauf einen neuen Wert aufsammelt.
|
||
|
||
```python
|
||
# 1. Summen-Akkumulator (Startwert: 0)
|
||
summe = 0
|
||
for x in [10, 20, 30]:
|
||
summe += x # summe = summe + x
|
||
print("Summe:", summe) # 60
|
||
|
||
# 2. Zähler-Akkumulator (Startwert: 0)
|
||
anzahl_gerade = 0
|
||
for x in range(1, 11):
|
||
if x % 2 == 0:
|
||
anzahl_gerade += 1
|
||
print("Gerade Zahlen:", anzahl_gerade) # 5
|
||
|
||
# 3. Produkt-Akkumulator (Startwert: 1, NIEMALS 0!)
|
||
produkt = 1
|
||
for x in range(1, 5):
|
||
produkt *= x # 1 * 2 * 3 * 4
|
||
print("Produkt:", produkt) # 24
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 🌟 Praxisbeispiele
|
||
|
||
### Beispiel A: Kleines Einmaleins (Verschachtelte Schleifen)
|
||
```python
|
||
for zeile in range(1, 4):
|
||
for spalte in range(1, 4):
|
||
ergebnis = zeile * spalte
|
||
print(f"{zeile}x{spalte}={ergebnis:2d}", end=" ")
|
||
print() # Zeilenumbruch
|
||
```
|
||
|
||
### Beispiel B: Zahlen-Ratespiel mit `while` und `break`
|
||
```python
|
||
geheime_zahl = 7
|
||
versuche = 0
|
||
|
||
while True:
|
||
versuche += 1
|
||
tipp = int(input("Rate eine Zahl zwischen 1 und 10: "))
|
||
if tipp == geheime_zahl:
|
||
print(f"🎉 Richtig erraten nach {versuche} Versuchen!")
|
||
break
|
||
elif tipp < geheime_zahl:
|
||
print("Zu klein!")
|
||
else:
|
||
print("Zu groß!")
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ Die 3 häufigsten Anfängerfehler
|
||
|
||
1. **Off-by-One Fehler bei `range()`:**
|
||
- `range(1, 5)` läuft nur bis 4! Wenn du die 5 inklusive haben willst, schreibe `range(1, 6)`.
|
||
2. **Akkumulator in der Schleife zurücksetzen:**
|
||
- Wenn du `summe = 0` **in** der Schleife schreibst, wird die Summe in jeder Runde gelöscht! Der Startwert muss **vor** der Schleife stehen.
|
||
3. **Endlosschleife bei `while`:**
|
||
- Vergiss nicht, die Variable in der `while`-Bedingung innerhalb der Schleife anzupassen (`i += 1` oder `n //= 10`).
|
||
|
||
---
|
||
|
||
## 🎯 Deine Aufgaben in `aufgabe.py`
|
||
|
||
Öffne `aufgabe.py` und bearbeite die Aufgaben:
|
||
1. **TODO 1:** `summe_bis(n: int) -> int` – Berechnet $1 + 2 + \dots + n$.
|
||
2. **TODO 2:** `fakultaet(n: int) -> int` – Berechnet $n! = 1 \cdot 2 \cdots n$.
|
||
3. **TODO 3:** `zaehle_gerade_zahlen(start: int, ende: int) -> int` – Zählt gerade Zahlen.
|
||
4. **TODO 4:** `ist_primzahl(n: int) -> bool` – Prüft Primzahlen.
|
||
5. **TODO 5:** `quorsumme(n: int) -> int` – Berechnet die Quersumme mit einer `while`-Schleife.
|
||
|
||
### Testen:
|
||
```bash
|
||
python3 test_aufgabe.py
|
||
```
|
||
Sobald alle 5 Tests grün sind (`OK`), kannst du zu Kapitel G06 weitergehen!
|