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