Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 2: Python Grundlagen.

Ähnliche Präsentationen


Präsentation zum Thema: "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 2: Python Grundlagen."—  Präsentation transkript:

1 Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 2: Python Grundlagen

2 2 Variablen und Funktionen Variablen- und Funktionsnamen können mit einem Buchstaben [ a - z, A - Z ] beginnen oder mit einem Unterstrich _. Der Unterstrich hat jedoch eine spezielle Bedeutung. Groß- und Kleinschreibung werden unterschieden. Umlaute (Unicode-Zeichen) sind nicht erlaubt. Reservierte Wörter dürfen nicht verwendet werden and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, with, while, yield Gültige Beispiele: a A Anton myVariable _all SomePrettyLongVar_001 Gültige Beispiele: a A Anton myVariable _all SomePrettyLongVar_001 Ungültige Beispiele: ä.first 17zulu from Meine Variable Wichtig! Ungültige Beispiele: ä.first 17zulu from Meine Variable Wichtig!

3 3 Variablenzuweisung Mehrfachzuweisungen sind möglich: a = 18 a, b = 18, a = b = 3**3 name = Müller Vorname, Nachname = Anton, Müller a, b = 18, a = b = 3**3 name = Müller Vorname, Nachname = Anton, Müller Änderungen des Variablenwertes: a += 5 # same as a = a+5 a -= 1 a *= b a /= math.pi a %= 1 auch: name += -Thurgau a += 5 # same as a = a+5 a -= 1 a *= b a /= math.pi a %= 1 auch: name += -Thurgau

4 44 Numerische Datentypen int: entspricht long in C long: unbegrenzter Wertebereich float: enspricht double in C complex: komplexe Zahlen a = 1 b = 1L c = 1.0; c = 1e0 d = 1 + 0j import math import cmath Realteil: d.real, Imaginärteil: d.imag

5 55 Operatoren auf Zahlen Grundrechenarten: +, -, *, / Div- und Modulo-Operator: //, %, divmod(x, y) Betrag: abs(x) Runden: round(x) Konvertierung: int(x), long(x), float(x), complex(re,im) Konjugierte einer komplexen Zahl: x.conjugate() Potenzen : x ** y, pow(x, y) Ergebnis einer Verknüpfung unterschiedlicher Datentypen ist vom Typ des größeren Datentyps. für ceil(), floor(): import math für ganz Neugierige: built-in-pow-and-math-pow-for-floats-in-python

6 66 Numerik-Fallen Beispiele aus D. Knuth The Art of Computer Programming Verletzung des Assoziativgesetzes: Verletzung des Distributivgesetzes:... Aus der Praxis …… und zur Wiederholung

7 7 Zeichenketten, Listen, Tupel, Verzeichnisse Mehrfachzuweisungen sind möglich: zk = Ein Text li = [1, 2, 3, Text, [True, False]] tu = (1, 2, Text) vz = {YYZ: Toronto, FRA: Frankfurt} zk = Ein Text li = [1, 2, 3, Text, [True, False]] tu = (1, 2, Text) vz = {YYZ: Toronto, FRA: Frankfurt} Zugriff auf Elemente (Index ist immer 0-basiert!): zk[2] # ergibt n li[0:2] # ergibt [1, 2] tu[1:] # ergibt (2, Text) vz[FRA] # ergibt Frankfurt zk[2] # ergibt n li[0:2] # ergibt [1, 2] tu[1:] # ergibt (2, Text) vz[FRA] # ergibt Frankfurt Bei Index-Bereichen ist der Endwert nicht enthalten!: a[1:10:2] # jeden zweiten ungeraden Wert a[-3] # der drittletzte Wert a[-1::-1] # Liste rückwärts a[1:10:2] # jeden zweiten ungeraden Wert a[-3] # der drittletzte Wert a[-1::-1] # Liste rückwärts string list tuple dictionary

8 8 Stringkonstanten wahlweise mit einfachen oder doppelten Anführungszeichen: s = spam s = "spam" Mehrzeilige Strings: s = """spam""" Escape-Sequenzen: s = "sp\na\tm\u0986 \n = line feed, \t = tab, \u = unicode Raw strings (keine Interpretation von Escape-Sequenzen): s = r"sp\nam Strings aus anderen Datentypen erzeugen: s = str(1.0) 8 Strings Programmdokumentation! s = spam ergibt spam Das \n wird als "\ + n interpretiert

