Programmieren in Python

Ähnliche Dokumente
Programmieren in Python

Beispiel 19. December 4, 2009

Programmierkurs Python I

Python-Workshop. Python für C/C++ Programmierer. Carl Friedrich Bolz. Carl Friedrich Bolz

Übersicht Programmablaufsteuerung

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren

Funktionales Programmieren in Python

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe

Kompaktkurs Python Einführung in die Programmierung zur Numerik mit Python

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

12 == 12 true 12 == 21 false 4 === 7 true 4 === "vier" false 4 === 4.0 false 12!= 13 true 12!== 12 false 12!== 12.0 true. 1 < 3 true 3 < 1 false

Die Suche nach Genen in Bakteriengenomen. BWInf-Workshop März Prof. Dr. Sven Rahmann AG Bioinformatik Informatik XI, TU Dortmund

Programmieren für Wirtschaftswissenschaftler SS 2015

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Erwin Grüner

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben.

Programmierung in Python

5.4 Klassen und Objekte

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Hans-Georg Eßer Betriebssysteme, WS 2006/07. Fachbereich Informatik/Mathematik Übungsblatt 1, Seite 1/5 Fachhochschule München

JAVA - Methoden

2.5 Programmstrukturen Entscheidung / Alternative

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Objektorientierte Programmierung

Die Programmiersprache C99: Zusammenfassung

Interpreter - Gliederung

Neue Features in C# 2.0

Die freie Programmiersprache Python mit Beispielen für ihren praktischen Einsatz. Python User Group Köln

Objektorientierte Programmierung OOP Programmieren mit Java

28. April Python ist eine Interpreter Sprache. einfach durch eigene C Module erweiterbar. Daten werden dynamisch getypt

10 Objektorientierte Programmierung, Teil 1

Java Einführung ABLAUFSTEUERUNG Kapitel 3 und 4

Informatik I. 4. Funktionen: Aufrufe und Definitionen. 25. Oktober Albert-Ludwigs-Universität Freiburg. Informatik I.

Webbasierte Programmierung

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Grundlagen der Programmierung in C Funktionen

Multimedia im Netz Wintersemester 2011/12

Einführung in Python Teil I Grundlagen

Steht in der ersten Zeile #!/usr/bin/python und hat man die Ausführungsrechte gesetzt kann man es direkt ausführen.

Frankfurt am Main. Dortmund. Stuttgart. Düsseldorf

Grundlagen von Python

Python Einführung in die prozedurale Programmierung. Monty Python's Flying Circus

C.3 Funktionen und Prozeduren

Studentische Lösung zum Übungsblatt Nr. 7

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

Arbeiten mit JavaKara

Sprachbeschreibung und Erweiterung

4 Schleifen -= Entstanden unter Excel 2003 =-

Einführung in Python

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Einführung in die C-Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

5. Tutorium zu Programmieren

Einstieg in die Informatik mit Java

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Ruby. Programmieren mit Zucker. Thomas Kühn

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Grundlagen der Programmierung in C++ Kontrollstrukturen

Programmieren in Python

Computergrundlagen Programmieren in C

2. Programmierung in C

Prozedurale Datenbank- Anwendungsprogrammierung

Grundlagen der Programmierung

Python Programmieren. Variablen, Ausdrücke und Anweisungen

Einführung in VisualBasic for Applications. Stefan Mahlitz

Linux Prinzipien und Programmierung

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Einführung in die Java- Programmierung

Linux Tutorium. 12. Shellprogrammierung. Version vom :38:56

Tag 7. Pattern Matching und eigene Datentypen

Name: Klausur Programmierkonzepte SS 2011

Ruby. Erfinder: Yukihiro Matsumoto Japan 1993 Einflüsse: Smalltalk Perl Eigenschaften: Objektorientiert Interpretiert

Einstieg ins Programmieren mit Python

Einführung in die Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Prüfung Software Engineering II (IB)

Syntax von LOOP-Programmen

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Theorie zu Übung 8 Implementierung in Java

Tutorium Rechnerorganisation

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

Flussdiagramm / Programmablaufplan (PAP)

Internetanbindung von Datenbanken

Informatik für Schüler, Foliensatz 23 Konstruktor, String-Methode und Heldenklassse

Interaktive Simulationen Lektion 1/3: Event-Driven Design und Signals

Übungsblatt 2. Abgabe: Freitag, 7. November 2014, 18:00 Uhr

Celery Eine asynchrone Task Queue (nicht nur) für Django. Markus Zapke-Gründemann Leipzig Python User Group

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Die Programmiersprache C Eine Einführung

Übung zur Vorlesung Multimedia im Netz

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Allgemeine Informatik 1 (AI1)

Transkript:

10. Iteratoren und Generatoren Albert-Ludwigs-Universität Freiburg KI-Praktikum, Sommersemester 2009

Iteratoren und Generatoren Überblick über diese Lektion: Iteratoren Generatoren Generator Comprehensions und List Comprehensions

