From e5a217b99ace7bd37144f68751e792a3851b14b9 Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Fri, 15 Oct 2021 22:33:57 +0200 Subject: [PATCH] add generator example This addresses issue #18 and adds correct syntax. --- latex/slides/06_comprehensions.tex | 8 +++-- .../resources/06_comprehensions/generators.py | 14 +++++++++ md/06_comprehensions.md | 31 +++++++++++++++++-- 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 latex/slides/resources/06_comprehensions/generators.py diff --git a/latex/slides/06_comprehensions.tex b/latex/slides/06_comprehensions.tex index 51531ad..e0cb20a 100644 --- a/latex/slides/06_comprehensions.tex +++ b/latex/slides/06_comprehensions.tex @@ -62,16 +62,18 @@ \section{Generators} \begin{description} \item[Generator] Ein Objekt, \"uber das iteriert werden kann. Wenn ein Element daraus verwendet wurde, ist es nicht mehr in dem Generatorobjekt enthalten.\\[.5cm] \end{description} - - Die grundlegende Syntax ist gleich der einer \textit{List Comprehension}. + Grundlegender Syntax: \alert{\texttt{( EXPRESSION for LAUFVARIABLE in ITERABLE (if FILTER) )}}\\ Da sich \alert{\texttt{list}} und \alert{\texttt{dict}} auch aus Iterables bauen lassen, gilt prinzipiell:\\[.25cm] \alert{\texttt{list(EXPRESSION for VARIABLE in ITERABLE) == [EXPRESSION for VARIABLE in ITERABLE]}}\\[.25cm] und\\[.25cm] \alert{\texttt{dict((KEY, VALUE) for VARIABLE in ITERABLE) == \{KEY:VALUE for VARIABLE in ITERABLE\}}}\\[.25cm] - \textbf{Aber:} Generators verhalten sich anders als Lists oder Dicts! + \textbf{Aber:} Generatoren sind lazy, sie erzeugen die Elemente erst wenn sie iteriert werden. +\end{frame} +\begin{frame}{Generators - Beispiel} + \lstinputlisting{resources/06_comprehensions/generators.py} \end{frame} diff --git a/latex/slides/resources/06_comprehensions/generators.py b/latex/slides/resources/06_comprehensions/generators.py new file mode 100644 index 0000000..76a0bf7 --- /dev/null +++ b/latex/slides/resources/06_comprehensions/generators.py @@ -0,0 +1,14 @@ +# liefert gerade Zahlen von 0 bis 10 (10 nicht enthalten) +generator = (i for i in range(10) if i % 2 == 0) + +# gibt 0, 2, 4, 6 und 8 aus +for number in generator: + print(number) + +# gibt nichts aus, generator ist erschöpft +for number in generator: + print(number) + +# wenn alle Elemente sofort erzeugt werden würde mindestens 4GB Speicher benötigt +for number in (i for i in range(2**32)): + print(number) diff --git a/md/06_comprehensions.md b/md/06_comprehensions.md index 9c4c83e..f3ef6c9 100644 --- a/md/06_comprehensions.md +++ b/md/06_comprehensions.md @@ -78,6 +78,7 @@ Grundlegender Syntax: Fast der gleiche Syntax, nur diesmal mit 2 Expressions: __KEY__ und __VALUE__. Ansonsten gelten die gleichen Regeln. +--- ## Beispiel @@ -99,8 +100,13 @@ enthalten. --- -Die grundlegende Syntax ist gleich der einer *List Comprehension*. Da -sich `list` und `dict` auch aus Iterables bauen lassen, gilt prinzipiell: +Grundlegender Syntax: + +```python +(EXPRESSION for LAUFVARIABLE in ITERABLE (if FILTER)) +``` + +Da sich `list` und `dict` auch aus Iterables bauen lassen, gilt prinzipiell: ```python list(EXPR for VAR in ITERABLE) == [EXPR for VAR in ITERABLE] @@ -110,6 +116,25 @@ und dict((KEY, VAL) for VAR in ITERABLE) == {KEY: VAL for VAR in ITERABLE} ``` +**Aber:** Generatoren sind lazy, sie erzeugen die Elemente erst wenn sie iteriert werden. + --- -**Aber:** Generators verhalten sich anders als Lists oder Dicts! +## Beispiel + +```python +# liefert gerade Zahlen von 0 bis 10 (10 nicht enthalten) +generator = (i for i in range(10) if i % 2 == 0) + +# gibt 0, 2, 4, 6 und 8 aus +for number in generator: + print(number) + +# gibt nichts aus, generator ist erschöpft +for number in generator: + print(number) + +# wenn alle Elemente sofort erzeugt werden würde mindestens 4GB Speicher benötigt +for number in (i for i in range(2**32)): + print(number) +```