Finished first draft of Python-part.

This commit is contained in:
Oliver Rümpelein 2016-04-25 16:20:31 +02:00
parent 4110c30cc6
commit e59dac99bf
4 changed files with 193 additions and 79 deletions

View file

@ -19,22 +19,22 @@ html header: <link rel="stylesheet"
+ currying => just convenience + currying => just convenience
+ code example: Pythagoraian triangles, bubble sort + code example: Pythagoraian triangles, bubble sort
* Phuncy: The pythonic way is functional! * Phuncy: The pythonic way is functional!
- Not strictly functional + Not strictly functional
- recursion, fafco - recursion
- lambda syntax + fafco
- map, fold => example (sum of squares?) - map, fold => example (sum of squares?)
- python lambda syntax: lambda a,b: a+b + python lambda syntax: lambda a,b: a+b
- fold with reduce + don't return lists, but iterators!
- don't return lists, but iterators! + fold with reduce
- Note: 2: map, filter, reduce, list comprehension + Note: 2: map, filter, reduce, list comprehension
3: map, filter, functools.reduce(), list comprehension 3: map, filter, functools.reduce(), list comprehension
- The python2 to 3 page states: + The python2 to 3 page states:
“Removed `reduce()`. Use `functools.reduce()` if you really need it; “Removed `reduce()`. Use `functools.reduce()` if you really need it;
however, 99 percent of the time an explicit `for` loop is more however, 99 percent of the time an explicit `for` loop is more
readable.” readable.”
- Why use it? => Multi-processing, WTF Count. + Why use it? => Multi-processing, WTF Count.
```python ```python
a = list(range(10)) a = list(range(10))
@ -50,7 +50,7 @@ html header: <link rel="stylesheet"
from functools import reduce from functools import reduce
print(reduce(lambda x,y: x+y,map(lambda x: x**2,range(10)))) print(reduce(lambda x,y: x+y,map(lambda x: x**2,range(10))))
``` ```
- currying: not really, but binding via lambdas or functools.partial() or + currying: not really, but binding via lambdas or functools.partial() or
https://mtomassoli.wordpress.com/2012/03/18/currying-in-python/ https://mtomassoli.wordpress.com/2012/03/18/currying-in-python/
- decorators! - decorators!
- still FP has advantages and is heavily used, i.e. in genomics (works on - still FP has advantages and is heavily used, i.e. in genomics (works on

View file

@ -39,9 +39,22 @@
fontsize=\small, fontsize=\small,
} }
\newminted[pycode]{python}%
{
linenos=true,
autogobble=true,
breaklines=true,
showspaces=false,
showtabs=false,
tabsize=2,
frame=single,
fontsize=\small,
}
\newmintinline[ccmd]{c}{} \newmintinline[ccmd]{c}{}
\newmintinline[cppcmd]{cpp}{} \newmintinline[cppcmd]{cpp}{}
\newmintinline[haskellcmd]{haskell}{} \newmintinline[haskellcmd]{haskell}{}
\newmintinline[pycmd]{python}{}
%%% Local Variables: %%% Local Variables:
%%% mode: latex %%% mode: latex

View file

@ -3,3 +3,9 @@ title={Foldr Foldl Foldl' - HaskellWiki},
urldate={2016-04-21}, urldate={2016-04-21},
url={https://wiki.haskell.org/Foldr_Foldl_Foldl%27}, url={https://wiki.haskell.org/Foldr_Foldl_Foldl%27},
} }
@online{decorators,
title={simeonfranklin.com - Understanding Python Decorators in 12 Easy Steps!},
urldate={2016-04-25},
url={http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/},
}

View file

@ -3,7 +3,7 @@
\usepackage{babel} \usepackage{babel}
\usepackage{csquotes} \usepackage{csquotes}
\usepackage{tabularx} \usepackage{tabularx}
\usepackage[backend=biber, style=numeric,]{biblatex} \usepackage[backend=biber,]{biblatex}
\bibliography{wtf} \bibliography{wtf}
\usepackage{fontspec} \usepackage{fontspec}
@ -209,6 +209,101 @@
\end{haskell} \end{haskell}
\end{frame} \end{frame}
\section{Phuncy!}
\subsection{Overview}
\begin{frame}{Functional programming in Python}
\begin{itemize}[<+->]
\item Obviously, python is not strictly functional…
\item …but has functions as first class objects!
\item Some other stuff is widely used, but with another syntax…
\item …, although there are ways to get the \enquote{real} functional
style.
\item I use python3 here, python2 differs in some points.
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Lambdas, Maps}
\begin{itemize}[<+->]
\item Lambda-syntax: \pycmd{lambda a,b: a+b}
\item Maps are done by \pycmd{map}
\item \emph{Note:} Most functional list-functions return iterators in
python, not lists!
\item Use \pycmd{list()} to cast Iterators, but this is usually not
necessary.
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Filters}
\begin{itemize}[<+->]
\item Can be done using \pycmd{filter(func, iter)}:
\begin{pycode}
a = range(1,7)
b = filter(lambda x: x%2, a)
print(list(b))
# [1,3,5]
\end{pycode}
\item Alternatively, use List Comprehension:
\begin{pycode}
a = range(1,7)
b = [x for x in a if x%2]
print(b)
\end{pycode}
\item Pro: Maybe easier readable, returns list
\item Con: Returns list (slower when iterating afterwards)
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Fold}
\begin{itemize}[<+->]
\item From the python2 to python3 Changelog:
\begin{quote}
Removed `reduce()`. Use `functools.reduce()` if you really need it;
however, 99 percent of the time an explicit `for` loop is more
readable.
\end{quote}
\item I disagree Old-style is more explicit and still available from \pycmd{functools}
\item Example sum of squares
\begin{pycode}
from functools import reduce
a = range(10)
mapped = map(lambda x: x**2, a)
reduced = reduce(lambda x,y: x+y, mapped)
\end{pycode}
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Currying}
\begin{itemize}[<+->]
\item No real currying, but several workarounds
\item Lambdas: \pycmd{g=lambda x: foo(2,x)}
\item \pycmd{functools.partial}:
\begin{pycode}
def foo(x,y):
return x+y
bar=partial(foo, 2)
bar(3) # 5
\end{pycode}
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Decorators}
\begin{itemize}[<+->]
\item Often used to modify functions in Frameworks
\item Encapsulates other functions. More infos at \cite{decorators}
\begin{pycode}
def debug(func):
def inner(*args, **kwargs):
sys.stderr.write("F: {}, args: {}, kwargs {}".format(func.__name__, args,
kwargs))
return func(*args, **args)
return inner
@debug
def foo(x):
print(x)
\end{pycode}
\end{itemize}
\end{frame}
\begin{frame}[plain]{References} \begin{frame}[plain]{References}
\printbibliography \printbibliography
\end{frame} \end{frame}
@ -216,5 +311,5 @@
%%% Local Variables: %%% Local Variables:
%%% mode: latex %%% mode: latex
%%% ispell-dictionary: en %%% ispell-local-dictionary: "en_GB"
%%% End: %%% End: