Skip to content

Commit

Permalink
rework iteration
Browse files Browse the repository at this point in the history
This should address issue fsr#8 by moving iteration behind unpacking to
prevent confusion with for loop examples.
Also, the slide has been separated in iterators and iterables and
contains information about __next__, StopIteration, all, any and caveats.
Furthermore the examples have been reworked to contain no long strings
and show more attributes of iterators.
  • Loading branch information
Deric-W committed Feb 25, 2022
1 parent 92bd7f5 commit 4b7e083
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 105 deletions.
57 changes: 35 additions & 22 deletions latex/slides/03_builtins.tex
Original file line number Diff line number Diff line change
Expand Up @@ -138,44 +138,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{\texttt{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}


Expand Down
44 changes: 22 additions & 22 deletions latex/slides/resources/03_builtins/iterate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
131 changes: 70 additions & 61 deletions md/03_builtins.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,95 +193,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
Expand Down Expand Up @@ -313,7 +322,7 @@ with MyManager() as m:
m.do_things()
```

#File Handling
# File Handling

---

Expand Down

0 comments on commit 4b7e083

Please sign in to comment.