Iteratoren und Generatoren Überblick über diese Lektion: Iteratoren Generatoren Generator Comprehensions und List Comprehensions

for und iter (1) Die Methode iter ist im Zusammenhang mit for-schleifen relevant. Jetzt lohnt es sich, die Funktionsweise von for-schleifen im Detail zu besprechen: Zu Beginn der Schleife wird die (bisher noch nicht besprochene) Builtin-Funktion iter mit dem Argument obj aufgerufen. Die Aufgabe von iter besteht darin, ein Objekt zu liefern, mit dessen Methoden obj durchlaufen werden kann. Ein solches Objekt bezeichnet mal als Iterator. iter(obj) erledigt diese Aufgabe, indem es obj. iter () aufruft. Hier liegt also die eigentliche Verantwortung. Das Resultat von iter(obj) wird in einer internen Variable gebunden, die wir cursor nennen wollen (sie ist nicht vom Programm aus sichtbar, hat also keine Namen): cursor = iter(obj)

for und iter (2) Bei jedem Schleifendurchlauf wird die next-methode von cursor aufgerufen und das Ergebnis an die Schleifenvariable x gebunden: x = cursor.next() Die Schleife endet, wenn cursor.next() eine Ausnahme des Typs StopIteration erzeugt.

for-schleifen als while-schleifen Die folgenden beiden Programme sind also äquivalent, sieht man mal von der Sichtbarkeit der Cursor-Variable ab: for x in obj: <do something> _cursor = iter(obj) while True: try: x = _cursor.next() except StopIteration: break <do something>

Iterator-Beispiel (1) Ein Iterator ist somit ein Objekt mit einer next-methode, die ggf. die Ausnahme StopIteration erzeugt. Ein Beispiel: squares iter.py class Squares(object): def init (self, max_index): self.max_index = max_index self.current_index = 0 def iter (self): return self def next(self): if self.current_index >= self.max_index: raise StopIteration result = self.current_index ** 2 self.current_index += 1 return result

Iterator-Beispiel (2) Python-Interpreter >>> from squares iter import Squares >>> sq = Squares(5) >>> for x in sq:... print x... 0 1 4 9 16

Iteratoren und Generatoren Überblick über diese Lektion: Iteratoren Generatoren Generator Comprehensions und List Comprehensions

Generatoren Iteratoren sind so nützlich, dass es ein spezielles Konstrukt in Python gibt, das das Erzeugen von Iteratoren erleichert: Generatoren. Generatoren sind Funktionen, die Iteratoren erzeugen. Äußerlich sieht ein Generator aus wie eine Funktion, nur dass er anstelle von (oder zusätzlich zu) return-anweisungen yield-anweisungen benutzt. Ein Beispiel: generate food.py def food(): yield "ham" yield "spam" yield "jam"

Generatoren (2) Im Gegensatz zu Funktionen können Generatoren mehrere Werte hintereinander erzeugen: Python-Interpreter >>> from generate food import food >>> myiter = food() >>> print myiter.next() ham >>> print "do something else" do something else >>> print myiter.next() spam >>> print myiter.next() jam >>> print myiter.next()...(traceback mit StopIteration)

Was tut ein Generator? (1) Ein Generator kann als Funktion aufgerufen werden. Er liefert dann ein Iterator-Objekt zurück. Der Code innerhalb der Generator-Definition wird zunächst nicht ausgeführt. Jedesmal, wenn die next-methode des zurückgelieferten Iterators aufgerufen wird, wird der Code innerhalb des Generators so lange ausgeführt, bis er auf eine yield-anweisung stößt. Bei Erreichen von yield obj wird obj als Ergebnis des next()-aufrufs zurückgeliefert und der Generator wieder (bis zum nächsten Aufruf) unterbrochen. Wenn die Funktion beendet wird oder eine return-anweisung erreicht wird, wird eine StopIteration-Ausnahme erzeugt. Anmerkung: In Generatoren ist nur return, nicht aber return obj erlaubt.

Was tut ein Generator? (2) Der gesamte Zustand des Generators wird zwischen den Aufrufen gespeichert; man kann ihn also so schreiben, als würde er nie unterbrochen werden. Man kann mit derselben Generator-Funktion mehrere Iteratoren erzeugen, ohne dass diese sich gegenseitig beeinflusst jeder Iterator merkt sich den Zustand seines Generator-Aufrufs.

Generatoren: Terminologie In Python wird sowohl der Generator selbst (food im Beispiel) als auch der Rückgabewert der Funktion (myiter im Beispiel) als Generator bezeichnet. Wenn man genau sein will, nennt man food eine Generatorfunktion und myiter einen Generator-Iterator.

Zurück zum Squares-Beispiel Hier noch einmal unser altes Beispiel: squares iter.py class Squares(object): def init (self, max_index): self.max_index = max_index self.current_index = 0 def iter (self): return self def next(self): if self.current_index >= self.max_index: raise StopIteration else: result = self.current_index ** 2 self.current_index += 1 return result

