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/ Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 1 Python – Definition und Ausführung von Skripten Öffnen des Editors Ausführen/Laden mit: Run Module F5 Editor Konsole/Shell Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Python – Definition und Ausführung von Skripten Python-Skript: Python-Skripte können enthalten Text-Datei mit Endung .py Definition von Funktionen Definition von Klassen (später in VL) beliebige weitere Anweisungen, die bei Laden des Skripts sofort ausgeführt werden Æ Hauptprogramm Skript: Prof. B. Jung Bei Laden/Ausführung des Skripts (in IDLE mit Taste F5): Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 2 Definition von Funktionen def funktionsname(arg1, arg2, …): anweisungsblock Funktionskopf Funktionskörper Schlüsselwort def, Funktionsname, Parameterliste in Klammern, Doppelpunkt Anweisungsblock, d.h. Folge von Anweisungen mit Schlüsselwert return kann ein Rückgabewert festgelegt werden eingerückt! 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 Prof. B. Jung def sumAndMultiplyTo(n): sum = 0 prod = 1 for i in range(1,n+1): sum = sum + i prod = prod * i return (sum,prod) Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Definition von Funktionen: Vom Struktogramm zum Programm Beispiel: Euklidischer Algorithmus ggt(a,b) b != 0 ja a>b a = a-b a nein b=b-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 Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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) "Muster": Programmstück, das so oder in leichter Abwandlung häufig (wieder-) verwendet wird Prof. B. Jung 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] TU Bergakademie Freiberg Grundlagen der Informatik, WS 2007/08 Max. Wert ist 8.25 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 Prof. B. Jung 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 y in x in y in >>> Funktion f(): 2 Funktion f(): 1 Hauptprogramm: 1 Hauptprogramm: 1 Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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} Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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) Prof. B. Jung def verdopple(): global x x = x * 2 # Hauptprogramm x = 10 verdopple() print x >>> 20 >>> Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 def f(x): global count count = count + 1 return x + count Sie werden aber auch leicht zur Fehlerquelle! count = 0 Z.B. Möglichkeit zur Definition von Funktionen, die bei Aufruf mit gleichen Parametern unterschiedliche Ergebnisse liefern (siehe rechts) >>> f(1) manchmal effizienter Code oft verwirrend ! dies verletzt Prinzip der referentiellen Transparenz: Wert eines Ausdrucks sollte nur von seiner Umgebung abhängen 2 >>> f(1) 3 >>> f(1) 4 Æ globale Variablen sollten sparsam, evtl. überhaupt nicht verwendet werden ! Prof. B. Jung TU Bergakademie Freiberg Grundlagen der Informatik, WS 2007/08 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 Prof. B. Jung def halbiere(zahl): zahl = float(zahl) zahl = zahl / 2 return zahl >>> >>> 2.5 >>> 5 >>> >>> >>> >>> 2.5 >>> n = 5 halbiere(n) n # n bleibt unverändert n = halbiere(n) print n Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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] >>> Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 >>> Prof. B. Jung >>> wertetabelle(3,1) 0.0 0.0 1.0 1.0 2.0 4.0 >>> Grundlagen der Informatik, WS 2007/08 >>> wertetabelle(5) 0.0 0.0 0.5 0.25 1.0 1.0 1.5 2.25 2.0 4.0 >>> TU Bergakademie Freiberg 7 Schlüsselwort-Argumente Bisher: Aufruf von Funktionen mit Positionsargumenten In Python auch möglich: Aufruf mittels Schlüsselwort-Argumente der Form Reihenfolge der Argumente bei Aufruf entsprechend Funktionsdefinition 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 >>> Prof. B. Jung >>> 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 Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 >>> Prof. B. Jung def fak(n): if n == 1: return 1 else: return n * fak(n-1) # Hauptprogramm print fak(5) print fak(10) print fak(20) Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 8 Rekursive Funktionen Fibonacci-Folge: 1, 1, 2, 3, 5, 8, 13, … def fib(n): if n == 1 or n==2: return 1 else: return fib(n-1) + fib(n-2) Rekursive Formulierung Basisfall: fib(1) = 1 Basisfall: fib(2) = 1 Rekursionsfall (n>2): fib(n) = fib(n-1) + fib(n-2) Prof. B. Jung 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] Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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) Prof. B. Jung >>> 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 Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 9 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) von Dritten geschriebene Module (im Web zahlreich zu finden) 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 2007/08 TU Bergakademie Freiberg 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 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 2007/08 Prof. B. Jung TU Bergakademie Freiberg 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 >>> Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 2007/08 TU Bergakademie Freiberg 11 Programmieren im Großen import – Anweisung, Beispiel (3) Import aller Funktionen aus Modul primzahlen >>> from primzahlen import * >>> prim(9) False >>> primListe(13) [2, 3, 5, 7, 11, 13] >>> Zugriffe auf beide Funktionen des Moduls Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 2007/08 TU Bergakademie Freiberg 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 >>> Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Standardbibliotheken in Python – welche gibt es? IDLE: Help > Python Docs Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 13 Standardbibliotheken in Python – welche gibt es? Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 2007/08 TU Bergakademie Freiberg 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 >>> Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 2007/08 TU Bergakademie Freiberg 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] Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 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 ) >>> Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 16