Programmierung I Basics (in Python)
Transcription
Programmierung I Basics (in Python)
Intro Skript-Sprache Programmierung I Basics (in Python) Erfinder: Guido von Rossum Entstehung: 1987 Web-Seite: www.python.org Newsgroup: comp.lang.python Noch relativ aktiv weiterentwickelt (PEPs): Wintersemester 2004/2005 University Bonn Dr. Gabriel Zachmann Programming Languages History „Python Enhancement Proposal“ http://www.python.org/peps/ Wohldefinierte Prozedur unter Einbeziehung der Community Woraus besteht ein Programm? Abstrakt: Zeichenfolge entsprechend einer formalen Grammatik Formale Grammatik besteht aus Regeln folgender Art: statement-list : ; [leeres Statement] statement ; statement-list Terminale sind Zeichen eines Alphabets Spätere Vorlesung zu formalen Sprachen Konkret: Wörter (Identifier) und Zahlen (Literals) Operatoren (+, %, &, … ) Sonstige Sonderzeichen (fast jedes hat eine eigene Bedeutung) Kommentare Werden ignoriert Startet mit #, bis zum Ende der Zeile x = 10; # Bedeutung der Variable # Kommentarzeile Identifier Anderes Wort für Name (Variablename, Funktionsname, Keywordname) Zeichenkette Zugelassen: alphanumerische Zeichen und Underscore (_) Erstes Zeichen darf nicht Ziffer sein blub und _bla sind ok 2pi nicht ok Kein Limit auf Länge Case-sensitiv 1 Keywords Eingebaute (built-in) Wertarten (Typen) Wörter mit spezieller Bedeutung int : Integers (ganze Zahlen) Sind reserviert, kann man nicht als Namen verwenden bool : Wahrheitswerte float : Floating-Point-Zahlen (floats) ("reelle Zahlen") and assert break class continue def Keywords in Python del for elif from else global except if exec import finally in is lambda not or pass print raise return try while yield str : Strings (Zeichenketten) Höhere Datenstrukturen List : später Komplexe zahlen, Dictionary, Map, Sequence, Set, Module, File, … Variablen Literale Zahlen int's, decimal, octal, hex long integer floats scientific notation 123 O123 0x123 123l 3.14f 3.14 3e-2 0.03 0.3e-1 Strings "" "name" "a \"string\"" "a string " "spanning two lines" null string (‘\0’) ‘n’ ‘a’ ‘m’ ‘e’ ‘\0’ prints: a "string" string concatenation for better readability Spezielle Zeichen in Strings (escape sequence) \n \r \t \b \” \f \\ \0 \’ \x041 Bool (Wahrheitswerte) False, 0, None, "" Alles andere, z.B.: True, 1, "0", 0.1, … falsch wahr Wertebereiche Jeder Typ hat bestimmten Wertebereich Plattform-abhängig! Symbolische Konstanten: import sys print sys.maxint import kinds print kinds.default_float_kind.MIN newline carriage return tab backspace double quote form feed backslash null character single quote hex, ‘A’ Ähnliche Funktion wie in Mathematik, speichert Wert Variable = Name und Wert In Python: Variablen haben keinen Typ Ist nur “Zeiger” auf Wert im Speicher, kann beliebig oft geändert werden Braucht nicht deklariert werden Erzeugung / Initialisierung: pi = 3.1415926 # erzeugt Variable seconds_per_day = 60*60*24 # dito seconds_per_day = 86400 # ändert Wert Style Guidelines für Variablen Style Guidelines sind sehr wichtig: Lesbarkeit Wartbarkeit des Programms "Kleine" Variablen: Laufvariablen, Variablen mit sehr kurzer Lebensdauer 1-3 Buchstaben i,j,k,… für int's a,b,c,x,y,z … für float's "Große" Variablen: Längere Lebensdauer, größere Bedeutung Labeling names! ("Sprechende Namen") mein_alter, meinAlter, determinante, … 2 Operatoren und Ausdrücke Ausdruck ("expression") = mathematischer Term Beispiel: sin(x)*sin(2*x) FORTRAN (Formula Translator) war Ende der 50er Jahre die erste Programmiersprache mit dieser Fähigkeit Ausdruck setzt sich zusammen aus: Literalen (Konstanten), Variablen, Funktionen Operatoren Klammern Übliche Regeln Ganzzahlarithmetik Wertebereich Typischerweise -231 ... 231-1 (32-bit int's) Overflow: Kein Überlauf in Python! Integers können beliebig lang werden Division: Operanden bestimmen, ob Integer- oder Float-Division! Bsp.: 3/2 Æ 1, 3.0/2 Æ 1.5 Rundet nach unten (oder zur 0)! Beispiel: 3/2 == 1, und -3/2 == -2 Division und Modulo: (x/y)*y + x%y == x Vergleichsoperatoren Operanden sollten gleichen Typ haben Resultat: Wahrheitswert (in Python: 0 oder 1) Achtung: verwechsle nicht = und == ! Arithm. Operator -i +w a*b a/b i%2 a+b a-b i=3 a=3.0 Bit-wise ~ i i & j i | j i ^ j i << n i >> n Operators bitwise Complement bitwise AND bitwise OR bitwise XOR left shift (n positions) right shift (n positions) Assignment op. x □= y Bsp.: x -= y x /= y x &= y Relational Operators Meaning unary + and mult., div., modulo binary + and int/float assignment < > <= >= == != less than greater than less or equal greater or equal equals not equal Boolean Operators not and or unary not logical and logical or equivalent x = x □ (y) x = x - y x = x / y x = x & y Float-Arithmetik Implementiert IEEE 754-1985 Standard Überlauf ("overflow"): Zahl wird zu groß / zu klein Beispiel: max.float * 2 Resultat = +∞ bzw. -∞ Underflow: Zahlen liegen zu dicht an der 0 Resultat = +0.0 bzw. -0.0 NaN (Not a Number) (in C++): Rechnungen, wo kein sinnvoller Wert rauskommt Bsp.: 1/0 , ∞*0 , sqrt(-1.0) In Python: Fehlermeldung Richtiger Vergleich von Floating-Point-Werten Verwendung von == ist fast immer ein Bug! Bsp.: in Qt 3.1 findet man (qwmatrix.h) bool isInvertible() { return (m11*m22 - m12*m21) != 0; } Meistens wollen wir "Gleichheit bis auf Rundungsfehler" Bessere Technik: "epsilon guard" if fabsf(f1 – f2) < 1E-5 : # Gleichheit Noch besser: if abs(f1 – f2) < 1E-5*f1 : 3 Bit-Operatoren Präzedenz und Assoziativität Für integrale Typen definiert (int, ...) Englisch: "precedence" & "associativity" ("grouping") Wert wird als Bitmuster betrachtet Ohne diese ist ein Ausdruck der Art a+b*c nicht eindeutig Beispiele: x y 1010 1100 x & y x | y x ^ y 1000 1110 0110 ~x 0101 ~y 0011 Beispiele: x = x >> 2; x &= 0x11; x = x << 3; if x & 1 : # x is odd else: # x is even # = x / 4 # = x % 4 # = x * 8 Präzedenz: Reihenfolge der Auswertung der Operatoren Assoziativität: Reihenfolge bei Operatoren gleicher Präzedenz Achtung: Reihenfolge der Auswertung der Operanden normalerweise nicht festgelegt! Bsp.: x = f(y) + f(z) – wird zuerst f(y) oder f(z) ausgewertet? Macht Unterschied, falls f() Nebeneffekte hat Fazit: Nebeneffekte sind schlechter Stil! Präzedenz-Tabelle Präzedenz Short circuit logic bei Boole'schen Ausdrücken Operator [] () ~ + * / % + << >> < … >= == != & ^ not and or = += … |= Grouping L-R R-L L-R L-R L-R L-R L-R L-R L-R L-R L-R L-R R-L and und or werden von links nach rechts ausgewertet Falls Wahrheitswert feststeht, keine weitere Auswertung! true or x → true false and x → false Im Standard festgelegt Kann sehr praktisch sein, kann Performance steigern Nicht einsetzen in komplexen Ausdrücken Dokumentieren! Beispiel: Nicht ganz vollständig if foo(x) and foo(y) : Einrahmen und über den Monitor hängen! Listen Statements (Anweisungen) Folge beliebiger Werte Beispiele von Listen-Literalen: l = [ 1, 2, 3 ] l = [ "null", "acht", 15 ] Erzeugen einer Liste von Zahlen mit range : Syntax: range(start[,stop[,step]]) Beispiel: x = range(0,100) x = range(10) # 0, ..., 99 # 0, ..., 9 Die Bausteine eines Programms mit Effekt (normalerweise) Programm ist lange Liste von Anweisungen Stil: eine Anweisung pro Zeile (kein Semikolon nötig) Anweisung = Leere Anweisung ( pass ) Ausdruck (nicht alle haben einen Effekt) Deklarationen (Funktionen, Klassen, …; später) Kontrollfluß-Statement (demnächst) Zugriff auf einzelnes Element: print x[1] 4 Beispiele: i = j i += 1 x + y z = x + y print z*y 5