Vorkurs Programmierung Aggregierte Datentypen und Klassenbibliothek von Python Prof. Dr. Detlef Krömker Dipl.-Inf. Jörg Demmer Professur für Graphische Datenverarbeitung Institut für Informatik Fachbereich Informatik und Mathematik (12) Hier wird Wissen Wirklichkeit Übungs-Nachlese ‣ Aufgabe 1 Parameter können in Python mit Default-Werten belegt werden, indem man sie in der Funktionsdeklaration zuweist: def foo(a, b, c = "Default", d = 4): ... Mögliche Aufrufe: foo(4,5) => a ist 4, b ist 5, c ist "Default", d ist 4 foo(4,5,"XYZ") => a ist 4, b ist 5, c ist “XYZ", d ist 4 foo(4,5,"XYZ",3) => a ist 4, b ist 5, c ist “XYZ", d ist 3 2 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 1 Übungs-Nachlese ‣ Eine beliebige Anzahl von Parametern kann übergeben werden, indem man dem letzten Parameter einen Stern voranstellt. Dann werden alle übergebenen Parameter in ein Tupel verpackt: def foo(a, b, *rest): print "a ist", a print "b ist", b print "Rest ist:" for i in rest: print i foo('A', 'B', 'CD', 'EF', 'GH') 3 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Übungs-Nachlese Ausgabe: a ist A b ist B Rest ist: CD EF GH 4 Vorkurs Programmierung WS 2006/2007 2 Übungs-Nachlese ‣ Aufgabe 3 Wenn eine Quellcode-Datei (Endung .py) als Modul importiert wird, erzeugt der Python-Interpreter .pyc-Dateien, die das Modul in Form von vorkompiliertem Bytecode enthalten. Dies beschleunigt die Ladezeit des Moduls (nicht die Ausführungsgeschwindigkeit), weil das sonst vom Interpreter durchzuführende Vorkompilieren entfällt. Außerdem kann ein Programm auf diese Weise weitergegeben werden, ohne den Quellcode offen legen zu müssen. 5 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Einwurf: Rekursion Rekursion, auch Rekurrenz oder Rekursivität, bedeutet Selbstbezüglichkeit (von lateinisch recurrere = zurücklaufen; engl. recursion). tritt immer dann auf, wenn etwas auf sich selbst verweist. muss nicht immer direkt auf sich selbst verweisen (direkte Rekursion), eine Rekursion kann auch über mehrere Zwischenschritte entstehen. Rekursion kann dazu führen, dass merkwürdige Schleifen entstehen. So ist z.B. der Satz „Dieser Satz ist unwahr“ rekursiv, da er von sich selber spricht. Eine etwas subtilere Form der Rekursion (indirekte Rekursion) kann auftreten, wenn zwei Dinge gegenseitig aufeinander verweisen. 6 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 3 Definition (Informatik und Mathematik) Als Rekursion bezeichnet man den Aufruf oder die Definition einer Funktion (hier wird Funktion sowohl wie in der Mathematik im Sinne von Abbildung gebraucht als auch im Sinne einer speziellen Prozedur, die einen Wert zurückgibt, siehe später) durch sich selbst. Ohne geeignete Abbruchbedingung geraten solche rückbezüglichen Aufrufe in einen so genannten infiniten Regress (umgangssprachlich auch Endlosschleife genannt). 7 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Grundidee der rekursiven Definition Der Funktionswert f(n+1) einer Funktion f: N0 → N0 ergibt sich durch Verknüpfung bereits vorher berechneter Werte f(n), f(n-1), ... Falls außerdem die Funktionswerte von f für hinreichend viele Startargumente bekannt sind, kann jeder Funktionswert von f berechnet werden. Bei einer rekursiven Definition einer Funktion f ruft sich die Funktion so oft selber auf, bis ein vorgegebenes Argument (meistens 0) erreicht ist, so dass die Funktion terminiert (abbricht). Vorgehensweise in der funktionalen Programmierung (siehe PRG 2) 8 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 4 Primitive Rekursion stets durch eine Iteration ersetzbar Kennzeichen: der Aufruf-Baum enthält keine Verzweigungen, das heißt er ist eigentlich eine Aufruf-Kette: das ist immer dann der Fall, wenn eine rekursive Funktion sich selbst jeweils nur einmal aufruft, insbesondere am Anfang (Head Recursion) oder nur am Ende (Tail Recursion) der Funktion. 9 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Rückblick ‣ Wir haben die wichtigsten Kontrollstrukturen kennen gelernt und gesehen, wie man Programme in Funktionen und Modulen organisieren kann ‣ Jetzt wollen wir uns ansehen, welche Bordmittel Python liefert, um Problemlösungen einfacher zu machen 10 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 5 Lernziele ‣ Die eingebauten aggregierten Datentypen/-strukturen kennen lernen: ‣ Listen ‣ Tupel ‣ Dictionaries ‣ Überblick erhalten über die wichigsten Funktionen der Klassenbibliothek: ‣ Mathematische Funktionen ‣ I/O ‣ Kommandozeilenparameter ‣ Serialisierung 11 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Aggregierte Datentypen –Datenstrukturen - Objekte ‣ Zusammengesetzte (aggregierte) Datentypen sind Datenkonstrukte, welche aus einfacheren (elementaren) Datentypen oder zusammengesetzten Datentypen bestehen. ‣ Eine Abgrenzung zu dem Begriff Datenstruktur ist kaum möglich, da sie nahezu beliebig komplex werden können. ‣ Datenstruktur: Der Fokus der Diskussion liegt auf der Strukturierung/(der Kodierung und Anordnung) der gespeicherten Daten ‣ Aggregierter Datentyp: Der Fokus der Diskussion liegt auf den Operationen (im Sinne eines abstrakten Datentyps). 12 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 6 Aggregierte Datentypen –Datenstrukturen - Objekte ‣ Die Definition von Datenstrukturen erfolgt im Allgemeinen durch die Angabe einer Spezifikation zur Datenhaltung (Widerspruch zur Abstraktion ??? ) und ‣ der Operationen an der Schnittstelle. Diese Spezifikation legt das allgemeine Verhalten der Operationen fest und abstrahiert damit von der konkreten Implementation der Datenstruktur. ‣ Von den meisten Datenstrukturen gibt es neben ihrer Grundform viele Spezialisierungen, die eigens für die Erfüllung ganz bestimmter Aufgaben spezifiziert wurden. 13 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Aggregierte Datentypen ‣ stehen in den meisten Programmiersprachen zur Verfügung. ‣ Programmiersprachen können aggregierte Datentypen auf zwei Ebenen unterstützen: 1. Sie stellt Konstruktoren zur Verfügung, mit deren Hilfe der Aufbau eines aggregierten Datentyps beschrieben werden kann. 2. Sie verfügen über vordefinierte aggregierte Datentypen (builtins). 14 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 7 Einige wichtige Builtins von Python Python bietet eine eingebaute Unterstützung für die folgenden linearen Datenstrukturen, die wir uns jetzt genauer ansehen wollen: ‣ Listen / Tupel ‣ Dictionaries ‣ Mengen (Set / Frozenset) 15 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Listen I ‣ Listen haben wir bereits als eine Möglichkeit kennen gelernt, um etwa mit Hilfe der range()-Funktion Mengen zur Aufzählung in ForSchleifen zu generieren. ‣ Das ist jedoch längst nicht alles, was Listen können. Die Liste ist in Python eine dynamische Datenstruktur zur Speicherung beliebiger Datentypen (Integers, Longs, Strings, …). ‣ Man Elemente hinzufügen, löschen, auf Existenz prüfen, sortieren … ‣ Eine Übersicht aller Möglichkeiten liefert help(list) 16 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 8 Listen II ‣ Listen werden initialisiert, indem man Elemente in eckige Klammern setzt, durch Kommata getrennt: liste liste # # ‣ 17 = [] # leere Liste = [ 10, 4.0, "Test" ] # Liste wird initialisiert mit Integerzahl 10, Float 4.0 und String "Test" Auf die einzelnen Elemente kann über Indizes, in eckige Klammern gesetzt, zugegriffen werden. Wichtig: Die Zählung beginnt dabei mit 0, nicht mit 1! Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Listen III >>> liste[0] 10 >>> liste[2] 'Test' ‣ Mit Hilfe der bereits kennen gelernten Slice-Operatoren kann man auch auf Teile der Liste zugreifen oder die Reihenfolge ändern: >>> liste[1:2] [4.0] >>> liste[::-1] ['Test', 4.0, 10] 18 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 9 Listen IV ‣ Oft benötigt man auch die Länge einer Liste. Diese erfährt man über den Befehl len: >>> len(liste) 3 ‣ Man kann auf einzelne Elemente nicht nur zugreifen, sondern sie auch verändern: >>> liste[2] = 20 >>> liste [10, 4.0, 20] 19 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Listen V ‣ Mit dem Befehl del liste[i] kann das Element an Position i gelöscht werden: >>> del liste[1] >>> liste [10, 20] ‣ 20 u.v.m -> help(list) und die Python-Dokumentation Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 10 Tupel ‣ Tupel verhalten sich ähnlich wie Listen, mit dem Unterschied, dass sie nach Initialisierung nicht mehr verändert werden können: tupel = (10, 20, 3.0) >>> tupel (10, 20, 3.0) tupel[2] = 2 Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> tupel[2] = 2 TypeError: 'tuple' object does not support item assignment 21 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Dictionaries I ‣ Dictionaries (auch bekannt als assoziative Arrays) sind Datenstrukturen, die einem bestimmten Schlüsselobjekt Werte zuordnen. Auf die Elemente wird dann nicht über einen Index, sondern über den Schlüssel zugegriffen. ‣ Jeder Schlüssel kann nur einmal verwendet werden; wird ein neues Element mit einem bereits vorhandenen Schlüssel eingefügt, geht der alte Wert verloren ‣ Wenn versucht wird, auf einen nicht vorhandenen Schlüssel zuzugreifen, führt dies zu einem Fehler 22 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 11 Dictionaries II >>> telnummer = { 'Mueller':1234, 'Schmidt':5678, 'Kaiser':1122 } >>> telnummer['Mueller'] 1234 >>> telnummer = { 'Mueller':1234, 'Schmidt':5678, 'Kaiser':1122, 'Mueller':2233 } >>> telnummer['Mueller'] 2233 >>> telnummer['Becker'] Traceback (most recent call last): File "<pyshell#46>", line 1, in <module> telnummer['Becker'] KeyError: 'Becker' 23 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Mengen (Sets) ‣ Mengen sind ungeordnete Sammlungen von Elementen, die keine Duplikate enthalten. ‣ Grundlegende Operationen sind Test auf Mitgliedschaft und Beseitigung von Duplikaten ‣ Außerdem: Schnitt, Vereinigung, Differenz 24 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 12 Mengen (Sets) >>> liste = [ 'a', 'b', 'c', 'a' ] >>> menge = set(liste) >>> menge set(['a', 'c', 'b']) >>> 'a' in menge True >>> 'd' in menge False >>> menge2 = set([ 'a', 'd', 'f' ]) >>> menge | menge2 # Vereinigung set(['a', 'c', 'b', 'd', 'f']) >>> menge - menge2 # Differenz set(['c', 'b']) >>> menge & menge2 # Schnitt set(['a']) >>> menge ^ menge2 # Symmetrische Differenz set(['c', 'b', 'd', 'f']) 25 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Eingebaute Funktionen ‣ Die eingebauten Funktionen von Python sind immer im globalen Namensraum verfügbar. Es muss also kein Modul importiert werden, um auf sie zuzugreifen ‣ Wir haben bereits bei raw_input() gesehen, dass es manchmal nötig sein kann, Datentypen explizit zu konvertieren. Für Konvertierungen unter den elementaren Datentypen bietet Python folgende Funktionen: float(x) – Konvertiert einen String oder eine Zahl zu einer Fließkommazahl int(x[,Radix]) – Konvertiert einen String oder eine Zahl zu einer Integerzahl, oder zu einem Long, wenn der Integer-Wertebereich überschritten wird. Der optionale Parameter Radix gibt die Basis an, die verwendet werden soll. Beispiel: >>> int("10100",2) 20 26 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 13 Klassenbibliothek: Eingebaute Funktionen ‣ Entsprechend konvertiert long(x[,Radix]) zu einem long. ‣ str([Object]) liefert von Objekten eine Stringrepräsentation (bei Zahlen die entsprechenden Literale) ‣ abs(x) liefert den Absolutbetrag einer Zahl ‣ cmp(x,y) – vergleicht zwei Objekte und liefert ein Integer. Ist kleiner null wenn x < y, null wenn x == y, größer null sonst ‣ help() – Online-Hilfe starten 27 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Eingebaute Funktionen ‣ len (Object): Die Länge eines Objekts ‣ input() und raw_input() – Einlesen von Daten ‣ range([start,]stop[,step]) – Erzeugen von Folgen, nützlich bei Schleifen ‣ type(Object) – Liefert den Typ eines Objekts 28 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 14 Klassenbibliothek: Module math, random help() math random 29 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Modul sys ‣ argv – Liste mit den Parametern, die auf der Kommandozeile übergeben wurden Beispiel: import sys print sys.argv[0], sys.argv[1] Speichern als argv.py, aufrufen mit python argv Hallo ergibt argv.py Hallo 30 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 15 Klassenbibliothek: Modul sys ‣ exit([x]) – Programm beenden und Code x zurückgeben ‣ getfilesystemencoding() – Zeichensatz des Dateisystems ‣ path – Liste mit den Verzeichnissen des Suchpfades 31 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Dateizugriff ‣ Eine Datei kann man mit dem Befehl open() öffnen: ‣ F = open(“datei.txt“, “w“) ‣ ‣ F ist dann ein Objekt, das auf die Datei verweist (dazu morgen mehr) Der erste Parameter ist der Dateiname; kann sowohl einen vollständigen Verzeichnispfad enthalten als auch einen relativen zum aktuellen Arbeitsverzeichnis Der zweite Parameter gibt den Modus an: r für Lesezugriff, w für Schreibzugriff (dabei wird neue Datei erstellt und existierende überschrieben). r+ bedeutet Lese- und Schreibzugriff, a Daten anfügen. ‣ 32 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 16 Dateizugriff ‣ Um Daten aus der Datei zu lesen, kann man die Methode F.read([size]) benutzen. Wenn size angegeben wird, werden entsprechend viele Bytes aus der Datei gelesen, sonst bis zum Ende der aktuellen Zeile. ‣ F.readline() liest eine ganze Zeile, F.readlines() liest alle Zeilen und speichert sie in einer Liste. ‣ Mit F.write(String) kann man einen String in die Datei schreiben. ‣ Mit F.close() wird die Datei wieder geschlossen. 33 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Serialisierung (Modul pickle) ‣ Wir können also Strings in Dateien schreiben oder lesen. Aber wie ist es mit binären Objekten wie Zahlen, Listen, Mengen oder noch komplexeren Datenstrukturen? ‣ Diese müssen in eine String-Repräsentation gebracht werden, zumindest in ein Format, mit dem Datenaustausch möglich ist. ‣ Die Umwandlung komplexer Objekte in serielle, für den Datenaustausch geeignete Objekte nennt man Serialisierung. ‣ In Python bietet das Modul pickle Funktionalität zur Serialisierung von Objekten. 34 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 17 Serialisierung (Modul pickle) ‣ Das Modul pickle macht Serialisierung sehr einfach. Wenn man ein Fileobjekt F hat und ein beliebiges Datenobjekt O, kann man mit dem Befehl pickle.dump(O, F) das Objekt in die Datei schreiben. ‣ Mit dem Befehl O = pickle.load(F) lädt man das Objekt wieder. 35 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Zusammenfassung und Ausblick ‣ Wir kennen jetzt die wichtigsten zusammengesetzten Datentypen in Python: Listen, Tupel, Mengen, Dictionaries. ‣ Wir haben uns einen Eindruck von der Klassenbibliothek und der Möglichkeiten, alltägliche Aufgaben zu verrichten, verschafft. ‣ Ist natürlich nur ein erster Einblick; die komplette Klassenbibliothek müssen Sie nicht an einem Tag verstehen ‣ Lesen Sie aber in der Referenz nach und vertiefen Sie kontinuierlich Ihre Kenntnisse, auch im Laufe des Semesters! ‣ Morgen beschäftigen wir uns noch mit dem wichtigen Konzept der objektorientierten Programmierung 36 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 18 Vielen Dank für Ihre Aufmerksamkeit! 37 Vorkurs Programmierung WS 2006/2007 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Fragen? 38 Vorkurs Programmierung WS 2006/2007 19