9 9 Indizierung von Strings ABER: Pythons Selbstschutz-Mechanismus Nicht ganz sinnvoll, aber machbar:

10 10 Vorkommen von Substrings zählen: s.count(sub [, start[, end]]) Beginnt/endet s mit einem Substring? s.startswith(sub[, start[, end]]), s.endswith(sub[, start[, end]]) s in Groß-/Kleinbuchstaben: s.upper(), s.lower() Leerraum entfernen: s.strip([chars]) An Substrings trennen: s.split([sub [,maxsplit]]) Position eines Substrings finden: s.index(sub[, start[, end]]) Einen Substring ersetzen: s.replace(old, new[, count]) Listenelemente in eine Zeichenkette verwandeln s.join(liste) 10 String-Methoden Weitere Methoden: help(str), dir(str) s wird zwischen allen Listenelementen eingefügt

11 11 Mehr zu strings Mehr Info auf: Hier einige nützliche Operatoren und Methoden für Zeichenketten Das ist bei weitem nicht alles!

12 12 Stringformatierung ähnlich C: Integer dezimal: d, i Integer oktal: o Integer hexadezimal: x, X Float: f, F Float in Exponentialdarstellung: e, E, g, G Einzelnes Zeichen: c String: s Ein %-Zeichen gibt man als % aus String-Formatierung

13 13 Listen und Tupel … können beliebige Objekte beinhalten … sind wahnsinnig praktisch, aber für numerische Anwendungen wenig effizient myList = [ -2, text, [1.,2.,3.] ] myTuple = ( 0.3, 8.0, r^ ) Listen-Elemente können verändert werden: myList[1] = complex(4., 1.) Bei Tupeln (und Strings) geht das nicht! Leere Liste = [], leeres Tupel = () Mehr Info auf:

14 14 Listenmethoden Element anhängen: s.append(x) um zweite Liste erweitern: s.extend(s2) Vorkommen eines Elements zählen: s.count(x) Position eines Elements: s.index(x[, min[, max]]) Element an Position einfügen: s.insert(i, x) Element an Position löschen und zurückgeben: s.pop([i]) Element löschen: s.remove(x) Liste umkehren: s.reverse() Sortieren: s.sort([cmp[, key[, reverse]]]) Summe der Elemente: sum(s)

15 15 Operationen auf Sequenzen Strings und Listen haben viel gemeinsam: Sie sind Sequenzen. Ist ein Element in s enthalten/nicht enthalten? x in s, x not in s Sequenzen aneinanderhängen: s + t Sequenzen vervielfältigen: n * s, s * n i-tes Element: s[i], von hinten: s[-i] Subsequenz: s[i:j], mit Schrittweite k: s[i:j:k] Subsequenz von Anfgang/bis Ende: s[:-i], s[i:], s[:] Länge: len(s) kleinstes/größtes Element: min(s), max(s) Zuweisungen: (a, b, c) = s (äquiv.: a = s[0], b = s[1], c = s[2])

16 Sequenzen erzeugen range(stop) or range(start, stop [, step]) erzeugt Zahlenfolge (Typ int) bis zum Wert vor stop. Wird nur der stop-Wert angegeben, beginnt die Zählung bei Null. enumerate(liste) erzeugt für jedes Listenelement ein Tupel (Index, Wert). Wird oft für Schleifen benutzt (s.u.) 16

17 17 Aufgaben 1.Sei L eine Liste L = [ 1, 2, 4, 8, 16, 32, 64, 128, 256 ]. Wie muss die Liste indiziert werden a)um alle geraden Zweierpotenzen zu erhalten? b)die Werte zwischen 2 4 und 2 7 (inklusive) zu erhalten? c)den Wert 64 zu bekommen (zwei Möglichkeiten)? 2.Was ergeben die folgenden Ausdrücke: a)Der Punkt geht an Zauberer Gandolf![-8:8:-7] ? b)[1,0,1,0,1,0,1,0,1,0][-10::1] ? c)([0,1],[2,3],[4,5])[2][1] d)(1,2.3,4)[4] e)L[:] mit L aus Aufgabe 1 ?

