Aggregierte Datentypen, Klassenbibliothek

Werbung
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
Herunterladen