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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Ü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 (oder zwei Sterne, dann wird es ein Dictionary): 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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 1 Übungs-Nachlese Ausgabe: a ist A b ist B Rest ist: CD EF GH 4 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Übungs-Nachlese ‣ Aufgabe 2 def betrag(operand): """Liefert den Betrag von operand""" return (operand**2)**0.5 def fak_it(operand): """Berechnet die Fakultaet von operand iterativ""" fak = 1 for i in range(1,operator+1): fak *= i return fak 5 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Übungs-Nachlese def fak_rek(operand): """Berechnet die Fakultaet von operand (rekursiv)""" if operand == 1: return 1 else: return operand * fak_rek(operand-1) 6 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 2 Übungs-Nachlese while 1 == 1: operand = input("Operand: ") operator = raw_input("Operator: ") if operator == "ende": break elif operator == "betrag": print betrag(operand) elif operator == "fakultaet": print fak_it(operand) print fak_rek(operand) else: operand2 = input("Operand 2: ") if operator == "+": print operand + operand2 elif operator == "-": print operand - operand2 elif operator == "*": print operand * operand2 elif operator == "/": print operand / operand2 elif operator == "**": print operand ** operand2 elif operator == "%": print operand % operand2 7 Vorkurs Programmierung WS 2007/2008 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 8 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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 9 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 3 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). 10 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Aggregierte Datentypen - Datenstrukturen - Objekte ‣ Die Definition von Datenstrukturen erfolgt im Allgemeinen durch die Angabe einer Spezifikation zur Datenhaltung 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. 11 Vorkurs Programmierung WS 2007/2008 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). 12 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 4 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) 13 Vorkurs Programmierung WS 2007/2008 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) 14 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Listen II ‣ Listen werden initialisiert, indem man Elemente in eckige Klammern setzt, durch Kommata getrennt: liste liste # # ‣ 15 = [] # 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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 5 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] 16 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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] 17 Vorkurs Programmierung WS 2007/2008 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] 18 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 6 Listen VI ‣ Weitere Befehle: >>> liste.append(15) >>> liste [10, 20, 15] >>> 20 in liste True >>> liste.sort() >>> liste [10, 15, 20] ‣ 19 u.v.m. siehe help(list) und die Python-Dokumentation Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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 20 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Einwurf: mutable vs. immutable ‣ Objekte, die nach ihrer Erzeugung verändert werden können, nennt man mutable (veränderlich). Dazu gehören unter Python Listen, Dictionaries und Mengen. ‣ Objekte, die nicht verändert werden können, sind immutable (unveränderlich). Dies sind vor allem Strings, in Python auch Tupel ‣ Anwendung: z.B. bei Multithreading 21 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 7 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. ‣ Deklaration: Geschweifte Klammern { } und Schlüssel/Wert-Paare, duch Doppelpunkt markiert und Kommata getrennt 22 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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 2007/2008 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 ‣ Deklaration: Schlüsselwort set und als Parameter ein aufzählbares Objekt (z.B. eine Liste) 24 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 8 Mengen (Sets) >>> liste = [ 'a', 'b', 'c', 'a' ] >>> menge1 = set(liste) >>> menge1 set(['a', 'c', 'b']) >>> 'a' in menge1 True >>> 'd' in menge1 False >>> menge2 = set([ 'a', 'd', 'f' ]) >>> menge1 | menge2 # Vereinigung set(['a', 'c', 'b', 'd', 'f']) >>> menge1 - menge2 # Differenz set(['c', 'b']) >>> menge1 & menge2 # Schnitt set(['a']) >>> menge1 ^ menge2 # Symmetrische Differenz set(['c', 'b', 'd', 'f']) 25 Vorkurs Programmierung WS 2007/2008 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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 9 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 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Wichtige Module ‣ ‣ ‣ ‣ ‣ help() math: sin(x), cos(x), floor(x), ceil(x), sqrt(x) random: Erzeugung von Zufallszahlen time: Liefert die Systemzeit und Routinen zur Umrechnung decimal: Bruchrechnung ohne Rundungsfehler >>> import decimal >>> x = decimal.Decimal("10") >>> x Decimal("10") >>> 1 / x Decimal("0.1") >>> 1 / 10.0 0.10000000000000001 29 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Modul copy ‣ Variablen sind in Python nur Referenzen auf Objekte, die im Speicher liegen. ‣ Kann Probleme geben, wenn man Objekte kopieren will. Wenn man nur eine Zuweisung zur Variablen macht, verweisen beide auf dasselbe Objekt: >>> >>> [1, >>> >>> [1, >>> >>> [1, >>> [1, 30 a = [1, 2, 3] a 2, 3] b = a b 2, 3] b[1] = 4 b 4, 3] a 4, 3] Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 10 Klassenbibliothek: Modul copy ‣ Dieses Problem lässt sich umgehen, indem man die Funktion copy.copy() verwendet: >>> >>> >>> [1, >>> >>> >>> [1, >>> [1, 31 import copy a = [1, 2, 3] a 2, 3] b = copy.copy(a) b[1] = 4 b 4, 3] a 2, 3] Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Modul copy ‣ copy() macht allerdings nur eine oberflächliche Kopie. Wenn unser Objekt Daten enthält, die keine elementaren Datentypen sind, sondern ebenfalls nur Referenzen, werden auch wieder nur die Referenzen kopiert: >>> a = [[1, 2], [3, 4]] >>> a [[1, 2], [3, 4]] >>> b = copy.copy(a) >>> b [[1, 2], [3, 4]] >>> b[0][1] = 5 >>> b [[1, 5], [3, 4]] >>> a [[1, 5], [3, 4]] 32 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Modul copy ‣ deepcopy() macht eine tiefe Kopie, d.h. es geht rekursiv hinunter, bis nur noch elementare Datentypen angetroffen werden, und kopiert die gesamte Datenstruktur: >>> a = [[1, 2], [3, 4]] >>> b = copy.deepcopy(a) >>> b[0][1] = 5 >>> b [[1, 5], [3, 4]] >>> a [[1, 2], [3, 4]] 33 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 11 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 34 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Klassenbibliothek: Modul sys ‣ exit([x]) – Programm beenden und Code x zurückgeben ‣ getfilesystemencoding() – Zeichensatz des Dateisystems ‣ path – Liste mit den Verzeichnissen des Suchpfades. Hier kann man auch eigene Pfade einfügen. 35 Vorkurs Programmierung WS 2007/2008 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. ‣ 36 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 12 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. 37 Vorkurs Programmierung WS 2007/2008 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. 38 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 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. 39 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 13 Threading ‣ Von Threading (Nebenläufigkeit) spricht man, wenn innerhalb eines laufenden Programms (Prozesses) Codeteile parallel abgearbeitet werden ‣ Threads teilen sich denselben Speicherbereich, haben aber eigene Befehlszähler und Stacks ‣ Bei konkurrierendem Zugriff auf Daten muss sichergestellt werden, dass durch geeignete Synchronisationsmechanismen stets ein definierter Zustand besteht 40 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Threading import threading, time class Hintergrund(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print "Beginne langwierige Berechnung...\n" time.sleep(5) # 5 Sekunden nichts tun print "Ende der langwierigen Berechnung.\n" background = Hintergrund() background.start() # Berechnung im Hintergrund starten print "Hauptprogramm bleibt im Vordergrund.\n" background.join() # Warte auf Ende des Threads print "Hauptprogramm hat Ende der Berechnung abgewartet.\n" 41 Vorkurs Programmierung WS 2007/2008 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 42 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit 14 Vielen Dank für Ihre Aufmerksamkeit! 43 Vorkurs Programmierung WS 2007/2008 Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Dipl.-Inf. Jörg Demmer Hier wird Wissen Wirklichkeit Fragen? 44 Vorkurs Programmierung WS 2007/2008 15