diff --git a/12-knihovna/12-knihovna.tex b/12-knihovna/12-knihovna.tex
new file mode 100644
index 0000000000000000000000000000000000000000..1c16b2e12519802014f491801b8d72ee2e7da0c2
--- /dev/null
+++ b/12-knihovna/12-knihovna.tex
@@ -0,0 +1,240 @@
+\documentclass{beamer}
+\usepackage[utf8]{inputenc}
+\usepackage[czech]{babel}
+\usepackage{palatino}
+\usepackage{verbatim}
+\usetheme{Warsaw}
+\title{Programování 1: Standardní knihovna}
+\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}{Moduly a importování}
+
+Programy mohou být členěné na {\bf moduly}.
+
+\medskip
+
+Provedeme-li:
+
+\medskip
+
+\py{import math}{}
+
+načte se soubor {\tt math.py} (hledá se v~aktuálním adresáři a pak v~knihovnách).
+Potom píšeme:
+
+\medskip
+
+\py{math.sin(1)}{}
+
+Formálně: {\bf math} je objekt, jako jeho atributy vidíme funkce a~proměnné
+definované uvnitř modulu.
+
+\medskip
+
+Alternativně:
+
+\medskip
+
+\py{from math import sin\\from sys import *}{}
+
+navíc zkopíruje do aktuálního modulu definice z~importovaného modulu
+(takže pak {\bf sin} znamená totéž co {\bf math.sin} apod.).
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Už jsme potkali\dots}
+
+\begin{itemize}
+\item {\bf math} -- matematické funkce a konstanty
+
+\medskip
+
+\item {\bf operator} -- funkční podoba operátorů (třeba {\bf add} pro $+$)
+
+\medskip
+
+\item {\bf collections} -- typ {\bf defaultdict}
+	\begin{itemize}
+	\item také tu je {\bf deque} (double-ended queue) -- seznam s~rychlým přidáváním a~odebíráním
+	na obou koncích
+	\end{itemize}
+\end{itemize}
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Binární řetězce}
+
+Typ {\bf bytes} obsahuje neměnnou posloupnost bajtů (8-bitových hodnot).
+
+~
+
+Literály: {\tt b'Brum'}, {\tt b'\bs{}x62\bs{}x72\bs{}x75\bs{}x6d'}
+
+~
+
+\py{%
+"číslo".encode('utf-8')
+}{%
+b'\bs{}xc4\bs{}x8d\bs{}xc3\bs{}xadslo'
+}
+
+\py{%
+b'\bs{}xc4\bs{}x8d\bs{}xc3\bs{}xadslo'.decode('utf-8')
+}{%
+'číslo'
+}
+
+\py{%
+bytes([1, 2, 3])
+}{%
+b'\bs{}x01\bs{}x02\bs{}x03'
+}
+
+Při práci s~binárními soubory čteme/zapisujeme bytes.
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Binární seznamy}
+
+Typ {\bf bytearray:}
+
+\medskip
+
+\begin{itemize}
+\item jako {\tt bytes}, ale lze modifikovat
+\item seznam bajtů (prostorově efektivnější než běžný seznam)
+\item {\tt bytearray(n)} -- seznam $n$ nul
+\item {\tt bytearray([1,2,3])}
+\item {\tt bytearray.decode('řetězec', 'utf-8')}
+\end{itemize}
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Homogenní pole}
+
+\py{%
+import array\\
+a = array.array('i', [1, 2])\\
+a.itemsize
+}{%
+4
+}
+
+\medskip
+
+{\bf 'i'} je kód typu položek, například:
+
+\medskip
+
+\begin{itemize}
+\item {\bf i} -- integer: aspoň 32-bitové číslo se znaménkem
+\item {\bf I} -- totéž bez znaménka
+\item {\bf b} -- bajt se znaménkem
+\item {\bf q} -- alespoň 64-bitové číslo se znaménkem
+\item {\bf f} -- float: aspoň 32-bitové desetinné číslo
+\item {\bf d} -- double: aspoň 64-bitové desetinné číslo
+\end{itemize}
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Zlomky}
+
+\py{%
+from fractions import Fraction\\
+Fraction(1, 2) + Fraction(1, 3)
+}{%
+Fraction(5, 6)
+}
+
+\py{%
+Fraction(1/3)
+}{%
+Fraction(6004799503160661, 18014398509481984)
+}
+
+\py{%
+Fraction(1/3).limit\_denominator(100000)
+}{%
+Fraction(1, 3)
+}
+
+\py{%
+Fraction("1/3")
+}{%
+Fraction(1, 3)
+}
+
+\py{%
+print(Fraction(1, 3))
+}{%
+'1/3'
+}
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\begin{frame}{Pseudonáhodný generátor}
+
+\py{%
+import random\\
+random.random()
+}{%
+0.28947857702914326 \cmt{(z~intervalu $[0,1]$)}
+}
+
+\py{%
+random.uniform(0, 1000)
+}{%
+50.64122748168531 \cmt{(z~intervalu $[a,b]$)}
+}
+
+\py{%
+random.randrange(0, 1000)
+}{%
+524 \cmt{(celé číslo od $a$ do~$b-1$)}
+}
+
+\py{%
+random.randrange(1000)
+}{%
+451 \cmt{(stejně jako u~range jde dolní mez vynechat)}
+}
+
+\py{%
+random.seed(12345)\\
+random.random()
+}{%
+0.41661987254534116  \cmt{(vyjde vždy stejně)}
+}
+
+\end{frame}
+
+% ----------------------------------------------------------------------
+
+\end{document}
diff --git a/12-knihovna/Makefile b/12-knihovna/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..6697a1749b204d79a937832f033d82634fa3a2ea
--- /dev/null
+++ b/12-knihovna/Makefile
@@ -0,0 +1,3 @@
+SLIDES=12-knihovna.pdf
+
+include ../Makerules
diff --git a/slidemac.tex b/slidemac.tex
index c00e75f88ecbc556ae36174da5a303e3dd921bed..4b2f7b83ae710faebdc6fef85a6a63f0212b05c8 100644
--- a/slidemac.tex
+++ b/slidemac.tex
@@ -15,3 +15,5 @@
 }
 
 \def\cmt#1{\quad\hbox{\color{black}\rm #1}}
+
+\def\bs{\char92\relax}