Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address Issue#8 #22

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
50 changes: 25 additions & 25 deletions latex/slides/resources/03_builtins/iterate.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
for i in [1,2,3]:
if i > 9:
break
# code
else:
pass
# wenn kein break vorkommt
# verlässt die Schleife
else:
# 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
# code
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