for-in-Schleifen
Bisher hast du Listen immer mit einem Zähler durchlaufen:
zaehler = 0
while zaehler < len(hoehen):
forward(hoehen[zaehler])
zaehler = zaehler + 1
Das funktioniert – ist aber umständlich. Für den häufigsten Fall gibt es eine kürzere Schreibweise.
Aufgabe 1: Eine neue Art von Schleife
Wir betrachten eine Modifikation des Beispiels aus der letzten Lektion.
Analysiere, wie die hier neu eingeführte Art von Schleife funktioniert. Vergleiche sie Zeile für Zeile mit der Version mit Zähler.
for zahl in hoehen:bedeutet: „Nimm nacheinander jedes Element der Liste und nenne eszahl."- Die Schleifenvariable enthält direkt den Wert, nicht den Index. Du brauchst also kein
hoehen[...]mehr. - Der Zähler entfällt vollständig: kein
zaehler = 0, keinlen(...), keinzaehler = zaehler + 1. - Diese Schleifenform heißt for-each-Schleife („für jedes Element").
Die dir bekannte Form for i in range(10): ist übrigens dasselbe Prinzip: range(10) erzeugt die Zahlen 0 bis 9, und die Schleife geht sie der Reihe nach durch.
Aufgabe 2: Wann passt welche Schleife?
Beurteile, ob sich die Aufgaben aus der letzten Lektion ebenfalls mit der neuen Schleifenform umsetzen lassen:
a) die Punkte aus der Liste durchmesser,
b) die Bäume aus den beiden Listen durchmesser und hoehen.
Modifiziere die Programme oder erkläre, warum es nicht sinnvoll wäre.
Auflösung
a) Ja, problemlos. Es gibt nur eine Liste, und wir brauchen nur die Werte:
for d in durchmesser:
dot(d)
forward(90)
b) Nein, hier nicht sinnvoll. Wir brauchen bei jedem Schritt Werte aus zwei Listen, die zusammengehören. Die for-in-Schleife läuft aber immer nur über eine Liste – der Index zur Nummer des Baums fehlt dann.
Faustregel:
- Brauchst du nur die Werte einer Liste →
for-in - Brauchst du die Position, oder greifst du auf mehrere Listen gleichzeitig zu → Schleife mit Zähler
Aufgabe 3: Das Maximum – noch einmal
Modifiziere die Maximum-Funktion aus der letzten Lektion so, dass sie die neue Schleifenform verwendet.
Denke daran, das Problem mit den negativen Zahlen gleich mit zu lösen.
def maximum(zahlen):
groesstes = zahlen[0]
for zahl in zahlen:
if zahl > groesstes:
groesstes = zahl
return groesstes
Aufgabe 4: Das Minimum
Entwickle eine Funktion minimum(zahlen), die die kleinste Zahl einer Liste bestimmt.
Tipp
Du musst am Maximum nur zwei Kleinigkeiten ändern: den Namen der Variablen und die Richtung des Vergleichs.
Aufgabe 5: Der Mittelwert
Entwickle eine Funktion mittelwert(zahlen), die den Mittelwert der Zahlen einer Liste berechnet.
Hinweis: Sind in der Liste zum Beispiel die Zahlen 10, 20 und 60 gespeichert, ist das Ergebnis 30.
Tipp 1: Zwei Schritte
Der Mittelwert ist die Summe aller Zahlen geteilt durch ihre Anzahl.
Die Summe bildest du mit einer for-in-Schleife, die Anzahl liefert len(zahlen).
Tipp 2: Welche Division?
Achte darauf, die normale Division mit dem einfachen Schrägstrich zu verwenden. Mit der Ganzzahldivision würde bei [1, 2] fälschlicherweise 1 statt 1.5 herauskommen.
def mittelwert(zahlen):
summe = 0
for zahl in zahlen:
summe = summe + zahl
return summe / len(zahlen)
Zusatzaufgabe 1: Das Maximum hervorheben
Entwickelt werden soll ein Programm, das Folgendes leistet:
In einer Liste sind positive Werte vorgegeben. Die Turtle zeichnet dazu ein Säulendiagramm. Der größte dieser Werte wird dabei farblich hervorgehoben. Kommt der maximale Wert mehrfach vor, wird er auch mehrfach markiert.
Tipp 1: Zwei Durchgänge
Du brauchst zwei Schleifen nacheinander:
- Zuerst das Maximum bestimmen – dafür kannst du deine Funktion aus Aufgabe 3 verwenden.
- Dann zeichnen und bei jedem Wert prüfen, ob er dem Maximum entspricht.
Tipp 2: Warum zwei Durchgänge nötig sind
Beim Zeichnen der ersten Säule weißt du noch gar nicht, ob später eine höhere kommt. Das Maximum muss also vorher feststehen.
from turtle import *
shape("turtle")
screensize(560, 360)
speed(0)
def maximum(zahlen):
groesstes = zahlen[0]
for zahl in zahlen:
if zahl > groesstes:
groesstes = zahl
return groesstes
werte = [40, 60, 20, 100, 80, 100, 50]
groesstes = maximum(werte)
pensize(20)
penup()
goto(-180, -120)
setheading(90)
for wert in werte:
if wert == groesstes:
pencolor("red")
else:
pencolor("black")
pendown()
forward(wert * 1.6)
penup()
backward(wert * 1.6)
right(90)
forward(30)
left(90)
Zusatzaufgabe 2: Noch mehr Markierungen
Erweitere das Programm aus Zusatzaufgabe 1 so, dass auch das Minimum und der Mittelwert in geeigneter Weise markiert werden.
Überlege dir selbst, wie du den Mittelwert sinnvoll darstellst – er entspricht ja meist keiner der Säulen.
Tipp: Der Mittelwert als Linie
Zeichne den Mittelwert als waagerechte Linie quer über das Diagramm. Dafür musst du nur die Turtle auf die passende Höhe setzen und einmal quer laufen lassen.