Termin 9: Programmieren im Großen Grundlagen der Informatik Wintersemester 2006/07 Prof. Bernhard Jung Übersicht Programmiertechniken in Python Import von Modulen import-Anweisung Ausgewählte Module der Python Standardbibliothek Ein- und Ausgabe Lesen und Schreiben in Dateien Modul pickle Hauptlernziel • Techniken für das "Programmieren im Großen" kennen lernen und verstehen: • Module / Bibliotheken • Ein- und Ausgabe Prof. B. Jung Grundlagen der Informatik, WS 2006/07 1 Programmieren im Großen import - Anweisung mittels import-Anweisung kann man Module (Python-Skripte) in andere Skripte importieren import-Anweisungen o.ä. gibt es in allen gängigen Programmiersprachen Import von Definitionen von Funktionen (und Klassen) anderer Module werden so im aktuellen Modul verfügbar Standardmodulen (ausgeliefert mit Python-Distribution) selbst geschriebenen Skripten Formen (Python) import modul1, modul2, … from modul import name1, name2, … importiert nur die benannten Funktionsdefinitionen des Moduls Zugriff auf Definitionen ohne Erwähnung des Modulnamens from modul import * Zugriff auf Funktionsdefinitionen mittels modul1.definition importiert alle Definitionen des Moduls Zugriff auf Definitionen ohne Erwähnung des Modulnamens Beispiele … Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Programmieren im Großen import - Anweisung Beispiel: Gewünscht ist Verwendung der Funktionen des PythonSkripts (Moduls) "primzahlen.py" in anderem Python-Skript """Funktionen fuer Primzahlen""" def prim(n): "Testet, ob n Primzahl ist" for teiler in range(2,n): if n % teiler == 0: return False return True primzahlen.py primzahlen.py def primListe(n): u"liefert eine Liste der Primzahlen kleiner gleich n" if n < 2: return [] result = [] for zahl in range(2, n+1): if prim(zahl): result.append(zahl) return result Grundlagen der Informatik, WS 2006/07 Prof. B. Jung 2 Programmieren im Großen import – Anweisung, Beispiel (1) Import des Moduls primzahlen Zugriff mit Modulname Zugriff ohne Modulname Æ Fehler >>> import primzahlen >>> primzahlen.prim(5) True >>> primzahlen.prim(8) False >>> prim(8) Traceback (most recent call last): File "<pyshell#8>", line 1, in -toplevelprim(8) NameError: name 'prim' is not defined >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Programmieren im Großen import – Anweisung, Beispiel (2) Import der Funktion prim aus Modul primzahlen Zugriff ohne Modulname Æ jetzt ok >>> from primzahlen import prim >>> prim(9) False >>> l = primListe(8) Zugriff auf nicht importierte Funktion Æ Fehler Traceback (most recent call last): File "<pyshell#12>", line 1, in -toplevell = primListe(8) NameError: name 'primListe' is not defined >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 3 Programmieren im Großen import – Anweisung, Beispiel (3) Import aller Funktionen aus Modul primzahlen Zugriffe auf beide Funktionen des Moduls Prof. B. Jung >>> from primzahlen import * >>> prim(9) False >>> primListe(13) [2, 3, 5, 7, 11, 13] >>> Grundlagen der Informatik, WS 2006/07 Programmieren im Großen import – Anweisung Wo sucht Python die zu importierenden Module? im aktuellen Verzeichnis wo zuletzt eine .py – Datei geöffnet wurde in den Verzeichnissen der sys.path Variable Inspektion in IDLE: File >> Path Browser Inspektion der sys.path Variable … Prof. B. Jung Grundlagen der Informatik, WS 2006/07 4 Inspektion und Erweitern von sys.path >>> import sys >>> sys.path ['C:\\Python24\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Python24', 'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\sitepackages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\sitepackages\\Pythonwin', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode'] >>> sys.path.append(r'C:\Dokumente und Einstellungen\Jung\Eigene Dateien\MyPythonPrograms') >>> sys.path ['C:\\Python24\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Python24', 'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\sitepackages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\sitepackages\\Pythonwin', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode', 'C:\\Dokumente und Einstellungen\\Jung\\Eigene Dateien\\MyPythonPrograms'] >>> import primzahlen >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Standardbibliotheken in Python – welche gibt es? IDLE: Help > Python Docs Prof. B. Jung Grundlagen der Informatik, WS 2006/07 5 Standardbibliotheken in Python – welche gibt es? Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Ausgewählte Standardbibliotheken: Modul math Definition von Konstanten pi e Definition mathematischer Funktionen ceil(x) – x wird aufgerundet floor(x) – x wird abgerundet sin(x), cos(x), tan(x) – Sinus, Cosinus, Tangens von x asin(x), acos(x), atan(x) degrees(x), radians(x)-Konversion zw. Bogenmaß und Grad fabs(x) – Betrag von x (als float) log(x), log10(x) – Logarithmus von x zur Basis 2 bzw. 10 … Prof. B. Jung Grundlagen der Informatik, WS 2006/07 6 Ausgewählte Standardbibliotheken: Modul math >>> from math import * >>> fabs(-1.1) 1.1000000000000001 >>> pi 3.1415926535897931 >>> cos(pi) -1.0 >>> sin(pi/2) 1.0 >>> floor(8.5) 8.0 >>> ceil(8.5) 9.0 >>> acos(0.5) 1.0471975511965976 >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Ausgewählte Standardbibliotheken: Modul random Funktionen randint(a, b) – liefert zufällige Integer-Zahl zw. a und b (inklusive) random() – liefert zufällige Realzahl zwischen 0 und 1 uniform(a,b) - liefert zufällige Realzahl zw. a und b (inklusive) choice(Sammlung) – liefert ein zufälliges Element der Sammlung (z.B. Liste, Menge) sample( Sammlung, k) – liefert k Zufallselemente aus Sammlung … Prof. B. Jung Grundlagen der Informatik, WS 2006/07 7 Ausgewählte Standardbibliotheken: Modul random >>> from random import * >>> random() 0.79513661012444292 >>> random() 0.93153037147896656 >>> randint(30,39) 36 >>> sample( ['a', 'b', 'c', 'd', 'e'], 3) ['b', 'a', 'c'] >>> sample( ['a', 'b', 'c', 'd', 'e'], 3) ['c', 'a', 'b'] >>> sample( range(50), 10) [23, 14, 43, 6, 29, 42, 24, 18, 28, 8] Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Auswahl Python-Bibliotheken für Multimedia (in Jython andere Multimedia-Bibliotheken) Tkinter graphische Benutzeroberflächen Bilder Winsound Sound auf Windows-Plattform >>> import winsound >>> winsound.PlaySound(r'C:\Dokumente und Einstellungen\Jung\Eigene Dateien\Sounds\techno_mono.wav', winsound.SND_ASYNC ) >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 8 Innovation Nachtsichtassistent für Automobile Infrarot-Technik für mehr Fahrsicherheit bei Dunkelheit Nominierung Deutscher Zukunftspreis 2006, www.deutscher-zukunftspreis.de Team: DaimlerChrysler AG, Robert Bosch AG Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Ein- und Ausgabe: Übersicht Interaktive Ein- und Ausgabe in Python-Interpreter Ausgabe: print auch formatierte Ausgabe (siehe auch Übungen), z.B. >>> print '%1.3f' % 1.2 1.200 Eingabe: input(), raw_input() Ein- und Ausgabe von / in Dateien Datenbanken später Prof. B. Jung Grundlagen der Informatik, WS 2006/07 9 Interaktive Eingabe Eingabe in der Python-Shell raw_input() input() Achtung: Interaktive Eingabe funktioniert nicht in JES-Interpreter Rückgabewert ist immer vom Typ String Typ des Rückgabewerts entsprechend Eingabewert >>> i = input("Geben Sie eine Zahl ein: ") Geben Sie eine Zahl ein: 10 >>> print type(i), i + 1 <type 'int'> 11 >>> i = raw_input("Geben Sie eine Zahl ein: ") Geben Sie eine Zahl ein: 10 >>> print type(i), i + 1 <type 'str'> Traceback (most recent call last): File "<pyshell#34>", line 1, in -toplevelprint type(i), i + 1 TypeError: cannot concatenate 'str' and 'int' objects >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Interaktive Eingabe - Beispiele >>> name = raw_input("Geben Sie Ihren Namen ein: ") Geben Sie Ihren Namen ein: Jung >>> print name Jung >>> type(name) <type 'str'> >>> zahl = raw_input("Geben Sie einen Wert ein: ") Geben Sie einen Wert ein: 10 >>> print zahl 10 >>> type(zahl) <type 'str'> >>> zahl = input("Geben Sie einen Wert ein: ") Geben Sie einen Wert ein: 10 >>> type(zahl) <type 'int'> >>> a = input() [1,2,3] >>> type(a) <type 'list'> >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 10 Interaktive Eingabe – Beispiele Eingabe einer beliebigen Anzahl von Zahlen def leseWerte(): """Interaktives Einlesen von Zahlen-Werten. Abbruch bei Eingabe einer Zahl < 0. """ werte = [] zahl = 0 # Dummy-Wert while (zahl >= 0 ): zahl = input("Eingabe einer Zahl --> ") if zahl >= 0: werte.append(zahl) return werte >>> l = leseWerte() Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> >>> print l [1, 1.2, 3, 4] Prof. B. Jung 1 1.2 3 4 -1 Aber, falls Eingabe keine Zahl: (Behandlung mit 'Exceptions', fortgeschrittenes Thema) >>> leseWerte() Eingabe einer ganzen Zahl --> 2 Eingabe einer ganzen Zahl --> zwei Traceback (most recent call last): File "<pyshell#17>", line 1, in toplevel-leseWerte() Grundlagen der Informatik, WS 2006/07 … NameError: name 'zwei' is not defined Arbeiten mit Dateien Ziel: Verfügbarkeit von Daten auch nach Beendigung eines Programms Æ Speichern der Daten in Dateien Prinzipielles Vorgehen beim Arbeiten mit Dateien 1. 2. 3. Öffnen der Datei (wiederholtes) Lesen bzw. Schreiben von Daten Schließen der Datei Prof. B. Jung Grundlagen der Informatik, WS 2006/07 11 Öffnen und Schließen von Dateien f = open(filename, mode) Erzeugt ein Objekt f vom Typ file Mode r – Datei zum Lesen öffnen. Die Datei muss existieren. w – Datei zum Schreiben öffnen. Existiert eine gleichnamige Datei, wird sie gelöscht. a – Schreiben am Ende einer Datei. Die Datei muss existieren. r+ - Lesen und Schreiben. Die Datei muss existieren. w+ - Lesen und Schreiben. Existiert eine gleichnamige Datei, wird sie gelöscht. a+ - Lesen und Schreiben am Ende einer Datei. Die Datei muss existieren. f.close() Anwendung der Methode close() auf das file-Objekt f Prof. B. Jung Grundlagen der Informatik, WS 2006/07 In Dateien Schreiben Schreiben von Strings f.write(String) f.writeLines([String1, String2, … ]) Schreiben verschiedener Datentypen mittels print Ausgabe erscheint in Datei wie bei print im Interpreter print >> f, data z.B. Prof. B. Jung print >> f, 10 print >> f, "Hallo Welt" print >> f, "%x" % 15 # Ausgabe als Hexadezimalzahl Grundlagen der Informatik, WS 2006/07 12 In Dateien Schreiben – Beispiel (write) def saveList(filename,list): f = open(filename, 'w') # for i in list: f.write( str(i) ) # f.write( "\n") # f.close() # Übergabe des Dateinamen als Raw-String open file for writing write each list element as string start a new line close the file Verzeichnis c:\temp muss existieren >>> saveList(r'c:\temp\list1.txt', [1,'zwei', 3.0]) >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 In Dateien Schreiben – Beispiel (print) def saveList2(filename,list): f = open(filename, 'w') # open file for writing for i in list: print >> f, i # print each list element to the file f.close() # close the file Übergabe des Dateinamen als normaler String Verzeichnis c:\temp muss existieren >>> saveList2('c:\\temp\\list2.txt', [1,'zwei', 3.0, (1,2) ]) >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 13 Aus Dateien Lesen Methoden f.read() – gibt die ganze Datei zurück (als String) f.read(n) – liest n Zeichen f.readline() – liest eine Zeile (d.h. bis '\n') f.readlines() – gibt eine Liste zurück; jedes Element ist eine Zeile der gelesenen Datei f Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Aus Dateien Lesen - Beispiel def readList(filename): f = open(filename, 'r') # open file for reading lines = f.readlines() # read all lines f.close() return lines Datei c:\temp\list2.txt muss existieren >>> readList2(r'c:\temp\list2.txt') ['1\n', 'zwei\n', '3.0\n', '(1, 2)\n'] >>> Rückgabe: Liste von Strings Prof. B. Jung Grundlagen der Informatik, WS 2006/07 14 Ein- und Ausgabe mit dem Modul pickle Problem bisher beim Einlesen read-Funktionen liefern nur Strings Einlesen anderer Datentypen erfordert explizite Konvertierung >>> i = int('1') >>> j = int('2\n') >>> print i, j 1 2 z.B. mittels int(), float()-Funktionen für komplexe Datentypen (Listen, Mengen, Objekte) noch komplexer fehleranfällig! Modul pickle (etwa: Einpökeln): ermöglicht Speichern und anschließendes Auslesen beliebiger Objekte ohne explizite Konvertierung Funktionen dump(data, file) # schreibe Daten data in Datei file load(file) # lädt Daten aus Datei; Rückgabe als ein Objekt Mögl. Nachteil: gespeicherte Dateiinhalte nicht mehr unbedingt verständlich Prof. B. Jung Grundlagen der Informatik, WS 2006/07 Modul pickle - Beispiel def saveWithPickle(filename, obj): f = open(filename, 'w') # open file for writing from pickle import dump dump(obj, f) f.close() def readWithPickle(filename): f = open(filename, 'r') # open file for reading from pickle import load obj = load(f) f.close() return obj >>> saveWithPickle(r'c:\temp\list3.txt', ['eins', 2, 3.0, {"otto":1}] ) >>> readWithPickle(r'c:\temp\list3.txt') ['eins', 2, 3.0, {'otto': 1}] >>> Prof. B. Jung Grundlagen der Informatik, WS 2006/07 15