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:

  • for Schleifen: Diese werden verwendet, um über eine Sequenz (wie eine Liste, ein Tupel oder eine Zeichenkette) zu iterieren.

  • while Schleifen: 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
    ####
  • sequence kann 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 element nimmt dabei nacheinander die Werte der Elemente in der Sequenz an.

  • Die Variable element existiert 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 mit range(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