18 18 Verzeichnisse (Dictionaries) Eine gute Beschreibung findet sich auf: Dictionaries sind geordnete Listen, deren Index keine Zahl, sondern ein Schlüsselwort (key) ist. Wie Listen, haben auch Verzeichnisse eine Reihe nützlicher Methoden: Weitere Methoden sind setdefault(), items() und update(). Schlüssel können auch andere (nicht veränderbare) Objekte sein.

19 19 Verzeichnisse erzeugen Explizite Syntax: dict Funktion: Beide Möglichkeiten führen zu demselben Ergebnis. Leeres Verzeichnis: {}

20 20 Dictionary Methoden Eintrag löschen: de l alle Einträge löschen: d.clear() Kopie: d.copy() Ist Schlüssel enthalten? d.has_key(k) oder: k in d Liste von (key, value)-Tupeln: d.items() Liste aller Schlüssel: d.keys() Liste aller Werte: d.values() Eintrag holen: d.get(k[, x]) Eintrag löschen und zurückgeben: d.pop(k[, x]) Eintrag löschen und zurückgeben: d.popitem()

21 Mengen (set) Mengen enthalten ungeordnete Elemente; jedes Element darf nur einmal vorkommen. Mengen lassen sich verknüpfen, man kann Teilmengen bilden, etc. frozenset definiert unveränderliche Mengen 21 für weitere Informationen siehe

22 22 Mutable und Immutable Einfache Zahlen, Zeichenketten und Tupel sind nicht veränderbar (immutable). Eine Zuweisung an eine andere Variable erzeugt eine Kopie der Variablen. Mögliche Quelle für schwer zu findende Programmierfehler! Listen und Verzeichnisse (dictionaries) sind veränderbar (mutable). Eine Zuweisung an eine andere Variable erzeugt eine Referenz auf dasselbe Objekt!

23 23 Das if-Statement Bedingungen können mit and, or, und not verknüpft werden. Falsche logische Bedingungen sind häufige Programmfehler!

24 24 Vergleichsoperatoren Gleichheit: == Ungleichheit: != Größer/größer-gleich: >, >= Kleiner, kleiner-gleich: <, <= logisches und/oder: and, or logisches nicht: not Vergleich der Objektidentität: is, is not Gleichheit: == Ungleichheit: != Größer/größer-gleich: >, >= Kleiner, kleiner-gleich: <, <= logisches und/oder: and, or logisches nicht: not Vergleich der Objektidentität: is, is not Schachtelung von Vergleichen: -10 < x < < x != < x < < x != 7 Bedingte Zuweisung (sehr nützlich!): a = x if x>0. else -x Beachte Operator-Rangfolge! (s. )http://docs.python.org/reference/expressions.html#summary Beispiel: -10**2 ergibt -100, 10**-2 ergibt 0.01

25 25 Boolsche Werte und None True, False sind als Konstanten definiert Zahlen != 0 gelten als True; Zahl == 0 gilt als False, leere Listen, Zeichenketten, Verzeichnisse sind False. Der Wert None zeigt an, dass eine Variable keinen Wert hat. Bei Wahrheitsvergleichen gilt None als False. Vorsicht bei Fließkomma-Vergleichen:

26 26 Auswertung logischer Ausdrücke Logische Ausdrücke werden von links nach rechts ausgewertet. Die Auswertung eines logischen Ausdrucks bricht ab, sobald klar ist, ob der Ausdruck True oder False ergibt. ergibt True bei (x 7) wird nicht mehr ausgewertet.

27 27 Schleife vorzeitig beenden: break nächster Durchlauf: continue else wird ausgeführt, wenn die Schleife nicht vorzeitig verlassen wurde for-Schleifen

28 Der in Operator … tritt in Schleifen auf ( for … in …: ) … wird benutzt, um Elemente einer Liste, eines Tupels oder eines dictionaries zu finden ( if 7 in myList: ) … kann genauso zum Suchen von Teilstrings benutzt werden ( if a in Scrabble: ) 28 Hier ist sogar 7. gleichwertig mit 7

