Advanced for loops

In diesem Kapitel kommen noch zwei Aspekte von for loops, die als “Advanced” eingestuft werden können aber in der Praxis sehr nützlich sind. Dabei geht es einerseits um verschachtelte for loops und zum andere um eine verkürzte Schreibweise von for loops.

Verschachtelte for loops

Wir können verschiedene for loops auch ineinander verschachteln (englisch: nested loops). Das ist vor allem dann nützlich, wenn alle Kombinationen aus zwei Datensätzen miteinander verrechnet werden müssen. Angenommen du willst die drei Mitglieder deiner Band (bestehend aus Il Buono, Il Brutto, Il Cattivo) deinen Eltern vorstellen und auch umgekehrt deine Eltern deiner Band vorstellen. Für so was eignen sich zwei verschachtelte for Loops hervorragend:

Als Platzhaltervariabel nutze ich wenn immer möglich das Singulär und für den Iterator das Plural von dem Objekt, über das ich iteriere. for bandmitglied in band, for vogel in voegel usw, dies hilft mir den Überblick im loop zu bewahren.

eltern = ["Papa", "Mama"]
band = ["Il Buono", "Il Brutto", "Il Cattivo"]

for bandmitglied in band:
    for elternteil in eltern:
        print(elternteil, "das ist",bandmitglied)
        print(bandmitglied, "das ist",elternteil)
        print("---")
Papa das ist Il Buono
Il Buono das ist Papa
---
Mama das ist Il Buono
Il Buono das ist Mama
---
Papa das ist Il Brutto
Il Brutto das ist Papa
---
Mama das ist Il Brutto
Il Brutto das ist Mama
---
Papa das ist Il Cattivo
Il Cattivo das ist Papa
---
Mama das ist Il Cattivo
Il Cattivo das ist Mama
---

Ein anderes Beispiel: In Übung 10.5 haben wir die beiden Zeilen "Who likes to party?", “We like to party?” 5x wiederholt. Dabei werden die Wörter `to party für jede Wiederholung zwei mal wiederholt:

Who likes to party?
We like to party!
Who likes to party?
We like to party!
...

Dies kann man in zwei verschachtelte For Loops umschreiben:

for i in range(5):
    inner = ["Who likes", "We like"]
    for j in inner:
        print(j+" to party")

Who likes to party
We like to party
Who likes to party
We like to party

Verkürzte Schreibweise

Es ist äusserst häufig der Fall, dass wir den Output aus einem Loop in einer Liste abspeichern wollen. Wie das geht haben wir ja bereits in Basic for loop gelernt:

rollen = ["bitch","lover","child","mother","sinner","saint"]

refrain = []
for rolle in rollen:
    liedzeile = "I'm a "+ rolle 
    refrain.append(liedzeile)

Nur ist das ein bisschen umständlich, weil wir dafür viele Zeilen Code brauchen, um etwas eigentlich ganz simples zu bewerkstelligen. Es gibt deshalb dafür auch eine verkürzte Schreibweise, welche ich in der letzten Woche bereits einmal verwendet habe (siehe Übung 8.6). Der obige Loop hat in der verkürzten Schreibweise die folgende Form:

refrain = ["I'm a "+ rolle for rolle in rollen]

Diese verkürzte Schreibweise heisst in Python list comprehension und sie ist äusserst praktisch, wenn man sie beherrscht. Das Beherrschen ist aber nicht zentral, es reicht schon wenn ihr eine solche Schreibweise wieder erkennt und richtig interpretieren könnt (im Sinne von “Aha, hier wird also in einem Loop eine Liste erstellt”). In der folgenden Darstellung seht ihr farblich, welche Elemente sich in der verkürzten Schreibweise wo wiederfinden und welche Elemente gar nicht wiederverwendet werden.

rollen = ["bitch","lover","child","mother","sinner","saint"]

Herkömmlicher For-Loop:

  ref = []
  for r in rollen:
      liedzeile = "I'm a "+ r
      refrain.append(liedzeile)
  
Verkürzte Schreibweise:
ref = ["I'm a "+ r for r in rollen]