Lektion 3

Wörterbücher

Python stellt einen Datentypen für Wörterbücher zur Verfügung, die eine Abbildung von einem Schlüssel (dem “Namen”) zu einem Wert (der “Adresse”) realisieren. Ein neues Wörterbuch erstellt man mit der Syntax

w = {"Schlüssel1":"Wert1", "Schlüssel2":5}

Das leere Wörterbuch ist einfach {}. Die Typen von Schlüsseln und Werten können gemischt werden, allerdings eignen sich nicht alle Typen als Schlüssel. Nur unveränderliche Typen (“immutable”) können als Schlüssel verwendet werden; Listen eignen sich also nicht.

Auf die Werte eines Wörterbuchs greift man so zu

>>> w = {5:7, 8:42, 9:32, 'blubb':23}
>>> w[5]
7
>>> w['blubb']
23
>>> w[5] = 9
>>> w[5]
9
>>> w[100] = 10
>>> w[100]
10

Man darf nicht lesend auf einen Schlüssel zugreifen, der nicht im Wörterbuch vorliegt. Ist man sich nicht sicher, ob der Wert existiert, kann man dies mit has_key so überprüfen

>>> w.has_key(100)
True
>>> w.has_key(50)
False

Alternativ kann man auch schreiben 50 in w. Für Wörterbücher gilt die gleiche Warnung wie für Listen: Zuweisungen erzeugen keine Kopien. Weitere praktische Methoden für Wörterbücher lassen sich mit einem help(dict) im Interpreter herausfinden.

Tupel

Wir haben bereits Listen als Sammlung von Werten kennengelernt. Listen kann man verändern, etwa durch anhängen von neuen Werten. Für die Anwendung als Schlüssel in Wörterbüchern sind sie damit ungeeignet. Als unveränderliche Alternative dienen Tupel. Sie werden ähnlich wie Listen durch kommaseparierte Werte notiert, allerdings verwendet man statt eckigen Klammern runde.

>>> t = (1, 2, "Hallo")
>>> t
(1, 2, 'Hallo')

Das Wichtige sind jedoch die Kommas, nicht die Klammern. Das Tupel mit einem Element notiert man folglich nicht (a), sondern (a,).

Lesend kann man auf Tupel genau so zugreifen wir auf Listen, also mit der Notation t[i], um auf das i+1-te Element zuzugreifen, lediglich ändern lassen sich Tupel nicht.

Module

Will man Programme schreiben, die zu groß sind, um nur eine Datei zu benutzen, oder will man auf den Code anderer Leute zugreifen, benötigt man Module. Python hat eine große Zahl an Modulen, die standardmäßig verfügbar sind. Für einen Überblick siehe hier.

Beispielhaft wollen wir ein Programm schreiben, dass feststellt, wieviele Freitage den 13. es in den letzten hundert Jahren gab. Da es recht aufwändig ist, mit Daten zu rechnen (Schaltjahre und dergleichen), verwenden wir vorgefertigte Funktionen aus dem Modul calendar.

Um ein Modul zu verwenden, muss man es in sein Programm importieren

import calendar

Diese Zeile lädt den Inhalt der entsprechenden Datei in der Standardbibliothek und macht alle Funktionen verfügbar. Um auf sie zuzugreifen, muss man den Präfix calendar. verwenden (dies kann mit anderer Syntax vermieden werden, siehe Kapitel 6 des Python Tutorials). Insbesondere kann mit Hilfe von calendar.weekday(y,m,d) festgestellt werden, welcher Wochentag am spezifizierten Datum war. Somit können wir schreiben:


def pech():
    count = 0
    for y in range(1911,2011):
        for m in range(1,13):
            if calendar.weekday(y,m,13)==4: 
                count +=1
    return count

print pech()

Man kann Python Dateien, die im selben Verzeichnis liegen auf die gleiche Art importieren und so seine Programme besser strukturieren.

Mehr zu Ein- und Ausgabe

Bisher können wir mit print Werte auf der Konsole ausgeben. Im Alltag ist es nötig, auch mit Dateien zu arbeiten. Glücklicherweise ist das sehr einfach. Um den Inhalt einer Datei in einen String einzulesen und anschließend auszugeben, schreibt man

with open('pfad/zur/datei.txt','r') as f:
    inhalt = f.read()

print inhalt

Unter Windows müssen die Pfade vielleicht mit Backslashes ('\\') notiert werden. Die with Syntax sorgt automatisch dafür, dass die Datei nach der Verwendung wieder geschlossen wird. Schreibt man 'w' statt 'r', wird die Datei zum Schreiben geöffnet, a hängt an die Datei an. In schreibbare Dateien kann man mit f.write('text') einen String ans Ende schreiben.