29 29 Aufgaben 3.Schreibe ein Python-Programm zur Überprüfung der Eingabe von Telefonnummern unter Verwendung von if, elif, else Ausdrücken und String-Operatoren. Gültige Telefonnummern sind: 0228/ (0)228/ (0) 228 / Teste dein Programm auch mit ungültigen Ausdrücken!

30 30 Auch hier können break und continue verwendet werden while-Schleifen In Python gibt es kein repeat … until. random.random() gibt Zufallszahl im Bereich [0,1) zurück.

31 Funktionen und Prozeduren Python kennt nur Funktionen. Wird nicht explizit ein Wert zurückgegeben (über return ), dann ist der Wert None. return kann auch mehrere Werte zurückgeben Definition von Funktionen mit def functionName(): Nutze das pass Kommando, um leere Funktionen (oder auch andere Programmblöcke) zu definieren 31

32 32 Funktionsargumente def f(x): # Aufruf: f(3) oder f(var) def g(x, y): # Aufruf: g(1,-1) oder g(x=1,y=-1) # [oder: g(y=-1,x=1)] def h(x, len=0):# Aufruf: h(var), h(var, 2), # h(x=var, len=2) def f(x): # Aufruf: f(3) oder f(var) def g(x, y): # Aufruf: g(1,-1) oder g(x=1,y=-1) # [oder: g(y=-1,x=1)] def h(x, len=0):# Aufruf: h(var), h(var, 2), # h(x=var, len=2) Argumente können über ihre Position oder ihren Namen identifiziert werden. Beide Formen können gemischt werden (aber Positionsargumente müssen immer vorne stehen) Keyword-Argumente können einen Defaultwert setzen (oft None) Sonderformen: *arg und **arg werten eine Argumentenliste bzw. ein Verzeichnis aus. Mehr Info:

33 33 Aufgaben 4.Eine Funktion sei definiert als def f(a, b, tol=1.e-3). Ferner sind definiert: a = 0, b = 2. Welche der folgenden Funktionsaufrufe sind korrekt? a)f(a, 2) b)f(2,0, 1.e-6) c)f(b, a) d)f(b=a, a=b) e)f(tol=0.01, a, b) 5.Was ergeben die beiden print Ausdrücke am Ende des folgenden Programms?

34 Iterables Ausgabe der Werte eines Feldes: 34 Variante 1: Variante 2: Variante 3: FORTRAN Python Listen sind Iterables für den Hinterkopf…

35 Iterable, Iterator und Generator Iterable: alles, was hinter in stehen kann (also vor allem in einer for Schleife) technisch: ein iterable Objekt muss eine __iter__ Methode haben Iterator: etwas, das selbstständig den nächsten Wert zurückliefert technisch: ein Objekt mit einer next() Methode Generator: eine Funktion, die einen Iterator implementiert technisch: eine Funktion mit einem yield Statement 35 mehr Informationen z.B. unter oder für den Hinterkopf…

36 Motivation für Iteratoren und Generatoren macht Programme lesbarer spart Speicherplatz, da immer nur ein Element und nicht gleich eine ganze Liste zurückgegeben wird erlaubt elegante und besser einsehbare Konstruktionen 36 Beispiel: ein selbst zu schreibender Generator für den Hinterkopf…

37 List comprehension erstelle eine Liste mit Hilfe eines Iterators allgemein: Sehr mächtiges Konstrukt! 37 für den Hinterkopf… erzeugt eine Liste mit Quadratzahlen von 1 2 bis xrange wie range, jedoch als Iterator … nur Quadratzahlen gerader Zahlen

38 zip fasse mehrere Listen zu einer Liste aus Tupeln zusammen … und erstelle daraus ein dictionary 38 für den Hinterkopf… Das geht natürlich auch in einer Zeile: myDict = dict(zip(namen, alter))

39 map und filter map wendet eine Funktion auf alle Elemente einer Liste an: filter gibt alle Listenelemente zurück, für die eine Funktion True zurückliefert: Zusammen leisten map und filter quasi das Gleiche wie list comprehensions. 39 für den Hinterkopf… lambda definiert eine Funktion in einer Zeile


Herunterladen ppt "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 2: Python Grundlagen."

Ähnliche Präsentationen


Google-Anzeigen