From 384cc5abd048ffc88e6f8bd82481c98d19991a81 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Mon, 2 Dec 2019 00:23:46 +0100 Subject: [PATCH] =?UTF-8?q?Lambda=20a=20jin=C3=A9=20funkce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 10-lambda/10-lambda.tex | 205 +++++++++++++++++++++++++++++++++++++++ 10-lambda/Makefile | 3 + 10-lambda/generator.py | 6 ++ 10-lambda/po_slozkach.py | 6 ++ 10-lambda/vnorene.py | 9 ++ 10-lambda/vnorene2.py | 10 ++ 6 files changed, 239 insertions(+) create mode 100644 10-lambda/10-lambda.tex create mode 100644 10-lambda/Makefile create mode 100644 10-lambda/generator.py create mode 100644 10-lambda/po_slozkach.py create mode 100644 10-lambda/vnorene.py create mode 100644 10-lambda/vnorene2.py diff --git a/10-lambda/10-lambda.tex b/10-lambda/10-lambda.tex new file mode 100644 index 0000000..07da645 --- /dev/null +++ b/10-lambda/10-lambda.tex @@ -0,0 +1,205 @@ +\documentclass{beamer} +\usepackage[utf8]{inputenc} +\usepackage[czech]{babel} +\usepackage{palatino} +\usepackage{verbatim} +\usetheme{Warsaw} +\title{Programování 1: Triky s funkcemi} +\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}{Funkce jako parametr} + +\verbatiminput{po_slozkach.py} + +\py{% +po\_slozkach(secti, [1, 2, 3], [10, 20, 30]) +}{% +[11, 22, 33] \cmt{(secti je jméno funkce, secti() její volání)} +} + +\py{% +po\_slozkach(max, [10, 2, 3], [1, 20, 30]) +}{% +[10, 20, 30] +} + +\py{% +import operator\\ +po\_slozkach(operator.add, [1, 2, 3], [10, 20, 30]) +}{% +[11, 22, 33] +} + +\end{frame} + +% ---------------------------------------------------------------------- + +\begin{frame}{Lambda-funkce (funkce bez jména)} + +\py{% +plus = lambda x, y: x+y \\ +plus(1, 5) +}{% +6 +} + +\py{% +po\_slozkach(lambda x, y: x*y, [2,4], [3,7]) +}{% +[6, 28] +} + +\end{frame} + +% ---------------------------------------------------------------------- + +\begin{frame}{Lambdy ve standardní knihovně} + +\py{% +k = ["kočka", "na", "okně"]\\ +sorted(k, key=lambda x: len(x)) +}{% +['na', 'okně', 'kočka'] +} + +\py{% +min(k, key=lambda x: len(x)) +}{% +'na' +} + +\py{% +p = [(1,'leden'), (2,'unor'), (4,'duben')]\\ +sorted(p, key=lambda x: x[1]) +}{% +[(4, 'duben'), (1, 'leden'), (2, 'unor')] +} + +\py{% +cisla = map(int, ["12", "34"])\\ +list(cisla) +}{% +[12, 34] \cmt{(nebo také:~~{\tt map(int, input().split())})} +} + +\py{% +suma = map(operator.add, [1,2], [10,20])\\ +list(suma) +}{% +[11, 22] +} + +\end{frame} + +% ---------------------------------------------------------------------- + +\begin{frame}{Vnořené funkce} + +\verbatiminput{vnorene.py} + +\py{% +f() +}{% +[1, 2, 3] +} + +\end{frame} + +% ---------------------------------------------------------------------- + +\begin{frame}{Vnořené funkce: vracíme vnitřní funkci} + +\begin{columns} + +\begin{column}{0.5\textwidth} +\verbatiminput{vnorene2.py} +\end{column} + +\begin{column}{0.5\textwidth} +\py{% +a = f() \\ +a() +}{% +1 +} + +\py{% +a() +}{% +2 +} + +\py{% +b = f() \\ +b() +}{% +1 +} + +\py{% +a() +}{% +3 +} + +\py{% +b() +}{% +2 +} + +\end{column} + +\end{columns} + +\end{frame} + +% ---------------------------------------------------------------------- + +\begin{frame}{Generátory} + +{\bf Generátor s~yield (korutina):} + +\medskip + +\verbatiminput{generator.py} + +\medskip + +{\bf Generátorové výrazy:} jako list comprehension, ale () místo [] + +\medskip + +\py{% +g = (i**2 for i in range(100)) \\ +max(g) +}{% +9801 \cmt{(seznam není nikde ulozený)} +} + +\py{% +max(i**2 for i in range(100)) +}{% +9801 \cmt{(nejsou třeba dvojí závorky)} +} + +\end{frame} + +% ---------------------------------------------------------------------- + +\end{document} diff --git a/10-lambda/Makefile b/10-lambda/Makefile new file mode 100644 index 0000000..59ad5b4 --- /dev/null +++ b/10-lambda/Makefile @@ -0,0 +1,3 @@ +SLIDES=10-lambda.pdf + +include ../Makerules diff --git a/10-lambda/generator.py b/10-lambda/generator.py new file mode 100644 index 0000000..698cbad --- /dev/null +++ b/10-lambda/generator.py @@ -0,0 +1,6 @@ +def gen(n): + for i in range(n): + yield i**2 + +for x in gen(10): + print(x) diff --git a/10-lambda/po_slozkach.py b/10-lambda/po_slozkach.py new file mode 100644 index 0000000..83f95a8 --- /dev/null +++ b/10-lambda/po_slozkach.py @@ -0,0 +1,6 @@ +# Spočítá z[i] = f(x[i], y[i]) +def po_slozkach(f, a, b): + return [ f(x, y) for x, y in zip(a, b) ] + +def secti(x, y): + return x + y diff --git a/10-lambda/vnorene.py b/10-lambda/vnorene.py new file mode 100644 index 0000000..5789322 --- /dev/null +++ b/10-lambda/vnorene.py @@ -0,0 +1,9 @@ +def f(): + n = 0 + + def krok(): + nonlocal n + n += 1 + return n + + return [krok(), krok(), krok()] diff --git a/10-lambda/vnorene2.py b/10-lambda/vnorene2.py new file mode 100644 index 0000000..f257e93 --- /dev/null +++ b/10-lambda/vnorene2.py @@ -0,0 +1,10 @@ +def f(): + + n = 0 + + def krok(): + nonlocal n + n += 1 + return n + + return krok -- GitLab