%% Presentation about higher order fun in Python

%% Some useful variations of the document class
%%\documentclass[draft]{beamer}
%%\documentclass[handout]{beamer}
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{texments}
\usepackage{lmodern}
%% get the smiley
\usepackage{wasysym}
\mode<presentation>{\usetheme{Copenhagen}}
\title{Python höherer Ordnung}
\author{Marek~Kubica}
\date{12.~März~2009}
\institute{$\mu$Py}

%% define texments style
\usestyle{default}
%% define beamer colors
\usecolortheme{python}

\begin{document}

\frame{\titlepage}

\begin{frame}
  \frametitle{Warum höhere Ordnung}
  \begin{block}{Funktionale Programmierung}
    \begin{itemize}
      \item viel Arbeit mit Funktionen
      \item Funktionen die Funktionen transformieren
      \item so wenig Zustand (State) wie möglich
    \end{itemize}
  \end{block}
  \begin{block}{Vorteile}
    \begin{itemize}
      \item Klarer, kürzerer Code
      \item Elegante Lösungen
      \pause
      \item Spaß!
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Dekoratoren}
  \begin{block}{Was ist das?}
    \begin{itemize}
      \item diese Teile mit der @-Syntax (Python 2.4)
      \item werden genutzt um Funktionen zu verarbeiten
      \item Vorher auch möglich, nur ohne @-Syntax
      \item fast wie Unix-Pipes nur mit Funktionen statt Strings
      \item ab Python 3.x gibt es Klassendekoratoren
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Ein einfacher Dekorator}
  \includecode[python]{simpledeco.py}
\end{frame}

\begin{frame}
  \frametitle{Probleme}
  \begin{block}{Funktionssignatur}
    Siehe \texttt{help(foo)}
    \begin{itemize}
      \item Falscher Name (\texttt{\_inner})
      \item Falsche Parameter (\texttt{*args, **kwargs})
      \item Falscher Docstring
    \end{itemize}
  \end{block}
  \begin{block}{Lösung}
    \texttt{functools.update\_wrapper}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Etwas ausgebessert}
  \includecode[python]{wrappeddeco.py}
  Parameter dennoch falsch
\end{frame}

\begin{frame}
  \frametitle{functools.wraps}
  Ein Dekorator für Dekoratoren
  \includecode[python]{wrapsdeco.py}
\end{frame}

\begin{frame}
  \frametitle{Dekoratoren mit Parametern}
  \includecode[python]{paramdeco.py}
\end{frame}

\begin{frame}
  \frametitle{Mehr Spaß mit Dekoratoren}
  \begin{block}{Das \texttt{decorator}-Modul}
    \begin{itemize}
      \item Bietet noch eine Menge Features über \texttt{functools} hinaus
      \item Behält bei Dekoratoren die Signatur bei
      \item Dekorator-Dekoratoren
      \item wird von TurboGears 2 verwendet
      \item 16-seitige Dokumentation
      \item \url{http://pypi.python.org/pypi/decorator}
    \end{itemize}
  \end{block}
  \begin{block}{\texttt{DecoratorTools}}
    \begin{itemize}
      \item Dekorator-Syntax (aber nicht \texttt{@decorator}) für Python 2.3
      \item Achtung: PJE-Ware \smiley
      \item \small{\url{http://peak.telecommunity.com/DevCenter/DecoratorTools}}
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{with-Statement}
  \begin{block}{Was isses?}
    \begin{itemize}
      \item Syntaktischer Zucker für \texttt{try/except/finally}
      \item neu in Python 2.5, Standard in Python 2.6
      \item \texttt{from \_\_future\_\_ import with\_statement}
      \item Eignen sich um Ressourcen vorzubereiten und freizugeben
        \pause (Also wie Konstruktoren und Destruktoren, nur dass
	sie funktionieren)
      \item ein neues \emph{Protokoll}
    \end{itemize}
  \end{block}
  \begin{block}{Beispiele für with-Statement}
    \begin{itemize}
      \item Dateizugriff
      \item Threads
      \item Datenbankzugriff
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Beispiel mit with}
  \includecode[python]{simplewith.py}
\end{frame}

\begin{frame}
  \frametitle{Beispiel ohne with}
  \includecode[python]{nowith.py}
\end{frame}

\begin{frame}
  \frametitle{Context Manager}
  \begin{block}{Was ist das?}
    \begin{itemize}
      \item Ist grundsätzlich nur ein \emph{Protokoll}
      \item Das Protokoll ist kompatibel zu alten Python-Versionen
      \item Ein Context Manager-Objekt hat \texttt{\_\_enter\_\_} und
        \texttt{\_\_exit\_\_}
      \item \texttt{\_\_enter\_\_} wird vor dem Betreten des
        \texttt{with}-Blocks ausgeführt
      \item \texttt{\_\_exit\_\_} wird nach dem Verlassen ausgeführt
      \item Objekte in Stdlib unterstützen es bereits
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Die contextlib}
  \begin{block}{contextlib.closing}
    \begin{itemize}
      \item Klassen die vor Python 2.5 da waren haben kein 
        \texttt{\_\_enter\_\_}/\texttt{\_\_exit\_\_}
      \item aber oftmals ein \texttt{close()}
      \item \texttt{contextlib.closing} wrappt Instanzen zu Context Managern
    \end{itemize}
  \end{block}
  \begin{block}{contextlib.nested}
    \begin{itemize}
      \item Wenn man mehrere Dateien öffnen will (etwa Eingabe und Ausgabe-Datei)
      \item Verschachtelung nötig, aber recht hässlich
      \item \texttt{contextlib.nested} verbindet mehrere Context Manager zu einem
      \item Nur ein \texttt{with}-Statement nötig
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}[fragile]
  \frametitle{functools.partial}
  \begin{block}{Eine Funktion die Parameter in Funktionen belegt}
    \begin{itemize}
      \item Eingabe: Funktion, Parameter die belegt werden sollen
        (positional und keyword)
      \item Ausgabe: Funktion, mit weniger Parametern
      \item Nutzen: Macht einige \texttt{lambda}s und Wrapperfunktionen
        überflüssig
    \end{itemize}
  \end{block}
  \begin{pygmented}{python}
