Lösungen: Teil 8 - Schleifen
Lösung 8.1: Einfache for-Schleife
def zahlen_bis_fuenf():
"""Erstellt eine Liste mit Zahlen von 1 bis 5."""
zahlen = []
for i in range(1, 6):
zahlen.append(i)
return zahlenAlternative (List Comprehension):
def zahlen_bis_fuenf():
"""Erstellt eine Liste mit Zahlen von 1 bis 5."""
return [i for i in range(1, 6)]Alternative (direkt mit list und range):
def zahlen_bis_fuenf():
"""Erstellt eine Liste mit Zahlen von 1 bis 5."""
return list(range(1, 6))Erklärung: range(1, 6) erzeugt Zahlen von 1 bis 5 (6 ist exklusiv).
Lösung 8.2: Summe mit Schleife
def summe_bis_n(n):
"""Berechnet die Summe von 1 bis n."""
summe = 0
for i in range(1, n + 1):
summe = summe + i
return summeAlternative (kürzer):
def summe_bis_n(n):
"""Berechnet die Summe von 1 bis n."""
summe = 0
for i in range(1, n + 1):
summe += i
return summeErklärung:
summe = 0ist der Akkumulator (Startwert)- In jeder Iteration wird der aktuelle Wert
izur Summe addiert summe += iist Kurzform fürsumme = summe + i
Beispiel für n=5:
- Iteration 1: summe = 0 + 1 = 1
- Iteration 2: summe = 1 + 2 = 3
- Iteration 3: summe = 3 + 3 = 6
- Iteration 4: summe = 6 + 4 = 10
- Iteration 5: summe = 10 + 5 = 15
Lösung 8.3: Gerade Zahlen zählen
def gerade_zaehlen(zahlen):
"""Zählt gerade Zahlen in einer Liste."""
anzahl = 0
for zahl in zahlen:
if zahl % 2 == 0:
anzahl += 1
return anzahlErklärung:
- Der Modulo-Operator
%gibt den Rest zurück zahl % 2 == 0bedeutet: durch 2 teilbar (gerade)- Wir zählen mit
anzahl += 1jede gerade Zahl
Lösung 8.4: Code Reading
Antworten:
Wie oft wird die Schleife durchlaufen?
3 Mal (die Liste
zahlenhat 3 Elemente: 10, 20, 30)Tabelle:
| Iteration | zahl | summe (vorher) | summe (nachher) |
|---|---|---|---|
| 1 | 10 | 0 | 10 |
| 2 | 20 | 10 | 30 |
| 3 | 30 | 30 | 60 |
Finaler Wert von
summe:60
Detaillierte Erklärung:
summe = 0 # summe = 0
zahlen = [10, 20, 30]
# Iteration 1:
zahl = 10 # Erstes Element
summe = summe + zahl # 0 + 10 = 10
print(f"Aktuelle Summe: {summe}") # Ausgabe: Aktuelle Summe: 10
# Iteration 2:
zahl = 20 # Zweites Element
summe = summe + zahl # 10 + 20 = 30
print(f"Aktuelle Summe: {summe}") # Ausgabe: Aktuelle Summe: 30
# Iteration 3:
zahl = 30 # Drittes Element
summe = summe + zahl # 30 + 30 = 60
print(f"Aktuelle Summe: {summe}") # Ausgabe: Aktuelle Summe: 60
print(f"Gesamt-Summe: {summe}") # Ausgabe: Gesamt-Summe: 60Lösung 8.5: Debugging
Fehler: range(1, 10) geht nur bis 9, nicht bis 10. Die Zahl 9 fehlt in der Liste.
Problem:
for i in range(1, 10): # range(1, 10) = [1, 2, 3, 4, 5, 6, 7, 8, 9]Korrekte Lösung:
def ungerade_zahlen():
"""Sammelt ungerade Zahlen von 1 bis 10."""
ungerade = []
for i in range(1, 11): # 11 statt 10, damit 10 inkludiert wird
if i % 2 == 1:
ungerade.append(i)
return ungerade
# Test
print(ungerade_zahlen()) # Ausgabe: [1, 3, 5, 7, 9]Erklärung:
range(start, stop)ist exklusiv beistop(die obere Grenze wird nicht eingeschlossen)range(1, 10)erzeugt 1, 2, 3, 4, 5, 6, 7, 8, 9 (ohne 10)range(1, 11)erzeugt 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 (mit 10)
Alternative Lösung (nur ungerade Zahlen in range):
def ungerade_zahlen():
"""Sammelt ungerade Zahlen von 1 bis 10."""
ungerade = []
for i in range(1, 11, 2): # Start 1, Stop 11, Step 2 (überspringt gerade Zahlen)
ungerade.append(i)
return ungeradeBonus-Übungen
Lösung Bonus 3: Fakultät
def fakultaet(n):
"""Berechnet die Fakultät von n (n!)."""
ergebnis = 1
for i in range(1, n + 1):
ergebnis *= i
return ergebnisErklärung:
- Fakultät: n! = n × (n-1) × ... × 2 × 1
- Beispiel 5!: 1 × 2 × 3 × 4 × 5 = 120
- Sonderfall: 0! = 1 (per Definition)
Lösung Bonus 4: Summe einer Liste
def summe_liste(zahlen):
"""Berechnet die Summe aller Zahlen in einer Liste."""
summe = 0
for zahl in zahlen:
summe += zahl
return summeErklärung: Wir iterieren über alle Elemente und addieren sie zur Summe.
Lösung Bonus 5: Durchschnitt berechnen
def durchschnitt(zahlen):
"""Berechnet den Durchschnitt einer Liste."""
summe = 0
for zahl in zahlen:
summe += zahl
return summe / len(zahlen)Alternative (mit sum):
def durchschnitt(zahlen):
"""Berechnet den Durchschnitt einer Liste."""
return sum(zahlen) / len(zahlen)Erklärung: Durchschnitt = Summe aller Zahlen ÷ Anzahl der Zahlen
Lösung Bonus 6: Gerade Zahlen filtern
def gerade_zahlen(zahlen):
"""Filtert alle geraden Zahlen aus einer Liste."""
ergebnis = []
for zahl in zahlen:
if zahl % 2 == 0:
ergebnis.append(zahl)
return ergebnisAlternative (List Comprehension):
def gerade_zahlen(zahlen):
"""Filtert alle geraden Zahlen aus einer Liste."""
return [zahl for zahl in zahlen if zahl % 2 == 0]Erklärung: Wir prüfen jede Zahl mit % 2 == 0 und fügen nur gerade Zahlen der Ergebnis-Liste hinzu.
Lösung Bonus 10: Liste verdoppeln
def liste_verdoppeln(zahlen):
"""Verdoppelt jedes Element in einer Liste."""
ergebnis = []
for zahl in zahlen:
ergebnis.append(zahl * 2)
return ergebnisAlternative (List Comprehension):
def liste_verdoppeln(zahlen):
"""Verdoppelt jedes Element in einer Liste."""
return [zahl * 2 for zahl in zahlen]Erklärung: Wir multiplizieren jedes Element mit 2 und fügen es der neuen Liste hinzu.
Lösung Bonus 13: Primzahl-Checker
def ist_primzahl(n):
"""Prüft, ob eine Zahl eine Primzahl ist."""
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return TrueOptimierte Version:
def ist_primzahl(n):
"""Prüft, ob eine Zahl eine Primzahl ist."""
if n < 2:
return False
# Nur bis zur Quadratwurzel prüfen
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return TrueErklärung:
- Primzahlen sind nur durch 1 und sich selbst teilbar
- Wir prüfen alle Zahlen von 2 bis n-1 auf Teilbarkeit
- Wenn eine Zahl n teilt, ist es keine Primzahl
- Optimierung: Nur bis √n prüfen nötig
Lösung Bonus 14: Fibonacci-Sequenz
def fibonacci(n):
"""Generiert die ersten n Fibonacci-Zahlen."""
if n == 0:
return []
elif n == 1:
return [0]
fib = [0, 1]
for i in range(2, n):
fib.append(fib[i-1] + fib[i-2])
return fibErklärung:
- Fibonacci-Sequenz: Jede Zahl ist die Summe der zwei vorherigen
- Start: [0, 1]
- Dann: 0+1=1, 1+1=2, 1+2=3, 2+3=5, 3+5=8, ...
- Beispiel n=7: [0, 1, 1, 2, 3, 5, 8]
Lösung Bonus 15: Liste sortieren
def sortiere_liste(zahlen):
"""Sortiert eine Liste aufsteigend."""
return sorted(zahlen)Alternative (in-place mit .sort()):
def sortiere_liste(zahlen):
"""Sortiert eine Liste aufsteigend."""
kopie = zahlen.copy()
kopie.sort()
return kopieErklärung:
sorted(zahlen)erstellt eine neue sortierte Listezahlen.sort()sortiert die Liste direkt (in-place)- Wir kopieren die Liste, damit die Ursprungsliste unverändert bleibt