Kapitel 7: Einführung in Python (1) Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Übersicht Die Programmiersprache Python Einfache Anweisungen Zuweisungen Eingabe Auswahl-Anweisung Wiederholungen if-Anweisung for-Schleife while-Schleife 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 Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 1 Python höhere Programmiersprache eigentlich "VHLL" (very high-level language), http://en.wikipedia.org/wiki/Very_high-level_programming_language interpretiert interaktive Benutzung möglich keine Compilierung notwendig umfasst mehrere Programmierparadigmen objektorientiert rein imperative/prozedurale Programmierung möglich Aspekte funktionale Programmierung einfach zu lernen plattformunabhängig Verzicht auf nicht unbedingt notwenige Sprachelemente Windows, Linux, Mac, Unix, … Smart phones open source, nichtkommerziell benannt nach "Monty Python" und auch so ausgesprochen Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg http://people.mandriva.com/~prigaux/language-study/ Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 2 Programmierung in Python – Aspekte imperativer und prozeduraler Programmierung imperative Programmierung Programm ist Folge von Befehlen sukzessive Änderung des Speicherinhalts (Variablenwert) Typische Strukturen: Schleifen, bedingte Anweisungen Ein imperatives Programm sagt präzise: was (welche Anweisung), wann (Reihenfolge der Anweisungen) womit (Speicherplatz/Variable) zu geschehen hat. prozedurale Programmierung Mittel zur Strukturierung in (imperativen) Programmiersprachen Prozedur = Unterprogramm Aufruf mit Argumenten im Programm Ziel: Übersichtlichkeit; Wiederverwendbarkeit Prof. B. Jung Einführung in die Informatik, WS 2007/08 Python: • Anweisungen • print "Hallo" • Variablen, Zuweisungen •i=5 • if … else • for … in …: • while … •… Python: • Aufruf von Funktionen • abs(-5) • Definition von Funktionen • def fktname(…): … TU Bergakademie Freiberg Python im interaktiven Modus Python Interpreter in Konsole Python-Shell von IDLE Windows: Start | Programme | Python 2.5 | Python (command line) IDLE: einfache Entwicklungsumgebung IDE = Integrated Development Environment z.B. Syntax Highlighting ERIC IDE http://www.riverbankcomputing.co.uk /pyqt/download.php viele Features für professionelle Softwareentwicklung … die in dieser Vorlesung aber nicht benötigt werden Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 3 Zuweisungen Zuweisung Variable = Ausdruck Typ der Variable muss nicht deklariert werden! Æ dynamische Typisierung erweiterte Zuweisung Variable += Ausdruck Kurzform für: Variable = Variable + Ausdruck ebenso: -=, *=, /=, %= wie z.B. Java, C, C++, … (etwa: int a = 1) Variable wird zur Laufzeit mit Typ des zugewiesenen Werts assoziiert Variablen müssen vor ihrer Verwendung erzeugt worden sein sonst Fehlermeldung Prof. B. Jung >>> a = 1 >>> a += 3 >>> print a 4 >>> type(a) <type 'int'> >>> a = "hello" >>> print a hello >>> type(a) <type 'str'> >>> x, y = 3.0, -2.0 >>> x, y = y, x >>> print x, y -2.0 3.0 >>> a = b Traceback (most recent call last): File "<pyshell#63>", line 1, in <module> a = b NameError: name 'b' is not defined Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Zuweisungen für mehrere Variablen Zuweisung desselben Werts an mehrere Variablen Variable1 = Variable2 = … = Ausdruck Zuweisung unterschiedlicher Werte an mehrere Variablen Variable1, Variable2, … = Ausdruck1, Ausdruck2, … nützlich z.B. zum Austausch der Inhalte zweier Variablen Prof. B. Jung >>> a = b = c = -1.0 >>> a -1.0 >>> b -1.0 >>> c -1.0 >>> x, y = 3.0, -2.0 >>> x, y = y, x >>> print x, y -2.0 3.0 in anderen Programmiersprachen wird dazu Hilfsvariable benötigt Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 4 Variablenamen: Bezeichner (Identifier) Namen von Variablen, Funktionen, Klassen, … bestehen aus Buchstaben, Ziffern, Underscore (_) Ziffer darf nicht am Anfang stehen wie in den den meisten anderen Programmiersprachen auch identifier ::= (letter|"_") (letter | digit | "_")* letter ::= lowercase | uppercase EBNF lowercase ::= "a"..."z" uppercase ::= "A"..."Z" digit ::= "0"..."9" Bsp: ungültige Variablennamen >>> 99Luftballons = "Hast du etwas Zeit für mich" SyntaxError: invalid syntax >>> more€ = 1000000 SyntaxError: invalid syntax >>> class = "Einfuehrung in die Informatik" SyntaxError: invalid syntax Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Schlüsselwörter Wörter mit spezieller Bedeutung sind reserviert können nicht als Bezeichner (Identifier) verwendet werden gibt es in allen Programmiersprachen in Python relativ wenige and as assert break class continue def Prof. B. Jung del elif else except exec finally for from global if import in is lambda not or pass print raise return try Einführung in die Informatik, WS 2007/08 while with yield TU Bergakademie Freiberg 5 Namenswahl für Variablen Einige Tipps lesbare aber nicht zu lange Namen z.B. sum, value Hilfsvariablen, die man nur über kurze Strecken braucht, eher kurz: Variablen, die man im ganzen Programm braucht, eher länger: z.B. inputText mit Kleinbuchstaben beginnen, Worttrennung durch Großbuchstaben oder "_" z.B. i, j, x z.B. inputText, input_text Englisch oder Deutsch? Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Aufruf von Funktionen Funktion übernimmt i.a. Argumente (Parameter) als Eingabewerte verarbeitet diese nach einem Algorithmus und liefert i.a. einen Wert zurück manche Funktionen haben keine Eingabeparameter manche Funktionen liefern keinen Wert zurück Beispiele für Standardfunktionen von Python >>> 65 >>> 5 >>> 8 >>> 3 Prof. B. Jung ord("A") abs(-5) max([5,3,8,4]) len("abc") Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 6 Aufruf von Funktionen Format des Ausrufs: funktion(arg1, arg2, …) Funktionen akzeptieren i.d.R. nur eine bestimmte Anzahl von Argumenten Die übergebenen Argumente müssen von einem bestimmten Typ sein Beispiel: Standardfunktion len() – Länge von Strings, Listen, Tupeln, Dictionaries Fehlerhafte Aufrufe Korrekte Aufrufe len(1) – 1 ist eine Zahl und besitzt keine Länge len("eins", "zwei") – Die Funkion len() akzeptiert nur ein Argument len("Wort") Æ 4 len([1,2,3,4]) Æ 4 len("sha" + 4 * "la") Æ 11 (Auswertung des Ausdrucks ergibt String) len( (1, 2, (3,4) ) ) Æ 3 (Tupel mit 3 Elementen) Manche Funktionen akzeptieren eine variable Anzahl von Parametern z.B. min(1,2,3,4,5) Æ 1 Prof. B. Jung Einführung in die Informatik, WS 2007/08 Methodenaufrufe Python: objektorientierte Sprache Methode = Funktion, die an Objekt gekoppelt ist Aufruf einer Methode: objektname.methodenname() ggfs Aufruf mit Parametern z.B. Methoden für Listen: reverse(), sort(), extend(), append(), remove(), … TU Bergakademie Freiberg >>> liste = [4,2,3,1] >>> liste.reverse() >>> liste [1, 3, 2, 4] >>> liste.sort() >>> liste [1, 2, 3, 4] >>> liste.extend([5,6]) >>> liste [1, 2, 3, 4, 5, 6] >>> liste.remove(3) >>> liste [1, 2, 4, 5, 6] In Python ist alles ein Objekt z.B. auch Integer allerdings sind Methoden hier versteckt … und müssen i.d.R. nie direkt aufgerufen werden in C, C++, Java sind Integer u.a. primitive Datentypen, also keine Objekte Prof. B. Jung >>> i = 2 >>> type(i) <type 'int'> >>> i.__neg__() -2 Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 7 Eingabe Eingabe in der Python-Shell raw_input() input() 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 TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 Interaktive Eingabe - Beispiele Prof. B. Jung >>> 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'> >>> input("Geben Sie einen Wert ein: ") Geben Sie einen Wert ein: 7 * 3 21 Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 8 Kommentare in Python Programmzeilen, die mit '#' beginnen sind Kommentare # compute the percentage of the hour that has elapsed percentage = (minute * 100) / 60 Kommentare können auch in der Mitte von Programmzeilen beginnen percentage = (minute * 100) / 60 # caution: integer division Kommentare in Programmen dienen der Dokumentation des Codes Kommentare werden vom Python-Interpreter nicht ausgewertet Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Kommentare Sinnvoll kommentieren! statt unklares Programm mit Kommentar, besser klares Programm ohne Kommentar alles kommentieren, was Erklärung bedarf nicht kommentieren, was ohnehin schon im Programm steht; folgendes ist z.B. unsinnig zaehler += 1 # Zaehler inkrementieren Sprache in Kommentaren und Namen Deutsch + einfacher Englisch + meist kürzer + passt besser zu den englischen Schlüsselwörtern (if, while, ...) + Programm kann international verteilt werden (z.B. über das Web) Jedenfalls: Deutsch und Englisch nicht mischen!! Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 9 If-Anweisung vgl. Programmablaufplan (Kap. 5) if ( <Bedingung> ): <Anweisungen> if ( <Bedingung> ): <Anweisungen> else: <Anweisungen> ja A1 B nein A2 Aufbau: if – Schlüsselwort Bedingung – kann zu True oder False evaluiert werden auch komplexe Bedingungen, z.B. verknüpft mit and if ( a > 5 ) and ( a < 10 ): Doppelpunkt Anweisungen, die ausgeführt werden, falls Bedingung gilt optionaler else-Teil Prof. B. Jung eingerückt ! Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg If-Anweisung - Beispiele if x > 0: print "x ist positiv" if x % 2 == 0: print x, "ist gerade" else: print x, "ist ungerade" Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 10 Verschachtelte if-Anweisungen if x == y: print x, "and", y, "are equal" else: if x < y: print x, "is less than", y else: print x, "is greater than", y if raw_input("can it fly? ") == 'y': print "bird" else: if raw_input("does it bark? ") == 'y': print "dog" else: print "cat" Entscheidungsbaum für Tiereraten Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg If-Anweisung, mehrfache Alternative elif Abk. für 'else if' B W1 beliebig viele elif-Zweige möglich … aber höchstens ein else else darf nur am Ende stehen if x == y: print x, "and", y, "are equal" elif x < y: print x, "is less than", y else: print x, "is greater than", y Prof. B. Jung W2 A1 A2 sonst A3 if choice == 'A': functionA() elif choice == 'B': functionB() elif choice == 'C': functionC() else: print "Invalid choice." Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 11 for-Schleife Muster: Beispiel: for <variable> in <sequenz>: <anweisungen> for i in ['a','b','c']: print i Aufbau von Schleifen for – Schlüsselwort, Name der Anweisung Indexvariable i Name der Variable kann frei gewählt werden in – Schlüsselwort, fester Teil der Anweisung Eine Sequenz bzw. Ausdruck der eine Sequenz liefert zur Erinnerung (Kap. 6 Datenstrukturen): Sequenz = Liste, String, oder Tupel Doppelpunkt ':' Rumpf der Schleife eingerückt Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg for-Schleife for <variable> in <sequenz>: <anweisungen> for i in ['a','b','c']: print i 1. 2. 3. Schleifendurchlauf: i = 'a' Æ Ausgabe: a Schleifendurchlauf: i = 'b' Æ Ausgabe: b Schleifendurchlauf: i = 'c' Æ Ausgabe: c Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 12 for-Schleife for <variable> in <sequenz>: <anweisungen> for i in [4,6,9]: print i 1. 2. 3. Schleifendurchlauf: i = 4 Æ Ausgabe: 4 Schleifendurchlauf: i = 6 Æ Ausgabe: 6 Schleifendurchlauf: i = 9 Æ Ausgabe: 9 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Die range()-Funktion range()-Funktion Signatur: range([start,] stop[, step]) -> list of integers Generierung von Listen mit Elementen zwischen den beiden InputParametern falls nur 1 Input-Parameter: impliziter Startwert 0 optionaler dritter Input-Parameter bestimmt Inkrement >>> print range(1,4) [1, 2, 3] >>> print range(-1,3) [-1, 0, 1, 2] >>> print range(5) [0, 1, 2, 3, 4] >>> print range(1,10,2) [1, 3, 5, 7, 9] Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 13 for-Schleife Python-Variante: >>> for count in range(500): print "I will not throw paper airplanes in class." I I I I I … will will will will will not not not not not throw throw throw throw throw paper paper paper paper paper airplanes airplanes airplanes airplanes airplanes in in in in in class. class. class. class. class. Verwendung von for mit range(): "Zählschleife" Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg While-Schleifen Zweite Art der Schleifenprogrammierung in Python (neben- for) Format Beispiel: Fibonacci-Zahlen < 100 while Bedingung: Anweisungen B nein ja >>> a, b = 0, 1 >>> while b < 100: print b, a, b = b, a+b A 1 1 2 3 5 8 13 21 34 55 89 >>> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 14 While-Schleife: Bsp. Quadratwurzel mit Newton-Methode Newton-Methode: In Mathematik Standardverfahren zur numerischen Lösung von nichtlinearen Gleichungen Idee: Nullstelle der Tangente als verbesserte Näherung der Nullstelle der Funktion zu verwenden. Iterative Näherung der Nullstellen von f d.h. f(x) = 0 für beliebige Funktionen: xn+1 = xn – f(xn) /f'(xn) z.B. Quadratwurzel von a: Iteration beenden wenn | xn+1 - xn | < ε f(x) = x2 - a Æ xn+1 = (xn + a / xn ) / 2 >>> a = x = 2.0 >>> while abs(x-a/x) > 0.00000001: x = (x+a/x) / 2.0 print x 1.5 1.41666666667 1.41421568627 1.41421356237 Prof. B. Jung Quelle: Wikipedia Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg While-Schleife: Bsp. Quadratwurzel mit Newton-Methode >>> a = x = 15.0 >>> while abs(x-a/x) > 0.00000001: x = (x+a/x) / 2.0 >>> a = x = 144.0 print x >>> while abs(x-a/x) > 0.00000001: x = (x+a/x) / 2.0 8.0 print x 4.9375 3.98773734177 72.5 3.87463446793 37.2431034483 3.87298369801 20.5547955554 3.87298334621 13.7802299906 12.1149915067 12.0005457307 12.0000000124 Beobachtung: Anzahl der Iterationen 12.0 nicht von vorne hinein klar, i.Ggs. etwa zur Zählschleife Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 15 Schleifen in Python B In Python 2 Arten von Schleifen: for und while (abweisende Schleife) In anderen Programmiersprachen oft dritte Variante: do .. while (nicht abweisende Schleife) eigentlich würde nur eine Art der Schleife genügen! nein ja A abweisende Schleife z.B. for durch while ersetzt: A >>> i = 0 >>> while i < 500: print "I will not throw", print "paper airplanes in class." i += 1 I will not throw paper airplanes in class. I will not throw paper airplanes in class. I will not throw paper airplanes in class. … Prof. B. Jung Einführung in die Informatik, WS 2007/08 ja B nein nicht abweisende Schleife TU Bergakademie Freiberg Endlosschleifen >>> while True: print "endlos", In meisten Fällen nicht erwünscht Abbruch: Konsolen-Fenster schließen, oder Tastenkombination Strg + c Bem: Manchmal sind Endlosschleifen durchaus erwünscht z.B. "main loop" in graphischen Benutzerschnittstellen Prof. B. Jung endlos endlos endlos endlos endlos endlos endlos endlos endlos endlos endlos … >>> while i != 0: i = i - 0.2 print i, 0.8 0.6 0.4 0.2 5.55111512313e-017 -0.2 -0.4 -0.6 -0.8 -1.0 -1.2 -1.4 … ungewollte Endlosschleife verursacht durch mangelnde Genauigkeit von Gleitkommazahlen Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 16