\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[czech]{babel}
\usepackage{palatino}
\usepackage{verbatim}
\usetheme{Warsaw}
\title{Programování 1: Funkce}
\author[Martin Mareš]{Martin Mareš\\\texttt{mj@ucw.cz}}
\institute{Katedra Aplikované Matematiky\\MFF UK Praha}
\date{2019}
\begin{document}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{footline}{}
\setbeamerfont{title page}{family=\rmfamily}
\shorthandoff{"}

\begin{frame}
\titlepage
\end{frame}

\input ../slidemac.tex

% ----------------------------------------------------------------------

\begin{frame}{Definice funkce}

{\tt
def stekej(): \\
~~~~print("Haf!") \\
~ \\
stekej() \\
stekej()
}

\bigskip

\begin{itemize}
\item Opakující se část programu stačí napsat jednou \\
      a spustit vícekrát.
\item Také jsme tím část programu pojmenovali, \\
      takže je při čtení jasné, co má dělat.
\end{itemize}

\end{frame}

% ----------------------------------------------------------------------

\begin{frame}{Funkce s parametrem}

{\tt
def stekej(n): \\
~~~~for i in range(n): \\
~~~~~~~~print("Haf!") \\
~ \\
stekej(5)
}

\bigskip

\begin{itemize}
\item Funkci můžeme předat parametr.
\item Když zavoláme {\tt stekej(5)}, funkce se spustí s~proměnnou~{\tt n}
      nastavenou na~{\tt 5}.
\item Proměnné {\tt n} a~{\tt i} existují jen lokálně uvnitř funkce, \\
      zvenčí nejsou vidět.
\end{itemize}

\end{frame}

% ----------------------------------------------------------------------

\begin{frame}{Funkce s výsledkem}

{\tt
def minimum(a, b): \\
~~~~if a < b: \\
~~~~~~~~return a \\
~~~~else: \\
~~~~~~~~return b \\
~ \\
print(minimum(3, 5))
}

\bigskip
\bigskip

\begin{itemize}
\item Příkaz {\bf return} ukončí vykonávání funkce a vrátí výsledek.
\item Můžeme použít i {\bf return} bez výsledku (vrátí {\bf None}).
\item Výsledek funkce nemusíme použít.
\end{itemize}

\end{frame}

% ----------------------------------------------------------------------

\begin{frame}{Ještě o~parametrech}

{\bf Nepovinné parametry:}

\bigskip

{\tt
def stekej(n=1, zvuk="Haf!"): \\
~~~~for i in range(n): \\
~~~~~~~~print(zvuk)
}

\bigskip

{\bf Různé způsoby volání:}

\bigskip

{\tt
stekej() \\
stekej(5) \\
stekej(5, "HAF!") \\
stekej(5, zvuk="HAF!") \\
stekej(zvuk="HAF!")
}

\end{frame}

% ----------------------------------------------------------------------

\begin{frame}{Viditelnost proměnných: chyták}

{\tt
zvuk = "Kuku!" \\
kolik\_hodin = 0 \\
~ \\
def zakukej(): \\
~~~~print(zvuk) \\
~~~~kolik\_hodin += 1
}

\bigskip

\begin{itemize}
\item Funkce vidí globální proměnnou {\bf zvuk}
\item Proměnná {\bf kolik\_hodin} je ale lokální, \\
      protože funkce do ní přiřazuje.
\end{itemize}

\end{frame}

% ----------------------------------------------------------------------

\begin{frame}{Viditelnost proměnných: řešení}

{\tt
zvuk = "Kuku!" \\
kolik\_hodin = 0 \\
~ \\
def zakukej(): \\
~~~~{\color{blue}global kolik\_hodin} \\
~~~~print(zvuk) \\
~~~~kolik\_hodin += 1
}

\end{frame}

% ----------------------------------------------------------------------

\end{document}