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 if-anweisung Wiederholungen 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/ 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 Verzicht auf nicht unbedingt notwenige Sprachelemente plattformunabhängig Windows, Linux, Mac, Unix, Smart phones open source, nichtkommerziell benannt nach "Monty Python" und auch so ausgesprochen http://people.mandriva.com/~prigaux/language-study/ 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 Python: Anweisungen print "Hallo" Variablen, Zuweisungen i = 5 if else for in : while Python: Aufruf von Funktionen abs(-5) Definition von Funktionen def fktname( ): Python im interaktiven Modus Python Interpreter in Konsole Windows: Start Programme Python 2.5 Python (command line) Python-Shell von IDLE 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 3
Zuweisungen Zuweisung Variable = Ausdruck Typ der Variable muss nicht deklariert werden! wie z.b. Java, C, C++, (etwa: int a = 1) Variable wird zur Laufzeit mit Typ des zugewiesenen Werts assoziiert dynamische Typisierung erweiterte Zuweisung Variable += Ausdruck Kurzform für: Variable = Variable + Ausdruck ebenso: -=, *=, /=, %= Variablen müssen vor ihrer Verwendung erzeugt worden sein sonst Fehlermeldung >>> 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 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 in anderen Programmiersprachen wird dazu Hilfsvariable benötigt >>> 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 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 "_")* EBNF letter ::= lowercase uppercase 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 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 del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try 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: z.b. i, j, x Variablen, die man im ganzen Programm braucht, eher länger: z.b. inputtext mit Kleinbuchstaben beginnen, Worttrennung durch Großbuchstaben oder "_" z.b. inputtext, input_text Englisch oder Deutsch? Aufruf von Funktionen Funktion übernimmt i.a. Argumente (Parameter) als Eingabewerte manche Funktionen haben keine Eingabeparameter verarbeitet diese nach einem Algorithmus und liefert i.a. einen Wert zurück manche Funktionen liefern keinen Wert zurück Beispiele für Standardfunktionen von Python >>> ord("a") 65 >>> abs(-5) 5 >>> max([5,3,8,4]) 8 >>> len("abc") 3 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 len(1) 1 ist eine Zahl und besitzt keine Länge len("eins", "zwei") Die Funkion len() akzeptiert nur ein Argument Korrekte Aufrufe 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 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(), 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 >>> 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] >>> i = 2 >>> type(i) <type 'int'> >>> i. neg () -2 7
Eingabe Eingabe in der Python-Shell raw_input() 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 >>> Interaktive Eingabe - Beispiele >>> 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 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 Kommentare Sinnvoll kommentieren! alles kommentieren, was Erklärung bedarf statt unklares Programm mit Kommentar, besser klares Programm ohne Kommentar 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!! 9
If-Anweisung vgl. Programmablaufplan (Kap. 5) if ( <Bedingung> ): <Anweisungen> if ( <Bedingung> ): <Anweisungen> else: <Anweisungen> ja A1 B A2 nein 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 eingerückt! optionaler else-teil If-Anweisung - Beispiele if x > 0: print "x ist positiv" if x % 2 == 0: print x, "ist gerade" else: print x, "ist ungerade" 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 Entscheidungsbaum für Tiereraten if raw_input("can it fly? ") == 'y': print "bird" else: if raw_input("does it bark? ") == 'y': print "dog" else: print "cat" If-Anweisung, mehrfache Alternative elif Abk. für 'else if' 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 W1 B W2 sonst A1 A2 A3 if choice == 'A': functiona() elif choice == 'B': functionb() elif choice == 'C': functionc() else: print "Invalid choice." 11
for-schleife Muster: for <variable> in <sequenz>: <anweisungen> Beispiel: 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 for-schleife for <variable> in <sequenz>: <anweisungen> for i in ['a','b','c']: print i 1. Schleifendurchlauf: i = 'a' Ausgabe: a 2. Schleifendurchlauf: i = 'b' Ausgabe: b 3. Schleifendurchlauf: i = 'c' Ausgabe: c 12
for-schleife for <variable> in <sequenz>: <anweisungen> for i in [4,6,9]: print i 1. Schleifendurchlauf: i = 4 Ausgabe: 4 2. Schleifendurchlauf: i = 6 Ausgabe: 6 3. Schleifendurchlauf: i = 9 Ausgabe: 9 Die range()-funktion range()-funktion Signatur: range([start,] stop[, step]) -> list of integers Generierung von Listen mit Elementen zwischen den beiden Input- Parametern 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] 13
for-schleife Python-Variante: >>> for count in range(500): print "I will not throw paper airplanes in class." I will not throw paper airplanes in class. I will not throw paper airplanes in class. I will not throw paper airplanes in class. I will not throw paper airplanes in class. I will not throw paper airplanes in class. Verwendung von for mit range(): "Zählschleife" While-Schleifen Zweite Art der Schleifenprogrammierung in Python (neben- for) Format while Bedingung: Anweisungen Beispiel: Fibonacci-Zahlen < 100 >>> a, b = 0, 1 >>> while b < 100: print b, a, b = b, a+b B A ja nein 1 1 2 3 5 8 13 21 34 55 89 >>> 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: x n+1 = x n f(x n ) /f'(x n ) Iteration beenden wenn x n+1 -x n < ε z.b. Quadratwurzel von a: f(x) = x 2 -a x n+1 = (x n + a / x n ) / 2 >>> a = x = 2.0 >>> while abs(x-a/x) > 0.00000001: x = (x+a/x) / 2.0 print x 1.5 Quelle: Wikipedia 1.41666666667 1.41421568627 1.41421356237 While-Schleife: Bsp. Quadratwurzel mit Newton-Methode >>> a = x = 15.0 >>> while abs(x-a/x) > 0.00000001: 8.0 4.9375 3.98773734177 3.87463446793 3.87298369801 3.87298334621 x = (x+a/x) / 2.0 print x Beobachtung: Anzahl der Iterationen nicht von vorne hinein klar, i.ggs. etwa zur Zählschleife >>> a = x = 144.0 >>> while abs(x-a/x) > 0.00000001: x = (x+a/x) / 2.0 print x 72.5 37.2431034483 20.5547955554 13.7802299906 12.1149915067 12.0005457307 12.0000000124 12.0 15
Schleifen in Python 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! z.b. for durch while ersetzt: >>> i = 0 >>> while i < 500: print "I will not throw", print "paper airplanes in class." i += 1 B nein ja A abweisende Schleife A ja B nein I will not throw paper airplanes in class. nicht abweisende Schleife I will not throw paper airplanes in class. I will not throw paper airplanes in class. Endlosschleifen 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 >>> while True: print "endlos", 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 16