Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G....
-
Upload
amalie-naeve -
Category
Documents
-
view
108 -
download
1
Transcript of Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G....
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!
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″
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
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
66
Numerik-FallenBeispiele aus D. Knuth „The Art of Computer Programming“
Verletzung des Assoziativgesetzes:
Verletzung des Distributivgesetzes:
... Aus der Praxis … … und zur Wiederholung
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
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
Indizierung von Strings
ABER: Pythons Selbstschutz-Mechanismus
Nicht ganz sinnvoll, aber machbar:
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
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!
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
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
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)
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])
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
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 ?
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.
19
Verzeichnisse erzeugen
Explizite Syntax:
dict Funktion:
Beide Möglichkeiten führen zu demselben Ergebnis.
Leeres Verzeichnis: {}
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()
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
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!
2323
Das if-Statement
Bedingungen können mit and, or, und not verknüpft werden.
Falsche logische Bedingungen sind häufige Programmfehler!
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
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:
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.
27
• Schleife vorzeitig beenden: break• nächster Durchlauf: continue• else wird ausgeführt, wenn die
Schleife nicht vorzeitig verlassen wurde
for-Schleifen
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
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!
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.
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
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/
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?
IterablesAusgabe der Werte eines Feldes:
34
Variante 1:
Variante 2:
Variante 3:
FORTRAN
Python Listen sind „Iterables“
für den Hinterkopf…
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…
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…
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
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))
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