Programmierkurs
für Naturwissenschaftler/innen

Iteration

In diesem Abschnitt geht es um Wiederholungen.

for-Schleifen

Eine Methode, um etwas zu wiederholen, ist die for-Schleife.

Sie möchten nun zum Beispiel die Summe der Kuben der ganzen Zahlen zwischen 1 und 10 finden.

Theoretisch könnte Sie es als

summation = 1 ** 3 + 2 ** 3 + 3 ** 3 + 4 ** 3 + 5 ** 3 + 6 ** 3 + 7 ** 3 + 8 ** 3 + 9 ** 3 + 10 ** 3
print(summation)

schreiben, aber das ist fehleranfällig. Außerdem wird sie noch länger und fehleranfälliger, wenn man den Fall von 1 bis 100 berechnen möchte.

In solchen Fällen verwendet man eine for-Schleife wie folgt. (Mehr dazu später. Für den Moment überfliegen Sie dies einfach.)

summation = 0             # Vergessen Sie nicht die Initialisierung

for i in range(1, 11):    # Warum 11, wird später erklärt
    summation += i ** 3   # summation = summation + i ** 3 ist auch möglich

print(summation)

Ein entsprechendes Flussdiagramm sieht so aus.

/images/loop-for-sum.png
for-loop

Vergleichen Sie das obige Programm mit dem Flussdiagramm und sehen Sie, wo die beiden gleich sind.

Neben dem Fluss von oben nach unten ist auch ein Rückfluss zu erkennen. Das heißt, dass dies auch eine Kontrollstruktur ist. Sie können auch sehen, dass es sich im Wesentlichen um eine bedingte Verzweigung handelt, wie man am Aussehen der Raute erkennen kann.

Wie Sie in dieser Übung vielleicht bemerkt haben, erscheint in Python $i \leftarrow i + 1$ usw. nicht explizit im Programm, was Sie vielleicht ein wenig verwirrt hat. Wichtig ist hier jedoch, dass während der Iteration $i$ immer wieder um 1 erhöht wird.

Beginnen wir mit einem einfachen Beispiel, um Ihnen eine Vorstellung zu vermitteln.

Geben Sie das folgende Programm ein und führen Sie es aus. Die Details werden gleich erklärt, aber stellen Sie sich einfach vor, was Sie tun. (Sie können auch zuerst die Erklärung lesen und es später ausprobieren.)

for i in range(3):
    print(i)

Ergebnis

Geben Sie das folgende Programm ein und führen Sie es aus. Die Details werden gleich erklärt, aber stellen Sie sich einfach vor, was Sie tun. (Sie können auch zuerst die Erklärung lesen und es später ausprobieren.)

summation = 0
for i in range(1, 6):
    summation += i
    print("  i =", i, ", summation =", summation)

print("Summation is", summation)

Ergebnis

Aufbau einer for-Schleife

Schauen wir uns die Struktur der for-Schleife anhand eines einfachen Beispiels genauer an.

for i in range(3):
    print(i)

Die Struktur der for-Schleife ist wie folgt:

Erste Zeile

for variable in was iteriert wird :

Zweite und folgende Zeilen

zu wiederholende Anweisungen

for, in und : in der ersten Zeile sollten so geschrieben werden (vergessen Sie nicht das : am Ende). Die zweite und die folgenden Zeilen enthalten die Anweisungen, die wiederholt ausgeführt werden. Wie bei Funktionen wird der zu wiederholende Teil durch Einrückung beschrieben.

Es ist nicht einfach zu erklären, was nach in zu schreiben ist, daher werde ich in diesem Dokument nur sagen, dass range() (und Arrays, die später erklären werden) hauptsächlich verwendet werden.

Die Verwendung von range() ist in der for-Schleife von entscheidender Bedeutung, weshalb wir sie im Folgenden etwas ausführlicher betrachten.

Was ist range()?

Kurz gesagt, range() erzeugt Zahlen in Folge. Zum Beispiel erzeugt range(n) die Zahlen 0, 1, …, n - 1 (beachten Sie, dass das Ende nicht n ist). Dies mag immer noch schwer zu verstehen sein, daher wollen wir uns im Folgenden einige konkrete Beispiele ansehen.

Verwendung von range()

range() verhält sich je nach der Anzahl der übergebenen Argumente etwas unterschiedlich.

In allen Fällen können nur ganzzahlige Argumente angegeben werden. Daher ist der erhaltene Wert immer auch eine ganze Zahl.

Mit einem einzigen Argument

range(n) erzeugt n ganze Zahlen ab 0. Man kann auch sagen, dass sie Zahlen von 0 bis kleiner als n erzeugt. Das heißt, range(n) ergibt 0, 1, …, n - 1. (Beachten Sie, dass die erste ganze Zahl 0 ist.)

Im folgenden Programm

for i in range(3):
    print(i)

erzeugt range(3) bei jeder Iteration 0, 1, 2, so dass das Ergebnis der Ausführung

0
1
2

ist.

Mit zwei Argumente

range(n, m) liefert eine ganze Zahl von n bis kleiner als m. (range(m) ist äquivalent zu range(0, m).)

Ein Programm

for i in range(10, 13):
    print(i)

wird 10, 11, 12 drucken (beachten Sie, dass 13 nicht enthalten ist).

Die beiden oben genannten sollten für den Moment ausreichen.

Wenn Sie Zeit/Lust haben, können Sie auch Folgendes aufnehmen. (Es wird nicht sehr häufig verwendet.)

Mit drei Argumente

range(n, m, s) erzeugt ganze Zahlen von n bis kleiner als m für jedes s.

