diff --git a/latex/slides/03_builtins.tex b/latex/slides/03_builtins.tex index af0521b..cd6f118 100644 --- a/latex/slides/03_builtins.tex +++ b/latex/slides/03_builtins.tex @@ -139,44 +139,57 @@ \section{Set/Frozenset} % ############################################################################# -% ------------------------------- 7. Iterations ------------------------------- +% ------------------------------- 7. Unpacking -------------------------------- % ############################################################################# -\section{Iterations} +\section{Unpacking} -\begin{frame}{Iteration} +\begin{frame}{Unpacking} \begin{itemize} - \item nur foreach - \item für Iterationen über Integer gibt es \\ \hspace{0.5cm} \texttt{range([start], stop, step=1)} - \item um Iteratoren zu kombinieren kann man \\ \hspace{0.5cm} \texttt{zip(iterator\_1, iterator\_2, ..., iterator\_n)} verwenden - \item alles mit einer \alert{\texttt{\_\_iter\_\_}} Methode ist iterierbar - % TODO: stateful Iterator erklaeren oder entfernen - \item \texttt{iter(iterable)} konstruiert einen \textit{stateful iterator} + \item einfaches Auflösen von Listen und Tupeln in einzelne Variablen + \item nützlich in \alert{\texttt{for}}-Schleifen \end{itemize} \end{frame} -\begin{frame}{Iteration - Beispiel} - \lstinputlisting[lastline=15]{resources/03_builtins/iterate.py} -\end{frame} - -\begin{frame}{Iteration - Beispiel} - \lstinputlisting[firstline=18]{resources/03_builtins/iterate.py} +\begin{frame}{Unpacking - Beispiel} + \lstinputlisting{resources/03_builtins/unpacking.py} \end{frame} % ############################################################################# -% ------------------------------- 8. Unpacking -------------------------------- +% ------------------------------- 8. Iterations ------------------------------- % ############################################################################# -\section{Unpacking} +\section{Iterations} -\begin{frame}{Unpacking} +\begin{frame}{Iteratoren} \begin{itemize} - \item einfaches Auflösen von Listen und Tupeln in einzelne Variablen - \item nützlich in \alert{\texttt{for}}-Schleifen + \item alles mit einer \alert{\texttt{\_\_next\_\_}} Methode ist ein \textit{Iterator} + \item Iteratoren stellen eine folge von Elementen dar, aus welcher man mit \alert{\texttt{next(iterator)}} das nächste Element holen kann + \item wenn der Iterator erschöpft ist wird eine \alert{\texttt{StopIteration}} Exception ausgelöst + \item gehören zu den \textit{Iterables} \end{itemize} + \textbf{Wichtig:} Iteratoren besitzen einen internen Zustand und sollten deswegen nicht von mehreren Benutzern gleichzeitig benutzt werden! + Dies kann mit der Verwendung mehrerer unabhängiger Iteratoren umgangen werden. \end{frame} -\begin{frame}{Unpacking - Beispiel} - \lstinputlisting{resources/03_builtins/unpacking.py} +\begin{frame}{Iterables} + \begin{itemize} + \item alles mit einer \alert{\texttt{\_\_iter\_\_}} Methode ist eine \textit{Iterable} + \item \textit{Iterables} liefern mit \alert{\textt{iter(obj)}} einen \textit{Iterator} über sich selbst + \item \alert{\texttt{for}} Schleifen ermöglichen ein einfaches Durchlaufen + \item eine \textit{Iterable} über Integer ist \\ \hspace{0.5cm} \texttt{range([start], stop, step=1)} + \item um Iterables zu kombinieren kann man \\ \hspace{0.5cm} \texttt{zip(iterable\_1, iterable\_2, ..., iterable\_n)} verwenden + \item \hspace{0.5cm} \texttt{any(iterable)} prüft ob mindestens ein Element einer \textit{Iterable} wahr ist + \item \hspace{0.5cm} \texttt{all(iterable)} prüft ob alle Elemente einer \textit{Iterable} wahr sind + \end{itemize} + \textbf{Wichtig:} Während des Iterierens können einige Iterables nicht verändert werden +\end{frame} + +\begin{frame}{Iteration - Beispiele} + \lstinputlisting[lastline=18]{resources/03_builtins/iterate.py} +\end{frame} + +\begin{frame}{Iteration - Beispiele} + \lstinputlisting[firstline=20]{resources/03_builtins/iterate.py} \end{frame} diff --git a/latex/slides/resources/03_builtins/iterate.py b/latex/slides/resources/03_builtins/iterate.py index ecf367f..954e2a2 100644 --- a/latex/slides/resources/03_builtins/iterate.py +++ b/latex/slides/resources/03_builtins/iterate.py @@ -3,34 +3,34 @@ break # verlässt die Schleife else: - pass # wenn kein break vorkommt + print("keine Zahl größer als 9") -for i in (1,2,3): - # code - pass +# Iterator über die Zahlen von 0 bis 3 (3 nicht enthalten) +iterator = iter(range(0, 3)) -for i in {1:'value1', 2:'value2'}: - # iteration ueber die keys - pass +# gibt 0, 1 und 2 aus +for i in iterator: + print(i) +# kein Output, Iterator ist erschöpft +for i in iterator: + print(i) +# gibt 1, 'value1' und 2, 'value2' aus for i in {1:'value1', 2:'value2'}.items(): - # i ist tuple von (key, value) - pass + # i ist ein Tuple von (key, value) + print(i[0], i[1]) -for value1, value2 in [ - (1, 'werner'), - (3, 'geh mal in den keller'), - (42, 'ich glaub die russen komm\'') - ]: - # iteration mit tuple unpacking - # code - -# oder auch +# iteration mit tuple unpacking +# gleiche Ausgabe wie letztes Beispiel +for key, value in {1:'value1', 2:'value2'}.items(): + print(key, value) -for value1, value2 in zip([1,3,42], ['werner', 'geh mal in den keller', 'ich glaub die russen komm\'', 'dieser string wird in der iteration nicht auftauchen', 'dieser auch nicht']) +# zip verbindet zwei Iterables und stoppt wenn einer die Elemente ausgehen +# -4 wird deswegen nicht ausgegeben +for value1, value2 in zip((1,2,3), (-1,-2,-3,-4)): + print(value1, value2) -for key, value in {1:'value1', 2:'value2'}.items(): - # iteration ueber keys und values mit tuple unpacking - pass +# True != False +any((False, True, False)) != all((False, True, False)) diff --git a/md/03_builtins.md b/md/03_builtins.md index e5acd96..96d7ca9 100644 --- a/md/03_builtins.md +++ b/md/03_builtins.md @@ -197,95 +197,104 @@ s1.add(s2) s2.add(5) # ==> AttributeError: 'frozenset' object has no attribute 'add' ``` -# Iteraton +# Unpacking --- -- nur foreach -- für Iterationen über Integer gibt es `range([start], stop, step=1)` -- um Iteratoren zu kombinieren kann man - `zip(iterator_1, iterator_2, ..., iterator_n)` verwenden -- alles mit einer `__iter__` Methode ist iterierbar -- `iter(iterable)` konstruiert einen *stateful iterator* +- einfaches Auflösen von Listen und Tupeln in einzelne Variablen +- nützlich in `for`-Schleifen --- ```python -for i in [1,2,3]: - if i > 9: - break - # verlässt die Schleife -else: - pass - # wenn kein break vorkommt - -for i in (1,2,3): - # code - pass +# unpacking (geht auch mit listen) +t = 1, 3, 'ein string' # tuple ohne klammern gebaut -for i in {1:'value1', 2:'value2'}: - # iteration ueber die keys - pass -``` +x, y, z = t +x is t[0] # ==> True +y is t[1] # ==> True ---- +x, *y = t +x # ==> 1 +y # ==> [3, 'ein string'] -```python -for i in {1:'value1', 2:'value2'}.items(): - # i ist tuple von (key, value) - pass +a, b, c = 1, 2, 4 -for value1, value2 in [ - (1, 'werner'), - (3, 'geh mal in den keller'), - (42, 'ich glaub die russen komm\'') - ]: - # iteration mit tuple unpacking - # code +d, e, f, *g = [3, 0, 8, 7, 46, 42] +f # ==> 8 +g # ==> [7, 46, 42] ``` +# Iterations + +## Iteratoren + --- -```python -# oder auch + - alles mit einer `__next__` Methode ist ein *Iterator* + - Iteratoren stellen eine folge von Elementen dar, aus welcher man mit `next(iterator)` das nächste Element holen kann + - wenn der Iterator erschöpft ist wird eine `StopIteration` Exception ausgelöst + - gehören zu den *Iterables* -for value1, value2 in zip([1,3,42], ['werner', - 'geh mal in den keller', - 'ich glaub die russen komm\'', - 'dieser string wird in \ -der iteration nicht auftauchen', 'dieser auch nicht']) +**Wichtig:** Iteratoren besitzen einen internen Zustand und sollten deswegen nicht von mehreren Benutzern gleichzeitig benutzt werden! -for key, value in {1:'value1', 2:'value2'}.items(): - # iteration ueber keys und values mit tuple unpacking - pass -``` +Dies kann mit der Verwendung mehrerer unabhängiger Iteratoren umgangen werden. -# unpacking +## Iterables --- -- einfaches Auflösen von Listen und Tupeln in einzelne Variablen -- nützlich in `for`-Schleifen + - alles mit einer `__iter__` Methode ist eine *Iterable* + - *Iterables* liefern mit `iter(obj)` einen *Iterator* über sich selbst + - `for` Schleifen ermöglichen ein einfaches Durchlaufen + - eine *Iterable* über Integer ist `range([start], stop, step=1)` + - um Iterables zu kombinieren kann man `zip(iterable_1, iterable_2, ..., iterable_n)` verwenden + - `any(iterable)` prüft ob mindestens ein Element einer *Iterable* wahr ist + - `all(iterable)` prüft ob alle Elemente einer *Iterable* wahr sind + +**Wichtig:** Während des Iterierens können einige Iterables nicht verändert werden + +## Beispiele --- ```python -# unpacking (geht auch mit listen) -t = 1, 3, 'ein string' # tuple ohne klammern gebaut +for i in [1,2,3]: + if i > 9: + break + # verlässt die Schleife +else: + # wenn kein break vorkommt + print("keine Zahl größer als 9") -x, y, z = t -x is t[0] # ==> True -y is t[1] # ==> True +# Iterator über die Zahlen von 0 bis 3 (3 nicht enthalten) +iterator = iter(range(0, 3)) -x, *y = t -x # ==> 1 -y # ==> [3, 'ein string'] +# gibt 0, 1 und 2 aus +for i in iterator: + print(i) -a, b, c = 1, 2, 4 +# kein Output, Iterator ist erschöpft +for i in iterator: + print(i) -d, e, f, *g = [3, 0, 8, 7, 46, 42] -f # ==> 8 -g # ==> [7, 46, 42] +# gibt 1, 'value1' und 2, 'value2' aus +for i in {1:'value1', 2:'value2'}.items(): + # i ist ein Tuple von (key, value) + print(i[0], i[1]) + +# iteration mit tuple unpacking +# gleiche Ausgabe wie letztes Beispiel +for key, value in {1:'value1', 2:'value2'}.items(): + print(key, value) + +# zip verbindet zwei Iterables und stoppt wenn einer die Elemente ausgehen +# -4 wird deswegen nicht ausgegeben +for value1, value2 in zip((1,2,3), (-1,-2,-3,-4)): + print(value1, value2) + +# True != False +any((False, True, False)) != all((False, True, False)) ``` # Context Manager @@ -317,7 +326,7 @@ with MyManager() as m: m.do_things() ``` -#File Handling +# File Handling ---