next = property(partial(get_object_at_offset, offset=1))
  \end{pygmented}
\end{frame}

\begin{frame}
  \frametitle{Das itertools-Modul}
  \begin{block}{Tools für Generatoren}
    Vorteil von Generatoren gegenüber Listen: Prozessor- und Speicherschonend.
    \begin{itemize}
      \item \texttt{imap}: Generator-Version von \texttt{map}.
        Ruft eine Funktion auf jedem Element eines \emph{Iterable} auf
	und gibt dessen Rückgabe in einen Generator
      \item \texttt{izip}: Generator-Version von \texttt{zip}.
        Verbindet mehrere \emph{Iterables} zu einem Generator.
      \item \texttt{count}: Generator der eine unendliche Reihe zurückgibt
        (0, 1, 2, 3...) oder (5, 6, 7, 8...) etc.
      \item \texttt{cycle}: Generator der ein \emph{Iterable} durchläuft
        und dessen Werte zurückgibt. Nach dem letzen Wert fängt er wieder
	von vorne an
      \item Beispiel folgt, aber zunächst erstmal das 
        \texttt{operator}-Modul
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Das operator-Modul}
  \begin{block}{Die Python-Operatoren als Funktionen}
    Das Eldorado für funktionale Programmierer in Python
    \begin{itemize}
      \item Bietet alle Operatoren wie \texttt{+}, \texttt{-},
        \texttt{*} als Funktionen
      \item Etwa \texttt{add}, \texttt{sub}, \texttt{mul}
      \item Auch exotischere Sachen wie \texttt{itemgetter},
        \texttt{attrgetter} und \texttt{truth}
    \end{itemize}
  \end{block}
  \begin{block}{Wozu sind die gut?}
    \begin{itemize}
      \item Können nun mit den \texttt{itertools} kombiniert werden,
        die Funktionen erwarten
      \item Können mit \texttt{partial} kombiniert werden
      \item Können in \texttt{dict}s gesteckt werden
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Das Beispiel}
  \includecode[python]{lots.py}
\end{frame}

\begin{frame}
  \frametitle{Sortier-Beispiel}
  \includecode[python]{sorting.py}
\end{frame}

\begin{frame}
  \frametitle{Noch mehr itertools}
  \includecode[python]{beancounter.py}
  \texttt{takewhile} hat auch noch einen Bruder, \texttt{dropwhile}
\end{frame}

\begin{frame}
  \frametitle{any() \& all()}
  \begin{block}{Quantoren}
    \begin{itemize}
      \item \texttt{any}: Der Existenzquantor $\exists$; gibt \texttt{True}
        zurück wenn \emph{irgendein} Wert \texttt{True} war,
	ansonsten \texttt{False}
      \item \texttt{all}: Der Allquantor $\forall$; gibt \texttt{True}
        zurück, wenn \emph{alle} Werte \texttt{True} waren,
	ansonsten \texttt{False}
    \end{itemize}
  \end{block}
  \begin{block}{Nutzen}
    Wenn man viele gleichartige Daten auf irgendeine Eigenschaft
    untersuchen will.
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Beispiele aus dem echten Leben}
  \includecode[python]{quantors.py}
\end{frame}

\begin{frame}
  \frametitle{sum()}
  \begin{block}{Generische Summations-Funktion}
    \begin{itemize}
      \item Nimmt als ersten Parameter ein \emph{Iterable}
      \item summiert jedes Element des Iterables auf
      \item Zweiter, optionaler Parameter: Startwert
      \item Funktioniert mit allen Datentypen auf denen \texttt{+} 
        definiert ist
      \item Achtung: Strings ausgenommen (``There should be one...'')
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Auch hier noch ein Beispiel}
  \includecode[python]{sumfun.py}
\end{frame}

\begin{frame}
  \frametitle{Fertig und aus}
  \begin{block}{Quellen und Inspirationen}
    \begin{itemize}
      \item Forum -- einige hübsche Beispiele
      \item Autoren der \texttt{functools} \& \texttt{itertools}
    \end{itemize}
  \end{block}
  \begin{block}{Was gibt es noch in der Richtung?}
    \begin{itemize}
      \item Klassendekoratoren
      \item Metaklassen
      \item Continuations (Stackless)
      \item Tail-Call Optimization (IronPython)
    \end{itemize}
  \end{block}
\end{frame}

\end{document}
