Kapitel 8: Einführung in Python (2) Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Übersicht Definition von Funktionen Definition einfacher Funktionen lokale und globale Variablen Parameterübergabe Rekursive Funktionen Import von Modulen import-anweisung Ausgewählte Module der Python Standardbibliothek Literatur M. Weigend. Objektorientierte Programmierung mit Python. MITP. 2006. J. Elkner and A. B. Downey. How to Think Like a Computer Scientist. Learning with Python 2nd Edition. http://www.ibiblio.org/obp/thinkcspy/ 1
Python Definition und Ausführung von Skripten Öffnen des Editors Ausführen/Laden mit: Run Module F5 Editor Konsole/Shell Python Definition und Ausführung von Skripten Python-Skript: Text-Datei mit Endung.py Python-Skripte können enthalten Definition von Funktionen Definition von Klassen (später in VL) beliebige weitere Anweisungen, die bei Laden des Skripts sofort ausgeführt werden Hauptprogramm Skript: Bei Laden/Ausführung des Skripts (in IDLE mit Taste F5): 2
Definition von Funktionen def funktionsname(arg1, arg2, ): anweisungsblock Funktionskopf Schlüsselwort def, Funktionsname, Parameterliste in Klammern, Doppelpunkt Funktionskörper Anweisungsblock, d.h. Folge von Anweisungen eingerückt! mit Schlüsselwert return kann ein Rückgabewert festgelegt werden Rückgabewert kann auch Tupel, Liste oder anderes Objekt sein def summierebis(n): sum = 0 for i in range(1,n+1): sum = sum + i return sum def sumandmultiplyto(n): sum = 0 prod = 1 for i in range(1,n+1): sum = sum + i prod = prod * i return (sum,prod) Definition von Funktionen: Vom Struktogramm zum Programm Beispiel: Euklidischer Algorithmus ggt(a,b) b!= 0 a > b ja nein a = a-b b=b-a a def ggt(a,b): while b!= 0: if a > b: a = a-b else: b = b-a return a ggt(35,14) 7 ggt(25,35) 5 ggt(50,100) 50 3
Muster: Einlesen von Zahlen def lies_messwerte(): werte = [] messwert = 0 while messwert >= 0: messwert = input("geben Sie eine Zahl ein: ") if messwert >= 0: werte.append(messwert) return werte # Hauptprogramm messwerte = lies_messwerte() print "Eingebenen wurden die Werte:", messwerte print "Max. Wert ist ", max(messwerte) Funktion liest wiederholt jeweils eine Zahl vom Eingabe-Prompt ein Ende der Schleife bei Eingabe einer Zahl < 0 Rückgabe der Eingabewerte als Liste Geben Sie eine Zahl ein: 4 Geben Sie eine Zahl ein: 2.5 Geben Sie eine Zahl ein: 8.25 Geben Sie eine Zahl ein: 0 Geben Sie eine Zahl ein: 1 Geben Sie eine Zahl ein: -1 Eingebenen wurden die Werte: [4, 2.5, 8.25, 0, 1] Max. Wert ist 8.25 "Muster": Programmstück, das so oder in leichter Abwandlung häufig (wieder-) verwendet wird Ausführung von Funktionen - Globale und lokale Namensräume Definition einer lokalen Variable x Definition globaler Variablen x, y lokale Variablen sind nur innerhalb der Funktionsdefinition sichtbar, d.h. können außerhalb nicht verwendet werden innerhalb von Funktionen sind lokale und globale Variablen sichtbar bei Namensgleichheit einer lokalen mit einer globalen Variable wird die lokale Variable ausgewertet def f(): x = 2 print "x in Funktion f(): ", x print "y in Funktion f(): ", y # Hauptprogramm x = 1 y = 1 f() print "x in Hauptprogramm: ", x print "y in Hauptprogramm: ", y x in Funktion f(): 2 y in Funktion f(): 1 x in Hauptprogramm: 1 y in Hauptprogramm: 1 4
Ausführung von Funktionen - Globale und lokale Namensräume def f(): x = 2 print "Globaler Namensraum von f(): ", globals() print "Lokaler Namensraum von f(): ", locals() Standardfunktionen # Hauptprogramm x = y = 1 f() Globaler Namensraum von f(): {'f': <function f at 0x00B45830>, ' builtins ': <module ' builtin ' (built-in)>, 'x': 1, 'y': 1, ' name ': ' main ', ' doc ': None} Lokaler Namensraum von f(): {'x': 2} Ausführung von Funktionen - Globale und lokale Namensräume Innerhalb von Funktionen können globale Variablen gelesen, aber nicht ohne Weiteres verändert werden Zur Veränderung einer globalen Variable innerhalb einer Funktion dient die global-anweisung (teilt Python mit, dass Zuweisung an eine globale Variable erfolgen soll) def verdopple(): global x x = x * 2 # Hauptprogramm x = 10 verdopple() print x 20 5
Zur Verwendung globaler Variablen Globale Variablen sind scheinbar bequem, weil sie im ganzen Programm sichtbar sind nicht notwendig, sie beim Aufruf einer Funktion als Parameter zu übergeben Sie werden aber auch leicht zur Fehlerquelle! Z.B. Möglichkeit zur Definition von Funktionen, die bei Aufruf mit gleichen Parametern unterschiedliche Ergebnisse liefern (siehe rechts) manchmal effizienter Code oft verwirrend! dies verletzt Prinzip der referentiellen Transparenz: Wert eines Ausdrucks sollte nur von seiner Umgebung abhängen def f(x): global count count = count + 1 return x + count count = 0 f(1) 2 f(1) 3 f(1) 4 globale Variablen sollten sparsam, evtl. überhaupt nicht verwendet werden! Ausführung von Funktionen - Parameterübergabe (1) Auf formale Parameter, d.h. Namen der Parameter im Funktionskopf, kann im Funktionskörper genau wie auf lokale Variablen zugegriffen werden Bei Aufruf der Funktion halbiere() wird der Parameter innerhalb der Funktion an eine andere Variable gebunden Sind die als Parameter übergebene Objekte unveränderbar z.b. Zahlen, Strings, Tupel dann haben Veränderungen innerhalb der Funktion keine Auswirkungen auf Objekte außerhalb def halbiere(zahl): zahl = float(zahl) zahl = zahl / 2 return zahl n = 5 halbiere(n) 2.5 n # n bleibt unverändert 5 n = halbiere(n) print n 2.5 6
Ausführung von Funktionen - Parameterübergabe (2) Veränderbare Objekte, z.b. Listen, können, wenn sie als Argumente einer Funktion übergeben werden, in dieser Funktion modifiziert werden (die Veränderungen sind auch außerhalb der Funktion wirksam)! def quadriere(l): for i in range( len(l) ): l[i] = l[i] * l[i] # Hauptprogramm liste = [1,2,3,4,5] print liste quadriere( liste ) print liste Programmlauf: [1, 2, 3, 4, 5] [1, 4, 9, 16, 25] Voreingestellte Parameter Manche Funktionen haben optionale Parameter, die bei Funktionsaufruf weggelassen werden können In der Funktionsdefinition werden für diese Default-Werte angegeben: def funktionsname(arg1=wert1, arg2=wert2, ): def wertetabelle(anzahl=3, schritt=0.5): x = 0.0 for i in range(anzahl): print x, ' ', x*x x = x + schritt wertetabelle() 0.0 0.0 0.5 0.25 1.0 1.0 wertetabelle(3,1) 0.0 0.0 1.0 1.0 2.0 4.0 wertetabelle(5) 0.0 0.0 0.5 0.25 1.0 1.0 1.5 2.25 2.0 4.0 7
Schlüsselwort-Argumente Bisher: Aufruf von Funktionen mit Positionsargumenten Reihenfolge der Argumente bei Aufruf entsprechend Funktionsdefinition In Python auch möglich: Aufruf mittels Schlüsselwort-Argumente der Form funktionsname(arg1=wert1, arg2=wert2, ) def wertetabelle(anzahl=3, schritt=0.5): x = 0.0 for i in range(anzahl): print x, ' ', x*x x = x + schritt wertetabelle(schritt=0.1) 0.0 0.0 0.1 0.01 0.2 0.04 wertetabelle(schritt=0.1, anzahl=5) 0.0 0.0 0.1 0.01 0.2 0.04 0.3 0.09 0.4 0.16 Rekursive Funktionen Rekursive Funktion: Funktion, die sich selbst aufruft z.b. Fakultät: n! = 1 * 2 * * n rekursive Formulierung der Fakultätsfunktion: 1! = 1 n! = n * (n-1)!, n > 1 120 3628800 2432902008176640000 def fak(n): if n == 1: return 1 else: return n * fak(n-1) # Hauptprogramm print fak(5) print fak(10) print fak(20) 8
Rekursive Funktionen Fibonacci-Folge: 1, 1, 2, 3, 5, 8, 13, Rekursive Formulierung Basisfall: fib(1) = 1 Basisfall: fib(2) = 1 Rekursionsfall (n>2): fib(n) = fib(n-1) + fib(n-2) def fib(n): if n == 1 or n==2: return 1 else: return fib(n-1) + fib(n-2) mit Rückgabe als Liste: def fib1(n): if n == 1: return [1] elif n== 2: return [1,1] else: bisher = fib1(n-1) i = bisher[n-2] + bisher[n-3] return bisher + [i] Dokumentation von Funktionen - Docstrings Unterhalb des Funktionskopfes sollte ein Kommentar in dreifachen Anführungszeichen angebracht werden Dieser Docstring der Funktion kann im interaktiven Modus mit der help()- Funktion zum Vorschein gebracht werden def fak(n): """Berechnung der Fakultaet einer Zahl. Eingabe: eine Zahl n Ausgabe: Fakultaet n! der Zahl Autor: Bernhard Jung, 15.11.2005 """ if n == 1: return 1 else: return n * fak(n-1) help(fak) Help on function fak in module main : fak(n) Berechnung der Fakultaet einer Zahl. Eingabe: eine Zahl n Ausgabe: Fakultaet n! der Zahl Autor: Bernhard Jung, 15.11.2005 9
Programmieren im Großen import - Anweisung mittels 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.ä. gibt es in allen gängigen Programmiersprachen Import von Standardmodulen (ausgeliefert mit Python-Distribution) von Dritten geschriebene Module (im Web zahlreich zu finden) selbst geschriebenen Skripten Formen (Python) import modul1, modul2, Zugriff auf Funktionsdefinitionen mittels modul1.definition from modul import name1, name2, importiert nur die benannten Funktionsdefinitionen 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 Beispiele Programmieren im Großen import - Anweisung Beispiel: Gewünscht ist Verwendung der Funktionen des Python-Skripts (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 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 10
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 Programmieren im Großen import Anweisung, Beispiel (2) Import der Funktion prim aus Modul primzahlen Zugriff ohne Modulname jetzt ok Zugriff auf nicht importierte Funktion Fehler from primzahlen import prim prim(9) False l = primliste(8) Traceback (most recent call last): File "<pyshell#12>", line 1, in -toplevell = primliste(8) NameError: name 'primliste' is not defined 11
Programmieren im Großen import Anweisung, Beispiel (3) Import aller Funktionen aus Modul primzahlen Zugriffe auf beide Funktionen des Moduls from primzahlen import * prim(9) False primliste(13) [2, 3, 5, 7, 11, 13] 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 12
Inspektion und Erweitern von sys.path import sys sys.path ['C:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages', 'C:\\Python25\\lib\\site-packages\\PIL'] sys.path.append(r'c:\dokumente und Einstellungen\Jung\Eigene Dateien\MyPythonPrograms') sys.path ['C:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages', 'C:\\Python25\\lib\\site-packages\\PIL', 'C:\\Dokumente und Einstellungen\\Jung\\Eigene Dateien\\MyPythonPrograms'] import primzahlen Standardbibliotheken in Python welche gibt es? IDLE: Help > Python Docs 13
Standardbibliotheken in Python welche gibt es? 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 14
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 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 15
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] Auswahl Python-Bibliotheken für Multimedia 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 ) 16