Das Squares-Beispiel mit Generatoren Mit Generatoren erreichen wir dasselbe sehr viel einfacher: squares generator.py def squares(max_index): for i in xrange(max_index): yield i ** 2 Anwendung: Python-Interpreter >>> from squares generator import squares >>> for x in squares(5):... print x,... 0 1 4 9 16

Unendliche Generatoren Da Generator-Funktionen nur on demand ausgeführt werden, können sie auch unendliche Berechnungen anstellen. Das ist nicht einmal selten: infinite squares.py def squares(): i = 0 while True: yield i ** 2 i += 1

Unendliche Generatoren (2) Benutzung des unendlichen Generators: Python-Interpreter >>> from infinite squares import squares >>> for x in squares():... print x,... if x >= 100:... break... 0 1 4 9 16 25 36 49 64 81 100

Das Modul itertools Das Modul itertools enthält nützliche Hilfsfunktionen im Zusammenhang mit Iteratoren und Generatoren. Einige einfache Beispiele: count([start=0]): Generiert die Zahlen start, start + 1, start + 2,... Beispiel: count() generiert 0, 1, 2, 3, 4, 5,... izip(*iterables): Generator-Version von zip. Beispiel: izip(count(100), "spam") generiert (100, "s"), (101, "p"), (102, "a") und (103, "m"). cycle(iterable): Durchläuft iterable zyklisch. Beispiel: cycle("ab") generiert "a", "b", "a", "b", "a", "b",...

Squares mit itertools.count squares for the last time i promise.py import itertools def squares(): for i in itertools.count(): yield i ** 2

Pythagoräische Tripel als Generator Für die, die sich noch an die Übungen zu Lektion 3 erinnern: pythagorean triples generator.py import itertools def pythagorean_triples(): for z in itertools.count(1): for x in xrange(1, z): for y in xrange(x, z): if x * x + y * y == z * z: yield (x, y, z) for triple in pythagorean_triples(): print triple Das Programm erzeugt Tripel bis zum Abwinken (mit Strg+C).

Iteratoren und Generatoren Überblick über diese Lektion: Iteratoren Generatoren Generator Comprehensions und List Comprehensions

Generator Comprehensions und List Comprehensions Häufig schreibt man Code nach diesem Schema: mylist = [] for char in "spam": mylist.append(char.upper() + char) oder def mygen(): for x in ask_user(): if x % 2 == 1: yield x * x Für solche Zwecke gibt es Kurzschreibweisen, die man als List Comprehension bzw. Generator Comprehensions bezeichnet.

Generator Comprehensions und List Comprehensions: Syntax Die beiden Begriffe leiten sich von set comprehensions ab; so bezeichnet man im Englischen folgendes Schema zur Mengennotation aus der Mathematik: M = { 3x x A, x 10 } Eine ähnliche Notation ist auch in Python möglich: Generator Comprehension: M = (3 * x for x in A if x >= 10) List Comprehension: M = [3 * x for x in A if x >= 10]

Generator Comprehensions und List Comprehensions: Beispiele Zurück zu unseren Beispielen: mylist = [] for char in "spam": mylist.append(char.upper() + char) mylist = [char.upper() + char for char in "spam"] def mygen(): for x in ask_user(): if x % 2 == 1: yield x * x mygen = (x * x for x in ask user() if x % 2 == 1)

Generator Comprehensions: Allgemeine Form Generator Comprehensions haben allgemein die folgende Form (Einrückung dient nur der Verdeutlichung): <ausdruck> for <var1> in <iterable1> for <var2> in <iterable2>... if <bedingung1> if <bedingung2>... Dabei muss ein for-teil vorhanden sein, während die if-teile optional sind. Äquivalenter Code ohne Generator Comprehension: for <var1> in <iterable1>: for <var2> in <iterable2>:... if <bedingung1>: if <bedingung2>: yield <ausdruck>

List Comprehensions: Allgemeine Form List Comprehensions werden mit umschließenden eckigen (nicht runden) Klammern notiert und haben ansonsten identische Syntax zu Generator Comprehensions. Die Semantik ist ebenfalls ähnlich: Die List Comprehension liefert dieselben Objekte wie die analoge Generator Comprehension, allerdings als Liste, nicht als Generator-Iterator.

List Comprehensions/Generator Comprehensions: Anmerkungen Einige abschließende Anmerkungen: Bei Generator Comprehensions kann man (genau wie bei Tupeln) die äußeren Klammern weglassen, sofern dadurch keine Mehrdeutigkeit entsteht: Python-Interpreter >>> print sum(x * x for x in (2, 3, 5)) 38 List Comprehensions sind eigentlich unnötig, da man mit list(<generator comprehension>) den gleichen Effekt mit ähnlichem Aufwand erreichen kann. Sie sind historisch älter als Generator Comprehensions.

Pythagoräische Tripel kompakt Vielleicht nicht unbedingt übersichtlich, aber möglich: pythagoras reloaded.py from itertools import count p = ((x,y,z) for z in count(1) for x in xrange(1, z) for y in xrange(x, z) if x * x + y * y == z * z)