Code mehrfach ausführen mit for-Schleifen#
In der Programmierung ist es oft notwendig, denselben Codeblock mehrfach auszuführen. Dies kann durch Schleifen erreicht werden.
In Python gibt es folgende Schleifenarten:
forSchleifen: Diese werden verwendet, um über eine Sequenz (wie eine Liste, ein Tupel oder eine Zeichenkette) zu iterieren.whileSchleifen: Diese führen einen Codeblock aus, solange eine bestimmte Bedingung wahr ist.
Aufgrund der unterschiedlichen Funktionsweisen spricht man auch von Zählschleifen (for) und Bedingungsschleifen (while).
In Aufgabenstellungen gibt es häufig Hinweise, dass eine Schleife verwendet werden kann:
“Wiederhole bis…/ solange wie…”
Summen \(\sum_{i=1}^{n} a_j = a_1+\ldots +a_n\)
Produkte \(\prod_{i=1}^{n} a_j = a_1 \cdot a_2 \cdot \ldots \cdot a_n\)
Laufvariablen \(j=1,2,\ldots,n\)
For-Schleifen#
Die Syntax einer for-Schleife in Python ist wie folgt:
for element in sequence:
####
# Codeblock, der für jedes Element in der Sequenz ausgeführt wird
####
sequencekann jedes iterierbare Objekt (Iterable) sein, wie eine Liste, ein Tupel, eine Zeichenkette oder ein Bereich (range) von Zahlen.Der Codeblock innerhalb der Schleife wird für jedes Element in der Sequenz ausgeführt (Wichtig: Einrückung durch Tab oder Leerzeichen beachten!).
Die Variable
elementnimmt dabei nacheinander die Werte der Elemente in der Sequenz an.Die Variable
elementexistiert auch nach der Schleife weiter und hat den letzten Wert der Sequenz.
for i in range(5):
print("Step ", i)
for i in range(10,30,5):
print("Step ", i)
print("Value of i after loop:", i)
Step 0
Step 1
Step 2
Step 3
Step 4
Step 10
Step 15
Step 20
Step 25
Value of i after loop: 25
my_list = ["Hello", "my", "name", "is", "Python"]
for word in my_list:
print(word)
Hello
my
name
is
Python
for c in "Python":
print(c)
P
y
t
h
o
n
For-Schleifen mit enumerate#
Manchmal will man durch eine Liste iterieren und gleichzeitig den Index des aktuellen Elements kennen.
Man kann eine
for-Schleife mitrange(len(...))verwenden, um die Indizes zu erhalten.Eine elegantere Lösung ist die Verwendung der Funktion
enumerate(), die sowohl den Index als auch das Element zurückgibt.
my_list = ["Hello", "my", "name", "is", "Python"]
for index, word in enumerate(my_list):
print(f"Wort {index}: {word}")
Wort 0: Hello
Wort 1: my
Wort 2: name
Wort 3: is
Wort 4: Python
Im folgenden Beispiel wollen wir jedes zweite Wort der Liste ausgeben
for index, word in enumerate(my_list):
if index % 2 == 0:
print(word)
Hello
name
Python
Vorsicht beim verändern der Sequence während der Schleife#
Wenn man die Sequence während der Iteration verändert (z.B. Elemente löscht), kann dies zu unerwartetem Verhalten führen, da die Indizes der verbleibenden Elemente sich ändern.
my_list = list(range(10))
for i in my_list:
if i % 2 == 0:
del my_list[i]
print(my_list)
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[9], line 4
2 for i in my_list:
3 if i % 2 == 0:
----> 4 del my_list[i]
5 print(my_list)
IndexError: list assignment index out of range
Geschachtelte for-Schleifen#
Wie alle Blöcke in Python können auch for-Schleifen geschachtelt werden.
Die Einrückung muss dabei korrekt beachtet werden.
Die inneren Schleifen dürfen von den äußeren Zählvariablen abhängig sein (aber nicht umgekehrt).
Das folgende Beispiel erzeugt das Pascal’sche Dreieck.
tri = [[1]]
for i in range(10):
tri.append([1])
for j in range(1,i+1):
tri[i+1].append(tri[i][j] + tri[i][j-1])
tri[i+1].append(1)
print(*tri, sep="\n")
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
Beispiel: Ausgabe des Pascal’schen Dreiecks für Binomialformeln#
Das Pascal’sche Dreieck gibt die Koeffizienten der Binomialformeln an. Die \(n\)-te Zeile des Dreiecks enthält die Koeffizienten für die Entwicklung von \((x+y)^n\).
for i, row in enumerate(tri):
print(f"(x+y)^{i} = ", end="")
for j, n in enumerate(row):
print(f"{n}x^{i-j}y^{j}", end="")
if j < i:
print(" + ", end="")
print("")
(x+y)^0 = 1x^0y^0
(x+y)^1 = 1x^1y^0 + 1x^0y^1
(x+y)^2 = 1x^2y^0 + 2x^1y^1 + 1x^0y^2
(x+y)^3 = 1x^3y^0 + 3x^2y^1 + 3x^1y^2 + 1x^0y^3
(x+y)^4 = 1x^4y^0 + 4x^3y^1 + 6x^2y^2 + 4x^1y^3 + 1x^0y^4
(x+y)^5 = 1x^5y^0 + 5x^4y^1 + 10x^3y^2 + 10x^2y^3 + 5x^1y^4 + 1x^0y^5
(x+y)^6 = 1x^6y^0 + 6x^5y^1 + 15x^4y^2 + 20x^3y^3 + 15x^2y^4 + 6x^1y^5 + 1x^0y^6
(x+y)^7 = 1x^7y^0 + 7x^6y^1 + 21x^5y^2 + 35x^4y^3 + 35x^3y^4 + 21x^2y^5 + 7x^1y^6 + 1x^0y^7
(x+y)^8 = 1x^8y^0 + 8x^7y^1 + 28x^6y^2 + 56x^5y^3 + 70x^4y^4 + 56x^3y^5 + 28x^2y^6 + 8x^1y^7 + 1x^0y^8
(x+y)^9 = 1x^9y^0 + 9x^8y^1 + 36x^7y^2 + 84x^6y^3 + 126x^5y^4 + 126x^4y^5 + 84x^3y^6 + 36x^2y^7 + 9x^1y^8 + 1x^0y^9
(x+y)^10 = 1x^10y^0 + 10x^9y^1 + 45x^8y^2 + 120x^7y^3 + 210x^6y^4 + 252x^5y^5 + 210x^4y^6 + 120x^3y^7 + 45x^2y^8 + 10x^1y^9 + 1x^0y^10
Mit geschickter Formatierung können wir das Ergebnis deutlich verschönern
Koeffizienten die 1 sind können weggelassen werden (außer in der ersten Zeile)
Exponenten die 1 sind können weggelassen werden
Exponenten die 0 sind können samt Variable weggelassen werden
for i, row in enumerate(tri):
print(f"(x+y)^{i} = ", end="")
for j, n in enumerate(row):
exp_x = f"^{i-j}" if i-j>1 else ""
exp_y = f"^{j}" if j>1 else ""
var_x = "x" if i-j>0 else ""
var_y = "y" if j>0 else ""
number = str(n) if n>1 or i==0 else ""
print(f"{number}{var_x}{exp_x}{var_y}{exp_y}", end="")
if j < i:
print(" + ", end="")
print("")
(x+y)^0 = 1
(x+y)^1 = x + y
(x+y)^2 = x^2 + 2xy + y^2
(x+y)^3 = x^3 + 3x^2y + 3xy^2 + y^3
(x+y)^4 = x^4 + 4x^3y + 6x^2y^2 + 4xy^3 + y^4
(x+y)^5 = x^5 + 5x^4y + 10x^3y^2 + 10x^2y^3 + 5xy^4 + y^5
(x+y)^6 = x^6 + 6x^5y + 15x^4y^2 + 20x^3y^3 + 15x^2y^4 + 6xy^5 + y^6
(x+y)^7 = x^7 + 7x^6y + 21x^5y^2 + 35x^4y^3 + 35x^3y^4 + 21x^2y^5 + 7xy^6 + y^7
(x+y)^8 = x^8 + 8x^7y + 28x^6y^2 + 56x^5y^3 + 70x^4y^4 + 56x^3y^5 + 28x^2y^6 + 8xy^7 + y^8
(x+y)^9 = x^9 + 9x^8y + 36x^7y^2 + 84x^6y^3 + 126x^5y^4 + 126x^4y^5 + 84x^3y^6 + 36x^2y^7 + 9xy^8 + y^9
(x+y)^10 = x^10 + 10x^9y + 45x^8y^2 + 120x^7y^3 + 210x^6y^4 + 252x^5y^5 + 210x^4y^6 + 120x^3y^7 + 45x^2y^8 + 10xy^9 + y^10