Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1

Ähnliche Präsentationen


Präsentation zum Thema: "Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1"—  Präsentation transkript:

1 Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung
Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1 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: a A Anton myVariable _all SomePrettyLongVar_001 Ungültige Beispiele: ä .first 17zulu from Meine Variable Wichtig!

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

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

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

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

7 Zeichenketten, Listen, Tupel, Verzeichnisse
string list tuple dictionary zk = ″Ein Text″ li = [1, 2, 3, ″Text″, [True, False]] tu = (1, 2, ″Text″) vz = {″YYZ″: ″Toronto″, ″FRA″: ″Frankfurt″} Mehrfachzuweisungen sind möglich: 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″ Erwähnen: Zeichenketten und Tupel sind „immutable“, Listen und Verzeichnisse „mutable“ (kommt später) 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

8 Strings 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) s = ″ ′ spam′ ″ ergibt ′spam ′ Programmdokumentation! Das \n wird als "\“ + “n“ interpretiert 8

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

10 String-Methoden • 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) Weitere Methoden: help(str), dir(str) s wird zwischen allen Listenelementen eingefügt 10

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

12 String-Formatierung 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

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

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

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

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

17 Aufgaben Sei L eine Liste L = [ 1, 2, 4, 8, 16, 32, 64, 128, 256 ]. Wie muss die Liste indiziert werden um alle geraden Zweierpotenzen zu erhalten? die Werte zwischen 24 und 27 (inklusive) zu erhalten? den Wert 64 zu bekommen (zwei Möglichkeiten)? Was ergeben die folgenden Ausdrücke: ″Der Punkt geht an Zauberer Gandolf!″[-8:8:-7] ? [1,0,1,0,1,0,1,0,1,0][-10::1] ? ([0,1],[2,3],[4,5])[2][1] (1,2.3,4)[4] L[:] mit L aus Aufgabe 1 ? 1. L[1::2] L[4:8] L[6] oder L[-3] 2. „Gut“ das Original 5 eine Fehlermeldung eine Kopie der Liste L (!)

18 Verzeichnisse (Dictionaries)
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. Eine gute Beschreibung findet sich auf:

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

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 „Meteorologie“ und „Klima“ haben auch das „m“ gemeinsam, wenn man Groß- und Kleinschreibung außer Acht lässt. Wie kann man das mit Mengen bestimmen? Antwort: set(„Meteorologie“.lower()) etc. für weitere Informationen siehe

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

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

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 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. ) Beispiel: -10**2 ergibt -100, 10**-2 ergibt 0.01

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. Vorsicht bei Fließkomma-Vergleichen: Der Wert None zeigt an, dass eine Variable “keinen Wert” hat. Bei Wahrheitsvergleichen gilt None als False.

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 for-Schleifen • Schleife vorzeitig beenden: break
• nächster Durchlauf: continue • else wird ausgeführt, wenn die Schleife nicht vorzeitig verlassen wurde

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“:) Hier ist sogar 7. gleichwertig mit 7

29 Aufgaben 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! 1. L[1::2] L[4:8] L[6] oder L[-3] 2. „Gut“ das Original 5 eine Fehlermeldung eine Kopie der Liste L (!)

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

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

32 Funktionsargumente 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) 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) Sonderformen: *arg und **arg werten eine Argumentenliste bzw. ein Verzeichnis aus. Mehr Info:

33 Aufgaben 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? f(a, 2) f(2,0, 1.e-6) f(b, a) f(b=a, a=b) f(tol=0.01, a, b) Was ergeben die beiden print Ausdrücke am Ende des folgenden Programms? 1. a)-d) are correct [though you might not get what you want] e) if positional and keyword args are mixed, positional must be first. 4. 15, [„Murks“, „a“, b“, „c“] 5, [„Murks“, „a“, b“, „c“] (Note: list is mutable and gets changed!)

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

35 Iterable, Iterator und Generator
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 mehr Informationen z.B. unter oder

36 Motivation für Iteratoren und Generatoren
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 Anmerkung: (Beispiel aus Der Vorteil dieser Schreibweise ist, dass die Analyse, was eine „gültige Zeile“ ist und die Aktion, die beim Finden von gültigen Zeilen stattfinden soll, getrennt werden (und sie haben auch eigentlich nix miteinander zu tun) Anderes Beispiel aus derselben Quelle: durchlaufe ein 2D Feld und führe für eine bestimmte Koordinate eine Aktion durch. Klassisch muss dies mit geschachtelten for Schleifen realisiert werden, aus denen man jedoch nicht einfach mit break herauskommt. Fasst man die beiden for Schleifen in einem Generator zusammen, der dann immer ein Paar (x,y) liefert, dann kann man den Abbruch ganz einfach realisieren: def twod_range(width, height): """Produce a stream of 2D coordinates""" for y in range(height): for x in range(width): yield(x, y) for col, row in twod_range(width, height): value = spreadsheet.getValue(col, row) if value == test: break ein selbst zu schreibender Generator Beispiel:

37 List comprehension erstelle eine Liste mit Hilfe eines Iterators
für den Hinterkopf… List comprehension erstelle eine Liste mit Hilfe eines Iterators allgemein: Sehr mächtiges Konstrukt! xrange wie range, jedoch als Iterator erzeugt eine Liste mit Quadratzahlen von 12 bis 102. NB: siehe auch „Generator expressions“ Beispiel: iter = (x*x for x in xrange(1,11)) (runde statt eckige Klammer – hier kann die äußere Klammer entfallen, da Ausdruck bereits geklammert ist) Gibt statt Liste einen Iterator zurück. Siehe auch List comprehensions können auch geschachtelt werden. Beispiel: [x+y for x in A for y in B] … nur Quadratzahlen gerader Zahlen

38 zip fasse mehrere Listen zu einer Liste aus Tupeln zusammen
für den Hinterkopf… zip fasse mehrere Listen zu einer Liste aus Tupeln zusammen … und erstelle daraus ein dictionary NB: siehe auch „Generator expressions“ Beispiel: iter = (x*x for x in xrange(1,11)) (runde statt eckige Klammer – hier kann die äußere Klammer entfallen, da Ausdruck bereits geklammert ist) Gibt statt Liste einen Iterator zurück. Siehe auch List comprehensions können auch geschachtelt werden. Beispiel: [x+y for x in A for y in B] Das geht natürlich auch in einer Zeile: myDict = dict(zip(namen, alter))

39 für den Hinterkopf… 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. lambda definiert eine Funktion in einer Zeile NB: siehe auch „Generator expressions“ Beispiel: iter = (x*x for x in xrange(1,11)) (runde statt eckige Klammer – hier kann die äußere Klammer entfallen, da Ausdruck bereits geklammert ist) Gibt statt Liste einen Iterator zurück. Siehe auch List comprehensions können auch geschachtelt werden. Beispiel: [x+y for x in A for y in B]


Herunterladen ppt "Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1"

Ähnliche Präsentationen


Google-Anzeigen