Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G....

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

Transcript of Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G....

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

Wissenschaftliche Programmierung mit Python

- für Meteorologie und Atmosphärenforschung

Martin G. Schultz

Teil 2: Python Grundlagen

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

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:aAAntonmyVariable_allSomePrettyLongVar_001

Ungültige Beispiele:ä.first17zulufromMeine VariableWichtig!

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

3

Variablenzuweisung

Mehrfachzuweisungen sind möglich:

a = 18

a, b = 18, -2.432a = b = 3**3name = ″Müller″Vorname, Nachname = ″Anton″, ″Müller″

Änderungen des Variablenwertes:

a += 5 # same as a = a+5a -= 1a *= ba /= math.pia %= 1auch: name += ″-Thurgau″

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

44

Numerische Datentypen

• int: entspricht long in C• long: unbegrenzter Wertebereich• float: enspricht double in C• complex: komplexe Zahlen

a = 1b = 1Lc = 1.0; c = 1e0d = 1 + 0j

import math

import cmath

Realteil: d.real, Imaginärteil: d.imag

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

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: http://stackoverflow.com/questions/10282674/difference-between-the-built-in-pow-and-math-pow-for-floats-in-python

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

66

Numerik-FallenBeispiele aus D. Knuth „The Art of Computer Programming“

Verletzung des Assoziativgesetzes:

Verletzung des Distributivgesetzes:

... Aus der Praxis … … und zur Wiederholung

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

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″}

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″

Bei Index-Bereichen ist der Endwert nicht enthalten!:

a[1:10:2] # jeden zweiten ungeraden Werta[-3] # der drittletzte Werta[-1::-1] # Liste rückwärts

stringlisttupledictionary

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

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

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

9

Indizierung von Strings

ABER: Pythons Selbstschutz-Mechanismus

Nicht ganz sinnvoll, aber machbar:

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

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 verwandelns.join(liste) 10

String-Methoden

Weitere Methoden: help(str), dir(str)

s wird zwischen allen Listenelementen eingefügt

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

11

Mehr zu strings

Mehr Info auf: http://docs.python.org/library/stdtypes.html#string-methods

Hier einige nützliche Operatoren und Methoden für Zeichenketten

Das ist bei weitem nicht alles!

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

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

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

1313

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: http://docs.python.org/tutorial/datastructures.html

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

1414

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)

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

1515

Operationen auf SequenzenStrings 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])

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

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

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

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 24 und 27 (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 ?

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

18

Verzeichnisse (Dictionaries)

Eine gute Beschreibung findet sich auf: http://infohost.nmt.edu/tcc/help/pubs/lang/pytut/dict-methods.html

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.

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

19

Verzeichnisse erzeugen

Explizite Syntax:

dict Funktion:

Beide Möglichkeiten führen zu demselben Ergebnis.

Leeres Verzeichnis: {}

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

20

Dictionary Methoden• Eintrag löschen: del• 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()

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

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

21für weitere Informationen siehe http://openbook.galileocomputing.de/python/python_kapitel_08_007.htm

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

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!

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

2323

Das if-Statement

Bedingungen können mit and, or, und not verknüpft werden.

Falsche logische Bedingungen sind häufige Programmfehler!

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

24

VergleichsoperatorenGleichheit: ==Ungleichheit: !=Größer/größer-gleich: >, >=Kleiner, kleiner-gleich: <, <=logisches und/oder: and, orlogisches nicht: notVergleich der Objektidentität: is, is not

Schachtelung von Vergleichen:

-10 < x < 10-5 < 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

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

25

Boolsche Werte und NoneTrue, False sind als Konstanten definiertZahlen != 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:

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

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<2), d.h. (x>7) wird nicht mehr ausgewertet.

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

27

• Schleife vorzeitig beenden: break• nächster Durchlauf: continue• else wird ausgeführt, wenn die

Schleife nicht vorzeitig verlassen wurde

for-Schleifen

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

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

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

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/735190(0)228/73519-0+49 (0) 228 / 73 51 90+49 2461 61-2831

Teste dein Programm auch mit ungültigen Ausdrücken!

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

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.

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

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

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

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)

• 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: http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

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

33

Aufgaben4. 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?

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

IterablesAusgabe der Werte eines Feldes:

34

Variante 1:

Variante 2:

Variante 3:

FORTRAN

Python Listen sind „Iterables“

für den Hinterkopf…

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

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

35mehr Informationen z.B. unter http://openbook.galileocomputing.de/python/python_kapitel_13_005.htm oder http://nedbatchelder.com/text/iter.html

für den Hinterkopf…

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

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 schreibenderGenerator

für den Hinterkopf…

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

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 12 bis 102.

xrange wie range, jedoch als Iterator

… nur Quadratzahlen gerader Zahlen

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

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))

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

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 eineFunktion in einer Zeile