In einer Liste oder einem Tupel kann man mehrere Werte speichern und auf diese Daten wieder zugreifen. Statt Werte in verschiedenen Variable a, b, c einzeln abzuspeichern, stellt Python Datentypen zur Verfügung, die als Behälter für beliebig viele Daten verwendet werden. In anderen Programmiersprachen verwendet man dazu oft Arrays. Im Gegensatz zu Arrays haben Listen keine feste, vordefinierte Länge, d.h. ihre Länge wird der Anzahl gespeicherter Elemente automatisch angepasst (dynamische Datenstruktur).
Die Elemente einer Liste werden in eckigen Klammern geschrieben, z. B. eine Liste mit Farbnamen:
colors = ["red", "blue, "green"]
Die Werte eines Tupels werden mit runden Klammern geschrieben, z. B. x, y-Koordinaten eines Punkts:
pt = (10, 20)
Im Gegensatz zu Listen können die Werte von Tupels nachher nicht mehr verändert werden. Listen und Tupels lassen sich auch kombinieren, z.B. eine Liste mit Koordinaten von Eckpunkten einer Figur:
corners = [(2, 3), (5, 8), 7, 1)]]
In den meisten der folgenden Beispiele könnte man statt Listen auch Tupels verwenden.
Beispiel 1: Auf die Elemente einer Liste zugreifen
Die Elemente einer Liste kann man mit einer for-Schleife der Reihe nach durchlaufen (iterieren). Im Beispiel besteht die Liste colors aus 7 Farbnamen.
Mit der for-Schleife for c in colors: geht man die Liste der Reihe nach durch und zeichnet mit dieser Farbe einen gefüllten Kreis, der während 600 Millisekunden angezeigt wird. Die Schleifenbefehle müssen eingerückt sein.
Auf die Elemente einer Liste kann man auch mit einem Index zugreifen. Das erste Element hat den Index 0, corners[3] ist also nicht etwa das dritte, sondern das vierte Element, im Beispiel also die Farbe "magenta".
# Gp10a.py from gpanel import * makeGPanel(-10, 10, -10, 10) colors = ["red", "blue", "yellow", "magenta", "green", "cyan"] for c in colors: setColor(c) fillCircle(4) delay(600) setColor(colors[3]) fillCircle(6) |
Erklärungen zum Programmcode:
for c in colors: Geht die Liste colors der Reihe nach durch | |
colors[3] Das vierte Element der Liste |
Beispiel 2: Ein Polygon mit der Liste der Eckpunkte zeichnen
# Gp10b.py from gpanel import * makeGPanel(0, 10, 0, 10) corners = [(4, 2), (1, 4), (3, 7), (6, 8), (7, 5), (5, 3)] setColor("blue") for pt in corners: fillPolygon(corners) |
Erklärungen zum Programmcode:
corners = [(4. 2)...] Man könnte auch ein Tupel verwenden | |
fillPolygon(corners) Die Funktion fillPolygon() erwartet als Parameter eine Liste mit Eckpunkten |
Beispiel 3: Die Elemente einer Liste mit Mausklicks erzeugen
Die Liste ist eine dynamische Datenstruktur, d.h. die Anzahl der Elemente kann sich während der Programmausführung ändern.
Im Beispiel ist die Liste corners zu Beginn leer. Mit einem linken Mausklick wird an der Position des Mausklicks ein kleiner Kreis gezeichnet und der Punkt an Ende der Liste hinzugefügt. Dazu verwendet man die Funktion append(). Bei einem rechten Mausklick wird mit dieser Liste ein gefülltes Polygon gezeichnet
# Gp10c.py from gpanel import * def onMousePressed(x, y): if isLeftMouseButton(): pos(x, y) circle(0.1) corners.append((x, y)) if isRightMouseButton(): fillPolygon(corners) makeGPanel(0, 20, 0, 20, mousePressed = onMousePressed) corners = [] setColor("magenta") |
Erklärungen zum Programmcode:
corners = [ ] Erzeugt eine leere Liste | |
corners.append((x, y)) Fügt den Punkt mit den Koordinaten (x, y) am Ende der Liste corners an |
Beispiel 4: Eine Punktmenge dynamisch mit Mausklicks festlegen und alle Verbindungslinien zeichnen
In diesem Beispiel ist es vorteilhaft, die Punkte mit p und q zu bezeichnen, wobei die Punkte mit einem Koordinatentupel (x. y) gegeben sind. Nach jedem Mausklick wird im Punkt p ein kleiner Kreis gezeichnet, danach wird p mit allen bereits bestehenden Punkten q der Liste corners verbunden und danach zu der Liste hinzugefügt.
# Gp10d.py from gpanel import * def onMousePressed(x, y): p = (x, y) pos(p) fillCircle(0.2) for q in corners: line(p, q) corners.append(p) corners = [] makeGPanel(0, 20, 0, 20, mousePressed = onMousePressed) |
Erklärungen zum Programmcode:
p = (x, y): Punkt mit den Koordinaten x, y (Position des Mausklicks | |
for q in corners: line(p, q) Der neue Punkt wird mit allen bestehenden Punkten der Liste corners verbunden |
Beispiel 5: Fadengrafik mit Punkt-Tupels
Für sogenannten Fadengrafiken benötigt man oft Teilungspunkte (dividing points) einer Strecke. Dazu gibt es in GPanel eine einfache Funktion getDividingPoint(pA, pB, r), der man die zwei Endpunkte pA und pB der Strecke und den Teilungsfaktor r übergibt. Sie liefert dir den Teilungspunkt als Liste zurück.
#Gp10e.py from gpanel import * makeGPanel(0, 100, 0, 100) pA = (10, 10) pB = (90, 20) pC = (30, 90) line(pA, pB) line(pA, pC) r = 0 while r <= 1: x1 = getDividingPoint(pA, pB, r) x2 = getDividingPoint(pA, pC, 1 - r) line(x1, x2) r += 0.05 delay(200) |
Erklärungen zum Programmcode:
x1 = getDividingPoint(pA, pB, r) bestimmt einen Teilungspunkt auf der Linie pA, pB |
Aufgaben: Serie 10 |
1) |
Schreibe dann die Liste sortiert nach Grösse. |
2) |
|
3) |
|
4) |
Wie im Beispiel 5 im vorhergehenden Abschnitt, musst du zuerst überprüfen, ob der linke oder der rechte Mausbutton gedrückt wurde. def onMousePressed(x, y): if isLeftMouseButton(): .... if isRightMouseButton(): ..... |
Zusatzinfo:
Die wichtigsten Operationen mit Listen
li[i] li.append(element) li.insert(i, element) li.index(element) li.pop(i) pop() len(li) del li[i] li.reverse() li.sort() |
Auf Listenelement mit Index i zugreifen Anfügen ans Ende Einfügen an Stelle i (Element i rutscht nach rechts) Sucht das erste Vorkommen und gibt dessen Index zurück Entfernt das Element mit Index i und gibt es zurück Entfernt das letzte Element und gibt es zurück Gibt die Anzahl Listenelemente zurück Entfernt das Element mit Index i Kehrt die Liste um (letztes Element wird das erste) Sortiert die Liste (Vergleich mit Standardverfahren) |