\documentclass{beamer} \usepackage[utf8]{inputenc} \usepackage[czech]{babel} \usepackage{palatino} \usepackage{verbatim} \usetheme{Warsaw} \title{Programování 2: Typové anotace} \author[Martin Mareš]{Martin Mareš\\\texttt{mj@ucw.cz}} \institute{Katedra Aplikované Matematiky\\MFF UK Praha} \date{2020} \setbeamersize{text margin left=5mm} \setbeamersize{text margin right=5mm} \begin{document} \setbeamertemplate{navigation symbols}{} \setbeamertemplate{footline}{} \setbeamerfont{title page}{family=\rmfamily} \shorthandoff{"} \begin{frame} \titlepage \end{frame} \input ../slidemac.tex % ---------------------------------------------------------------------- \begin{frame}{Proč a nač?} Jak se programovací jazyky chovají k~typům dat: \begin{itemize} \item {\bf statické} typování -- typ mají proměnné a funkce \item {\bf dynamické} typování -- typ mají hodnoty \end{itemize} ~ Obojí má své výhody i nevýhody. ~ K~čemu třeba jsou užitečné statické typy: \begin{itemize} \item Lepší dokumentace\\(např.: funguje {\bf math.exp} na komplexní čísla?) \item Kontrola konzistence typů před spuštěním programu \item Napovídání v~editorech \end{itemize} ~ Dnešní Python umí kombinovat statické a dynamické typy~\dots \end{frame} % ---------------------------------------------------------------------- \begin{frame}{Typové anotace} {\tt\color{blue} def f(x: int, y: str) -> int:\\ ~~~~return x + len(y) } \smallskip Čteme: {\bf f} je funkce, parametr {\bf x} je typu {\bf int}, {\bf y} typu {\bf str},\\ vrací výsledek typu {\bf int}. ~ {\tt\color{blue} a: int = 42 } \smallskip Proměnné {\bf a} jsme deklarovali typ {\bf int}. ~ Python sám typy nekontroluje (to dělají samostatné type checkery), ale pamatuje si je: \smallskip \py{% f.\_\_annotations\_\_ }{% \{'x': int, 'y': str, 'return': int\} } \py{% help(f) }{% Help on function f in module \_\_main\_\_:\\ f(x: int, y: str) -> int } \end{frame} % ---------------------------------------------------------------------- \begin{frame}{Složitější typy} {\tt\color{blue} from typing import List\\ def g(seznam: List[str]) -> None: } \smallskip Parametrizovaný typ pro seznamy. ~ {\tt\color{blue} from typing import Optional\\ def center(s: str, šíře: Optional[int]=80) -> str: } \smallskip Buď {\bf int} nebo {\bf None} (též chybí-li parametr při volání). ~ {\tt\color{blue} Class Třída:\\ ~~~~def metoda(self, něco: int): } \smallskip {\bf self} automaticky dostane typ {\bf Třída}. ~ {\tt\color{blue} from typing import Sequence, TypeVar\\ T = TypeVar("T")\\ def choose(s: Sequence[T]) -> T: } \smallskip Funguje pro jakoukoliv homogenní posloupnost (seznam/tuple/\dots). \end{frame} % ---------------------------------------------------------------------- \end{document}