for-Schleifen in Python
Lerne, wie du mit for-Schleifen ueber Listen, Strings und Bereiche iterierst. Von range() bis enumerate() und zip().
for-Schleife Grundlagen
Die for-Schleife in Python ist anders als in vielen anderen Sprachen. Sie iteriert ueber die Elemente einer Sequenz (Liste, String, Bereich, etc.):
fruechte = ["Apfel", "Banane", "Kirsche"]
for frucht in fruechte:
print(frucht)
Ausgabe:
Apfel
Banane
Kirsche
Die Grundstruktur lautet:
for variable in iterable:
# Code, der fuer jedes Element ausgefuehrt wird
pass
variablenimmt bei jedem Durchlauf den Wert des naechsten Elements an.iterableist alles, was man “durchlaufen” kann (Liste, String, range, etc.).- Der eingerueckte Block wird fuer jedes Element einmal ausgefuehrt.
Die range() Funktion
range() erzeugt eine Zahlenfolge — perfekt zum Zaehlen:
range(n) — Von 0 bis n-1
for i in range(5):
print(i)
Ausgabe:
0
1
2
3
4
Beachte: range(5) erzeugt die Zahlen 0, 1, 2, 3, 4 — also 5 Zahlen, aber die 5 selbst ist nicht enthalten!
range(start, stop) — Von start bis stop-1
for i in range(3, 8):
print(i)
Ausgabe:
3
4
5
6
7
range(start, stop, step) — Mit Schrittweite
# Jede zweite Zahl
for i in range(0, 10, 2):
print(i, end=" ")
print() # 0 2 4 6 8
# Rueckwaerts zaehlen
for i in range(10, 0, -1):
print(i, end=" ")
print() # 10 9 8 7 6 5 4 3 2 1
# Countdown
for i in range(5, 0, -1):
print(f"{i}...")
print("Start!")
Ausgabe des Countdowns:
5...
4...
3...
2...
1...
Start!
Ueber Strings iterieren
Strings sind Sequenzen von Zeichen. Du kannst ueber jeden Buchstaben iterieren:
wort = "Python"
for buchstabe in wort:
print(buchstabe, end=" ")
Ausgabe:
P y t h o n
Beispiel: Vokale zaehlen
text = "Programmieren lernen macht Spass"
vokale = "aeiouAEIOU"
anzahl = 0
for zeichen in text:
if zeichen in vokale:
anzahl += 1
print(f"Der Text enthaelt {anzahl} Vokale.")
Ausgabe:
Der Text enthaelt 10 Vokale.
Ueber Listen iterieren
Listen sind die haeufigsten Iterables:
noten = [1.3, 2.7, 1.0, 3.3, 2.0]
summe = 0
for note in noten:
summe += note
durchschnitt = summe / len(noten)
print(f"Durchschnittsnote: {durchschnitt:.2f}")
Ausgabe:
Durchschnittsnote: 2.06
Ueber ein Dictionary iterieren
hauptstaedte = {
"Deutschland": "Berlin",
"Frankreich": "Paris",
"Italien": "Rom"
}
# Ueber Schluessel iterieren
for land in hauptstaedte:
print(land)
# Ueber Schluessel und Werte iterieren
for land, stadt in hauptstaedte.items():
print(f"Die Hauptstadt von {land} ist {stadt}.")
# Nur ueber Werte iterieren
for stadt in hauptstaedte.values():
print(stadt)
enumerate() — Index und Wert gleichzeitig
Manchmal brauchst du den Index und den Wert gleichzeitig. Dafuer gibt es enumerate():
fruechte = ["Apfel", "Banane", "Kirsche", "Dattel"]
for index, frucht in enumerate(fruechte):
print(f"{index}: {frucht}")
Ausgabe:
0: Apfel
1: Banane
2: Kirsche
3: Dattel
Startindex festlegen
teilnehmer = ["Anna", "Bob", "Clara"]
for nummer, name in enumerate(teilnehmer, start=1):
print(f"Platz {nummer}: {name}")
Ausgabe:
Platz 1: Anna
Platz 2: Bob
Platz 3: Clara
Warum enumerate() statt range(len())?
farben = ["rot", "gruen", "blau"]
# UMSTAENDLICH:
for i in range(len(farben)):
print(f"{i}: {farben[i]}")
# BESSER (pythonisch):
for i, farbe in enumerate(farben):
print(f"{i}: {farbe}")
Beide liefern dasselbe Ergebnis, aber enumerate() ist lesbarer und eleganter.
zip() — Parallele Iteration
Mit zip() iterierst du ueber mehrere Sequenzen gleichzeitig:
namen = ["Anna", "Bob", "Clara"]
alter = [25, 30, 22]
for name, a in zip(namen, alter):
print(f"{name} ist {a} Jahre alt.")
Ausgabe:
Anna ist 25 Jahre alt.
Bob ist 30 Jahre alt.
Clara ist 22 Jahre alt.
zip() mit drei Listen
namen = ["Anna", "Bob", "Clara"]
faecher = ["Mathe", "Physik", "Informatik"]
noten = [1.3, 2.0, 1.7]
for name, fach, note in zip(namen, faecher, noten):
print(f"{name}: {fach} = {note}")
Ausgabe:
Anna: Mathe = 1.3
Bob: Physik = 2.0
Clara: Informatik = 1.7
zip() stoppt beim kuerzesten Iterable
a = [1, 2, 3, 4, 5]
b = ["a", "b", "c"]
for x, y in zip(a, b):
print(x, y)
# Nur 3 Durchlaeufe -- zip stoppt bei der kuerzeren Liste
Ausgabe:
1 a
2 b
3 c
break und continue
break — Schleife vorzeitig beenden
# Suche die erste negative Zahl
zahlen = [5, 3, 8, -2, 7, -4]
for zahl in zahlen:
if zahl < 0:
print(f"Erste negative Zahl gefunden: {zahl}")
break
print(f"{zahl} ist positiv.")
Ausgabe:
5 ist positiv.
3 ist positiv.
8 ist positiv.
Erste negative Zahl gefunden: -2
continue — Aktuellen Durchlauf ueberspringen
# Nur positive Zahlen ausgeben
zahlen = [5, -3, 8, -2, 7, -4]
for zahl in zahlen:
if zahl < 0:
continue # Rest ueberspringen, naechster Durchlauf
print(zahl)
Ausgabe:
5
8
7
break in verschachtelten Schleifen
break beendet nur die innerste Schleife:
for i in range(3):
for j in range(3):
if j == 2:
break # Beendet nur die innere Schleife
print(f"i={i}, j={j}")
print(f"--- Innere Schleife bei i={i} beendet ---")
Die else-Klausel bei for-Schleifen
Python hat eine besondere Funktion: for...else. Der else-Block wird ausgefuehrt, wenn die Schleife ohne break durchgelaufen ist:
# Pruefe, ob eine Zahl eine Primzahl ist
zahl = 17
for i in range(2, zahl):
if zahl % i == 0:
print(f"{zahl} ist keine Primzahl (teilbar durch {i}).")
break
else:
print(f"{zahl} ist eine Primzahl!")
Ausgabe:
17 ist eine Primzahl!
# Suche nach einem Element
namen = ["Anna", "Bob", "Clara"]
gesucht = "David"
for name in namen:
if name == gesucht:
print(f"{gesucht} gefunden!")
break
else:
print(f"{gesucht} nicht in der Liste.")
Ausgabe:
David nicht in der Liste.
Verschachtelte Schleifen
Du kannst Schleifen ineinander verschachteln:
for i in range(1, 4):
for j in range(1, 4):
print(f"({i},{j})", end=" ")
print() # Neue Zeile nach jeder inneren Schleife
Ausgabe:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
Praxis: Multiplikationstabelle
# Multiplikationstabelle 1 bis 10
print("Multiplikationstabelle:")
print("-" * 55)
# Kopfzeile
print(" ", end="")
for j in range(1, 11):
print(f"{j:5d}", end="")
print()
print("-" * 55)
# Tabelle
for i in range(1, 11):
print(f"{i:3d} |", end="")
for j in range(1, 11):
print(f"{i*j:5d}", end="")
print()
Ausgabe (gekuerzt):
Multiplikationstabelle:
-------------------------------------------------------
1 2 3 4 5 6 7 8 9 10
-------------------------------------------------------
1 | 1 2 3 4 5 6 7 8 9 10
2 | 2 4 6 8 10 12 14 16 18 20
3 | 3 6 9 12 15 18 21 24 27 30
...
Praxis: Sternmuster drucken
# Dreieck
hoehe = 5
for i in range(1, hoehe + 1):
print("*" * i)
Ausgabe:
*
**
***
****
*****
# Zentriertes Dreieck (Pyramide)
hoehe = 5
for i in range(1, hoehe + 1):
leerzeichen = " " * (hoehe - i)
sterne = "*" * (2 * i - 1)
print(leerzeichen + sterne)
Ausgabe:
*
***
*****
*******
*********
# Raute
hoehe = 5
# Obere Haelfte
for i in range(1, hoehe + 1):
leerzeichen = " " * (hoehe - i)
sterne = "*" * (2 * i - 1)
print(leerzeichen + sterne)
# Untere Haelfte
for i in range(hoehe - 1, 0, -1):
leerzeichen = " " * (hoehe - i)
sterne = "*" * (2 * i - 1)
print(leerzeichen + sterne)
Uebungen
Uebung 1: Summe von 1 bis n
Schreibe ein Programm, das die Summe aller Zahlen von 1 bis n berechnet (n wird vom Benutzer eingegeben).
Loesung anzeigen
n = int(input("Gib eine Zahl ein: "))
summe = 0
for i in range(1, n + 1):
summe += i
print(f"Die Summe von 1 bis {n} ist {summe}.")
# Bonus: Direkt mit sum()
print(f"Kontrolle: {sum(range(1, n + 1))}")
Uebung 2: FizzBuzz
Gib die Zahlen von 1 bis 30 aus. Wenn die Zahl durch 3 teilbar ist, gib “Fizz” aus. Wenn durch 5 teilbar, “Buzz”. Wenn durch beide teilbar, “FizzBuzz”.
Loesung anzeigen
for i in range(1, 31):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
Uebung 3: Umgekehrter String
Schreibe ein Programm, das einen String Zeichen fuer Zeichen umkehrt (ohne [::-1] zu verwenden).
Loesung anzeigen
text = input("Gib einen Text ein: ")
umgekehrt = ""
for zeichen in text:
umgekehrt = zeichen + umgekehrt
print(f"Umgekehrt: {umgekehrt}")
Uebung 4: Haeufigste Buchstaben
Schreibe ein Programm, das zaehlt, wie oft jeder Buchstabe in einem Text vorkommt.
Loesung anzeigen
text = input("Gib einen Text ein: ").lower()
buchstaben = {}
for zeichen in text:
if zeichen.isalpha():
if zeichen in buchstaben:
buchstaben[zeichen] += 1
else:
buchstaben[zeichen] = 1
# Sortiert nach Haeufigkeit ausgeben
for buchstabe, anzahl in sorted(buchstaben.items(), key=lambda x: x[1], reverse=True):
print(f"'{buchstabe}': {anzahl}x")
Pro-Tipp: Vermeide range(len()) — es gibt fast immer einen besseren Weg!
farben = ["rot", "gruen", "blau"]
# NICHT pythonisch:
for i in range(len(farben)):
print(farben[i])
# Pythonisch -- direkt iterieren:
for farbe in farben:
print(farbe)
# Wenn du den Index brauchst -- enumerate():
for i, farbe in enumerate(farben):
print(f"{i}: {farbe}")
# Fuer zwei Listen -- zip():
codes = ["#FF0000", "#00FF00", "#0000FF"]
for farbe, code in zip(farben, codes):
print(f"{farbe}: {code}")
Dieses Prinzip heisst “Pythonic Code” — Python bietet elegante Werkzeuge, nutze sie!