TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
listen&tupels

13. LISTEN & TUPELS

 

 

DU LERNST HIER...

 

wie du beliebig viele Daten in einer Liste oder einem Tupel ablegen kannst und wie du darauf zugreifst. 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. Wichtigste zusammengesetzte (strukturierte) Datentypen sind  die Liste und das Tupel. In Python werden die einzelnen Werte der Liste in eckige Klammern und die Werte des Tupels in runde Klammern geschrieben und mit Kommas getrennt. Beispielsweise schreibst du das Tupel mit den Zahlen 10, 20, also beispielsweise die x, y-Koordinaten eines Punkts so:

pt = (10, 20)

oder die Liste mit den Tönen eines Songs

song = ['c', 'd', 'e', 'f', 'g', 0, 'g', 0, 'a', 'a', 'a', 'a', 'g']

Der zusätzliche Leerschlag nach dem Komma ist fakultativ. Zur besseren Lesbarkeit setzen wir ihn aber immer.

Auf einen einzelnen Wert der Liste oder des Tupels greifst du mit einem Index in einer eckigen Klammer zu, der immer bei 0 beginnt, beispielsweise liefert song[2] den Ton 'e' oder x = pt[0], die x-Koordinate  10 des Punkts. Der Unterschied zwischen Listen und Tupels besteht darin, dass Listen verändert werden können, nachdem sie erzeugt wurden, Tupel hingegen nicht.

 

 

MUSTERBEISPIELE

 

Um den Song abzuspielen, verwendest du playTone(note, duration), wo duration die zeitliche Länge des Tons in Millisekunden ist (note = 0 legt eine Pause ein). Du musst also die Liste durchlaufen und die Werte aus der Liste holen. Am einfachsten machst du dies mit einer for-Schleife. Dazu gibt es  zwei Möglichkeiten. 

Du durchläufst die Liste mit einem Index i. Ist n die Anzahl der Listenelemente, (man sagt auch die Länge der Liste) so muss der Index i von 0 bis n-1 laufen.. Statt von Hand zu zählen, kannst du die Länge n der Liste mit der eingebauten Funktion n = len(li) bestimmen. Dies hat den Vorteil, dass die Listenlänge immer noch stimmt, wenn du die Länge der Liste veränderst. Zum Abspielen schreibst du daher:

from gturtle import *
      
song = ['c', 'd', 'e', 'f', 'g', 0, 'g', 0, 'a', 'a', 'a', 'a', 'g']

n = len(song)
for i in range(n):
    playTone(song[i], 400)

Oft setzt man len(song) direkt ein und schreibt:

for i in range(len(song)):
    ...

Es gibt eine zweite, kürzere Art, die Liste mit einer for-Schleife zu durchlaufen, bei der du keinen Index brauchst. Mit der Schreibweise

for element in liste:

kannst du nämlich ein Element um das andere aus der Liste holen. Das Abspielprogramm schreibst du also eleganter so:

from gturtle import *
      
song = ['c', 'd', 'e', 'f', 'g', 0, 'g', 0, 'a', 'a', 'a', 'a', 'g']

for tone in song:
    playTone(tone, 400)
► In Zwischenablage kopieren

Im zweiten Beispiel erstellst du eine Liste mit 6 Farben. Mit einer for-Schleife, gehst du die Liste durch und zeichnest gefüllte Kreise. Der grösste Kreis hat den Durchmesser 300, die nächsten sind jeweils um 50 kleiner.

 

from gturtle import *

makeTurtle()      

colors = ['red', 'yellow', 'green', 'magenta', 'black', 'cyan']
d = 300
for c in colors:
    setPenColor(c)
    dot(d)
    d = d - 50
► In Zwischenablage kopieren

Du kannst auf die Elemente der Liste colors auch mit einem Index zugreifen. Das flgende Programm liefert das gleiche Ergebnis.

from gturtle import *

makeTurtle()      

colors = ['red', 'yellow', 'green', 'magenta', 'black', 'cyan']
d = 300
for i in range(6):
    setPenColor(colors[i])
    dot(d)
    d = d - 50
► In Zwischenablage kopieren

 

 

ZUM SELBST LÖSEN

 
1.

Ergänze die Notenliste so, dass das ganze Lied gemäss folgender Notennotation gespielt wird. Kennst du es?

 

2.

Schreibe die Koordinaten als Punkttupel (x, y) und setze sie in eine Liste, also beispielsweise haus = [(0, 0), (0, 200) , (150, 300), (300, 200), (300, 0), (0, 0)].
Durchlaufe die Liste mit der for-Schleife
for (x, y) in haus:
um die Figur mit dem Befehl moveTo(x, y) zu zeichnen.

.
 

3.

Erstelle eine Liste colors mit 8 Farben. Definiere eine Funktion line(color, length), der eine farbige Linie zeichnet. Zeichne eine Spirale, so wie im Bild rechts. Nach jeder gezeichneten Strecke wird die nächste Farbe aus der Liste colors genommen und eine längere Strecke gezeichnet. Nach dem man die letzte farbe genommen hat, beginnt man wieder mit der ersten Farbe. 
Anleitung: hier ist es besser auf die Elemente der Liste mit einen Index zugreifen. Mit
if i == 8:
    i = 0

