Grundlagen der Informatik Wintersemester 2005/06 Prof. Bernhard Jung Passworte für Web-Formulare in den Übungen! Prof. B. Jung Grundlagen der Informatik, WS 2005/06 1 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 Prof. B. Jung Grundlagen der Informatik, WS 2005/06 import über import-Anweisung kann man Module (Python-Skripte) in andere Skripte importieren Definitionen von Funktionen (und Klassen) anderer Module werden so im aktuellen Modul verfügbar import-Anweisungen o.ä. kommen in allen gängigen Programmiersprachen vor Formen (Python) import modul1, modul2, … Zugriff mit auf Definitionen mittels modul1.definition from modul import name1, name2, … importiert nur die benannten Definitionen des Moduls Zugriff auf Definitionen ohne Erwähnung des Modulnamens from modul import * importiert alle Definitionen des Moduls Zugriff auf Definitionen ohne Erwähnung des Modulnamens Prof. B. Jung Grundlagen der Informatik, WS 2005/06 2 import Beispiel: Gewünscht ist Verwendung der Funktionen des PythonSkripts (Moduls) "primzahlen.py" in anderem Python-Skript """Funktionen fuer Primzahlen""" primzahlen.py primzahlen.py def prim(n): "Testet, ob n Primzahl ist" for teiler in range(2,n): if n % teiler == 0: return False return True 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 2005/06 Prof. B. Jung import ! " #$% Zugriff des Moduls primzahlen Zugriff mit Modulname Zugriff ohne Modulname Fehler Prof. B. Jung >>> 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 >>> Grundlagen der Informatik, WS 2005/06 3 import ! " #&% Zugriff 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 import Grundlagen der Informatik, WS 2005/06 ! " #'% Zugriff aller Funktionen aus Modul primzahlen Zugriffe auf beide Funktionen des Moduls ok Prof. B. Jung >>> from primzahlen import * >>> prim(9) False >>> primListe(13) [2, 3, 5, 7, 11, 13] >>> Grundlagen der Informatik, WS 2005/06 4 import 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 2005/06 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 2005/06 5 * + ) , 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 2005/06 * + ) , >>> 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 2005/06 6 * + ) , 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 2005/06 * + ) , >>> 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 2005/06 7 # 0 - ! % ) . / , 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 1 (. 2 3 !3 - Prof. B. Jung Grundlagen der Informatik, WS 2005/06 2+ #( 4 ) 5 "% Grundlagen der Informatik, WS 2005/06 8 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 2005/06 ) Eingabe in der Python-Shell raw_input() Achtung: Interaktive Eingabe funktioniert nicht in JES-Interpreter Rückgabewert ist immer vom Typ String input() 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 2005/06 9 ( ) ! " >>> 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 2005/06 4 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 2005/06 10 6. . + 4 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 2005/06 (4 + 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. print >> f, 10 print >> f, "Hallo Welt" print >> f, "%x" % 15 # Ausgabe als Hexadezimalzahl Prof. B. Jung Grundlagen der Informatik, WS 2005/06 11 (4 + ! " # 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 (4 Grundlagen der Informatik, WS 2005/06 + ! " #" % 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 2005/06 12 4 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 2005/06 4 ! " 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 2005/06 13 , ") Problem bisher beim Einlesen read-Funktionen liefern nur Strings Einlesen anderer Datentypen erfordert explizite Konvertierung 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 2005/06 ") ! " 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 2005/06 14