for i in range(1, 10, 3):
    print(i)

In diesem Programm erzeugt range(1, 10, 3) Zahlen von 1 bis kleiner als 10 in 3er-Schritten, d. h. 1, 4 und 7 werden angezeigt.

Überlegen Sie, was das folgende Programm anzeigen würde. Geben Sie dann dieses Programm ein und führen Sie es aus.

for i in range(1, 3):
    print(i)

Probieren Sie auch verschiedene Argumente für range() aus, z. B.

  • anderer Wert als im Beispiel

  • ein einziges Argument

usw.

Ergebnis

Siehe https://docs.python.org/ja/3/library/stdtypes.html#ranges für weitere Informationen über range().

Schreiben Sie mithilfe der for-Schleife ein Programm, die Summe der ganzen Zahlen von 1 bis 100 zu ermitteln.

Ergebnis

while-Schleife

Bei for-Schleifen ist die Anzahl der Iterationen wichtig. Andererseits gibt es Fälle, in denen die Anzahl der Iterationen nicht im Voraus bekannt ist, man aber so lange iterieren möchte, wie bestimmte Bedingungen erfüllt sind.

Zum Beispiel: Wir summieren die Kuben der ganzen Zahlen ab 1. Wir möchten nun wissen, wann die Gesamtzahl zum ersten Mal 1000 übersteigt. In diesem Fall ist die Anzahl der Iterationen nicht im Voraus bekannt, so dass es schwierig ist, dafür mit for-Schleife zu schreiben.

In diesem Fall kann man while verwenden:

n = 0
summation = 0
while summation < 1000:
    n += 1
    summation += n ** 3
    print(n, summation)

print("Result:", n, summation)

Geben Sie das obige Programm ein und führen Sie es aus. Versuchen Sie sich vorzustellen, was jeder Teil des Programms tut.

Ergebnis

Die Struktur der while-Schleife ist wie folgt:

while Schleifenbedingung:
    Anweisungen
/images/loop-while-python.png
while-loop

Die Schleifenbedingung wird zuerst ausgewertet und wenn sie wahr ist, werden die Anweisungen ausgeführt. Zu wiederholende Anweisungen werden durch Einrückung angezeigt, wie in for usw. Da die Bedingung zuerst ausgewertet wird, kann die Anweisungen nie ausgeführt werden.

  1. Geben Sie das folgende Programm ein und führen Sie es aus. Überlegen Sie, was passiert ist und warum.

    n = 50
    
    while n < 0:
        n -= 10
        print("in while:", n)
    
    print("result:", n)
  2. Angenommen, der Programmierer wollte von n wiederholt 10 abziehen und beenden, wenn n negativ wird. Überlegen Sie in diesem Fall, welcher Teil des Programms geändert werden sollte und wie. Ändern Sie sie und überprüfen Sie, ob sie wie erwartet funktioniert. (Am Ende sollte result: -10 angezeigt werden, was dem erwarteten Ergebnis entspricht.)

Ergebnis

break

Wenn Sie aus einer Schleife ausbrechen möchten, können Sie break verwenden. Die Verwendung von break sollte jedoch nach Möglichkeit vermieden werden. Bevor Sie ihn verwenden, sollten Sie genau überlegen, ob er wirklich notwendig ist und ob es eine bessere Möglichkeit gibt, ihn zu schreiben. break kann in for und while verwendet werden.

Ein relativ häufiges Muster ist das folgende.

Wenn Sie eine iterative Berechnung durchführen (z. B. mit der Newton-Raphson-Verfahren) und diese beenden möchten, wenn sie konvergiert, könnten Sie theoretisch wie folgt schreiben:

while not converged:    # Sie schreiben hier die konkrete Bedingung der Konvergenz.
    # Berechnung

Wenn die Konvergenz jedoch nicht garantiert ist (was fast immer der Fall ist), ist es oft wünschenswert, eine maximale Anzahl von Iterationen festzulegen und aufzugeben, wenn die Konvergenz nicht innerhalb dieser Anzahl eintritt. In einem solchen Fall kann man zum Beispiel wie folgt schreiben:

maxloop = 100

for i in range(maxloop):
    # Berechnung

    if converged:    # Sie schreiben die konkrete Bedingung der Konvergenz.
        break

Oder das Folgende:

maxloop = 100
count = 0

while not converged:    # Sie schreiben die konkrete Bedingung der Konvergenz.
    # Berechnung

    count += 1
    if count >= maxloop:
        print("not converged")
        break

Dies kann als while mit einer begrenzten Anzahl der Schleifen (in diesem Fall 100) betrachtet werden.

Wenn Sie break in einer verschachtelten for- bzw. white-Schleife (einer Schleife innerhalb einer Schleife) verwenden, wird die innerste Schleife von break aus verlassen.

Anmerkung zu Schleifen

Achten Sie beim Schreiben von Schleifen sehr genau auf die Schleifenbedingung. Es ist ein häufiger Fehler, eine Schleife zu viel oder eine zu wenig zu haben. Solche Fehler sind oft nur schwer zu finden.

Wenn Sie in while eine Bedingung schreiben, die immer wahr ist (und nie falsch wird), entsteht eine Endlosschleife, die auch natürlich vermieden werden soll.

Zusammenfassung

In diesem Abschnitt haben Sie die Grundlagen der Iteration kennen gelernt.

  • Für die Wiederholung können for und while verwendet werden.

  • break wird zur Unterbrechung einer Schleife verwendet (sollte aber mit Vorsicht eingesetzt werden).

  • range(), oft in for verwendet, wurde erklärt.