S OFTWAREENTWICKLUNG MIT P YTHON St. Behrens L. Hellmig FAHRPLAN Motivation und Kurzvorstellung Über den Umgang mit Daten Algorithmik Grafisches mit Python Turtlegrafik GUI Grundlagen der Objektorientierung M OTIVATION Delphi und Java stellen eine hohe Einstiegshürde für Programmieranfänger dar. Ressourcen werden für Codierung statt für die Modellierung von Daten und Algorithmen verbraucht. (Klammern- und Semikolonsuche in unübersichtlichem Quelltext) Verändertes Lizenzmodell für Delphi Nach Übernahme von SUN durch Oracle unklare Zukunft von Java E RFAHRUNGSWERTE MIT P YTHON Weiterbildungen/Vorlesungen Programmiersprache der Landesolympiade Informatik www.pythonchallenge.org Python als Sprache visueller Programmierumgebungen Hamster Kara Scratch … www.pathfinder-mv.de M ONTY P YTHON : Die N a m e n s ge b e r http://screenrant.com/bright-side-life-jake-16534/ 5 P YTHON (*1990) Verbreitung lokale, plattformunabhängige, zeitunkritische Anwendungen Webapplikationen Schnittstellen zu anderen Programmiersprachen http://www.flickr.com/photos/52614599@N00/199700290/ Philosophie einfach, intuitiv und mächtig Open Source wie reines Englisch zu lesender Quelltext geeignet für tägliche Aufgaben und kurze Entwicklungszeiten Guido van Rossum wohlwollender Diktator auf Lebenszeit (Benevolent Dictator for Life, BDFL) 6 PALINDROMTEST: J AVA VS . P YTHON >>> import antigravity S TECKBRIEF Interpretierte Sprache Implizite, dynamische, starke Typisierung Struktur des Quelltextes ist Syntaxelement. Unterstützung des imperativen, objektorientierten und funktionalen Programmierparadigmas aktuelle Versionen Python 3.2 Python 2.7.1 Python 3.x Python 2.x I NSTALLATION http://www.python.org/ ??? I NSTALLATION http://www.portablepython.com/ Für weitere Plattformen (z. B. DOS ) sind v. a. Versionen der 2.x-Reihe erhältlich. I NSTALLATION Installation des Python-Interpreters ist nötig zum Programmieren Ausführen der Programme Installierbar auf lokalen Maschinen Webservern Erzeugen einer lauffähigen Anwendung unter Windows ist mit dem Tool py2exe möglich. IDE S Python Command Line IDLE (Shell + IDE) Syntaxhighlighting Einfacher Debugger Alternativen? PythonWin (ActivePython) PyEclipse, PyDev (Eclipse-Plugins) Jython, CPython, IronPython, … (Java, C, .NET) http://couchtripper.com/pics/comedy/EricIdle.jp g In der Standardausstattung enthalten sind V OM Q UELLTEXT ZUM M ASCHINENCODE Compiler Übersetzung des Quellcodes als Ganzes in eine ausführbare Programmdatei Interpreter Zeilenweise Übersetzung des Quelltextes und umgehende Ausführung Eins Eins Zwei Drei Eins Zwei Zwei Eins Zwei Drei Drei Drei 14 P ROGRAMMAUSFÜHRUNG Compiler Geschwindigkeitsvorteile Fehlererkennung: 1. 2. Syntaktisch beim Compilieren Erkennen von Laufzeitfehlern (technisch bzw. semantisch) Interpreter In-Time-Übersetzung reduziert die Performance. Erkennung von Fehlern (mit Ausnahme grober Syntaxfehler) in den betreffenden Zeilen erst bei der Programmausführung. Test einzelner Anweisungen per Eingabekonsole möglich 15 E RSTE S CHRITTE Python IDLE STARTEN P YTHON -S HELL ALS TASCHENRECHNER Die Eingabe eines mathematischen Terms wird vom Interpreter ausgewertet und auf der Konsole ausgegeben. >>> 8+2 #Addition 10 >>> 8-2 #Subtraktion 6 >>> 8*2 #Multiplikation 16 >>> 8/3 #Division 2.6666666666666665 >>> 8//5 #ganzzahlige Division 1 >>> 8%5 #Modulo (Rest bei ganzzahliger Division) 3 >>> 8**3 #Potenzieren 512 Die Vorrangautomatik wird beherrscht. 2.666: Es wird ein Dezimal-PUNKT gesetzt. 18 DATENTYPEN Python D ATENTYPEN IN P YTHON Jeder Datentyp ist eine Klasse. Operieren mit Klassenmethoden des Datentyps selbst importierter Klassen (z. B. math, random, …) Built-in-Funktionen http://docs.python.org/py3k/library/functions.html ?highlight=pow#built-in-functions Operatoren WICHTIGE D ATENTYPEN IN P YTHON Numerische Typen int, float, complex Boolescher Typ bool Sequentielle Typen str, list, tuple Mapping-Typ dict Mengentypen set, frozenset KeinWert-Typ NoneType 21 N UMERISCHE D ATEN : O PERATOREN /F UNKTIONEN + - * / ** // % <> <= >= == != Grundrechenarten Potenzieren Ganzzahlige Division Modulo Kleiner/Größer Kleiner-Gleich/Größer-Gleich Gleich/Ungleich abs(x) Absoluter Betrag round(x,n) Rundung auf n Dezimalstellen N UMERISCHE D ATEN : WEITERE K LASSEN Die Klassen math und random beinhalten eine Reihe weiterer nützlicher Funktionen. Ein einmaliger Import der Klasse erfolgt mit import. Aufruf mit Punktnotation klasse.methode() N UMERISCHE D ATENTYPEN INT , FLOAT , COMPLEX Wertebereich unterliegt keinen Restriktionen! (2**200000) float Entspricht IEEE 754 double (64 Bit) Informationen zum Wertebereich und zur Genauigkeit des Datentyps erhält man mit int >>> import sys >>> sys.float_info sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) complex auf Anfrage T YPBESTIMMUNG UND - UMWANDLUNG Typbestimmung durch type(Datum) Typecasting mit <zieltyp>(Datum) Umwandlung in String-Typ mit str(Datum) format(Datum) Jeder Datentyp ist eine Klasse. Ü BER DEN U MGANG MIT VARIABLEN Implizite Typisierung Zuteilung des Typs einer Variablen zur Laufzeit in Abhängigkeit vom Wert. Eine explizite Deklaration entfällt. Dynamische Typisierung Der Variablentyp kann sich während der Laufzeit in Abhängigkeit von den Daten ändern. Starke Typisierung Der Variablentyp ist stets eindeutig bestimmbar. I NTERNE D ATENVERWALTUNG IN P YTHON Alle numerischen Typen sind immutabel. Immutable Daten können nicht "am Platz" überschrieben werden. I NTERNE D ATENVERWALTUNG IN P YTHON Alle numerischen Typen sind immutabel. Prinzip: Die Variablen werden den Daten zugeordnet. T YPISIERUNG Starke Typisierung Alle Daten sind zu einem bestimmten Zeitpunkt eindeutig einem Typ zuzuordnen. Implizite Typisierung Deklarierung von Variablen und Zuordnung des Datentyps mit erster Wertzuweisung Unnötig sind darum eine explizite Deklaration der Variablen die Angabe eines Datentyps Dynamische Typisierung Der Datentyp ist während der Laufzeit veränderlich. T YPISIERUNG IN P YTHON stark implizit dynamisch in der Konsole kurzes Programm D AS N ICHTS ALS D ATUM NoneType None (kein Wert) Eigener Datentyp mit nur einem Wert (None) Dient dem Codieren fehlender/nicht berechenbarer Daten L OGISCHER D ATENTYP BOOL bool True/False Operatoren and, or, not Die Auswertung Boolescher Terme erfolgt stets vermittels des Verfahrens der Lazy Evaluation, d. h. analog zu den Java-Operatoren | bzw. &. Ü BERSICHT ZU SEQUENTIELLEN D ATENTYPEN Strings sind Zeichenketten immutabler Datentyp wort1 = 'Hallo' wort2 = "Hallo" Listen sind geordnete Reihungen beliebiger Datentypen. mutabler Datentyp fibonacciliste = [0,1,1,2,3,5,8,13] letter = ['Anton','Berta','Cäsar','Dora'] Tupel sind Listen "mit Schreibschutz". immutabler Datentyp letter = ('Anton','Berta','Cäsar','Dora') S EQUENTIELLE D ATENTYPEN Strings, Listen und Tupel Die Länge von Strings und Listen ist während der Laufzeit veränderlich. Zu Tupeln gibt es nicht viel zu sagen. Es gibt keinen statischen Datentyp Array. I NDIZIERUNG SEQUENTIELLER D ATEN liefert das i-te Element der Sequenz s, s[i:j] liefert den Ausschnitt von Index i bis Index j von s , s[i:] liefert den Ausschnitt von Index i bis zum Ende von s, s[i:j:k] liefert den Ausschnitt von Index i bis Index j von s, wobei nur jedes k-te Element innerhalb dieses Ausschnitts beachtet wird s[-i] liefert das i -te Zeichen von hinten, s[i] O PERATIONEN AUF SEQUENTIELLEN DATEN x in s x not in s s+t s+=t s*n is == prüft, ob sich x in der Sequenz s befindet prüft, ob sich x nicht in der Sequenz s befindet erzeugt Verkettung von s und t als neuer Sequenz, hängt die Sequenz t an die Sequenz s an, liefert einen neuen Sequenz, in der die Sequenz s n-fach kopiert ist. prüft zwei Sequenzen auf physische Identität prüft zwei Sequenzen auf inhaltliche Identität F UNKTIONEN /M ETHODEN S EQUENTIELLER D ATEN Built-In-Funktionen len(s) min(s) max(s) liefert die Anzahl der Elemente in s, liefert das kleinste Element von s, gemäß der definierten Ordnungsrelation. liefert das größte Element von s, gemäß der definierten Ordnungsrelation. Methoden count(x) Zählt das Auftreten von Elementen mit dem Wert x index(x) Ermittelt den Index des ersten Auftretens von x Z EICHENKETTEN str Werden im Unicode (UTF-8) gespeichert. Können sowohl in "Gänsefüßchen" als auch in 'Hochkommas' eingeschlossen werden. Spezialfall """DocString""" bzw. '''DocString''' Länge beliebig Vermissen Sie einen char-Typ? U MWANDLUNG Z AHL S TRING MIT FORMAT () Die Funktion format(...) erzeugt aus numerischen Daten einen String, dessen Eigenschaften mit Format-Spezifikationen bestimmt werden können. format(<wert>[, <format_spezifikation>]) Einfachster Fall: 39 U MWANDLUNG Z AHL S TRING MIT FORMAT () Die Format-Spezifikation bietet u. a. folgende Optionen.* [Vorzeichen][0][Breite][,][.Genauigkeit][Typ] Vorzeichen::= '+' | ' -' | ' ' '+' erzwingt ein Vorzeichen auch bei positiven Zahlen Breite::= integer Zahl der reservierten Stellen für den Ausdruck. Eine führende 0 sorgt für das Auffüllen aller Stellen mit 0. Das Komma erzeugt Tausendertrennungen. Genauigkeit::= integer Bestimmt die Genauigkeit. Sollte kleiner/gleich der Breite sein. Nur für float-Typ verfügbar. Typ bestimmt weitere datentypspezifische Formatierungen. Genaueres in den Hinweisen zu den Typen int und float. * ausführlicher auf: http://docs.python.org/py3k/library/string.html#format-specification-mini-language 40 U MWANDLUNG Z AHL S TRING MIT FORMAT () Beispiele 41 M ETHODEN DER S TRING -K LASSE (A USWAHL ) find(...) lower() s.find(sub[, start[, end]]) int s.lower() str ermittelt den Index des ersten Auftreten eines Substr ings. fail: -1 Wandelt alle Buchstabe n in Kleinbuchstabe n. (analog: upper()) count(...) replace(...) s.count(sub[, start[, end]]) int s.replace (alt, neu[, count]) str zählt das (nicht überlappende ) Vorkomme n eines Substr ing s erzeugt eine Kopie des Strings, bei der alle Teilstrings <old> durch den Teilstring <neu> ersetzt werden. Optional <count>: maximale Zahl der Ersetzungen isalpha() s.isalpha() bool ist True, wenn alle Zeichen Buchstabe n sind. (analog: isdigit()) encode() s.encode() str zeigt die interne Codierung in UTF-8 an. 42 S TRINGS ALS IMMUTABLER D ATENTYP Es wäre naheliegend zu versuchen, eine direkte Wertzuweisung für ein Zeichen des Strings vorzunehmen, ABER... Fehlerursache: Strings sind immutable Datentypen, d. h. sie können nicht "am Ort" geändert werden. S TRINGS ALS IMMUTABLER D ATENTYP Abhilfe schafft eine neue Wertzuweisung. L ISTEN list Einschluss in eckige Klammern Trennung der Elemente durch Komma liste = [el0, el1, el2, … ,eln] Listen können beliebige Datentypen enthalten. leereListe = [] listeMitZahlen = [1,2,3] listeMitStrings = ['Hund', 'Katze', 'Maus'] gemischteListe = [1, 'Tiger', 45, -3.4, 'Huhn'] listeMitListen = [[1,2,3],['a','b','c']] L ISTEN .M ETHODEN () (A USWAHL ) Element x zu a hinzufügen (ans Ende) a.insert(i,x) Element x zu a hinzufügen (an Stelle i) a.remove(x) löscht x aus a a.pop() gibt das letzte Element von a aus und löscht es a.pop(n) gibt das n-te Element von a aus und löscht es a.sort() sortiert a lexikographisch a.reverse() dreht die Reihenfolge der Elemente in a um a.append(x) 46 L ISTEN ALS M UTABLER D ATENTYP Die Elemente von Listen sind am Platz überschreibbar. Dies wird bei der Verwendung von Listen als Funktionsparameter zu beachten sein. L ISTEN VERSCHIEDENER D ATENTYPEN In einer Liste können verschiedene Datentypen gespeichert werden: Verbesserung: Jedes Listenelement ist selbst eine Liste. zettel[5][1] zettel[5] zettel[5][0] zettel[4][1] zettel[4] zettel[4][0] zettel[3][1] zettel[3][0] zettel[3] zettel[2][1] zettel[2] zettel[2][0] zettel[1][1] zettel[1][0] zettel[1] zettel[0][1] zettel[0][0] zettel[0] D ICTIONARIES Syntax Einschluss des Dictionaries in geschweifte Klammern Trennung der Einträge durch Komma Jeder Eintrag entspricht der Form key : value dct={k0:v0, k1:v1, k2:v2, … ,kn:vn} weitere elegante Möglichkeiten zur Erzeugung von Dictionaries auf http://tutorial.pocoo.org/datastructures.html?highlight=dictionary#dictionar ies 49 D ATEN IN D ICTIONARIES 1. keys (Schlüssel) dürfen jeweils nur einmal im Dictionary vorkommen. dürfen nicht veränderbar sein müssen also immutablen Datentypen angehören. (Zahlenwerte, Strings, Tupel mit ausschließlich immutablen Elementen – Boolesche Werte werden wie 0 und 1 behandelt.) dürfen innerhalb eines Dictionaries auch unterschiedlichen Datentyps sein. 2. values (Werte) dürfen mehrfach vorkommen. sind von beliebigem Datentyp. Z UGRIFF AUF D ICTIONARIES Auslesen eines Wertes durch dict[key] Hinzufügen eines Wertes durch Zuweisung dict[key] = value 51 F UNKTIONEN UND O PERATOREN max() und min() beziehen sich auf die Keys. Der in – Operator bezieht sich auf die Keys. D ICTIONARIES .M ETHODEN () 1/3 dict.clear() Entfernt alle Elemente des Dictionaries dict dict.copy() Erzeugt eine Kopie des Dictionaries dict dict.update(dict2) Fügt die Einträge des Dictionaries dict2 dem Dictionary dict hinzu dict.has_key(key) Gibt True zurück, falls key im Dictionary; anderenfalls False. 53 D ICTIONARIES .M ETHODEN () 2/3 dict.fromkeys(keyseq, default=None) Erzeugt ein neues Dictionary aus Schlüsseln einer Sequenz und einem vorgegebenen Wert. dict.get(key, default=None) Für key wird der Wert zurückgegeben; falls key nicht im Dictionary ist, der default-Wert 54 D ICTIONARIES .M ETHODEN () 3/3 dict.items() Gibt eine (spezielle) Liste aller Tupelpaare (key,value) der Einträge des Dictionaries dict zurück. dict.keys() Gibt eine (spezielle) Liste aller Schlüssel des Dictionaries dict zurück. dict.values() Gibt eine (spezielle) Liste aller Werte des Dictionaries dict zurück. Die Umwandlung in eine normale Liste kann jeweils per Typecasting erfolgen. 55 M ENGENTYPEN set {el_1, el_2, …, el_n} mutabler Datentyp frozenset ({el_1, el_2, …, el_n}) immutabler Datentyp Es stehen vorwiegend Methoden für Mengenoperationen zur Verfügung. A LGORITMIK Python V ORBEMERKUNGEN ZUR SYNTAX Unterscheidung Groß- und Kleinschreibung Zwang zum sauberen Programmierstil nur ein Befehl pro Zeile keine Semikola o. dgl. Blöcke werden durch Einrückungen definiert Keine {Klammern} oder BEGIN/END-Konstrukte Kommentare: V ORBEMERKUNG D ATENEIN - UND - AUSGABE Dateneingabe mit der Funktion input(string) string Die Konvertierung in den Zieldatentyp kann per Typecasting erfolgen. Datenausgabe mit print(Wert[e],sep =' ',end='\n') S TEUERANWEISUNGEN Verzweigung if – else if – elif – else Es gibt keine Mehrfachverzweigung (case, switch) try – except – else – finally zum Behandeln von Exceptions Schleifen while / while … else for / for … else Es gibt keine weiteren Schleifenarten (repeat-until, do-while) V ERZWEIGUNGEN : S YNTAX if bedingung: <then-Anweisungsblock> else: <else-Anweisungsblock> bedingung ist ein boolescher Ausdruck. Die Einrückungen sind Element der Syntax. Alle Anweisungen nach einem if oder else müssen gleich tief eingerückt werden. M EHRFACHVERZWEIGUNGEN ELSE IF ELIF Mehrfachverzweigungen sind beliebig tief schachtelbar. Problem: Quelltextbreite else-if-Konstrukte können durch elif substituiert werden. F EHLERBEHANDLUNG MIT TRY - EXCEPT - ELSE Die Ausführung kritischen Codes unter Vorbehalt und das Definieren einer Ausnahmeregelung verhindern einen Programmabsturz. try: << kritischer Code >> # Ausführung , falls keine Exception except: # kritischer Code wird nicht ausgeführt << Verhalten des Programms bei Exception >> else: # nach bereits ausgeführtem kritischen Code << weiterer Code , der nur ausgeführt wird ,>> <<wenn keine Exception erzeugt wurde >> S CHLEIFE 1: WHILE while bedingung: <Schleifenkörper> else: <Anweisungsblock nach Schleifenende> else Der Block hinter else wird ausgeführt, wenn die Schleife regulär beendet wird. beendet die Schleife sofort ohne Ausführung des else-Zweigs continue unterbricht einen Schleifendurchlauf break S CHLEIFE 2: FOR - IN for element in datenmenge: <Schleifenkörper> else: <Anweisungsblock nach Schleifenende> datenmenge durch range-Funktion erzeugte Sequenz ganzer Zahlen ( int) sequentieller Datentyp ( str, list, tuple) Abbildungstyp (dict) Mengentyp (set, frozenset) element sukzessives Durchlaufen aller Elemente der Datenmenge S CHLEIFE 2: FOR – IN (B EISPIELE ) F UNKTIONEN Syntax: def funktionsname(parameter1, parameter2,…): ''' DocString ''' Anweisungsblock eingerückt return ergebnis Funktionen innerhalb von Funktionen sind möglich Zugriff auf globale Variablen auf Wunsch möglich. def funktionsname(parameter1, parameter2,…): global x ... return ergebnis F UNKTIONEN : W ISSENSWERTES ZU PARAMETERN "Call by Value" für immutable Daten (einfache Datentypen, Tupel) "Call by Reference" für mutable Daten (Listen) F UNKTIONEN : W ISSENSWERTES ZU PARAMETERN optionale Parameter F UNKTIONEN : W ISSENSWERTES ZU PARAMETERN bezeichnete Parameter F UNKTIONEN : R ÜCKGABEWERT ( E ) None bei fehlendem return Mit einem Trick können beliebig viele Werte innerhalb eines Tupels zurückgegeben werden. F UNKTIONEN : D OC S TRINGS Docstrings dienen als Hilfetext bei Nutzung von Funktionen. F UNKTIONSBIBLIOTHEKEN Sammlungen eigener wiederverwendbarer Funktionen können in einer für Python erreichbaren *.py-Datei gespeichert werden. Der Nutzung in Programmen ist möglich in der Form: import meineFunktionen as mf n = mf.gibZahlEin(von,bis) F RÖSCHE UND S CHILDKRÖTEN GUI S GESTALTEN mit tkinter A BITUR 2009, A UFGABE 1.2.1/1.2.2 Um die Sicherheit in dem Möbelhaus und den Warenlagern zu gewährleisten, müssen die Mitarbeiter im Eingangsbereich einen Zugangscode eingeben. Dieser Zugangscode soll die vierstellige Zahl 4583 sein. Entwickeln Sie ein Programm in der im Unterricht verwendeten Programmiersprache, das den eingegebenen Zugangscode auf Richtigkeit prüft. (4) Erweitern Sie das Programm so, dass nach einer dreimaligen Prüfung der Vorgang abgebrochen wird. (2) G UI MIT TKINTER ERSTELLEN tkinter ist Standardbibliothek für PythonGUI Derzeit v. a. textbasierte Gestaltung der GUI – Formdesigner wie in Delphi und Java fehlen noch. Viele andere Tools stehen noch nicht für Python 3.x zur Verfügung. A BI 2009 } 1.2.1/1.2.2 A BI 2009 } 1.2.1/1.2.2 B EMERKUNGEN ZUR OOP K LASSENDEFINITION Verzicht auf Schlüsselwörter für Sichtbarkeitsattribute attribut (public) _attribut (protected – Empfehlung) __attribut (private) Häufig auch in der Form attribut (public) _attribut_ (protected – Empfehlung) __attribut__ (private) Methoden analog K LASSENDEFINITION Verzicht auf explizite Deklaration der Attribute – stattdessen Deklaration durch Wertzuweisung im Konstruktor __init__(self, parameter) Alle Objektmethoden und –attribute werden mit dem Präfix self angesprochen. Alle in der Klasse definierten Variablen sind Klassenattribute (Präfix: Klassenname) OOP: D AS K ONTOBEISPIEL IN P YTHON Klassendefinition Klassenvariable Konstruktor Destruktor OOP: D AS K ONTOBEISPIEL IN P YTHON getter setter OOP: D AS K ONTOBEISPIEL IN P YTHON weitere Methoden OOP: D AS K ONTOBEISPIEL IN P YTHON Erzeugen von Objekten Aufruf der Methoden