Jython

10. Listen und Tupels

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)
► In Zwischenablage kopieren
 

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)
► In Zwischenablage kopieren
 

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")
► In Zwischenablage kopieren
 

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)
► In Zwischenablage kopieren
 

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)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

x1 = getDividingPoint(pA, pB, r) bestimmt einen Teilungspunkt auf der Linie pA, pB

 


Aufgaben: Serie 10

1)


Gib mit einem Inputdialog
z = inputInt("Gib eine Zahl ein")
8 Zahlen zwischen 1 und 10 ein und speichere sie in einer Liste zahlen. Schreibe die Liste mit dem Befehl print im TigerJython-Ausgabefenster aus. Mit dem Befehl kannst du die Liste sortieren.

Schreibe dann die Liste sortiert nach Grösse.

 


2)


Zeichne gefüllte Kreise mit den Farben aus der Liste
colors = ["red", "blue", "yellow", "magenta", "green", "cyan"]

 


3)


Zeichne ein Haus mit Hilfe einer Liste mit den Koordinaten der Eckpunkte.


 

4)


Ergänze das Beispiel 4 so, dass mit dem linken Mausklick ein Punktmenge mit verbindungslinien dynamisch erzeugt wird und mit dem rechten Mausklick die geschlossenen Flächen, in welchen die Koordinaten des Mausklicks liegen, gefärbt werden.

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)