Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Imperative Programmierung
der Universität Oldenburg
OStR Dipl. Ing. Carsten Kraft
Hash-Tabellen und -Funktionen Hash-Tabellen in Java
Forschungszentrum caesar
Variablen und Datentypen
Zusammenfassung der Vorwoche
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Programmieren in Logik
10. Grundlagen imperativer Programmiersprachen
3 Sprachelemente und Anweisungen JavaHS Merseburg (FH) WS 06/07 Strings (Zeichenketten)
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Funktion defined Die Funktion defined testet, ob eine Variable einen anderen Wert als undef enthält. Ist der Wert undef, so wird falsch zurückgegeben,
Imperative Programmierung
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Zusammenfassung Vorwoche
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Einführung in die Programmierung Datensammlung
Einführung in die Programmierung Anweisungen und Datentypen
Kollektionstypen (1) Es sind polymorphe Typkonstruktoren, jeweils als Sorten- und als Klassenkonstruktor (t,v beliebige Typen): –set, Set :Ungeordnete.
Grundkonzepte Java - Klassendefinition
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
Informatik 1 Übung 2.
Kontrollstrukturen Verwendung: Steuerung des Ablaufs.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 3: Numpy.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Dynamische Datentypen
Datenbanksysteme für hörer anderer Fachrichtungen
Variablenkonzept Klassisch, in Java Basistyp
Algorithmen und Datenstrukturen Übungsmodul 11
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Einführung in PHP.
Einführung in PHP 5.
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
CuP - Java Sechste Vorlesung Entspricht ungefähr Kapitel 3. 1 – 3
Datentypen: integer, char, string, boolean
Programmieren in C Grundlagen C 2
BMEVIEEA100 Grundlagen der Programmierung
PHP: Operatoren und Kontrollstrukturen
Hochschule Fulda – FB ET Sommersemester 2014
SFZ Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Grundlagen.
SFZ FN Sj. 13/14 Python Grundlagen InfK12 Sj 13/14 GZG FN W.Seyboldt.
8 Erzeugen und Verwalten von Tabellen Ziele Kennenlernen der wichtigsten Datenbankobjekte Anlegen von Tabellen Datentypen zur Definition von Spalten.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Anführungszeichen?! echo 'Apfel$atf'; // ergibt: Apfel$aft
XPath Datenmodell und Sequenzen Universität zu Köln – Historisch-Kulturwissenschaftliche Informationsverarbeitung Datenbanktechnologie – Daniel Ebner –
(Syntax, Strings/Zahlen, Variablen, Arrays)
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Java-Kurs Übung Besprechung der Hausaufgabe
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
Variablen und Datentypen
Die STL. Schreiben und Lesen von Dateien  Einbinden von  Lesen und Schreiben über stream-Objekte Streams führen Transformationen zwischen Programmobjekten.
Datentypen: integer, char, string, boolean
SS 04 Christiane Rauh Christian Hellinger
 Präsentation transkript:

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

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!

Variablenzuweisung Mehrfachzuweisungen sind möglich: 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″

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

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 5

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

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

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

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

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

Mehr zu strings Hier einige nützliche Operatoren und Methoden für Zeichenketten Das ist bei weitem nicht alles! Mehr Info auf: http://docs.python.org/library/stdtypes.html#string-methods

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

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 13

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

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

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

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

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: http://infohost.nmt.edu/tcc/help/pubs/lang/pytut/dict-methods.html

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

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 „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 http://openbook.galileocomputing.de/python/python_kapitel_08_007.htm

„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!

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

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. http://docs.python.org/reference/expressions.html#summary ) Beispiel: -10**2 ergibt -100, 10**-2 ergibt 0.01

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.

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.

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

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

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

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.

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

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

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

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“

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 http://openbook.galileocomputing.de/python/python_kapitel_13_005.htm oder http://nedbatchelder.com/text/iter.html

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 http://nedbatchelder.com/text/iter.html) 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:

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 http://openbook.galileocomputing.de/python/python_kapitel_13_004.htm List comprehensions können auch geschachtelt werden. Beispiel: [x+y for x in A for y in B] … nur Quadratzahlen gerader Zahlen

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 http://openbook.galileocomputing.de/python/python_kapitel_13_004.htm 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))

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 http://openbook.galileocomputing.de/python/python_kapitel_13_004.htm List comprehensions können auch geschachtelt werden. Beispiel: [x+y for x in A for y in B]