kannst du den Index wieder zurücksetzen, damit wieder die erste Farbe der Liste genommen wird.

 

 

 

 

DIE LISTE ALS OBJEKT

  Bisher hast du die Listen im Programmcode definiert. Du kannst aber eine Liste auch erst zu Laufzeit des Programms erstellen, denn ihre Länge ist flexibel (man sagt auch "dynamisch"). Dabei ist es wichtig, dass du die Liste wie ein Objekt als etwas Eigenständiges betrachtest.

In deinem Programm erzeugst du mit einem Mausklick einen neuen Punkt pt = (x, y) und zeichnest jeweils alle Verbindungslinien zu den bestehenden Punkten.  Dazu musst du die bestehenden Punkte in einer Liste points speichern.

Dem Objekt points kannst du Befehle erteilen, beispielsweise "Füge das folgende Element hinten an. Dazu brauchst du den Punktoperator. Befehle sind Funktionen, bei Objekten spricht man auch von Methoden.

Um den Punkt pt  hinten in der Liste anzufügen, schreibst du points.append(pt). Zuerst musst du mit points = [] eine leere Liste erzeugen.

Um die Verbindungslinien zu zeichnen, schreibst du eine Funktion drawLines(pt) und rufst sie im Mauscallback auf. In der for-Schleife verbindest du den neuen Punkt mit allen anderen.

 


from gturtle import *

def drawLines():
    for p in points:            
        for q in points:
            setPos(p)            
            moveTo(q)

def addPoint(x, y):
    pt = (x, y)
    setPos(pt)    
    dot(8)
    points.append(pt)
    drawLines()        

makeTurtle(mousePressed = addPoint)
hideTurtle()
points = []
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Mit points.append(pt) fügst du ein neues Element hinten an der Liste an.

for p in points: durchläufst du die Liste Element um Element.

 

 

ZUM SELBST LÖSEN

 

3.


Als Vorlage nimmst du das vorhergehende Beispiel. Bei jedem Mausklick wird wie oben ein neuer Punkt erzeugt und dann werden alle Punkte mit der gleichen zufälligen Farbe übermalt.

 

 

 

4.

In einer Schleife kann der Benutzer  mit inputFloat() beliebig viele Zeugnisnoten zwischen 1 und 6 eingeben, die in eine Notenliste eingefügt werden. Bei der Eingabe 0 wird der Durchschnitt mit msgDlg() ausgeschrieben.

.
 

 

   

 

13-1
Didaktische Hinweise:

Container sind wichtige und nützliche Datenstrukturen, die lange Zeit in in klassischen Programmiersprachen ausser Lisp/Logo stiefmütterlich behandelt wurden.  Es handelt sich hier um eine sanfte Einführung, die vor allem zeigen soll, dass es sich um eine dynamische Datenstruktur handelt, deren Grösse zu Laufzeit beliebig verändert werden kann.

13-2
Fachlicher Hinweis:

In klassischen Programmiersprachen würde man hier einen Array einsetzen. Im Unterschied zu Python-Listen haben Arrays üblicherweise eine feste Länge und können nur Elemente des gleichen Datentyps enthalten. Dafür sind sie wesentlich effizienter als Listen, da sie direkt den Maschinecode abbilden (indirekte Adressierung).

13-3
Didaktische Hinweise:

Dies ist die erste Bekanntschaft mit den grundlegenden Ideen der Objektorientierten Programmierung (OOP), die in diesem Lehrgang bewusst in den Hintergrund rückt.  Insbesondere werden Objekte nur gebraucht, aber nicht als Klassen definiert.

Eine gänzliche Verbannung der OOP ist weder sinnvoll and machbar, da viele Python-Bibliotheken explizit davon Gebrauch machen.

13-4
Didaktischer Hinweise:

Für  Punkte erweisen  sich Tupel als besonders günstige Datenstruktur, da sie wie in der Mathematik üblich als zwei  Zahlen in runden Klammern geschrieben werden.

Die angepasste Strukturierung von Daten ist in der Informatik  von grosser Wichtigkeit. Darum stehen alle Turtlebefehle mit x und y Parametern gleichlautend für Tupels, Listen und komplexe Zahlen zur Verfügung.

13-5
Fachlicher Hinweis:

Hier das korrekte Programm, bei dem jeweils nur die Linien vom neuen Punkt zu allen übrigen Punkten der Liste gezeichnet werden.
points[:-1] gibt die Liste ohne das letzte Element.

from gturtle import *

def drawLines(p):
    for q in points[:-1]:
        setPos(p)            
        moveTo(q)

def addPoint(x, y):
    pt = (x, y)
    setPos(pt)    
    dot(8)
    points.append(pt)
    drawLines(pt)        

makeTurtle(mousePressed = addPoint)
hideTurtle()
points = []