From 36e18b3d407bd375ab5199a21711dfd39127a9f0 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 4 Jan 2022 13:24:34 +0000 Subject: [PATCH 01/31] Compiled --- meta/course.json | 116 + meta/installing-naucse/index.html | 40 + meta/local-run/index.html | 224 + meta/local-run/info.yml | 35 + meta/submitting-a-run/index.html | 71 + meta/submitting-a-run/naucse_fork.png | Bin 0 -> 49953 bytes mi-pyt/async/index.html | 387 + mi-pyt/click/index.html | 189 + mi-pyt/course.json | 772 ++ mi-pyt/cython/index.html | 590 ++ mi-pyt/cython/test_matmul.py | 34 + mi-pyt/deployment/index.html | 23 + mi-pyt/deployment/pythonanywhere.html | 77 + mi-pyt/distribution/index.html | 404 + mi-pyt/docs/index.html | 389 + mi-pyt/flask/index.html | 365 + mi-pyt/generators/index.html | 239 + mi-pyt/install/index.html | 62 + mi-pyt/magic/index.html | 577 ++ mi-pyt/micropython/index.html | 194 + mi-pyt/notebook/index.html | 116 + mi-pyt/numpy/index.html | 4175 ++++++++++ mi-pyt/numpy/python.jpg | Bin 0 -> 126582 bytes mi-pyt/numpy/sample.wav | Bin 0 -> 925262 bytes mi-pyt/numpy/secret.png | Bin 0 -> 4883 bytes mi-pyt/pandas/actors.csv | 7 + mi-pyt/pandas/index.html | 7214 +++++++++++++++++ mi-pyt/pandas/spouses.csv | 12 + mi-pyt/pandas/style-table.css | 57 + mi-pyt/pyqt/basic-screenshot.png | Bin 0 -> 52134 bytes mi-pyt/pyqt/index.html | 560 ++ mi-pyt/pyqt/pics/README/index.md | 11 + mi-pyt/pyqt/pics/arrows/down.svg | 83 + mi-pyt/pyqt/pics/arrows/left.svg | 83 + mi-pyt/pyqt/pics/arrows/right.svg | 83 + mi-pyt/pyqt/pics/arrows/up.svg | 83 + mi-pyt/pyqt/pics/castle.svg | 130 + mi-pyt/pyqt/pics/dude1.svg | 120 + mi-pyt/pyqt/pics/dude2.svg | 116 + mi-pyt/pyqt/pics/dude3.svg | 116 + mi-pyt/pyqt/pics/dude4.svg | 116 + mi-pyt/pyqt/pics/dude5.svg | 116 + mi-pyt/pyqt/pics/fish.svg | 97 + mi-pyt/pyqt/pics/fish2.svg | 97 + mi-pyt/pyqt/pics/grass.svg | 84 + mi-pyt/pyqt/pics/lines/1.svg | 89 + mi-pyt/pyqt/pics/lines/10.svg | 89 + mi-pyt/pyqt/pics/lines/11.svg | 85 + mi-pyt/pyqt/pics/lines/12.svg | 89 + mi-pyt/pyqt/pics/lines/13.svg | 85 + mi-pyt/pyqt/pics/lines/14.svg | 85 + mi-pyt/pyqt/pics/lines/15.svg | 89 + mi-pyt/pyqt/pics/lines/2.svg | 89 + mi-pyt/pyqt/pics/lines/3.svg | 89 + mi-pyt/pyqt/pics/lines/4.svg | 89 + mi-pyt/pyqt/pics/lines/5.svg | 89 + mi-pyt/pyqt/pics/lines/6.svg | 89 + mi-pyt/pyqt/pics/lines/7.svg | 85 + mi-pyt/pyqt/pics/lines/8.svg | 89 + mi-pyt/pyqt/pics/lines/9.svg | 89 + mi-pyt/pyqt/pics/shark.svg | 57 + mi-pyt/pyqt/pics/wall.svg | 94 + mi-pyt/pyqt/pics/wall2.svg | 94 + mi-pyt/pyqt/pics/water.svg | 71 + mi-pyt/requests/index.html | 153 + mi-pyt/testing/index.html | 564 ++ pyladies/and-or/index.html | 87 + pyladies/asteroids/index.html | 345 + pyladies/asteroids/screenshot.png | Bin 0 -> 53112 bytes pyladies/basic-functions/index.html | 146 + pyladies/basics/diagram.svg | 534 ++ pyladies/basics/dropbox.png | Bin 0 -> 41480 bytes pyladies/basics/gitk.png | Bin 0 -> 59093 bytes pyladies/basics/index.html | 339 + pyladies/branching/branch1.png | Bin 0 -> 5370 bytes pyladies/branching/branches.png | Bin 0 -> 6496 bytes pyladies/branching/index.html | 166 + pyladies/branching/merge.png | Bin 0 -> 7185 bytes pyladies/circular-imports/index.html | 108 + pyladies/class/index.html | 253 + pyladies/cmdline/index.html | 276 + pyladies/cmdline/windows-cmd-properties.png | Bin 0 -> 23872 bytes .../collaboration/gh-workflow-diagram.svg | 346 + pyladies/collaboration/index.html | 359 + pyladies/comparisons/index.html | 184 + pyladies/course.json | 1768 ++++ pyladies/def/index.html | 217 + pyladies/dict/index.html | 136 + pyladies/exceptions/index.html | 171 + pyladies/expressions/index.html | 71 + pyladies/files/index.html | 126 + pyladies/first-steps/index.html | 83 + pyladies/fstring/index.html | 67 + pyladies/functions/call-anatomy.svg | 413 + pyladies/functions/index.html | 206 + pyladies/github-api/index.html | 129 + pyladies/hello-world/index.html | 68 + pyladies/ignoring/index.html | 203 + pyladies/inheritance/index.html | 199 + pyladies/install-editor/atom.html | 73 + pyladies/install-editor/gedit.html | 66 + pyladies/install-editor/gedit_indent.png | Bin 0 -> 21030 bytes pyladies/install-editor/gedit_linenums.png | Bin 0 -> 28001 bytes pyladies/install-editor/gedit_prefs.png | Bin 0 -> 87034 bytes pyladies/install-editor/index.html | 91 + pyladies/install-editor/kate.html | 68 + .../install-editor/notepad-plus-plus.html | 55 + pyladies/install-editor/others.html | 77 + pyladies/install-editor/vscode.html | 57 + pyladies/install/index.1.html | 80 + pyladies/install/index.html | 12 + pyladies/install/linux.html | 63 + pyladies/install/macos.html | 15 + pyladies/install/windows.html | 26 + pyladies/install/windows_32v64-bit.png | Bin 0 -> 36230 bytes .../install/windows_add_python_to_path.png | Bin 0 -> 70057 bytes pyladies/json/index.html | 102 + pyladies/list/index.html | 414 + pyladies/local-variables/index.html | 150 + pyladies/modules/index.html | 84 + pyladies/nested-traceback/index.html | 58 + pyladies/pong/index.html | 499 ++ pyladies/pong/pong.png | Bin 0 -> 941 bytes pyladies/print/index.html | 112 + pyladies/pyglet/had.gif | Bin 0 -> 10907 bytes pyladies/pyglet/had.png | Bin 0 -> 12723 bytes pyladies/pyglet/had2.png | Bin 0 -> 14573 bytes pyladies/pyglet/index.html | 413 + pyladies/pyglet/pong.py | 325 + pyladies/reassignment/index.html | 92 + pyladies/str-index-slice/index.html | 165 + pyladies/str-methods/index.html | 83 + pyladies/str/index.html | 209 + pyladies/str/quote-comic.svg | 466 ++ pyladies/testing/index.html | 226 + pyladies/tuple/index.html | 125 + pyladies/turtle/index.html | 412 + pyladies/turtle/turtle-dashed.png | Bin 0 -> 255 bytes pyladies/turtle/turtle-dashed2.png | Bin 0 -> 310 bytes pyladies/turtle/turtle-hexagons.png | Bin 0 -> 1735 bytes pyladies/turtle/turtle-rect.png | Bin 0 -> 340 bytes pyladies/turtle/turtle-square.png | Bin 0 -> 323 bytes pyladies/turtle/turtle-squares.png | Bin 0 -> 890 bytes pyladies/turtle/turtle-stairs.png | Bin 0 -> 1055 bytes pyladies/variables/index.html | 151 + pyladies/venv-setup/dirs.png | Bin 0 -> 3429 bytes pyladies/venv-setup/index.html | 110 + pyladies/while/index.html | 98 + 148 files changed, 32593 insertions(+) create mode 100644 meta/course.json create mode 100644 meta/installing-naucse/index.html create mode 100644 meta/local-run/index.html create mode 100644 meta/local-run/info.yml create mode 100644 meta/submitting-a-run/index.html create mode 100644 meta/submitting-a-run/naucse_fork.png create mode 100644 mi-pyt/async/index.html create mode 100644 mi-pyt/click/index.html create mode 100644 mi-pyt/course.json create mode 100644 mi-pyt/cython/index.html create mode 100644 mi-pyt/cython/test_matmul.py create mode 100644 mi-pyt/deployment/index.html create mode 100644 mi-pyt/deployment/pythonanywhere.html create mode 100644 mi-pyt/distribution/index.html create mode 100644 mi-pyt/docs/index.html create mode 100644 mi-pyt/flask/index.html create mode 100644 mi-pyt/generators/index.html create mode 100644 mi-pyt/install/index.html create mode 100644 mi-pyt/magic/index.html create mode 100644 mi-pyt/micropython/index.html create mode 100644 mi-pyt/notebook/index.html create mode 100644 mi-pyt/numpy/index.html create mode 100644 mi-pyt/numpy/python.jpg create mode 100644 mi-pyt/numpy/sample.wav create mode 100644 mi-pyt/numpy/secret.png create mode 100644 mi-pyt/pandas/actors.csv create mode 100644 mi-pyt/pandas/index.html create mode 100644 mi-pyt/pandas/spouses.csv create mode 100644 mi-pyt/pandas/style-table.css create mode 100644 mi-pyt/pyqt/basic-screenshot.png create mode 100644 mi-pyt/pyqt/index.html create mode 100644 mi-pyt/pyqt/pics/README/index.md create mode 100644 mi-pyt/pyqt/pics/arrows/down.svg create mode 100644 mi-pyt/pyqt/pics/arrows/left.svg create mode 100644 mi-pyt/pyqt/pics/arrows/right.svg create mode 100644 mi-pyt/pyqt/pics/arrows/up.svg create mode 100644 mi-pyt/pyqt/pics/castle.svg create mode 100644 mi-pyt/pyqt/pics/dude1.svg create mode 100644 mi-pyt/pyqt/pics/dude2.svg create mode 100644 mi-pyt/pyqt/pics/dude3.svg create mode 100644 mi-pyt/pyqt/pics/dude4.svg create mode 100644 mi-pyt/pyqt/pics/dude5.svg create mode 100644 mi-pyt/pyqt/pics/fish.svg create mode 100644 mi-pyt/pyqt/pics/fish2.svg create mode 100644 mi-pyt/pyqt/pics/grass.svg create mode 100644 mi-pyt/pyqt/pics/lines/1.svg create mode 100644 mi-pyt/pyqt/pics/lines/10.svg create mode 100644 mi-pyt/pyqt/pics/lines/11.svg create mode 100644 mi-pyt/pyqt/pics/lines/12.svg create mode 100644 mi-pyt/pyqt/pics/lines/13.svg create mode 100644 mi-pyt/pyqt/pics/lines/14.svg create mode 100644 mi-pyt/pyqt/pics/lines/15.svg create mode 100644 mi-pyt/pyqt/pics/lines/2.svg create mode 100644 mi-pyt/pyqt/pics/lines/3.svg create mode 100644 mi-pyt/pyqt/pics/lines/4.svg create mode 100644 mi-pyt/pyqt/pics/lines/5.svg create mode 100644 mi-pyt/pyqt/pics/lines/6.svg create mode 100644 mi-pyt/pyqt/pics/lines/7.svg create mode 100644 mi-pyt/pyqt/pics/lines/8.svg create mode 100644 mi-pyt/pyqt/pics/lines/9.svg create mode 100644 mi-pyt/pyqt/pics/shark.svg create mode 100644 mi-pyt/pyqt/pics/wall.svg create mode 100644 mi-pyt/pyqt/pics/wall2.svg create mode 100644 mi-pyt/pyqt/pics/water.svg create mode 100644 mi-pyt/requests/index.html create mode 100644 mi-pyt/testing/index.html create mode 100644 pyladies/and-or/index.html create mode 100644 pyladies/asteroids/index.html create mode 100644 pyladies/asteroids/screenshot.png create mode 100644 pyladies/basic-functions/index.html create mode 100644 pyladies/basics/diagram.svg create mode 100644 pyladies/basics/dropbox.png create mode 100644 pyladies/basics/gitk.png create mode 100644 pyladies/basics/index.html create mode 100644 pyladies/branching/branch1.png create mode 100644 pyladies/branching/branches.png create mode 100644 pyladies/branching/index.html create mode 100644 pyladies/branching/merge.png create mode 100644 pyladies/circular-imports/index.html create mode 100644 pyladies/class/index.html create mode 100644 pyladies/cmdline/index.html create mode 100644 pyladies/cmdline/windows-cmd-properties.png create mode 100644 pyladies/collaboration/gh-workflow-diagram.svg create mode 100644 pyladies/collaboration/index.html create mode 100644 pyladies/comparisons/index.html create mode 100644 pyladies/course.json create mode 100644 pyladies/def/index.html create mode 100644 pyladies/dict/index.html create mode 100644 pyladies/exceptions/index.html create mode 100644 pyladies/expressions/index.html create mode 100644 pyladies/files/index.html create mode 100644 pyladies/first-steps/index.html create mode 100644 pyladies/fstring/index.html create mode 100644 pyladies/functions/call-anatomy.svg create mode 100644 pyladies/functions/index.html create mode 100644 pyladies/github-api/index.html create mode 100644 pyladies/hello-world/index.html create mode 100644 pyladies/ignoring/index.html create mode 100644 pyladies/inheritance/index.html create mode 100644 pyladies/install-editor/atom.html create mode 100644 pyladies/install-editor/gedit.html create mode 100644 pyladies/install-editor/gedit_indent.png create mode 100644 pyladies/install-editor/gedit_linenums.png create mode 100644 pyladies/install-editor/gedit_prefs.png create mode 100644 pyladies/install-editor/index.html create mode 100644 pyladies/install-editor/kate.html create mode 100644 pyladies/install-editor/notepad-plus-plus.html create mode 100644 pyladies/install-editor/others.html create mode 100644 pyladies/install-editor/vscode.html create mode 100644 pyladies/install/index.1.html create mode 100644 pyladies/install/index.html create mode 100644 pyladies/install/linux.html create mode 100644 pyladies/install/macos.html create mode 100644 pyladies/install/windows.html create mode 100644 pyladies/install/windows_32v64-bit.png create mode 100644 pyladies/install/windows_add_python_to_path.png create mode 100644 pyladies/json/index.html create mode 100644 pyladies/list/index.html create mode 100644 pyladies/local-variables/index.html create mode 100644 pyladies/modules/index.html create mode 100644 pyladies/nested-traceback/index.html create mode 100644 pyladies/pong/index.html create mode 100644 pyladies/pong/pong.png create mode 100644 pyladies/print/index.html create mode 100644 pyladies/pyglet/had.gif create mode 100644 pyladies/pyglet/had.png create mode 100644 pyladies/pyglet/had2.png create mode 100644 pyladies/pyglet/index.html create mode 100644 pyladies/pyglet/pong.py create mode 100644 pyladies/reassignment/index.html create mode 100644 pyladies/str-index-slice/index.html create mode 100644 pyladies/str-methods/index.html create mode 100644 pyladies/str/index.html create mode 100644 pyladies/str/quote-comic.svg create mode 100644 pyladies/testing/index.html create mode 100644 pyladies/tuple/index.html create mode 100644 pyladies/turtle/index.html create mode 100644 pyladies/turtle/turtle-dashed.png create mode 100644 pyladies/turtle/turtle-dashed2.png create mode 100644 pyladies/turtle/turtle-hexagons.png create mode 100644 pyladies/turtle/turtle-rect.png create mode 100644 pyladies/turtle/turtle-square.png create mode 100644 pyladies/turtle/turtle-squares.png create mode 100644 pyladies/turtle/turtle-stairs.png create mode 100644 pyladies/variables/index.html create mode 100644 pyladies/venv-setup/dirs.png create mode 100644 pyladies/venv-setup/index.html create mode 100644 pyladies/while/index.html diff --git a/meta/course.json b/meta/course.json new file mode 100644 index 00000000..c8822d30 --- /dev/null +++ b/meta/course.json @@ -0,0 +1,116 @@ +{ + "api_version": [ + 0, + 3 + ], + "course": { + "description": "Návod na přidání kurzu na Nauč se Python", + "edit_info": { + "branch": "main", + "url": "https://github.com/encukou/naucse-python" + }, + "lessons": { + "meta/installing-naucse": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "installing-naucse/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/installing-naucse/index.md", + "title": "Lokální instalace Nauč se Python", + "vars": {} + } + }, + "source_file": "lessons/meta/installing-naucse/info.yml", + "static_files": {}, + "title": "Lokální instalace Nauč se Python" + }, + "meta/local-run": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "local-run/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/local-run/index.md", + "title": "Vytvoření lokálního kurzu", + "vars": {} + } + }, + "source_file": "lessons/meta/local-run/info.yml", + "static_files": { + "info.yml": { + "path": "local-run/info.yml" + } + }, + "title": "Vytvoření lokálního kurzu" + }, + "meta/submitting-a-run": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "submitting-a-run/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/submitting-a-run/index.md", + "title": "Přidání kurzu na Nauč se Python", + "vars": {} + } + }, + "source_file": "lessons/meta/submitting-a-run/info.yml", + "static_files": { + "naucse_fork.png": { + "path": "submitting-a-run/naucse_fork.png" + } + }, + "title": "Přidání kurzu na Nauč se Python" + } + }, + "long_description": "

V tomto meta-kurzu je kompletní návod na přidávání kurzů na Nauč se Python.

\n

Kurz je určený pro organizátory a k přidání kurzu jsou potřeba jen základní znalosti práce\ns gitem a GitHubem.

", + "sessions": [ + { + "materials": [ + { + "lesson_slug": "meta/installing-naucse", + "title": "Lokální instalace Nauč se Python", + "type": "lesson" + }, + { + "lesson_slug": "meta/local-run", + "title": "Vytvoření lokálního kurzu", + "type": "lesson" + }, + { + "lesson_slug": "meta/submitting-a-run", + "title": "Přidání kurzu na Nauč se Python", + "type": "lesson" + } + ], + "slug": "adding-a-run", + "source_file": "courses/meta/info.yml", + "title": "Přidání kurzu" + } + ], + "source_file": "courses/meta/info.yml", + "title": "Jak přidat kurz na Nauč se Python" + } +} \ No newline at end of file diff --git a/meta/installing-naucse/index.html b/meta/installing-naucse/index.html new file mode 100644 index 00000000..7b9e8656 --- /dev/null +++ b/meta/installing-naucse/index.html @@ -0,0 +1,40 @@ +

Lokální instalace Nauč se python

+

K přidání kurzu nejdřív člověk potřebuje vlastní, lokální instalaci webové aplikace Nauč se Python.

+

Příprava

+

První věc, kterou budeš potřebovat, je Python, a to alespoň ve verzi 3.6. +Pokud zrovna danou verzi Pythonu nainstalovanou nemáš, můžeš postupovat podle návodu na instalaci Pythonu.

+

Druhá věc, kterou budeš potřebovat, je Git – pokud nemáš ten, můžeš postupovat podle návodu na instalaci Gitu.

+

Poslední věc, kterou potřebuješ, už není žádný program, ale pár schopností. +Je potřeba, aby jsi uměl/a pracovat s příkazovou řádkou (terminálem) a s Gitem. +Vše potřebné si můžeš připomenout v návodu na používání terminálu, respektive v návodu na používání Gitu.

+

Instalace

+

Nauč se Python používá k definici závislostí Pipenv, který si nejspíš budeš muset doinstalovat. +Postupovat můžeš podle návodu na instalaci Pipenvu.

+

Po instalaci si musíš naklonovat repozitář, ze kterého se Nauč se Python vykresluje. +To uděláš tímto příkazem:

+
$ git clone https://github.com/pyvec/naucse.python.cz
+

Poté přepni adresář do naklonovaného repozitáře:

+
$ cd naucse.python.cz
+

Zbývá už jen nainstalovat závislosti, to uděláš pomocí následujícího příkazu, který za tebe zároveň i vytvoří virtuální prostředí.

+
$ pipenv install
+

+

Spuštění

+

Nauč se Python jde pustit ve dvou režimech. +První režim vykresluje každou stránku pokaždé znova – hodí se na vývoj, aby byly všechny změny okamžitě vidět. +Pustí se následovně:

+
$ pipenv run naucse serve
+ * Running on http://0.0.0.0:8003/ (Press CTRL+C to quit)
+ * Restarting with stat
+ * Debugger is active!
+ * Debugger PIN: 256-270-314
+

V ukázce vidíš rovnou i příklad toho, co to vypíše – zajímá tě jen adresa, zde http://0.0.0.0:8003/ (u tebe se může lišit). +Když si ji zkopíruješ a otevřeš ve webovém prohlížeči, uvidíš vlastní běžící Nauč se Python.

+

Druhý režim nejdříve vykreslí všechny stránky a až poté ti je zobrazí – hodí se spíše na kontrolu toho, že se při vývoji nic nepokazilo. +Pustí se následovně (pozor, nějakou chvíli to trvá):

+
$ pipenv run naucse freeze --serve
+Generating HTML...
+ * Running on http://127.0.0.1:8003/ (Press CTRL+C to quit)
+

Když odnaviguješ například do seznamu kurzů, je možné, že tam nebudou všechny. +To jsou kurzy, které se vykreslují z jiných forků, které jsou na lokálním prostředí +automaticky vypnuté.

+
\ No newline at end of file diff --git a/meta/local-run/index.html b/meta/local-run/index.html new file mode 100644 index 00000000..a67ecd83 --- /dev/null +++ b/meta/local-run/index.html @@ -0,0 +1,224 @@ +

Vytvoření lokálního kurzu

+

Teď, když už máš lokální instalaci aplikace Nauč se Python, můžeš začít vytvářet vlastní kurz.

+

První věc, kterou musíš udělat, je vybrat si identifikátor kurzu, pod kterým bude kurz uložený. +Tento identifikátor také bude ve všech adresách, které se budou týkat tohoto kurzu. +Identifikátor se může skládat pouze z malých alfanumerických znaků a spojovníků (-) a musí být uníkátní, alespoň v daném roce. +Jak zjistit, jestli už identifikátor existuje? Podívej se do složky runs a pak dále do složky, která odpovídá roku, ve kterém tvůj kurz začíná.

+

Jak vybrat identifikátor?

+

Ze správného identifikátoru (v kombinaci s rokem) by mělo být jasné, o který kurz se jedná. +Dobrý příklad je třeba 2017/mi-pyt, identifikátor pro předmět MI-PYT, který začal v roce 2017. +Pro jiné kurzy může být problém přijít na unikátní identifikátor. +Například kurzy PyLadies se organizují ve více městech několikrát ročně. +Poté se do identifikátoru přidává i město a označení, který je to kurz v daném roce – například 2018/pyladies-ostrava-jaro. +Třeba v Praze ale zároveň běží i více kurzů najednou, tak se používá 2018/pyladies-praha-jaro-cznic a 2018/pyladies-praha-jaro-ntk, poslední část zde říká, kde se kurz koná.

+


+Takže doporučení jsou následovné:

+ +

Když už máš vymyšlený identifikátor, vytvoř ve složce s rokem složku, která se bude jmenovat podle tvého identifikátoru. +Pokud ještě složka pro daný rok neexistuje, musíš ji vytvořit také.

+

Definice kurzu

+

Kurz se definuje pomocí souboru info.yml, který se umisťuje právě do složky, kterou jsi výše vytvořil/a. +Tento soubor obsahuje všechny informace o kurzu – název, popisek, kde a kdy se koná a pak samozřejmě plán jednotlivých lekcí. +Soubor je formátu YAML, který si teď trochu ukážeme.

+

O formátu YAML

+

Formát se skládá z několika stavebních bloků, které se dají poté skládat dohromady. +Prvním je seznam hodnot (podobně jako v Pythonu). +Seznam se ve formátu YAML zapisuje následovně:

+
- První položka
+- Druhá položka
+- 3
+- Položka může být i něco jiného než text!
+

Druhým stavebním blokem je slovník (zase podobně jako v Pythonu), který se skládá z klíčů a hodnot, nezáleží v ní tedy na pořadí, protože se k informaci vždy člověk dostance pomocí klíče. +Slovník se ve formátu YAML zapisuje následovně:

+
klic1: Hodnota klíče klic1.
+klic2: 2
+klic3: I hodnoty ve slovníku mohou být něco jiného než text.
+klic4: |
+    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
+
+    Tento text budou dva separátní odstavce v rámci jednoho klíče.
+klic5:
+klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
+

Seznamy a slovníky jde samozřejmě i skládat dohromady:

+
klic1: Hodnota klíče
+klic2:
+- Tohle je seznam, které patří pod klíč klic2
+- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
+- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
+klic3:
+  vnorenyklic: Slovník může obsahovat další slovník i takto.
+

Povinné informace

+

Teď, když už se vyznáš ve formátu YAML, můžeš začít vytvářet soubor info.yml. +Celá definice kurzu je jeden velký slovník, který si postupně popíšeme a vyplníme. +Pro potřeby kurzu je připravena šablona, kterou můžeš použít.

+

Nejdřív prvních pár základních povinných údajů:

+ +

A teď už jen nepovinné údaje:

+ +

Jestli chceš, aby pro kurz šel vygenerovat iCal soubor s plánem lekcí, musíš dále poté vyplnit údaj default_time. +Tato hodnota musí být slovník, který obsahuje dva klíče start a end, kde bude čas lekcí. +Čas musí být ve formátu HH:MM a musí být obalen uvozovkami nebo apostrofy (kvůli té dvojtečce, aby si YAML nemyslel, že je to další slovník), takže třeba takhle:

+
default_time:
+  start: '18:00'
+  end: '20:00'
+

Poslední nepovinná hodnota, než se dostaneme k obsahu kurzu, jsou proměné, které se definují klíčem vars a musí být také slovníkem. +Proměné mohou upravovat obsah lekcí a stránek kurzu, a pokud budeš vytvářet nebo upravovat materiály, můžeš si i definovat vlastní.

+

První proměnou, kterou můžeš použít, je coach-present. +Pokud je tvůj kurz s lektorem nebo koučem, nastav tuto proměnou na hodnotu true.

+

Druhou proměnou, kterou můžeš použít je user-gender. +Pokud víš, že na tvém kurzu budou lidé jen jednoho pohlaví, můžeš nastavit materiály (které tak byly napsány), aby vykreslily správně formátovaný obsah. +Nastavíš to pomocí písmenka f pro ženy, m pro muže. +Pokud proměnou nevyplníš, materiály vykreslí obě varianty.

+

Další proměnou, kterou můžeš použít, je pyladies. +Tu využij (nastavenín na hodnotu true), pokud organizuješ kurz PyLadies. +Tato proměná aktivuje v materiálech nějaké popisky navíc, například o tahácích, nebo také sjednotí názvy složek na pyladies.

+

Plán na základě kanonických materiálů

+

Pro vytvoření obsahu máš dvě základní možnosti. +Buď využiješ plán existujícího kanonického kurzu, nebo si nadefinuješ svůj vlastní. +Zde je popsán postup odvozování.

+

Nejdřív si vyber kanonický kurz, ze kterého chceš svůj kurz odvodit. +Kanonické kurzy najdeš ve složce courses. +Vybraný kanonický kurz nastav v souboru info.yml klíčem derives – napiš do něj název složky kurzu (např. pyladies nebo mi-pyt).

+

A teď už zbývá poslední věc, a to je sestavení programu kurzu. +Kurz se skládá z jednotlivých lekcí a každá lekce se skládá z jednotlivých materiálů. +Lekce nadefinuješ klíčem plan v souboru info.yml. +Ten musí být seznam dalších slovníků.

+

Máš dvě možnosti, jak nadefinovat jednotlivé lekce. +Buď můžeš převzít lekci z kanonického kurzu, nebo si nadefinovat vlastní.

+

Nicméně, co je společné, je definování data a času kurzu. +Datum nastavíš klíčem date, ve formátu YYYY-MM-DD. +Čas nastavovat nemusíš, použije se čas z default_time, ale můžeš ho přenastavit pomocí klíče time, který bude mít jako hodnotu další slovník s hodnotami start a/nebo end (ve formátu HH:MM obalené uvozovkami).

+

Definice vlastní lekce

+

Nejdříve si ukážeme, jak se definují vlastní lekce – přebírání pak už bude jednoduché. +Nejdřív si budeš muset zase vymyslet pro lekci identifikátor, který napiš do klíče slug. +Identifikátor musí být zase unikántní, nicméně tentorkát jen v rámci kurzu. +Identifikátor lekce bude v adrese na tu specifickou lekci. +Dalším povinným údajem je title – název lekce.

+

Kromě definování data a času už pak při definici lekce zbývá jen seznam materiálů. +Ty se nastavují pomocí klíče materials. +I když nechceš žádné materiály pro lekci definovat, musíš klíč nadefinovat, a to s hodnotou [] (prázdný seznam). +Základní definice lekce tedy vypadá následovně:

+
plan:
+- slug: first-lesson
+  title: Název první lekce
+  date: 2018-03-07
+  materials: []
+

Existují tři druhy materiálů. První druh jsou interní materiály, druhý druh jsou odkazy mimo Nauč se Python a třetí jsou jen záznam bez odkazu. +Materiály se dále pak rozdělují na několik typů, které určují ikonku, která se použije v seznamu materiálů vedle názvu.

+

Podporované typy jsou následující:

+ +

A teď už k definování. +Interní materiály se definují pomocí klíče lesson, do kterého patří identifikátor interního materiálu. +Interní materiály jsou definovány ve složce lessons. +V té složce jsou tzv. kolekce materiálů, které pak obsahují jednotlivé materiály. +Identifikátor materiálu je <název kolekce>/<název materiálu z kolekce>, takže například beginners/install. +Následovně by se použil materiál v seznamu materiálů:

+
plan:
+- slug: first-lesson
+  title: Název první lekce
+  date: 2018-03-07
+  materials:
+  - lesson: beginners/install
+

Druhý druh se definuje pomocí klíčů url a title. +Do url patří kompletní odkaz na materiál, do title patří název odkazu. +Nepovinně se pak může změnit typ pomocí klíče type. +Příklad použítí:

+
plan:
+- slug: first-lesson
+  title: Název první lekce
+  date: 2018-03-07
+  materials:
+  - title: Úvodní prezentace
+    url: https://example.com/uvod.pdf
+  - title: Tahák na příkazovou řádku
+    url: https://example.com/tahak.pdf
+    type: cheatsheet
+  - title: Domácí projekty (PDF)
+    url: https://example.com/ukol.pdf
+    type: homework
+

Třetí druh se definuje stejně jako druhý, jen se do klíče url dá hodnota null.

+

Poslední věc, která jde definovat u materiálů, jsou proměné, pomocí klíče vars. +Definují se stejně jako u celého kurzu, ale mají účinek jen pro specifický materiál. +Například takhle:

+
plan:
+- slug: first-lesson
+  title: Název první lekce
+  date: 2018-03-07
+  materials:
+  - lesson: beginners/install
+    vars:
+      bonus: true
+

Převzetí lekce

+

Lekci převezmeš nastavením klíče base na identifikátor (slug) lekce z kanonického kurzu (viz soubor info.yml ve složce toho kurzu). +Takto převzaná lekce si vezme z kanonického kurzu název i materiály. +Lze to třeba i jen takto:

+
plan:
+- base: install
+  date: 2018-03-07
+- base: hello
+  date: 2018-03-14
+  time:
+    start: '18:00'
+    end: '20:00'
+

Nicméně můžeš ale i u převzatých kurzů změnit seznam materiálů, pomocí seznamu hodnot materials. +Můžeš si nadefinovat úplně nový seznam materiálů (stejně jako výše) nebo můžeš použít hodnotu +merge, které na dané místo v seznamu materiálů vloží všechny materiály z odvozované lekce. +To se hodí, pokud třeba jen potřebuješ přidat něco před nebo za materiály z kanonického kurzu. +Použití vypadá následovně:

+
plan:
+- base: install
+  date: 2018-03-07
+  materials:
+  - title: Úvodní prezentace
+    url: https://example.com/uvod.pdf
+  - +merge
+  - title: Domácí projekty (PDF)
+    url: https://example.com/ukol.pdf
+    type: homework
+

Úplně nový plán

+

Pokud chceš vytvořit úplně nový plán, můžeš se řídit stejným postupem jako výše, jen nevyplňuj klíč derives a nevyužívej způsob definování přes lekci base.

+

Otestování vlastního kurzu

+

Po vytvoření souboru info.yml s povinnými položkami se můžeš konečně podívat na to, jak tvůj kurz bude vypadat. +Podle instrukcí z předchozí části manuálu si spusť Nauč se v Python režimu serve. +Otevři si adresu, kterou ti příkaz napíše, a odnaviguj se do části s kurzy.

+

Pokud se stránka s kurzy nevykreslí, tak uvidíš Python vyjímku, která ti může pomoct, ale také může být pěkne matoucí. +Nejprve si zkontroluj, jeslti jsi vážně vyplnil/a všechny povinné údaje. +Jestli si myslíš, že ano, tak se nám ozvi přes issues na našem GitHubu a my ti rádi pomůžeme. +V opačném případě si rozklikni svůj kurz. +Pokud se ti nevykreslí detail kurzu, nejspíš jsi udělal/a nějakou chybu v definici lekcí nebo materiálů – zkontroluj si, jestli například nemáš dvě lekce se stejným identifikátorem, jestli není překlep v nějakém klíčí a jestli například neodkazuješ na materiál, který neexistuje.

+

Dále si pak můžeš proklikat všechny jednotlivé materiály, jestli vše funguje a vypadá jak má. +Jako další test může posloužit druhý režim spuštění Nauč se Python (freeze), který projde všechny stránky, jestli fungují.

+

Upravování a vytváření materiálů

+

Na závěr této části ještě trochu k materiálům. +Jak bylo zmíněno výše, obsah materiálů je definován ve složce lessons. +Kromě toho, že si můžeš sestavit vlastní kurz, můžeš si i upravit materiály, které využíváš, nebo si napsat úplně nové.

+

Většina materiálů je napsaná v formátu Markdown a pár je napsaných v Jupyter Noteboocích. +Upravování je jednoduché, stačí se podívat do složky s daným specifický materiálem a upravit, co je potřeba, v souboru s obsahem.

+

Vytváření je trošku složitější v tom, že člověk musí vybrat správnou kolekci a název lekce a pak vytvořit ve složce kromě obsahu i soubor informacích o materiálech. +Soubor se znovu jmenuje info.yml a má povinné tři údaje, title, style a license:

+ +

Dále má soubor nepovinné položky, první attributions – buď jednoduchý text, nebo seznam textů s informacemi o tom, kdo a proč materiál napsal. +Nakonec lze použít jinou licenci na ukázky kódu pomocí license_code: doporučujeme použít cc0.

+

Obecně je dobrý nápad se při psaní materiálů inspirovat již existujícími řešeními v ostatních materiálech a přebírat jejich styl a způsoby formátování.

+
\ No newline at end of file diff --git a/meta/local-run/info.yml b/meta/local-run/info.yml new file mode 100644 index 00000000..08e7db8c --- /dev/null +++ b/meta/local-run/info.yml @@ -0,0 +1,35 @@ +title: +subtitle: +time: 18:00–20:00 +default_time: + start: '18:00' + end: '20:00' +place: +description: +long_description: | + Delší popisek +derives: pyladies +vars: + pyladies: true + coach-present: true +plan: +- base: install + date: 2018-03-07 + materials: + - title: Úvodní prezentace + url: http://example.com/prezentace.pdf + - +merge + - title: Domácí úkoly + url: http://example.com/domaci_ukol.pdf + type: homework +- title: Procvičování a soubory + date: 2018-03-14 + slug: exercises + time: + start: '19:00' + end: '21:00' + materials: + - title: Procvičíme si vše, co jsme se naučily + url: null + type: special + - lesson: beginners/files diff --git a/meta/submitting-a-run/index.html b/meta/submitting-a-run/index.html new file mode 100644 index 00000000..10ac08f7 --- /dev/null +++ b/meta/submitting-a-run/index.html @@ -0,0 +1,71 @@ +

Přidání kurzu na Nauč se Python

+

Když už máme nadefinováný vlastní kurz, zbývá nám jen ho dostat na naucse.python.cz. +Budeme k tomu potřebovat jen pár příkazu v Gitu a trochu trpělivosti.

+

Nahrání do vlastního forku

+

První věc, kterou budeš potřebovat, je vlastní účet na GitHubu.

+

Přihlaš se na GitHub a vytvoř „fork” repozitáře pyvec/naucse.python.cz. +Na stránce repozitáře vpravo nahoře na to je tlačítko Fork.

+
+Tlačítko na vytvoření forku repozitáře s Nauč se Python +

Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, +jestli fork bude pod tvým účtem nebo pod organizací. +Děláš-li kurz pro organizaci, použij tu, +abyste do materiálů mohli přispívat všichni. +Jinak udělej kurz pod vlastním účtem.

+

Vytvoření chvilku trvá. +To, že je fork vytvořen, poznáš tak, že tě GitHub přesměruje na stránku, která bude skoro stejná, ale v hlavičce bude jiné uživatelské jméno (tvoje nebo tvé +organizace) a pod tím text forked from pyvec/naucse.python.cz.

+

Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. +To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno, +pod kterým fork je):

+
$ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/naucse.python.cz.git
+

Dále potřebuješ vytvořit commit se svým kurzem a případně se změnami v materiálech. +Je dobré změny dělat v zvláštní větvi, ne v master. +Vymysli si název větve (např. podzim-2016) a pusť příkazy

+
$ git branch nazevvetve
+$ git checkout nazevvetve
+

Jak vytvořit commit, se dozvíš například v návodu na používání Gitu. +Více o větvích se můžeš dozvědět v návodu na větvení v Gitu.

+

Svůj commit teď potřebuješ dostat do svého forku na GitHubu. +To uděláš příkazem (uzivatelskejmeno nahraď za uživatelské jméno, pod kterým fork +je):

+
$ git push uzivatelskejmeno
+

Informace o forku pro Nauč se Python

+

Teď potřebuješ dostat informaci o tvém forku do základního repozitáře. +To se dělá pomocí souboru link.yml, se kterým se udělá Pull Request do základního repozitáře.

+

Nejdřív si vytvoř novou větev odvozenou od původního repozitáře, ve které vytvoříš soubor link.yml. +To uděláš tímto příkazem (pridanikurzu můžeš změnit, je to název nové větve):

+
$ git checkout -b pridanikurzu origin/master
+

Možná sis všiml/a, že tvoje změny jsou najednou pryč, ale neboj, ony jsou uloženy na tvém počítači i na GitHubu, jen zrovna nejsou vidět.

+

Teď potřebuješ vytvořit stejnou složku jako jsi vytvořil/a pro soubor info.yml – musí se jmenovat úplně stejně. +V té složce vytvoř soubor, který se tentokrát bude jmenovat link.yml. +Bude zase ve formátu YAML, ale tentokrát bude jednoduchý. +Jedinou povinou informací je klíč repo, do kterého musíš dát odkaz na tvůj fork. +Jméno větve pak napiš do klíče branch. +Pozor, jedná se o větev s kurzem, ne o větev, ze které kurz přidáváš na Nauč se Python (tedy ne pridanikurzu z příkladu výše).

+

Výsledný soubor pak vypadá následovně:

+
repo: https://github.com/uzivatelskejmeno/naucse.python.cz.git
+branch: nazevvetve
+

Vytvoř s tímto souborem (a jen tímto souborem) commit a zase odešli změnu na GitHub.

+
$ git push uzivatelskejmeno
+

Teď už potřebuješ udělat Pull Request (dále jen jako PR) se souborem link.yml. +Jak udělat PR je popsáno v návodu na používání Gitu. +Ideálně do popisku napiš, kdo jsi a co organizuješ za kurz, ať to správci nemusí zjišťovat například z popisku v info.yml.

+

Po tom, co správci PR schválí a sloučí tvoje změny do základního repozitáře, stačí počkat pár minut a tvůj kurz se objeví na naucse.python.cz.

+

Upravování kurzu

+

Pokud budeš chtít na svém kurzu něco změnit, musíš se nejdřív zpátky přepnout do větve, ve které ten kurz je. +To uděláš následujícím příkazem. +nazevvetve nahraď za větev, ve které kurz máš.

+
$ git checkout nazevvetve
+

S každou změnou pak musíš udělat commit a odeslat commit na GitHub.

+

Už naprosto poslední věc, kterou je potřeba zařídit, je aby se změny ve tvém kurzu u tebe ve forku projevily na Nauč se. +To se dělá pomocí tzv. webhooků, webových adres, které reagují na nějaké akce. +Musíš tedy nastavit svůj fork, aby posílal akce na webhook, který vyvolá nové nasazení webové stránky naucse.python.cz.

+

Pro instalaci webhooků máme speciální aplikaci, která je umí sama nastavit. +Běží na adrese hooks.nauc.se. +Když se v té aplikaci přihlásíš, uvidíš tam svůj fork repozitáře naucse.python.cz (a všechny ostatní forky Nauč se, do kterých máš přístup). +Poté už jen stačí kliknout na tlačítko Aktivovat u správného repozitáře a webhook se nainstaluje. +A to je všechno! Přidal/a jsi kurz na Nauč se Python!

+

Pokud to umíš a chceš, můžeš si webhook nainstalovat sám/sama manuálně. +Adresa webhooku je https://hooks.nauc.se/hooks/push, je potřeba Content-Type application/json a secret není potřeba zadávat.

+
\ No newline at end of file diff --git a/meta/submitting-a-run/naucse_fork.png b/meta/submitting-a-run/naucse_fork.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdfb521cf3a04d9d6cfd9fd95c48ba3dd230709 GIT binary patch literal 49953 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 literal 0 HcmV?d00001 diff --git a/mi-pyt/async/index.html b/mi-pyt/async/index.html new file mode 100644 index 00000000..6ac5d5d6 --- /dev/null +++ b/mi-pyt/async/index.html @@ -0,0 +1,387 @@ +

Ve cvičení použijeme ukázku z PyQt5. +Máte-li ještě virtualenv s nainstalovaným PyQt, použijte ho, případně ho +podle lekce o PyQt nainstalujte znovu.

+

K PyQt si přiinstalujte knihovnu asyncqt:

+
$ python -m pip install asyncqt
+

Nejde-li to, nevadí – nezbytné dnes PyQt nebude.

+

Navíc si nainstalujte knihovnu aiohttp:

+
$ python -m pip install aiohttp
+

+

V minulosti byly na této stránce popsány i generátory. +Neovládáte-li je ještě, přečtěte si o nich.

+

+

AsyncIO

+

Pojďme si povídat o souběžnosti – možnostech, jak nechat počítač dělat víc +úloh věcí najednou.

+

Jak jsme si řekli v lekci o C API, Python má globální zámek, takže pythonní kód +může běžet jen v jednom vlákně najednou. +Taky jsme si řekli, že to většinou příliš nevadí: typický síťový nebo GUI program +stráví hodně času čekáním na události (odpověď z internetu, kliknutí myší atp.) +a u tohoto čekání není potřeba držet zámek zamčený.

+

Servery typicky při zpracovávání požadavku stráví většinu času síťovou komunikací. +Proto se často spouští několik vláken nebo přímo procesů najednou, aby se mohl vytížit +procesor. +Při velkém množství vláken ale nastanou dva problémy. +První je, že vláken nemůže být neomezeně mnoho. +Každé vlákno potřebuje vlastní stack, tj. poměrně velkou část paměti; a počet vláken +bývá omezen i jinak (na Linuxu je globální limit počtu procesů, do kterého se počítají +i jednotlivá vlákna – viz cat /proc/sys/kernel/threads-max). +Druhý problém je, že přepnutí z jednoho vlákna do druhého se může stát kdykoli. +Ověřit si, že je na to program připravený, je poměrně složité a na zajištění +správné funkčnosti je potřeba zamykání či jiné techniky. Ty bývají relativně +pomalé, a tak se jim programátoři snaží vyhnout. +A chyby vzniklé nesprávným ošetřením přepínání vláken bývají složité na odhalení +a vyřešení.

+

Vlákna jsou příklad preemptivního multitaskingu, kdy operační systém rozhoduje, +kdy přepne z jednoho vlákna do druhého, a tuto změnu si prakticky vynutí. +Jednotlivá vlákna se s tím musí vyrovnat. +Alternativou je kooperativní multitasking, kdy se jednotlivé úlohy umí samy vzdát +procesorového času, když např. čekají na síťovou komunikaci. +Programátor tak ví, že dokud takto nepředá kontrolu ostatním úlohám, žádná jiná +úloha mu pod rukama nemůže měnit stav procesu. +Na druhou stranu je ale potřeba dostatečně často kontrolu předávat, aby se všechny +úlohy dostaly ke slovu. +Tuto techniku tak nemůže používat operační systém, pod kterým můžou běžet i špatně +napsané programy. V rámci jednoho procesu se to ale dá s úspěchem využít.

+

Souběžnost v Pythonu

+

V Pythonu existovala a existuje řada knihoven, které nám umožňují „dělat více +věcí zároveň“. +Pro preemptivní multitasking jsou tu threading, tedy podpora pro vlákna, +a multiprocessing, tedy způsob jak spustit nový pythonní proces, +ve kterém se provede určitá funkce +(přičemž vstup a výstup se předává serializovaný přes pipes).

+

Další knihovna, kterou lze z PyPI nainstalovat, je greenlet. +Ta nám dává k dispozici tzv. mikro-vlákna, +která se mezi sebou přepínají v rámci jednoho procesu. +Na rozdíl od systémových vláken nepotřebují tolik paměti navíc, ale +stále jde (alespoň z pohledu programátora) o preemptivní strategii: +k přepnutí může dojít kdykoli, +je tedy potřeba zamykat a složitě hledat málo časté chyby.

+

Byly vyvinuty i knihovny pro kooperativní přepínání, založené na tzv. +futures. +Nejznámější jsou Twisted a Tornado. +Obě jsou relativně staré (2002, resp. 2009), ale stále populární.

+

Ačkoli byly Twisted, Tornado a podobné knihovny užitečné, měly zásadní problém +v tom, že každá má jiné API. +Vznikaly tak kolem nich ekosystémy vázané na konkrétní knihovnu: +server napsaný pro Tornado se nedal použít pod Twisted a aplikace +využívající Twisted nemohla využít knihovnu pro Tornado.

+

Jak to vyřešit?

+

Jeden standard

+

xkcd 927

+

Komiks xkcd, © Randall Munroe, CC-BY-NC

+

Podobně jako přístup k různým SQL databázím je v Pythonu standardizovaný +(knihovny pro SQLite, Postgres, MySQL atd. všechny podporují API definované +v PEP 249) nebo je standardizované API webových serverů (WSGI, PEP 3333), +tak vzniklo standardizované API pro kooperativní multitasking. +Toto API je definováno v PEP 3156 a jeho referenční implementace, asyncio, +je ve standardní knihovně Pythonu. +(Ne že by to zabránilo vzniku dalších asynchronních knihoven jako +Curio a Trio. +Ty ovšem spíš experimentují s novými paradigmaty a osvědčené principy se z nich +postupně dostávají do asyncio.)

+

Interně je asyncio postavené na konceptu futures inspirovaných Tornado/Twisted, +ale jeho „hlavní“ API je postavené na coroutines podobných generátorům.

+

Od Pythonu verze 3.5 používá asyncio místo „normálních“ generátorů +speciální syntaxi, která umožňuje kombinovat asynchronní funkce s příkazy +for a with nebo i yield. +Tuto syntaxi použijeme i tady; máte-li starší Python, podívejte se na potřebné změny uvedené níže.

+

Jak vypadá taková asynchronní funkce? +Definuje se pomocí async def místo def, a může používat příkaz await.

+

Ukažme si to na příkladu:

+
import asyncio
+
+async def count(name, interval):
+    """Prints numbers from 0 in regular intervals"""
+    i = 0
+    while True:
+        print(name, 'counts', i)
+        await asyncio.sleep(interval)
+        i += 1
+
+
+loop = asyncio.get_event_loop()
+loop.run_until_complete(count('Counter', 1))
+loop.close()
+

Co se tu děje? +Příkazem await asyncio.sleep(interval) se asynchronní funkce pozastaví +(podobně jako generátor při yield) a předá kontrolu knihovně asyncio +s informací že za daný čas by kontrolu chtěla zase zpátky. +Než daný interval uplyne, asyncio může spouštět jiné úlohy; +po jeho uplynutí pozastavenou funkci „probudí“ a její algoritmus pokračuje dál.

+

Když žádné jiné úlohy neexistují, je pomalé počítání trochu nudné. +Zkuste proto spustit počítadla dvě. +(Detaily funkce ensure_future a příkazu await task vysvětlíme níže.)

+
import asyncio
+
+async def count(name, interval):
+    ...
+
+async def run_two_counters():
+    fast_task = asyncio.ensure_future(count('Fast', 0.3))
+    slow_task = asyncio.ensure_future(count('Slow', 1))
+    await fast_task
+    await slow_task
+
+loop = asyncio.get_event_loop()
+loop.run_until_complete(run_two_counters())
+loop.close()
+

Spouštění a ukončení – poslední tři řádky – je poněkud složité na zápis, +ale typicky to v každém programu potřebujete napsat jen jednou.

+

V Pythonu verze 3.7 a vyšší lze ty tři poslední řádky nahradit jednodušším:

+
asyncio.run(run_two_counters())
+

V Pythonu verze 3.4 a nižší ještě neexistovala klíčová slova async a +await; asynchronní funkce byly implementovány jako generátory. +Ve starších verzích Pythonu bylo potřeba místo:

+
async def ...:
+    await ...
+

psát:

+
@asyncio.coroutine
+def ...:
+    yield from ...
+

Starý způsob zatím funguje i v novějším Pythonu a dokonce se ještě někdy +objeví i v dokumentaci. +Od Pythonu 3.8 je ale deprecated.

+

Event Loop

+

Knihovna asyncio nám dává k dispozici smyčku událostí, která se, podobně jako +app.exec v Qt, stará o plánování jednotlivých úloh. +Smyček událostí může být více. +Tradiční způsob je, že každé vlákno může mít vlastní smyčku událostí, +kterou získáme pomocí asyncio.get_event_loop a pak ji můžeme spustit dvěma +způsoby:

+
    +
  • loop.run_forever() spustí smyčku na tak dlouho, dokud jsou nějaké úlohy +naplánovány (to trochu odporuje názvu, ale většinou se nestává, že by se +úlohy „vyčerpaly“), nebo
  • +
  • loop.run_until_complete(task) – tahle funkce skončí hned, jakmile je hotová +daná úloha, a vrátí její výsledek.
  • +
+

Nakonec je smyčku potřeba uzavřít (loop.close()), což např. dá použitým +knihovnám možnost korektně uzavřít zbylá síťová spojení.

+

Od Pythonu 3.7 můžete použít asyncio.run(task), což vytvoří novou +smyčku událostí, spustí v ní danou úlohu (pomocí run_until_complete) +a zase ji zavře. +Chcete-li ji použít (a tedy psát kód jen pro Python 3.7+), používejte pak všude +místo ensure_future funkci create_task, která vás lépe ochrání před +těžko nalezitelnými chybami.

+

Async funkce a Task

+

Smyčka událostí provádí úlohy a asynchronní funkce.

+

Asynchronní funkce se definují pomocí async def a umožňují použít příkaz +(nebo operátor) await, kterým se provádění funkce pozastaví a kontrola se +předá jiným úlohám do doby, než nastane nějaká událost (např. uplynul časový +intervaluj, jsou dostupná nová data ze socketu…).

+

Pozastavení funguje podobně jako yield u generátoru.

+

Zavoláním asynchronní funkce dostaneme coroutine pozastavenou na začátku +těla funkce:

+
>>> async def demo():
+...     print('Demo')
+...
+>>> coroutine = demo()
+>>> coroutine
+<coroutine object demo at 0x7fda8be22b90>
+

Naplánujeme-li provádění coroutine na smyčce událostí +(např. pomocí run_until_complete), tělo funkce se začne vykonávat:

+
>>> loop = asyncio.get_event_loop()
+>>> result = loop.run_until_complete(coroutine)
+Demo
+

V rámci jedné coroutine pak lze provedení jiné coroutine naplánovat +a počkat na jejich skončení pomocí await. +Jak run_until_complete tak await nám dají k dispozici návratovou hodnotu +příslušné asynchronní funkce.

+
import asyncio
+
+async def add(a, b):
+    await asyncio.sleep(1)  # schedule a "sleep" and wait for it to finish
+    return a + b
+
+async def demo():
+    coroutine = add(2, 3)
+    result = await coroutine  # schedule "add" and wait for it to finish
+    print('The result is:', result)
+
+loop = asyncio.get_event_loop()
+result = loop.run_until_complete(demo())
+loop.close()
+

Nevýhoda čistých coroutines spočívá v tom, že na každé zavolání +takové funkce lze použít jen jeden await. +Výsledek se nikam neukládá, jen se po skončení jednou předá. +Druhý await pro stejné zavolání asynchronní funkce skončí s chybou. +Zkuste si to – v kódu výše přidejte daší řádek s await coroutine:

+
    print('The result is:', (await coroutine))
+

Tenhle problém můžeme vyřešit tak, že asynchronní funkci „zabalíme“ +jako úlohu, Task. +V Pythonu 3.7 se Task tvoří pomocí asyncio.create_task; +pro kompatibilitu se staršími verzemi ale použijeme ekvivalentní +asyncio.ensure_future. +Task se chová stejně jako coroutine – lze použít v await nebo +run_until_complete, ale navíc:

+
    +
  • výsledek je k dispozici kdykoli po ukončení funkce (např. pro druhý await) a
  • +
  • úloha se naplánuje hned po zavolání ensure_future.
  • +
+

Druhou vlastnost je lepší ukázat na příkladu:

+
import asyncio
+
+async def print_and_wait():
+    print('Async function starting')
+    await asyncio.sleep(0.5)
+    print('Async function done')
+    return 'result'
+
+async def demo_coro():
+    coroutine = print_and_wait()
+    await asyncio.sleep(1)
+    print('Awaiting coroutine')
+    print(await coroutine)     # schedule coroutine and wait for it to finish
+
+async def demo_task():
+    task = asyncio.ensure_future(print_and_wait())  # schedule the task
+    await asyncio.sleep(1)
+    print('Awaiting task')
+    print(await task)  # task is finished at this point; retreive its result
+
+
+loop = asyncio.get_event_loop()
+print('Coroutine:')
+result = loop.run_until_complete(demo_coro())
+print('Task:')
+result = loop.run_until_complete(demo_task())
+loop.close()
+

Fan-Out a Fan-In

+

S pomocí asynchronních funkcí můžeme nad našimi programy přemýšlet tak, +jako by to byly „normální“ procedurálně zapsané algoritmy: máme jedno +„vlákno“, které se provádí od začátku do konce, jen na některých místech +(označených await) se provádění přeruší a zatímco náš kód čeká na výsledek +nějaké operace, může se spustit jiný kus kódu. +Funkce, na které je takto potřeba čekat, bývají v dokumentaci patřičně +označeny (v síťovém programování je to většinou čtení ze socketů nebo inicializace +či ukončení serveru).

+

Pomocí ensure_future a await můžeme k tomu dělat něco navíc: +rozdělit běh našeho programu na víc úloh, které se budou vykonávat „souběžně“ – +například autor scraperu chce stáhnout několik stránek najednou +nebo server souběžně odpovídá na několik požadavků. +Tomuto rozdělení se říká fan-out.

+

Opačná operace je fan-in, kdy několik úloh opět spojíme do jedné. +Výše uvedený scraper může počkat, než jsou všechny stránky stažené – +třeba pomocí jednoho await pro každý Task nebo asynchronní funkce +gather. +Poté může pokračovat zpracováním získaných dat.

+

Počkáním na úlohu (pomocí await, gather, run_until_complete atp.) +získáte její návratovou hodnotu. +Ale na všechny úlohy, i na ty, které nic zajímavého nevrací, je důležité počkat. +Neuděláte-li to, bude asyncio vypisovat varovné hlášky:

+
>>> import asyncio
+>>> asyncio.sleep(1)  # no await
+>>> exit()
+sys:1: RuntimeWarning: coroutine 'sleep' was never awaited
+

Toto varování nikdy neignorujte. Kdyby váš program nedělal co má, spolu s +varováním byste ignorovali výjimky v této coroutine.

+

Asynchronní cykly a kontexty

+

Až budete používat některé „asynchronní“ knihovny, setkáte se pravděpodobně se dvěma +novými konstrukcemi: async for a async with.

+

Fungují jako jejich „ne-async“ varianty, jen na začátku a konci každé iterace (resp. +na začátku a konci bloku) můžou přerušit vykonávání funkce – podobně jako await.

+

Typický příklad je u databází: začátek a konec transakce i získávání jednotlivých +řádků pravděpodobně potřebují komunikaci po síti, takže hypotetická databázová +knihovna by se mohla používat nějak takto:

+
async with database.transaction_context():
+    await database.execute('UPDATE ...')
+    async for row in (await database.execute('SELECT ...')):
+        handle(row)
+

A další

+

Nakonec několik tipů, o kterých je dobré vědět.

+

V asyncio najdeme synchronizační mechanismy známé z vláknového programování, např. +Lock a Semaphore – viz dokumentace.

+

Musíme-li použít blokující funkci, která např. komunikuje po síti bez await a která by +tedy zablokovala i všechny ostatní úlohy, můžeme použít +loop.run_in_executor(), a tím danou funkci zavolat ve vlákně nebo podprocesu, ale výsledek zpřístupnit +jako objekt, na který lze počkat pomocí await. +Použití je opět popsáno v dokumentaci.

+

Občas vás při programování s asyncio zaskočí zrádná chyba. +V takových případech je dobré zapnout debug režim pomocí proměnné prostředí PYTHONASYNCIODEBUG=1. +V tomto režimu asyncio upozorňuje na časté chyby, do některých chybových výpisů přidává informaci o tom, +kde aktuální Task vznikl, apod. +Více informací je zase v dokumentaci.

+

Alternativní smyčky událostí

+

Jak bylo zmíněno na začátku, hlavní cíl asyncio je definovat společné rozhraní +pro různé asynchronní knihovny, aby bylo možné např. kombinovat knihovny pro +Tornado se smyčkou událostí v Twisted. +Samotné asyncio je jen jedna z mnoha implementací tohoto rozhraní. +Zajímavá je například knihovna uvloop, která je asi 2-4× rychlejší než asyncio +(ale má závislosti, které se pro součást standardní knihovny nehodí).

+

Další zajímavá implementace je asyncqt, která pod standardním asyncio API používá +smyčku událostí z Qt. +Umožňuje tak efektivně zpracovávat Qt události zároveň s asynchronními funkcemi +známými z asyncio.

+

Event loop z asyncqt je potřeba na začátku programu naimportovat a nastavit +jako hlavní smyčku událostí, a poté ji, místo Qt-ovského app.exec(), spustit. +Jednotlivé asynchronní funkce se pak používají jako v čistém asyncio: +pomocí asyncio.ensure_future, await, atd.

+

Ukázka:

+
import asyncio
+
+from PyQt5 import QtGui, QtWidgets
+from asyncqt import QEventLoop
+
+app = QtWidgets.QApplication([])
+loop = QEventLoop(app)
+asyncio.set_event_loop(loop)
+
+display = QtWidgets.QLCDNumber()
+display.setWindowTitle('Stopwatch')
+
+display.show()
+
+async def update_time():
+    value = 0
+    while True:
+        display.display(value)
+        await asyncio.sleep(1)
+        value += 1
+
+asyncio.ensure_future(update_time())
+
+loop.run_forever()
+

Komunikace

+

Ono io v asyncio naznačuje, že je tato knihovna dělaná především na +vstup a výstup – konkrétně na komunikaci přes síť (případně s jinými procesy).

+

Ke komunikaci používá asyncio tři úrovně abstrakce: Transport, Protocol +a Stream. +V krátkosti si je tu popíšeme; detaily pak najdete v dokumentaci (je pro nás +totiž mnohem důležitější abyste pochopili principy, než abyste uměli konkrétní +API, které lze dohledat v dokumentaci).

+

Transporty a protokoly jsou postaveny na konceptech knihovny Twisted.

+

Transport zajišťuje samotné posílání bajtů mezi počítači (transportní vrstvu), kdežto +Protocol implementuje nějaký aplikační protokol. +Transport většinou nepíšeme sami, použijeme existující. +V asyncio jsou zabudované transporty pro TCP, UDP a SSL. +Protocol je pak použit pro implementaci konkrétních protokolů jako +HTTP, FTP a podobně. +V dokumentaci najdete podrobnější popis včetně příkladů.

+

Kromě toho existuje i „Stream API“ založené na asynchronních funkcích. +Většinou platí, že operace otevření, čtení, flush a zavření Streamu +jsou asynchronní funkce (v dokumentaci označované jako coroutines), a je +tedy nutné je použít s await; oproti tomu zápis asynchronní není – data +se uloží do bufferu a pošlou se, až to bude možné.

+

Typicky ale místo čistého asyncio použijeme existující knihovnu. +Tady je příklad z knihovny aiohttp, která implementuje server a klienta +pro HTTP:

+
import asyncio
+import aiohttp
+
+async def main(url):
+    # Use a a session
+    session = aiohttp.ClientSession()
+    async with session:
+
+        # Get the response (acts somewhat like a file; needs to be closed)
+        async with session.get(url) as response:
+
+            # Fetch the whole text
+            html = await response.text()
+            print(html)
+
+loop = asyncio.get_event_loop()
+loop.run_until_complete(main('http://python.cz'))
+loop.close()
+
\ No newline at end of file diff --git a/mi-pyt/click/index.html b/mi-pyt/click/index.html new file mode 100644 index 00000000..b81c3f7a --- /dev/null +++ b/mi-pyt/click/index.html @@ -0,0 +1,189 @@ +

click

+

Nechme internety na chvíli být a pojďme se podívat na úplně jinou knihovnu, +click.

+

Knihovna click slouží k vytváření rozhraní pro příkazovou řádku +(angl. command line interface, CLI). +Primárně to je zpracování argumentů, ale click umí zjednodušit i výstup.

+

Click je dobré používat s knihovnou colorama, která se stará o obarvování +textu na příkazové řádce ve Windows (a na Unixu nedělá nic). +Nainstalujte si tedy obě:

+
$ python -m pip install click colorama
+

Argumenty příkazové řádky

+

Nástroje na zpracování argumentů z CLI jsou i přímo ve standardní knihovně, +a dokonce jich není málo: sys.argv, argparse, optparse, getopt. +S knihovnou click je ale práce mnohem příjemnější a výsledky většinou +lépe odpovídají zavedeným konvencím.

+

Cena za jednoduchost a konzistenci je, že některé styly návrhu CLI click +nepodporuje. +Máte-li existující rozhraní, které chcete jen převést do Pythonu, +click nejspíš nebude nejlepší volba.

+

Takto jednoduše se dá vytvořit aplikace s přepínači:

+
import click
+
+@click.command()
+@click.option('--count', default=1,  metavar='COUNT',
+              help='Number of greetings.')
+@click.option('--name', prompt='Your name', metavar='NAME',
+              help='The person to greet.')
+def hello(count, name):
+    """Simple program that greets NAME for a total of COUNT times."""
+    for x in range(count):
+        click.echo(f'Hello {name}!')
+
+if __name__ == '__main__':
+    hello()
+

Vyzkoušejte si ji! Máte-li ji uloženou jako hello.py, zkuste:

+
$ python hello.py
+$ python hello.py --help
+$ python hello.py --name Pythonista
+$ python hello.py --count 5
+

Příkazy a přepínače

+

Funkce s dekorátorem @click.command je příkaz – když ji zavoláte, +click zpracuje argumenty příkazové řádky a zavolá původní funkci +s příslušnými pythonními hodnotami. +Proto se dává do bloku if __name__ == '__main__':, který se spustí, jen +když se pythonní soubor spoustí „přímo“. +Když je soubor importován, tenhle blok se neprovede.

+

Dekorátory @click.option a @click.argument pak přidávají přepínače +a argumenty.

+

Přepínače (angl. options), přidávané pomocí option, jsou nepovinné +parametry, kterými se nějak obměňuje chování programu. +Pokud uživatel nějaký přepínač nezadá, použije se hodnota zadaná jako default +(nebo None, když default chybí).

+

Podle default se řídí i typ argumentu, není-li dán explicitně. +Takže count v příkladu výše je celé číslo.

+

Jména přepínačů začínají, podle Unixové konvence, pomlčkami: jednou pomlčkou +pro jednopísmenné zkratky, dvěma pomlčkami pro vícepísmenná jména. +Jeden přepínač může mít i víc jmen.

+

Speciální případ jsou booleovské přepínače, které mají jedno jméno +pro True a jiné pro False. Lze samozřejmě také vytvořit bezhodnotový +přepínač pomocí is_flag.

+
import click
+
+@click.command()
+@click.option('-n', '--name', default='world',
+              help='Name of the person to greet')
+@click.option('-c/-C', '--color/--no-color',
+              help='Make the output colorful')
+@click.option('-v', '--verbose', is_flag=True,
+              help='More verbose output')
+def hello(name, color, verbose):
+    if color:
+        name = click.style(name, fg='blue')
+    click.echo(f'Hello {name}!')
+    if verbose:
+        click.echo('Nice to meet you.')
+
+if __name__ == '__main__':
+    hello()
+
$ python hello.py
+Hello world!
+$ python hello.py --name Guido
+Hello Guido!
+$ python hello.py --name Jane -v
+Hello Jane!
+Nice to meet you.
+$ python hello.py -n 'Mr. Git'
+Hello Mr. Git!
+$ python hello.py --help
+Usage: hello.py [OPTIONS]
+
+Options:
+  -n, --name TEXT               Name of the person to greet
+  -c, --color / -C, --no-color  Make the output colorful
+  --help                        Show this message and exit.
+

Přepínač --help přidává click sám.

+

Argumenty

+

Kromě přepínačů podporuje click i argumenty. +Přepínače musí uživatel na řádce pojmenovat; argumenty se zadávají beze jména, +ale záleží u nich na pořadí. +Používají se ve dvou případech: pro povinné parametry a pro parametry, kterých +může být zadán libovolný počet. +Na všechno ostatní radši použijte přepínače.

+

Například příkaz cd potřebuje jeden argument: jméno adresáře, +do kterého má přepnout. +Jeho rozhraní by v clicku vypadalo takto:

+
@click.command()
+@click.argument('directory')
+def cd(directory):
+    """Change the current directory"""
+    click.echo(f'Changing to directory {directory}')
+

Proměnný počet argumentů se zadává pomocí nargs=-1 (0 nebo víc argumentů) +nebo nargs=-1, required=True (1 nebo víc).

+

Například příkaz mv bere N souborů a adresář, kam je přesune. +Takové rozhraní by v clicku vypadalo následovně:

+
@click.command()
+@click.argument('source', nargs=-1, required=True)
+@click.argument('destination')
+def mv(source, destination):
+    """Move any number of files to one destination"""
+    for filename in source:
+        click.echo(f'Moving {filename} to {destination}')
+

Soubory

+

Má-li uživatel zadat jméno souboru, nepoužívejte řetězce, ale speciální typ +click.File(). +Click za vás soubor automaticky otevře a zavře. +Kromě toho podporuje unixovskou konvenci, že - znamená standardní +vstup/výstup.

+

Argument pro File je mód, ve kterém se soubor otevírá, podobně jako pro +funkci open: +'r' pro čtení, 'w' pro zápis.

+
@click.command()
+@click.argument('files', nargs=-1, type=click.File('r'))
+def cat(files):
+    """Print out the contents of the given files"""
+    for file in files:
+        print(file.read(), end='')
+

Existuje i varianta click.Path(), +která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto +poskytuje i jiné další typy.

+

Validace vstupů

+

Vstupy získané z přepínačů i argumentů lze ověřit pomocí +vlastních podmínek a podle toho naprogramovat chování včetně +chybových hlášek. Click však opět nabízí pohodlnější způsob, +a to pomocí callback. +V rámci callback funkce můžete ověřit libovolně hodnotu a/nebo +ji vhodně transformovat. Pokud hodnota neodpovídá požadavkům, +můžete použít vyjímku click.UsageError +nebo click.BadParameter +(vztahuje-li se přímo ke konkrétnímu parametru). Click se pak +sám postará o případné ukončení programu s odpovídající chybovou +hláškou a kódem.

+
def validate_username(ctx, param, value):
+    if 2 <= len(value) <= 8 and re.match('^[a-zA-Z]+[0-9]*$', value):
+        return value.lower()
+    else:
+        raise click.BadParameter('not valid CTU username')
+
+@click.command()
+@click.option('-u', '--username', callback=validate_username)
+def email(username):
+    click.echo(f'{username}@fit.cvut.cz')
+
+if __name__ == '__main__':
+    email()
+

Podpříkazy

+

Click má dobrou podporu pro podpříkazy známé z verzovacích systémů jako git: +příkaz git sám o sobě nedělá nic, jen sdružuje podpříkazy jako git add +a git commit.

+

Umí-li váš program více akcí, souhrnný příkaz označte @click.group() +a jednotlivé podpříkazy pak přidávejte pomocí command():

+
@click.group()
+def git2():
+    pass
+
+@git2.command()
+def commit():
+    message = click.edit('Made some changes')
+    click.echo(f'Making commit with message: {message}')
+
+@git2.command()
+@click.argument('files', nargs=-1)
+def add(files):
+    for file in files:
+        click.echo(f'Adding {file}')
+

A další

+

Tahle lekce není popis všeho, co click umí – je to jen ochutnávka, +abyste věděli, co od téhle knihovny očekávat.

+

Click má velice dobrou dokumentaci, ve které najdete detaily i všechny +ostatní možnosti.

\ No newline at end of file diff --git a/mi-pyt/course.json b/mi-pyt/course.json new file mode 100644 index 00000000..6af4ae30 --- /dev/null +++ b/mi-pyt/course.json @@ -0,0 +1,772 @@ +{ + "api_version": [ + 0, + 3 + ], + "course": { + "description": "Základy již znáte a chcete se dozvědět o dalších možnostech využití Pythonu.", + "edit_info": { + "branch": "main", + "url": "https://github.com/encukou/naucse-python" + }, + "lessons": { + "advanced/generators": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "generators/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/advanced/generators/index.md", + "title": "Generátory", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/advanced/generators/info.yml", + "static_files": {}, + "title": "Generátory" + }, + "fast-track/install": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok a Petr Viktorin, 2016-2017." + ], + "content": { + "path": "install/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/fast-track/install/index.md", + "title": "Vytvoření virtuáního prostředí", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/fast-track/install/info.yml", + "static_files": {}, + "title": "Vytvoření virtuáního prostředí" + }, + "intro/async": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "async/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/async/index.md", + "title": "AsyncIO", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/async/info.yml", + "static_files": {}, + "title": "AsyncIO" + }, + "intro/click": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "click/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/click/index.md", + "title": "Click – Rozhraní pro příkazovou řádku", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/click/info.yml", + "static_files": {}, + "title": "Click – Rozhraní pro příkazovou řádku" + }, + "intro/cython": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "cython/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/cython/index.md", + "title": "Cython", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/cython/info.yml", + "static_files": { + "test_matmul.py": { + "path": "cython/test_matmul.py" + } + }, + "title": "Cython" + }, + "intro/deployment": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "deployment/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/deployment/index.md", + "title": "Deployment webových aplikací", + "vars": { + "coach-present": false, + "mi-pyt": true + } + }, + "pythonanywhere": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "deployment/pythonanywhere.html" + }, + "license": "cc-by-sa-40", + "slug": "pythonanywhere", + "solutions": [], + "source_file": "lessons/intro/deployment/pythonanywhere.md", + "subtitle": "PythonAnywhere", + "title": "Deployment webových aplikací – PythonAnywhere", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/deployment/info.yml", + "static_files": {}, + "title": "Deployment webových aplikací" + }, + "intro/distribution": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "distribution/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/distribution/index.md", + "title": "Moduly", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/distribution/info.yml", + "static_files": {}, + "title": "Moduly" + }, + "intro/docs": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "docs/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/docs/index.md", + "title": "Dokumentace", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/docs/info.yml", + "static_files": {}, + "title": "Dokumentace" + }, + "intro/flask": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "flask/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/flask/index.md", + "title": "Flask", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/flask/info.yml", + "static_files": {}, + "title": "Flask" + }, + "intro/magic": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "magic/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/magic/index.md", + "title": "Magie", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/magic/info.yml", + "static_files": {}, + "title": "Magie" + }, + "intro/micropython": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "micropython/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/micropython/index.md", + "title": "MicroPython", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/micropython/info.yml", + "static_files": {}, + "title": "MicroPython" + }, + "intro/notebook": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "notebook/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "modules": { + "katex": "0.7.1" + }, + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/notebook/index.ipynb", + "title": "Notebook", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/notebook/info.yml", + "static_files": {}, + "title": "Notebook" + }, + "intro/numpy": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "numpy/index.html" + }, + "license": "cc-by-sa-40", + "modules": { + "katex": "0.7.1" + }, + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/numpy/index.ipynb", + "title": "NumPy", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/numpy/info.yml", + "static_files": { + "python.jpg": { + "path": "numpy/python.jpg" + }, + "sample.wav": { + "path": "numpy/sample.wav" + }, + "secret.png": { + "path": "numpy/secret.png" + } + }, + "title": "NumPy" + }, + "intro/pandas": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "pandas/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pandas/index.ipynb", + "title": "Pandas", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/pandas/info.yml", + "static_files": { + "actors.csv": { + "path": "pandas/actors.csv" + }, + "spouses.csv": { + "path": "pandas/spouses.csv" + }, + "style-table.css": { + "path": "pandas/style-table.css" + } + }, + "title": "Pandas" + }, + "intro/pyqt": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "pyqt/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pyqt/index.md", + "title": "GUI v Pythonu", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/pyqt/info.yml", + "static_files": { + "basic-screenshot.png": { + "path": "pyqt/basic-screenshot.png" + }, + "pics/README/index.md": { + "path": "pyqt/pics/README/index.md" + }, + "pics/arrows/down.svg": { + "path": "pyqt/pics/arrows/down.svg" + }, + "pics/arrows/left.svg": { + "path": "pyqt/pics/arrows/left.svg" + }, + "pics/arrows/right.svg": { + "path": "pyqt/pics/arrows/right.svg" + }, + "pics/arrows/up.svg": { + "path": "pyqt/pics/arrows/up.svg" + }, + "pics/castle.svg": { + "path": "pyqt/pics/castle.svg" + }, + "pics/dude1.svg": { + "path": "pyqt/pics/dude1.svg" + }, + "pics/dude2.svg": { + "path": "pyqt/pics/dude2.svg" + }, + "pics/dude3.svg": { + "path": "pyqt/pics/dude3.svg" + }, + "pics/dude4.svg": { + "path": "pyqt/pics/dude4.svg" + }, + "pics/dude5.svg": { + "path": "pyqt/pics/dude5.svg" + }, + "pics/fish.svg": { + "path": "pyqt/pics/fish.svg" + }, + "pics/fish2.svg": { + "path": "pyqt/pics/fish2.svg" + }, + "pics/grass.svg": { + "path": "pyqt/pics/grass.svg" + }, + "pics/lines/1.svg": { + "path": "pyqt/pics/lines/1.svg" + }, + "pics/lines/10.svg": { + "path": "pyqt/pics/lines/10.svg" + }, + "pics/lines/11.svg": { + "path": "pyqt/pics/lines/11.svg" + }, + "pics/lines/12.svg": { + "path": "pyqt/pics/lines/12.svg" + }, + "pics/lines/13.svg": { + "path": "pyqt/pics/lines/13.svg" + }, + "pics/lines/14.svg": { + "path": "pyqt/pics/lines/14.svg" + }, + "pics/lines/15.svg": { + "path": "pyqt/pics/lines/15.svg" + }, + "pics/lines/2.svg": { + "path": "pyqt/pics/lines/2.svg" + }, + "pics/lines/3.svg": { + "path": "pyqt/pics/lines/3.svg" + }, + "pics/lines/4.svg": { + "path": "pyqt/pics/lines/4.svg" + }, + "pics/lines/5.svg": { + "path": "pyqt/pics/lines/5.svg" + }, + "pics/lines/6.svg": { + "path": "pyqt/pics/lines/6.svg" + }, + "pics/lines/7.svg": { + "path": "pyqt/pics/lines/7.svg" + }, + "pics/lines/8.svg": { + "path": "pyqt/pics/lines/8.svg" + }, + "pics/lines/9.svg": { + "path": "pyqt/pics/lines/9.svg" + }, + "pics/shark.svg": { + "path": "pyqt/pics/shark.svg" + }, + "pics/wall.svg": { + "path": "pyqt/pics/wall.svg" + }, + "pics/wall2.svg": { + "path": "pyqt/pics/wall2.svg" + }, + "pics/water.svg": { + "path": "pyqt/pics/water.svg" + } + }, + "title": "GUI v Pythonu" + }, + "intro/requests": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "requests/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/requests/index.md", + "title": "Requests – Weboví klienti", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/requests/info.yml", + "static_files": {}, + "title": "Requests – Weboví klienti" + }, + "intro/testing": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "testing/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/testing/index.md", + "title": "Testování", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/intro/testing/info.yml", + "static_files": {}, + "title": "Testování" + } + }, + "long_description": "

Díváte se na materiály předmětu MI-PYT (Pokročilý Python) na FIT ČVUT.\nMateriály jsou dostupné v dvojí podobě, interně pro studenty FITu\nna Course Pages a pro všechny veřejně zde.

\n

Tento kurz vzniká pod záštitou firmy Red Hat Czech, s.r.o.

", + "sessions": [ + { + "materials": [ + { + "lesson_slug": "fast-track/install", + "title": "Vytvoření virtuáního prostředí", + "type": "lesson" + }, + { + "lesson_slug": "intro/requests", + "title": "Requests – Weboví klienti", + "type": "lesson" + }, + { + "lesson_slug": "intro/click", + "title": "Click – Rozhraní pro příkazovou řádku", + "type": "lesson" + } + ], + "serial": "1", + "slug": "requests-click", + "source_file": "courses/mi-pyt/info.yml", + "title": "Weboví klienti & CLI – Requests a Click" + }, + { + "materials": [ + { + "lesson_slug": "intro/flask", + "title": "Flask", + "type": "lesson" + }, + { + "lesson_slug": "intro/deployment", + "title": "Deployment webových aplikací", + "type": "lesson" + } + ], + "serial": "2", + "slug": "flask", + "source_file": "courses/mi-pyt/info.yml", + "title": "Webové aplikace – Flask" + }, + { + "materials": [ + { + "lesson_slug": "intro/distribution", + "title": "Moduly", + "type": "lesson" + } + ], + "serial": "3", + "slug": "distribution", + "source_file": "courses/mi-pyt/info.yml", + "title": "Moduly" + }, + { + "materials": [ + { + "lesson_slug": "intro/testing", + "title": "Testování", + "type": "lesson" + } + ], + "serial": "4", + "slug": "testing", + "source_file": "courses/mi-pyt/info.yml", + "title": "Testování" + }, + { + "materials": [ + { + "lesson_slug": "intro/docs", + "title": "Dokumentace", + "type": "lesson" + } + ], + "serial": "5", + "slug": "docs", + "source_file": "courses/mi-pyt/info.yml", + "title": "Dokumentace – Sphinx" + }, + { + "materials": [ + { + "lesson_slug": "intro/notebook", + "title": "Notebook", + "type": "lesson" + }, + { + "lesson_slug": "intro/numpy", + "title": "NumPy", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/numpy/numpy-cs.pdf", + "title": "Tahák na NumPy", + "type": "cheatsheet" + } + ], + "serial": "6", + "slug": "numpy", + "source_file": "courses/mi-pyt/info.yml", + "title": "NumPy" + }, + { + "materials": [ + { + "lesson_slug": "intro/pandas", + "title": "Pandas", + "type": "lesson" + } + ], + "serial": "7", + "slug": "pandas", + "source_file": "courses/mi-pyt/info.yml", + "title": "Analýza dat – Pandas" + }, + { + "materials": [ + { + "lesson_slug": "intro/cython", + "title": "Cython", + "type": "lesson" + } + ], + "serial": "8", + "slug": "cython", + "source_file": "courses/mi-pyt/info.yml", + "title": "Cython" + }, + { + "materials": [ + { + "lesson_slug": "intro/pyqt", + "title": "GUI v Pythonu", + "type": "lesson" + } + ], + "serial": "9", + "slug": "qt", + "source_file": "courses/mi-pyt/info.yml", + "title": "GUI – PyQT" + }, + { + "materials": [ + { + "lesson_slug": "advanced/generators", + "title": "Generátory", + "type": "lesson" + }, + { + "lesson_slug": "intro/async", + "title": "AsyncIO", + "type": "lesson" + } + ], + "serial": "10", + "slug": "async", + "source_file": "courses/mi-pyt/info.yml", + "title": "Generátory a AsyncIO" + }, + { + "materials": [ + { + "lesson_slug": "intro/magic", + "title": "Magie", + "type": "lesson" + } + ], + "serial": "11", + "slug": "magic", + "source_file": "courses/mi-pyt/info.yml", + "title": "Magie" + }, + { + "materials": [ + { + "lesson_slug": "intro/micropython", + "title": "MicroPython", + "type": "lesson" + } + ], + "serial": "12", + "slug": "upy", + "source_file": "courses/mi-pyt/info.yml", + "title": "MicroPython" + } + ], + "source_file": "courses/mi-pyt/info.yml", + "title": "MI-PYT", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } +} \ No newline at end of file diff --git a/mi-pyt/cython/index.html b/mi-pyt/cython/index.html new file mode 100644 index 00000000..13bfa81f --- /dev/null +++ b/mi-pyt/cython/index.html @@ -0,0 +1,590 @@ +

Dnes budeme potřebovat do virtuálního prostředí nainstalovat tyto knihovny:

+
$ python -m pip install --upgrade pip
+$ python -m pip install notebook numpy cython pytest pytest-profiling
+

Také je potřeba nainstalovat překladač jazyka C +a hlavičkové soubory Pythonu:

+
    +
  • Na Linuxu bude stačit nainstalovat balíčky gcc +a python3-devel (Fedora) nebo python3-dev (Ubuntu/Debian).
  • +
  • Na Windows se řiďte instrukcemi pro vaši verzi Pythonu +na Python wiki.
  • +
+
+

C API

+

Mluvíme-li o „Pythonu“, máme často na mysli jak jazyk samotný, tak i interpret, +program, který programy v tomto jazyce umí spouštět. +Správně je ale „Python“ pouze jméno jazyka. +Interpretů tohoto jazyka je více, například:

+
    +
  • CPython, referenční implementace napsaná v C; interpret, který spouštíme příkazem python3
  • +
  • PyPy, implementace zaměřená na rychlost, napsaná v Pythonu
  • +
  • MicroPython, implementace pro mikroprocesory a zařízení s minimem paměti
  • +
  • Jython, implementace napsaná v Javě, která umožňuje využívat javovské třídy
  • +
  • IronPython, napsaný v C#, s integrací do .NET
  • +
  • Batavia, Brython, pyjs – různé pokusy o integraci do JavaScriptu
  • +
+

Jednotlivé interprety se liší v detailech jako jsou přesnost reálných čísel, +vypisování chybových hlášek, řazení záznamů ve slovnících nebo přístup +k interním strukturám interpretu. +Správně napsaný pythonní program by neměl na takových detailech záviset, pokud +není k nekompatibilitě mezi interprety dobrý důvod.

+

Někdy to ale je potřeba, a dnešní přednáška bude specifická pro CPython +a přímé využití jeho API pro jazyk C.

+

Rychlost

+

Častý důvod proč sáhnout k C API je rychlost: CPython je celkem pomalý. +Tradiční metoda optimalizace je zjistit, které části jsou kritické, a přepsat +je do C. +Využijí se tak výhody obou jazyků: Python pro rychlý vývoj, snadné +prototypování a přehlednost kódu, a C pro rychlost.

+

Když je náš program příliš pomalý, je potřeba ho optimalizovat. +První krok k tomu je vždy zkontrolovat, co zabírá více času, než by mělo. +K tomu se dá použít nástroj profile ze standardní knihovny, který vypíše +tabulku počtu volání jednotlivých funkcí a času v nich stráveného:

+
$ python -m profile -s cumtime program.py
+

Profilovat běh pytest testů se dá jednoduše pomocí modulu pytest-profiling:

+
$ python -m pip install pytest-profiling
+$ python -m pytest --profile
+

Když máme představu o tom, co nás brzdí, můžeme začít přepisovat do C způsoby +popsanými níže.

+

Jiná možnost, jak program zrychlit, je ho pustit, tak jak je, pod interpretem +PyPy, který obsahuje optimalizovaný překladač. To je ale jiná kapitola.

+

Externí knihovny

+

Druhý důvod, proč programátoři používají C API, je použití knihoven, které mají +rozhraní pro C. +Takových knihoven existuje mnoho – pokud není něco specifické pro určitý jazyk, +často se to dá volat i z C.

+

Pro práci s externími knihovnami se dá použít C API nebo vestavěný modul +ctypes, ale v dnešní době je dobré místo toho použít CFFI, knihovnu +která funguje i s PyPy (a teoreticky jinými implementacemi).

+

CPython

+

Třetí důvod, proč použít C API, je práce s CPythonem samotným. +Když člověk zabředne do složitého problému, může na CPython pustit C debugger +jako gdb nebo Valgrind, prozkoumat potíže na nižší úrovni +a zjistit, kde přesně se chyba nachází.

+

Modul v C

+

Pojďme začít příkladem. +Vytvořte si následující soubor, který implementuje rozšíření +(importovatelný modul) s jednou funkcí.

+

(Nebudeme chtít, abyste podobný kód uměli napsat, ale měli byste být schopní +porozumět tomu, co dělá.)

+

demo.c:

+
#include <Python.h>
+
+PyDoc_STRVAR(
+    mod_docstring, 
+    "Demo extension module with a Python wrapper for the system(3) function");
+
+static PyObject *demo_system(PyObject *self, PyObject *args){
+    const char *command;
+    int retval;
+
+    /* Parse the given arguments: expect one string, convert to char* */
+    if (!PyArg_ParseTuple(args, "s", &command)) {
+        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
+        return NULL;
+    }
+
+    /* Call the C function */
+    retval = system(command);
+
+    /* Return result as Python int (error handling built in) */
+    return PyLong_FromLong(retval);
+}
+
+/* List of all methods in the module */
+static PyMethodDef DemoMethods[] = {
+    {"system",  demo_system, METH_VARARGS,
+            PyDoc_STR("Execute a shell command.")},
+    {NULL, NULL, 0, NULL}        /* Sentinel */
+};
+
+/* Module specification */
+static struct PyModuleDef demo_module = {
+   PyModuleDef_HEAD_INIT,
+   "demo",          /* name of module */
+   mod_docstring,   /* dosctring (may be NULL) */
+   0,               /* size of per-interpreter state of the module */
+   DemoMethods,     /* list of methods */
+};
+
+
+/* Module entrypoint */
+PyMODINIT_FUNC
+PyInit_demo(void)
+{
+    return PyModuleDef_Init(&demo_module);
+}
+

Z tohoto souboru by měla být patrná struktura podobných rozšíření: +máme funkci (demo_system), která převádí objekty Pythonu +na datové typy C, volá samotnou funkci a výsledek převádí zpět na pythonní +objekt.

+

Dále máme pole záznamů o funkcích (DemoMethods), kde je ke každé funkci +přiřazeno jméno, dokumentační řetězec a způsob volání (v našem případě +METH_VARARGS, tedy volání s proměnným počtem nepojmenovaných argumentů, +podobně jako bychom v Pythonu napsali def system(*args)).

+

Další potřebná proměnná, demo_module, obsahuje informace o modulu: +jméno, dokumentační řetězec a seznam funkcí. +Kdybychom potřebovali kromě funkcí definovat i třídy nebo konstanty, +zde bychom pomocí slotů definovali funkci, která modul +inicializuje, t.j. má podobnou funkci jako __init__ u třídy v Pythonu.

+

Poslední část je funkce PyInit, jediná která není definována jako static, +takže jediná, která je exportována jako API knihovny, kterou vytváříme. +Až bude Python tento modul importovat, najde tuto funkci podle jména, spustí ji +a podle vrácené struktury typu PyModuleDef vytvoří pythonní objekt s modulem.

+

Překlad

+

Abychom mohli takovýto modul naimportovat, musíme ho nejdřív přeložit a sestavit +z něj sdílenou knihovnu – soubor .so (nebo .dll) – s názvem modulu: +buď jen demo.so, nebo i s identifikací architektury a verze Pythonu, +např. demo.cpython-35m-x86_64-linux-gnu.so. +(Výhoda delších názvů je v tom, že v jednom adresáři může být víc modulů pro +různé architektury a že se Python nebude snažit načíst nekompatibilní moduly.)

+

Překlad je nutné provést se správnými přepínači a volbami, nejlépe takovými, +s jakými byl sestaven samotný Python.

+

Pro zjednodušení tohoto procesu můžeme použít setuptools: do nám už známého +souboru setup.py přidáme argument ext_modules se seznamem rozšiřovacích modulů. +Podrobný popis třídy Extension je v dokumentaci; nám bude stačit +jen jméno a seznam zdrojových souborů:

+

setup.py:

+
from setuptools import setup, Extension
+
+module1 = Extension(
+    'demo',
+    sources=['demo.c'],
+)
+
+setup(
+    name = 'demo',
+    version = '0.1',
+    description = 'Demo package',
+    ext_modules = [module1]
+)
+

Příkazy python setup.py sdist a python setup.py install budou fungovat jako normálně, +jen je na instalaci potřeba překladač jazyka C.

+

Aby uživatelé překladač mít nemuseli, můžeme nainstalovat knihovnu wheel (python -m pip install wheel) a pak příkazem python setup.py bdist_wheel vygenerovat tzv. wheel archiv, +např. dist/demo-0.1-cp35-cp35m-linux_x86_64.whl. Tento archiv jde nahrát na PyPI a následně +nainstalovat, ovšem jen na architektuře a verzi Pythonu, pro které byl vytvořen.

+

Existuje způsob, jak vytvořit co nejvíce platformě nezávislý linuxový wheel. +Jedná se o platformu nazvanou manulinux1, což je ve zkratce velmi stará verze +Linuxu (CentOS 5), na které se wheely vytvoří, aby šly použít na různých +novějších i relativně starých distribucích. Pro tvorbu wheelů se používá +Docker obraz manylinux, +vývojáři samozřejmě nepoužívají pro vývoj CentOS 5 (tedy většina ne).

+

Zajímavým nástrojem, který stojí za zmínku, je cibuildwheel. +Zjednodušuje tvorbu wheelů pro Linux, macOS i Windows pomocí +CI služeb Travis CI a AppVeyor.

+

Wheels jdou vytvářet i pro moduly tvořené jen pythonním kódem. +Nejsou pak vázané na verzi a architekturu. +Jejich výhoda oproti sdist archivům spočívá v tom, že se rychleji instalují.

+

Alternativa k instalaci, alespoň pro lokální vývoj, je rozšíření jen přeložit a dát do +aktuálního adresáře (nebo jakéhokoli jiného adresáře, odkud se importují moduly). +K tomu slouží příkaz python setup.py build_ext --inplace. +Pozor na to, že po každé změně zdrojového kódu je potřeba rozšíření znovu přeložit.

+

Příkaz python setup.py develop bude fungovat jako dřív (používá build_ext --inplace), +jen je opět potřeba příkaz po každé změně znovu spustit.

+

PyObject

+

Podívejme se teď na základní mechanismy interpretu CPython.

+

Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject +(dokumentace, +definice). +Skládá se ze dvou prvků:

+
typedef struct _object {
+    Py_ssize_t ob_refcnt;
+    struct _typeobject *ob_type;
+} PyObject;
+

První je počet referencí (reference count), který se dá popsat jako počet míst, +ze kterých je možné k tomuto objektu přistoupit. +Když objekt uložíme do proměnné nebo do seznamu, zvýší se počet referencí o 1. +Když seznam nebo proměnná zanikne (nebo náš objekt přepíšeme jiným), +počet referencí se zase sníží. +Když počet referencí dosáhne nuly, znamená to, že se k objektu už nedá dostat a Python ho +uvolní z paměti.

+

Druhý prvek struktury PyObject je ukazatel na typ. +Typ je pythonní objekt (class), který definuje chování třídy objektů: operátory, +atributy a metody, které ten objekt má.

+

Struktura PyObject slouží jako hlavička, za kterou pak následují data interpretovaná podle +typu daného objektu. +Například pythonní objekt typu float vypadá následovně:

+
typedef struct {
+    PyObject ob_base;
+    double ob_fval;
+} PyFloatObject;
+

...tedy struktura PyObject, za kterou je v paměti číselná hodnota.

+

Seznamy obsahují za hlavičkou např. velikost a (ukazatel na) pole ukazatelů na jednotlivé +prvky. +Podobně objekty typu int (které mají v Pythonu neomezený rozsah) mají délku a pole +jednotlivých 30bitových „číslic“. +NumPy matice mají metadata (velikost, typ, popis rozložení v paměti) a ukazatel na pole hodnot.

+

To základní, co potřebujeme vědět, je, že na úrovni C je každý pythonní objekt reprezentován +jako struktura počtu referencí, ukazatele na typ a dat specifických pro daný typ.

+

Reference counting

+

Tak jako v C je důležité správně alokovat a dealokovat paměť, při tvorbě rozšíření do CPythonu +je třeba správně pracovat s referencemi: ke každému Py_INCREF (přičtení 1 k počtu referencí) +je potřeba později zavolat Py_DECREF (odečtení 1 a případné uvolnění objektu). +Jakákoli práce s objektem se smí provádět jen mezi INCREF a příslušným DECREF.

+

Platí konvence, že argumenty funkcí se předávají jako tzv. borrowed reference: o počitadlo +se stará volající a v průběhu volané funkce se objekt dá používat. +Pokud bychom ale argument potřebovali i po skončení volané funkce (např. si ho uložíme +do globální proměnné), je potřeba mu počitadlo zvýšit (a po skončení práce zase snížit).

+

V našem modulu demo přebíráme jako parametr n-tici. +Zodpovědnost zavolat na tuto n-tici Py_DECREF má ale volající, ne my. +Zavoláním funkce PyArg_ParseTuple získáme char*, který ale můžeme používat jen v rámci naší +funkce: po jejím skončení může volající argumenty funkce uvolnit, a tím řetězec zrušit.

+

Funkce, které vracejí pythonní objekty, předpokládají, že na vrácenou hodnotu provede DECREF volající. +V modulu demo voláme funkci PyLong_FromLong, která vytvoří nové pythonní číslo. +Za vzniklou referenci naše funkce přebírá zodpovědnost, je tedy na nás, abychom se postarali +o zavolání Py_DECREF. +Vrácením výsledku tuto zodpovědnost ale předáváme na funkci, která volá tu naši.

+

Hodnoty a výjimky

+

Další konvence, kterou většina funkcí v C API dodržuje, je způsob vracení výjimek.

+

Funkce, které vrací pythonní objekty, na úrovni C vrací PyObject*. +Nastane-li výjimka, objekt výjimky se zaznamená do globální (přesněji, thread-local) +proměnné a funkce vrátí NULL.

+

V našem modulu demo voláme funkci PyArg_ParseTuple, která může vyvolat výjimku: typicky +TypeError kvůli nesprávnému počtu nebo typu argumentů. +V takovém případě tato funkce výjimku zaznamená a vrátí NULL. +Naší funkci system už stačí vrátit NULL, protože víme, že výjimka už je zaznamenaná.

+

Další funkce, která může neuspět, je PyLong_FromLong. +Vzhledem k tomu, že její výsledek rovnou vracíme, není potřeba úspěch kontrolovat – vrátíme +buď správnou hodnotu nebo NULL se zaznamenanou výjimkou.

+

GIL

+

Poslední omezení, kterého si autor rozšíření musí být vědom, je Global Interpreter Lock. +Stručně řečeno, s objekty PyObject* může pracovat pouze jedno vlákno. +Toto vlákno drží globální zámek, který čas od času odemkne a znovu se pokusí zamknout, +aby mohly běžet i ostatní vlákna.

+

Díky GIL je vícevláknové programování v Pythonu relativně bezpečné: nemůže např. nastat souběh +(race condition), kdy by se nastavilo počitadlo referencí na špatnou hodnotu. +Na druhou stranu tento zámek ale omezuje paralelismus, a tedy i rychlost programu.

+

Globální zámek se dá odemknout v situacích, kdy nepracujeme s PyObject* a nevoláme pythonní kód. +Například čtení ze souboru nebo sítě ostatní vlákna neblokuje. +Stejně tak maticové operace v NumPy typicky nedrží GIL zatímco počítají na úrovni C nebo Fortranu.

+

Cython

+

Teď, když víme jak to všechno funguje, se můžeme podívat na způsob, jak rozšíření psát +jednoduše. +C API se totiž dá použít nejen z C, ale z jakéhokoli jazyka, který umí volat funkce se +stejnými konvencemi, např. C++ (s pomocí extern C). +Další způsob, jak použít C API ale nepsat C, je použít překladač z příjemnějšího jazyka do C.

+

Jeden takový jazyk je Cython (neplést s CPython).

+

Cython je jazyk podobný Pythonu, který ale lze přeložit na C a dále optimalizovat.

+

Cython si nainstalujte pomocí příkazu:

+
$ python -m pip install cython
+

Kompilace Pythonu

+

Když chceme převést modul z Pythonu do Cythonu, nejjednodušší začátek je přejmenovat soubor .py +na .pyx, aby bylo jasné, že jde o jiný jazyk, který nepůjde naimportovat přímo.

+

Jazyky Python a Cython nejsou 100% kompatibilní, ale zvláště u kódu, který pracuje hlavně s +čísly, se nekompatibilita neprojeví. +Vývojáři Cythonu považují každou odchylku od specifikace jazyka za chybu, kterou je nutno opravit.

+

Jako příklad můžete použít tuto naivní implementaci celočíselného a maticového násobení. +Uložte si ji jako matmul.py:

+
import numpy
+
+def intmul(a, b):
+    result = a * b
+    return result
+
+def matmul(a, b):
+    n = a.shape[0]
+    m = a.shape[1]
+    if b.shape[0] != m:
+        raise ValueError('incompatible sizes')
+    p = b.shape[1]
+    result = numpy.zeros((n, p))
+    for i in range(n):
+        for j in range(p):
+            for k in range(m):
+                x = a[i, k]
+                y = b[k, j]
+                result[i, j] += x * y
+    return result
+

Stáhněte si testy a zkontrolujte, že prochází.

+

Potom soubor přejmenujte na matmul.pyx.

+

Výsledek bychom mohli převést na C pomocí příkazu cython -3 matmul.pyx, čímž +vznikne matmul.c. Ten můžeme přeložit výše uvedeným způsobem.

+

Jednodušší varianta je použít Cython v setup.py. +Pro naše účely bude setup.py s Cythonem a NumPy vypadat takto:

+
from setuptools import setup
+from Cython.Build import cythonize
+import numpy
+
+setup(
+    name='matmul',
+    ext_modules=cythonize('matmul.pyx', language_level=3),
+    include_dirs=[numpy.get_include()],
+    setup_requires=[
+        'Cython',
+        'NumPy',
+    ],
+    install_requires=[
+        'NumPy',
+    ],
+)
+

V případě problémech s nefungujícím include_dirs na systému macOS +použijte komplikovanější variantu:

+
from distutils.extension import Extension
+...
+ext_modules = cythonize([Extension('matmul', ['matmul.pyx'],
+                                   include_dirs=[numpy.get_include()])],
+                        language_level=3)
+

Po zadání python setup.py develop nebo python setup.py build_ext --inplace atp. +se modul matmul.pyx zkompiluje s použitím nainstalovaného NumPy a bude připraven na použití. +(Zkontrolujte, že testy prochází i se zkompilovaným modulem.)

+

Nevýhoda tohoto přístupu je, že k spuštění takového setup.py je již potřeba +mít nainstalovaný cython a numpy. +Instalace z archivu sdist se tedy nemusí povést – je potřeba uživatelům říct, +že dané moduly už musí mít nainstalované. +Tento problém aktuálně řeší PyPA (správci pip a setuptools).

+

Instalace z archivů wheel by měla být bezproblémová.

+

Anotace

+

Kód, který takto vznikne, není o moc rychlejší než původní Python. +Je to tím, že sekvence příkazů ve funkci je sice převedená do C a přeložená do strojového kódu, +ale každá operace pracuje s generickými pythonními objekty, takže musí pro každé číslo +číslo z matice zkonstruovat pythonní objekt, vyhledat implementaci sčítání pro dvě celá čísla, +a výsledek převést zpět na int64 a uložit do matice.

+

Na situaci se můžeme podívat pomocí přepínače --annotate:

+
$ cython -3 --annotate matmul.pyx
+

To vygeneruje soubor matmul.html, kde jsou potencionálně pomalé operace vysvíceny žlutě. +Ke každému řádku se navíc dá kliknutím ukázat odpovídající kód v C (který bývá docela složitý, +protože řeší věci jako zpětnou kompatibilitu a ošetřování chyb, a navíc používá hodně pomocných +maker).

+

Obecně nebývá problém mít „žluté“ ty řádky, které se ve funkci provádí pouze jednou. +Ale v cyklech, zvláště těch třikrát zanořených, se autor rozšíření typicky snaží žlutým řádkům +vyhnout. +Nejjednodušší způsob, jak toho docílit, je doplnění statických informací o typech.

+

Doplnění typů

+

Začneme u funkce intmul, kde doplníme informaci o tom, že parametry a a b a proměnná +result jsou typu int. +Parametrům stačí doplnit typ podobně jako v C, ostatní lokální proměnné potřebují definici pomocí +příkazu cdef:

+
def intmul(int a, int b):
+    cdef int result
+    result = a * b
+    return result
+

Teď bude funkce nepatrně rychlejší, ale také méně obecná: nejde jí násobit řetězec číslem, +ale ani reálná čísla (float), a dokonce ani celá čísla, která se nevejdou do 64 bitů (příp. +jiné velikosti, dle systému). +Typ int v Cythonu je totiž int z C, ne ten neomezený z Pythonu.

+

Další věc, kterou můžeme udělat, je změnit příkaz def na cpdef a doplnit typ návratové +hodnoty:

+
cpdef int intmul(int a, int b):
+    cdef int result
+    result = a * b
+    return result
+

Tím se zbavíme nákladného převodu výsledku na PyObject. +Bohužel ale toto zrychlení pocítíme, jen když takovou funkci zavoláme +z jiné funkce napsané v Cythonu.

+

Tři typy funkcí

+

Funkce jdou deklarovat třemi způsoby:

+
    +
  • def func(...): je funkce, která jde volat z Pythonu i z Cythonu, ale volání z Cythonu je pomalé (argumenty a výsledek se převádí na pythonní objekty a zpět),
  • +
  • cdef <type> func(...): je funkce, která jde volat pouze z Cythonu, ale volání je rychlé (pracuje se s C typy),
  • +
  • cpdef <type> func(...): je funkce, která se z Cythonu volá rychle, ale jde volat i z Pythonu (ve skutečnosti Cython vytvoří dva druhy této funkce).
  • +
+

Třídy

+

Cython umožňuje vytvářet tzv. built-in třídy: stejný druh tříd jako je +např. str nebo int. +Práce s takovými třídami je rychlejší, ale mají pevně danou strukturu. +Ani jim ani jejich instancím nelze z Pythonu nastavovat nové atributy:

+
>>> "foo".bar = 3
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+AttributeError: 'str' object has no attribute 'bar'
+

Příklad definice built-in třídy:

+
cdef class Foo:
+    # Všechny členské proměnné musí být nadefinované tady
+    cdef int foo
+    ...
+
+    def __cinit__(self, int f):
+        # Inicializace třídy.
+        # Cython zajistí, že se tato funkce zavolá pouze jednou (na rozdíl
+        # od __init__, kterou lze z pythonního kódu zavolat kdykoli)
+        self.foo = f
+        ...
+
+    def __dealloc__(self):
+        # Deinicializace třídy
+        ...
+
+    cpdef int method(self):
+        ...
+        return self.foo
+

Více o definici tříd najdete v dokumentaci Cythonu.

+

Používání NumPy

+

Pro funkci matmul můžeme nadefinovat číselné proměnné (n, m, p, i, j, k, x, y) +jako int, ale tím si moc nepomůžeme: většinu času program stráví vybíráním a ukládáním hodnot +z/do matic, a protože Cython nemá informace o tom, že jsou to NumPy matice, používá obecný +protokol pro pythonní kontejnery, takže se každá hodnota převede na pythonní objekt.

+

Je tedy potřeba říct Cythonu, že používáme NumPy matice. +Naštěstí v NumPy existuje integrace s Cythonem, takže můžeme na úrovni C „naimportovat“ +rozšíření pro NumPy:

+
cimport numpy
+

... a potom použít typ „dvourozměrná matice celých čísel“, který se v Cythonu jmenuje +numpy.ndarray[numpy.int64_t, ndim=2]. +Naše funkce tedy bude začínat takto:

+
cpdef numpy.ndarray[numpy.int64_t, ndim=2] matmul(
+        numpy.ndarray[numpy.int64_t, ndim=2] a,
+        numpy.ndarray[numpy.int64_t, ndim=2] b):
+    cdef numpy.ndarray[numpy.int64_t, ndim=2] result
+    ...
+

Kdybychom si nebyli jistí typem matice, můžeme si ho nadefinovat pomocí ctypedef:

+
ctypedef numpy.int64_t DATATYPE
+

...a pak používat tento alias. +Na maticové typy bohužel typedef zatím nefunguje.

+

Pro práci s maticí ASCII znaků lze použít typ numpy.int8_t, ale je třeba při zapisování přímo na konkrétní pozice zapisovat číselný typ char:

+
cdef numpy.ndarray[numpy.int8_t, ndim=2]  directions = numpy.full((h, w), b'#', dtype=('a', 1))
+directions[maze >= 0] = b' '  # Python level, using b' '
+directions[1, 2] == ord('x')  # C level, using char
+

Použití matrix[a, b] je v Cythonu rychlejší než matrix[a][b], protože se +uvnitř dějí jiné věci. Při použití matrix[a, b] u matice deklarované jako +dvourozměrné pole nějakého typu Cython přistoupí přímo k obsahu na úrovni +jazyka C. Při použití matrix[a][b] se ale dějí operace dvě, nejprve +matrix[a] vrací jeden řádek matice a až poté [b] vrací jeden prvek z +tohoto řádku. Obě operace probíhají na úrovni Pythonu a proto budou pomalejší +a při použití --annotate bude řádek s takovou operací označen žlutě.

+

Direktivy

+

Anotací typů matic se naše demo maticového násobení dostalo skoro na úroveň +C, ale ne úplně: řádky, které pracují s maticemi, jsou ve výstupu --annotate +stále trochu žluté. +Cython totiž při každém přístupu k matici kontroluje, jestli nečteme nebo +nezapisujeme mimo pole a případně vyvolá IndexError.

+

Pokud víme – jako v našem případě – že je taková kontrola zbytečná, +můžeme Cythonu říct, aby ji nedělal. +Přístupy mimo pole pak způsobí nedefinované chování (většinou program spadne, +nebo hůř, bude pracovat se špatnými daty). +Kontrola se vypíná direktivou boundscheck, která se dá zadat dvěma hlavními +způsoby: dekorátorem:

+
@cython.boundscheck(False)
+cpdef funkce():
+    ...
+
+

... nebo příkazem with:

+
with cython.boundscheck(False):
+    ...
+
+

... případně i pro celý soubor, viz dokumentace.

+

Další zajímavá direktiva je cython.wraparound(False), která podobným způsobem +vypíná pythonní způsob indexování zápornými čísly: místo indexování od konce +s ní dostaneme nedefinované chování.

+

Seznam dalších direktiv najdete v dokumentaci.

+

Cython podporuje ještě blok with cython.nogil:, který je podobný direktivám, +ale dá se použít jen s with. +V rámci tohoto bloku je odemčený GIL (globální zámek). +Smí se použít, pouze pokud nepracujeme s pythonními objekty – například když +operujeme jen na obsahu už existujících maticí. +Opak je with cython.gil:, kterým zámek zase zamkneme – například když +potřebujeme vyhodit výjimku.

+

Struktury, ukazatele a dynamická alokace

+

Přestože v Cythonu můžete používat pythonní n-tice, slovníky, seznamy a další +podobné nehomogenní typy, jejich použití je pomalé, protože vždy pracují +s pythonními objekty.

+

Pokud máte kód, který potřebuje dočasné pole takových záznamů, +je pro časově kritické části kódu lepší k problému přistoupit spíše „céčkovsky“, +přes alokaci paměti a ukazatele.

+

Následující příklad ukazuje, jak naplnit pole heterogenních záznamů:

+
# Import funkcí pro alokaci paměti – chovají se jako malloc() apod.
+from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
+
+# Definice struktury
+cdef struct coords:
+    int row
+    int column
+    char data
+
+MAXSIZE = ...
+
+def path(...):
+    # Definice ukazatele, přetypování
+    cdef coords * path = <coords *>PyMem_Malloc(MAXSIZE*sizeof(coords))
+    if path == NULL:
+        # nedostatek paměti
+        raise MemoryError()
+
+    cdef int used = 0
+    for ...:
+        ...
+
+        #
+        path[used] = coords(row, column, data)
+        used += 1
+
+    # pole můžeme používat
+    ...
+
+    # a musíme ho před vrácením předělat na list
+    lpath = []
+    cdef int i
+    for i in range(used):
+        lpath.append(path[i])
+
+    # a uvolnit
+    PyMem_Free(path)
+    return lpath
+

Pro homogenní pole ale doporučujeme spíše NumPy matice.

+

Následující příklad ukazuje, jak lze přiřazovat do struktur:

+
cdef struct coord:
+    float x
+    float y
+    float z
+
+cdef coord a = coord(0.0, 2.0, 1.5)
+
+cdef coord b = coord(x=0.0, y=2.0, z=1.5)
+
+cdef coord c
+
+c.x = 42.0
+c.y = 2.0
+c.z = 4.0
+
+cdef coord d = {'x':2.0,
+                'y':0.0,
+                'z':-0.75}
+

Použití knihoven z C

+

Pro použití C knihoven z Pythonu je lepší použít CFFI. +Ale když už píšete kód v Cythonu +a potřebujete zavolat nějakou C funkci, můžete to udělat takto:

+
cdef extern from "stdlib.h":
+    int rand()
+    void srand(long int seedval)
+
+cdef extern from "time.h":
+    ctypedef long time_t
+    long int time(time_t *)
+
+srand(time(NULL))
+print(rand())
+

Deklarace můžete vložit přímo do .pyx souboru, ale pokud je chcete používat +z různých míst, pojmenujte soubor .pxd, to vám umožní na něj použít cimport.

+

Pro části standardní knihovny jsou takové deklarace již v Cythonu +předpřipravené, můžete tedy použít cimport rovnou:

+
from libc.stdlib cimport rand, srand
+from libc.time cimport time
+
+srand(time(NULL))
+print(rand())
+

Zkratky: pyximport a %%cython

+

Pro interaktivní práci v Jupyter Notebook má Cython vlastní „magii“. +Na začátku Notebooku můžeme zadat:

+
%load_ext cython
+

a potom můžeme na začátku kterékoli buňky zadat %%cython:

+
%%cython
+
+cpdef int mul(int a, int b):
+    return a * b
+

Kód v takové buňce pak Notebook zkompiluje Cythonem a funkce/proměnné v něm +nadefinované dá k dispozici.

+

Můžeme použít i %%cython --annotate, což vypíše anotace přímo do Notebooku.

+

Další zkratka je modul pyximort, který dává možnost importovat moduly .pyx +přímo: hledají se podobně jako .py nebo .so a před importem se zkompilují. +Zapíná se to následovně:

+
import pyximport
+pyximport.install()
+
+import matmul
+

Video

+

Před nedávnem měl Miro na Středisku unixových technologií nahrávanou ukázku přepsání +úlohy ruksaku z předmětu MI-PAA z Pythonu do Cythonu (včetně nepříjemného záseku a live +ukázky debugování problému). +Na video se můžete podívat, mohlo by vám prozradit spoustu tipů, které se vám mohou hodit +ke splnění úlohy. +K obsahu jen dodáme, že místo malloc a free je lepší použít PyMem_Malloc a +PyMem_Free z ukázky výše.

\ No newline at end of file diff --git a/mi-pyt/cython/test_matmul.py b/mi-pyt/cython/test_matmul.py new file mode 100644 index 00000000..23004276 --- /dev/null +++ b/mi-pyt/cython/test_matmul.py @@ -0,0 +1,34 @@ +import pytest +import numpy + +import matmul + + +@pytest.mark.parametrize( + ('a', 'b', 'expected'), + ( + (1, 1, 1), + (3, 3, 9), + ) +) +def test_intmul(a, b, expected): + assert matmul.intmul(a, b) == expected + + +@pytest.mark.parametrize( + ('a', 'b', 'expected'), + ( + ([[1, 0], [0, 1]], [[1, 2], [3, 4]], [[1, 2], [3, 4]]), + ([[1, 2], [3, 4]], [[1, 0], [0, 1]], [[1, 2], [3, 4]]), + ([[1, 2], [3, 4]], [[5, 6], [7, 8]], [[19, 22], [43, 50]]), + ([[1, 2, 3, 4]], [[5], [6], [7], [8]], [[70]]), + ([[2]], [[3]], [[6]]), + ) +) +def test_matmul(a, b, expected): + a = numpy.array(a) + b = numpy.array(b) + expected = numpy.array(expected) + result = matmul.matmul(a, b) + assert result.shape == (a.shape[0], b.shape[1]) + assert (result == expected).all() diff --git a/mi-pyt/deployment/index.html b/mi-pyt/deployment/index.html new file mode 100644 index 00000000..15bcb097 --- /dev/null +++ b/mi-pyt/deployment/index.html @@ -0,0 +1,23 @@ +

Deployment webových aplikací

+

Aplikace napsaná v Pythonu běží na našem počítači, ale jak ji dostat do Internetu? +Existují různé možnosti, jednou z nich je nasadit ji do cloudu.

+

Nemáte ještě webovou aplikaci? Můžete vyzkoušet framework +Flask.

+

WSGI

+

Nasazování webových aplikací v Pythnu se opírá o WSGI, +což je standardní pythonní rozhraní pro komunikaci +mezi webovou aplikací a webovým serverem definované v PEPu 333.

+

Naprostá většina webových frameworků v Pythonu toto rozhraní implementuje přímo, +případně k tomuto účelu obsahuje wrapper.

+

Je tedy jedno, jestli používáte Flask, Pyramid, Django, Bottle nebo Falcon, +vždy vaší aplikaci představuje application objekt, který se navenek chová +stejně. Webové frameworky implementují aplikační část WSGI.

+

Stejně tak existují webové servery, které implementují serverovou část WSGI, +například Gunicorn nebo mod_wsgi pro httpd (Apache). Tyto servery umí +pracovat s application objektem a nezajímá je, v jakém frameworku je aplikace +napsaná.

+

Většině cloudových providerům stačí nějakým způsobem application objekt předat +a o zbytek se postarají za vás. Jedním z takových providerů je i +PythonAnywhere.

+

Deployment webových aplikací na PythonAnywhere je popsaný v lekci +PythonAnywhere.

\ No newline at end of file diff --git a/mi-pyt/deployment/pythonanywhere.html b/mi-pyt/deployment/pythonanywhere.html new file mode 100644 index 00000000..961daaad --- /dev/null +++ b/mi-pyt/deployment/pythonanywhere.html @@ -0,0 +1,77 @@ +

Deployment webových aplikací na PythonAnywhere

+

PythonAnywhere je pro limitované použití zdarma.

+

K posílání kódu na produkční prostředí budeme používat Git. +Nejprve proto uložte celý projekt do Gitu a nahrajte na GitHub.

+

Potom se zaregistrujte na +www.pythonanywhere.com a vyberte +Beginner Account. +Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. +V té vytvořte a aktivujte virtuální prostředí a nainstalujte Flask (plus +případně další závislosti nebo jiný webový framework).

+

PythonAnywhere používá specificky nastavený Linux, +tak je ve webové konzoli potřeba použít jiný příkaz +na vytvoření virtuální prostředí, než jste z toho kurzu zvyklí. +Napište příkazy takto (bez úvodního $):

+
$ virtualenv --python=python3.7 __venv__
+$ . __venv__/bin/activate
+$ python -m pip install flask
+

Pokud máte na PythonAnywhere starší účet, možná tam Python 3.7 nenajdete. +Můžete použít Python 3.6, nemělo by to vadit, protože tento návod je +koncipován tak, aby s touto verzí také fungoval. +Případně můžete zažádat o aktualizaci systémové +image.

+

Následně naklonujte na PythonAnywhere váš kód. +S veřejným repozitářem je to jednodušší – stačí ho naklonovat „anonymně” +(git clone https://github.com/<github-username>/<github-repo>). +Pokud ale používáme privátní repozitář, bude potřeba si vygenerovat SSH klíč:

+
$ ssh-keygen  # (zeptá se na hesla ke klíči)
+$ cat ~/.ssh/id_rsa.pub
+

Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním +nastavení v sekci "SSH and GPG Keys". +Pak můžete klonovat přes SSH:

+
$ git clone git@github.com:<github-username>/<github-repo>.git
+

Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

+

Přejděte na stránkách PythonAnywhere do Dashboard do záložky Web, +a vytvořte novou aplikaci. +V nastavení zvolte Manual Configuration a Python 3.7. +(Volby jiné než Manual Configuration automaticky vytvoří kostru aplikace. +Vy ale už aplikaci máte hotovou, takže je nepotřebujete.)

+

V konfiguraci vzniklé webové aplikace je potřeba nastavit Virtualenv +na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/__venv__), +a obsah WSGI Configuration File přepsat. +To jde buď kliknutím na odkaz v konfiguraci (otevře se webový editor) +nebo zpět v bashové konzoli pomocí editoru jako vi nebo nano.

+

Nový obsah souboru by měl být:

+
import sys
+path = '/home/<uživatelské-jméno>/<jméno-adresáře>'
+if path not in sys.path:
+    sys.path.append(path)
+
+from <jméno-souboru> import app as application
+

(Za <uživatelské-jméno>, +<jméno-adresáře> a +<jméno-souboru> +je samozřejmě potřeba doplnit +vaše údaje. Jméno souboru je zde bez přípony .py.)

+

Nakonec restartujte aplikaci velkým zeleným tlačítkem na záložce Web +a na adrese <uživatelské-jméno>.pythonanywhere.com +si ji můžete prohlédnout.

+

Deployment soukromých údajů

+

Protože vaše hesla, tajné klíče apod. nejsou v repozitáři, je nutné je předat +aplikaci zvlášť. +Konfigurační i jiné soubory jde nahrát v záložce Files nebo opět vytvořit +a editovat ve webové konzoli.

+

Pokud vaše aplikace vyžaduje nastavení nějakých proměnných prostředí +(například s cestou ke konfiguračnímu souboru nebo přímo s nějakou konfigurací), +můžete tak učinit přímo z WSGI Configuration File. +Buďto „nízkoúrovňově“ (os.environ) nebo více sofistikovaně například pomocí modulu dotenv, +což ostatně doporučují i v dokumentaci.

+

Doporučujeme pro tyto potřeby stejně raději nepoužívat API klíče +k vlastním účtům, raději si vyrobte nějaké účty pouze pro tento účel. +GitHub povoluje všem vytvořit si jeden účet pro automatické operace, ale +takový účet musí mít napsané v popisu, že je robot.

+

Aktualizace

+

Když nahrajeme nový kód na GitHub, je vždy potřeba provést na PythonAnywhere +v konzoli git pull a pak v záložce Web aplikaci restartovat.

+

Placená varianta PythonAnywhere má API a tento proces jde zautomatizovat.

+

Ve verzi zadarmo to není tak pohodlné.

\ No newline at end of file diff --git a/mi-pyt/distribution/index.html b/mi-pyt/distribution/index.html new file mode 100644 index 00000000..6b76ce55 --- /dev/null +++ b/mi-pyt/distribution/index.html @@ -0,0 +1,404 @@ +

Moduly

+

Zatím jsme tvořili programy v Pythonu tak nějak na divoko, tedy v jednom nebo +více souborech bez nějakého zvláštního řádu. V této lekci se podíváme na +to, jak tvořit redistribuovatelné moduly a balíčky, které jdou nahrát na PyPI +(veřejný seznam balíčků pro Python) a instalovat pomocí nástroje pip.

+

Za příklad si vezmeme kód Ondřeje Caletky, který umožňuje určit české svátky +v zadaném roce. Jako příklad je ideální, protože obsahuje jak funkce, které +můžeme volat z Pythonu, tak lze volat z příkazové řádky.

+ +

Volání z příkazové řádky, pomocí příkazu python isholiday.py nebo +python -m isholiday, zajišťuje blok if __name__ == '__main__':. +Toto je rychlý způsob, jak napsat modul, který jde jak importovat, tak spustit. +Když nějaký modul importujeme, má v proměnné __name__ k dispozici své jméno. +„Hlavní” modul ale není importován a jeho jméno není vždy k dispozici +(např. v cat isholiday.py | python). +Python proto __name__ „hlavního” modulu nastavuje na '__main__', +čehož se často využívá.

+

Později se podíváme na elegantnější způsob jak to zařídit; teď se vraťme +zpět k balíčkování.

+

Slovníček pojmů

+

Než se pustíme do samotného výkladu, zavedeme některé pojmy tak, +aby mezi nimi nedošlo v textu záměně. +Anglické pojmy v závorce jsou převzaty z oficiálního glosáře.

+
    +
  • (importovatelný) modul (ModuleImport Package) je cokoliv, +co se dá importovat z Pythonu, v tomto textu tedy především Python soubor nebo adresář s nimi;
  • +
  • balíček (Distribution Package) je instalovatelný archiv obsahují +importovatelné moduly pro Python a další potřebné soubory, může být i rozbalený;
  • +
  • zdrojový balíček (Source Distribution, sdsit) je varianta zabaleného balíčku ve zdrojové formě;
  • +
  • binární balíček (Binary Distribution, bdsit) je varianta zabaleného balíčku v nezdrojové (např. zkompilované) formě;
  • +
  • projekt (Project) je knihovna, framework, skript, plugin, aplikace apod. (či jejich kombinace), které balíme do balíčků.
  • +
+

setup.py

+

Základním stavebním kamenem Python balíčku je soubor setup.py, který +obsahuje všechna potřebná metadata ve volání funkce setup() z modulu +setuptools.

+

Pojďme vytvořit jeho minimální variantu:

+
from setuptools import setup
+
+
+setup(
+    name='isholiday',
+    version='0.1',
+    description='Finds Czech holiday for given year',
+    author='Ondřej Caletka',
+    author_email='ondrej@caletka.cz',
+    license='Public Domain',
+    url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
+    py_modules=['isholiday'],
+)
+

Všimněte si, že jsme balíček pojmenovali stejně jako soubor se zdrojovým kódem +(tedy stejně jako modul). +Je to dobrá konvence, ale není to technicky nutné.

+

Balíček můžeme zkusit nainstalovat do virtuálního prostředí:

+
$ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
+$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
+(__venv__)$ python setup.py install
+...
+(__venv__)$ python
+>>> import isholiday
+>>> 
+(__venv__)$ python -m pip freeze
+isholiday==0.1
+

Souboru setup.py rozumí i nástroj pip, takže můžete použít ten:

+
(__venv__)$ python -m pip install .
+

Mezi výše uvedenými příkazy existují rozdíly, ale pro základní použití se výsledek neliší.

+

Alternativně můžete použít příkaz develop (nebo pip install --editable), +který balíček nainstaluje tak, že změny v souborech se projeví rovnou +(není třeba po každé změněně instalovat znovu).

+

Přes setup.py můžeme dělat i jiné věci, než jen instalovat, například vytvořit archiv, zdrojový balíček:

+
(__venv__)$ python setup.py sdist
+...
+warning: sdist: standard file not found: should have one of README, README.rst, README.txt
+...
+

Extra soubory do zdrojového balíčku

+

Jak vidíte, setuptools si stěžuje, že náš projekt nemá README – soubor, +do kterého se tradičně píšou základní informace o projektu. +Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, +tedy tam, kde byste jej nejspíš čekali.

+
Czech public holiday checker...

Poté spustíme setup.py sdist znovu:

+
(__venv__)$ python setup.py sdist
+

V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam +být i soubor README.

+

Skvělé, pojďme vytvořit i další speciální soubor, LICENSE, který bude +obsahovat text licence, v tomto případě Public Domain. +Obsah najdete třeba na CC0.

+

Pokud ale se souborem LICENSE vytvoříte zdrojový balíček, soubor v archivu +nebude. Je to proto, že se standardně do archivu přidávají jen některé soubory. +Další soubory lze přidat pomocí souboru MANIFEST.in, dle dokumentace.

+

V našem případě bude MANIFEST.in vypadat takto:

+
include LICENSE

Při dalším spuštění už setup.py přidá i soubor LICENSE. +To můžete zkontrolovat i ve výsledném archivu.

+
(__venv__)$ python setup.py sdist
+...
+hard linking LICENSE -> isholiday-0.1
+hard linking MANIFEST.in -> isholiday-0.1
+hard linking README -> isholiday-0.1
+...
+

Hotový balíček pak můžete nainstalovat pomocí nástroje pip. +Doporučuji to dělat v jiném virtuálním prostředí – v aktuálním už ho máte +nainstalovaný.

+
# v jiné konzoli, v jiném adresáři
+$ python3 -m venv __venv2__
+$ . __venv2__/bin/activate
+(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
+Processing cesta/k/projektu/dist/isholiday-0.1.tar.gz
+Installing collected packages: isholiday
+  Running setup.py install for isholiday ... done
+Successfully installed isholiday-0.1
+

Více argumentů pro setup()

+

Na chvíli se vrátíme k volání funkce setup() a přidáme co nejvíc dalších +položek. +Jejich vysvětlení najdete v dokumentaci.

+
from setuptools import setup
+
+
+with open('README') as f:
+    long_description = ''.join(f.readlines())
+
+
+setup(
+    name='isholiday',
+    version='0.1',
+    description='Finds Czech holiday for given year',
+    long_description=long_description,
+    author='Ondřej Caletka',
+    author_email='ondrej@caletka.cz',
+    keywords='holiday,dates',
+    license='Public Domain',
+    url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
+    py_modules=['isholiday'],
+    classifiers=[
+        'Intended Audience :: Developers',
+        'License :: Public Domain',
+        'Operating System :: POSIX :: Linux',
+        'Programming Language :: Python',
+        'Programming Language :: Python :: Implementation :: CPython',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
+        'Topic :: Software Development :: Libraries',
+        ],
+    zip_safe=False,
+)
+

Všimněte si několika věcí. V první řadě v long_description vidíte, že jsme +pořád ještě v Pythonu a můžeme si ušetřit duplikaci nějakých informací pomocí +malého kousku kódu. Dalším zajímavým argumentem je classifiers. Jsou to +v podstatě takové tagy nebo strukturované informace o balíčku. +Zásadně si je nevymýšlíme sami, ale hledáme je v +seznamu. +Tyto informace budou později vidět na PyPI a +půjde podle nich hledat.

+

Argument zip_safe=False zajistí, že se moduly z balíčku nainstalují do adresáře. +Setuptools totiž mají nepříjemný zlozvyk instalovat moduly jako zip, +což komplikuje práci s datovými soubory (např. templates pro Flask). +Je proto lepší zip_safe=False uvést.

+

Více souborů s Python kódem

+

Doteď jsme vytvářeli balíček jen s modulem ve formě jednoho zdrojového souboru isholiday.py. +Co ale dělat, pokud je náš projekt větší a obsahuje souborů více? +Teoreticky je možné je přidat všechny do py_modules, ale není to dobrý nápad.

+

Proč to vlastně není dobrý nápad? Jednotlivé moduly ze všech nainstalovaných +balíčků by byly rozesety bez ladu a skladu mezi ostatními. +Mohl by snadno nastat konflikt v názvech, například pokud by více balíčků +mělo modul utils. +Slušně vychovaný Pythonista dá do každého balíčku právě jeden hlavní modul, +pojmenovaný stejně jako balíček a všechny ostatní moduly zanoří do něj.

+

Raději uděláme modul ve formě složky. V našem případě soubor +isholiday.py zatím přesuneme do isholiday/__init__.py:

+
(__venv__)$ tree
+.
+├── isholiday
+│   └── __init__.py
+├── LICENSE
+├── MANIFEST.in
+├── README
+└── setup.py
+
+1 directory, 5 files
+

Soubor __init__.py jednak značí, že adresář isholiday je importovatelný modul, +a také obsahuje kód, který se spustí při importu modulu isholiday.

+

Musíme ještě mírně upravit setup.py – místo py_modules použijeme packages:

+
diff --git a/setup.py b/setup.py
+index 3a69792..6b453ab 100644
+--- a/setup.py
++++ b/setup.py
+@@ -11,7 +11,7 @@ setup(
+     keywords='holiday,dates',
+     license='Public Domain',
+     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
+-    py_modules=['isholiday'],
++    packages=['isholiday'],
+     classifiers=[
+         'Intended Audience :: Developers',
+         'License :: Public Domain',
+

Případně, což je ještě lepší, můžeme použít find_packages():

+
from setuptools import setup, find_packages
+
+setup(
+    ...
+    packages=find_packages(),
+    ...
+)
+

A jaký je tedy vlastně rozdíl mezi py_modules a packages? +Zjednodušeně: Ten první je na moduly sestávající z jednoho souboru, ten druhý na moduly v adresáři.

+

Momentálně máme všechen kód přímo v __init__.py, což sice funguje, +ale ideální to není. Dobré je mít kód v samostatných souborech a v __init__.py +pouze importovat veřejné rozhraní, tedy to, co budou z vašeho modulu importovat +jeho uživatelé.

+

V souboru __init__.py by tak prakticky žádný kód kromě importů být neměl. +Přesuňte tedy obsah __init__.py do holidays.py a +do __init__.py místo toho napište:

+
from .holidays import getholidays, isholiday
+
+__all__ = ['getholidays', 'isholiday']
+

Tečka v příkazu import není chyba: je to zkratka pro aktuální modul. +Můžeme psát i from isholiday.holidays import ..., +což ale trochu ztěžuje případné přejmenování modulu.

+

Ono __all__ pak explicitně definuje rozhraní modulu. Například s původním +modulem šlo provést from isholiday import datetime, ale asi by nikdo +nečekal, že tahle možnost bude nutně zachována i v příštích verzích knihovny. +Seznamem __all__ dáte najevo, že tyhle funkce nejsou jen „náhodné importy“, +a zároveň tím zamezíte různým varováním o +importovaném ale nevyužitém modulu, které může hlásit vaše IDE nebo linter.

+

Python samotný pak __all__ používá jako seznam proměnných importovaných +přes from isholiday import *. Tento způsob importu nevidíme rádi, +protože znepřehledňuje kód, to ale neznamená, že to musíme uživatelům +naší knihovny znepříjemňovat (např. pro interaktivní režim).

+

Spouštění modulu

+

Pokusíme-li se teď program spustit pomocí python -m isholiday, +narazíme na problém: na rozdíl od souboru se složka s kódem takto spustit nedá:

+
$ python -m isholiday
+python: No module named isholiday.__main__; 'isholiday' is a package and cannot be directly executed
+

Namísto spuštění souboru (typicky s blokem if __name__ == '__main__':) totiž +Python v tomto případě hledá soubor pojmenovaný __main__.py a spustí ten.

+

Soubor __main__.py není určený k tomu, aby se z něho importovalo, proto +by měl obsahovat co nejméně kódu – ideálně jen volání funkce, která je +definovaná jinde. Vytvořte proto __main__.py s následujícím obsahem:

+
from .holidays import main
+
+main()
+

a v holidays.py zaměňte if __name__ == '__main__': za def main():.

+

Modul teď bude možné (opět) spustit pomocí python -m isholiday. +Bude to fungovat i tehdy, když vytvoříte balíček (python setup.py sdist) +a nainstalujete ho v jiném virtuálním prostředí.

+

Programy pro příkazovou řádku

+

Pokud chcete, aby váš modul umožňoval spouštění přímo z příkazové řádky, +bez python -m, měli byste použít entrypoints. +K tomu je potřeba přidat do volání setup v setup.py příslušný argument:

+
setup(
+    ...
+    entry_points={
+        'console_scripts': [
+            'isholiday_demo = isholiday.holidays:main',
+        ],
+    },
+)
+

isholiday_demo je jméno entrypointu, tedy příkazu pro příkazovou řádku. +isholiday.holidays:main je pak cesta k funkci ve tvaru modul:funkce; +funkce může být v modulu definovaná nebo importovaná.

+

Skript bude možné použít, je-li aktivní prostředí, kde je nainstalován, jen +zadáním jména entrypointu:

+
(__venv__)$ python setup.py sdist
+
# v jiné konzoli, v jiném virtuálním prostředí
+(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
+(__venv2__)$ isholiday_demo
+...
+Mon Mar 28 00:00:00 2016 True
+Tue Mar 28 00:00:00 2017 False
+Fri Apr 14 00:00:00 2017 True
+

Specifikace závislostí

+

Balíčky na PyPI mohou záviset na dalších balíčkách. V případě isholiday to +potřeba není, ale v úlohách z minulých cvičení ano.

+

Existuje několik úrovní závislostí, ve většině případů si +vystačíte s argumentem install_requires. +Balíček, který závisí na balíčkách Flask (jakékoli verze) a +click (verze 6 a vyšší) by v setup.py měl mít:

+
setup(
+    ...
+    install_requires=['Flask', 'click>=6'],
+)
+

Soubor requirements.txt

+

Kromě závislostí v setup.py se u pythonních projektů často setkáme se souborem +requirements.txt, který obsahuje přesné verze všech závislostí, včetně +tranzitivních – t.j. závisí-li náš balíček na Flask a Flask na Jinja2, +najdeme v requirements.txt mimo jiné například řádky:

+
Flask==0.11.1
+Jinja2==2.8

Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde +program běží, například mezi testovacím strojem a produkčním nasazením +webové aplikace. +Tento soubor se dá vygenerovat z aktuálního prostředí zadáním +python -m pip freeze > requirements.txt a balíčky v něm se dají nainstalovat +pomocí python -m pip install -r requirements.txt. +My ho používat nebudeme, vystačíme si s volnější specifikací závislostí +v setup.py.

+

Nahrání na PyPI

+

Balíček jde zaregistrovat a nahrát na PyPI. Původně k tomu sloužily příkazy +setup.py register a upload, ale tyto příkazy používaly HTTP, což není +bezpečné. Prototo je lepší použít program twine (instalovatelný přes pip), +který používá HTTPS.

+

Budete si potřebovat zařídit +účet na PyPI, +účet na testovací PyPI +a vytvořit konfigurační soubor ~/.pypirc:

+
[distutils]
+index-servers=
+    pypi
+    testpypi
+
+[pypi]
+username = <your user name goes here>
+password = <your password goes here>
+
+[testpypi]
+repository = https://test.pypi.org/legacy/
+username = <your user name goes here>
+password = <your password goes here>
+

Hesla můžete vynechat, pokud je budete chtít pokaždé zadávat.

+

Používáte-li Windows, je potřeba nastavit proměnnou prostředí HOME na adresář +se souborem .pypirc, např:

+
> set HOME=C:\cesta\k\nastaveni
+

Registrace projektu a nahrání na testovací PyPI se provádí pomocí příkazu +upload: ten projekt zaregistrueje (pokud to jde) a nahraje samotný balíček:

+
(__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
+Uploading distributions to https://test.pypi.org/legacy/
+Uploading isholiday-0.1.tar.gz
+[================================] 8379/8379 - 00:00:02
+

První nahrání se zdaří, jen pokud jméno projektu již není zabrané. +Další nahrávání je povoleno jen vám, případně uživatelům, +kterým to povlíte přes webové rozhraní. +Po úspěšném nahrání lze nahrávat další verze balíčku, ale musí být novější +než ta, co už na PyPI je. Nejde tedy jednou nahraný balíček přepsat.

+

Svůj balíček najdete na https://test.pypi.org/project/<název_balíčku>/.

+

Pro nahrání na opravdovou PyPI stačí vynechat -r testpypi. +Zabírat jména na opravdové PyPI jen tak není hezké vůči ostatním Pythonistům; +registrujte tedy prosím jen balíčky, které budou nějak pro ostatní užitečné.

+

Instalace pomocí pip

+

Projekt nahraný na PyPI by mělo jít nainstalovat pomocí pipu. +V případě použití ostré verze PyPI stačí k instalaci zadat název balíčku:

+
(__venv__)$ python -m pip install <název_balíčku>
+

Pokud však použijeme testovací PyPI, je nutné pipu říct, aby balíček hledal tam. +Postup uvedený v dokumentaci není +v tomto případě nejvhodnější, protože z testovací PyPI vezme jak náš balíček, +tak i případné závislosti, které mohou být zastaralé, rozbité či jinak škodlivé.

+

Lepší by bylo, kdyby pip nainstaloval závislosti z ostré PyPI a na testovací +hledal jen náš projekt. Toho se dá docílit přepínačem --extra-index-url.

+
(__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
+

V tomto případě pip nejdřív prohledá ostrou PyPI, a pokud nenajde požadovaný +balíček, použije testovací PyPI. Zde je potřeba dávat pozor na název projektu, +protože případné konflikty mezi ostrou a testovací PyPI se nekontrolují. +Pokud tedy máme projekt na testovací PyPI a na ostré existuje projekt se +stejným názvem, nainstaluje se ten z ostré verze.

+

V případě, že tento problém nastane, je možné ho částečně obejít specifikací +verze instalovaného balíčku:

+
(__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
+

Pokud u duplicitního projektu na ostré PyPI neexistuje požadovaná verze, +nainstaluje se náš balíček z testovací PyPI.

+

Jiná možnost je zadat přímo cestu k archivu s balíčkem místo jeho názvu. +Zde pak na umístění balíčku ani verzi nezáleží:

+
(__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
+

Odkaz na archiv se dá najít na informační stránce o našem projektu na PyPI.

+

Datové soubory

+

Některé moduly kromě samotného kódu potřebují i datové soubory. +Například aplikace ve Flasku potřebují templates. +Taková data se dají do balíčku přidat parametrem package_data:

+
setup(...,
+    packages=['hello_flask'],
+    ...
+    package_data={'hello_flask': ['templates/*.html']},
+)
+

Další informace jsou odkázané v dokumentaci.

+

Wheel: Binární balíčky

+

Zatím jsme se zabývali jen zdrojovými balíčky (sdist). +Existují ale i balíčky „zkompilované” – binární (bdist). +Když se instaluje zdrojový balíček, vykonává se kód ze souboru setup.py. +Binární balíček se místo toho jen rozbalí na patřičné místo.

+

Z historických důvodů existuje několik různých druhů binárních distribucí, +v současné době je ale důležitá pouze možnost bdist_wheel:

+
(__venv__)$ python setup.py bdist_wheel
+

Výsledek je v souboru dist/*.whl.

+

Pokud vám příkaz nefunguje, nainstalujte balík wheel.

+

Obsah binárního balíčku typu wheel můžete prozkoumat, je to obyčejný ZIP.

+

Naše programy jsou zatím platformně nezávislé a ve wheelu, +i když se jmenuje binární, žádné binární soubory nejsou. +To se ale změní, až se budeme zabývat tvorbou modulů v jazyce C: +sdist pak obsahuje zdrojové soubory a bdist_wheel zkompilované moduly.

+

Potom je dobré distribuovat oba dva – každý má své výhody:

+
    +
  • sdist jde nainstalovat na různých operačních systémech i procesorových +architekturách,
  • +
  • sdist tradičně obsahuje soubory jako LICENSE a README, ale
  • +
  • wheel při instalaci nepotřebuje např. překladače C (všechno už je přeložené +pro konkrétní OS a architekturu), a
  • +
  • wheel se rychleji instaluje.
  • +
+

Proces vydání složitějšího softwaru pak může vypadat takto:

+
(__venv__)$ rm dist/*
+(__venv__)$ python setup.py sdist bdist_wheel
+[... kontrola vytvořených balíčků v „čistém“ virtualenvu ...]
+(__venv__)$ python -m twine upload dist/*
+

Další

+

K balíčkování existuje obsáhlá dokumentace. +Budete-li chtít dělat něco, co v tomto kurzu není, podívejte se tam!

\ No newline at end of file diff --git a/mi-pyt/docs/index.html b/mi-pyt/docs/index.html new file mode 100644 index 00000000..cb65975a --- /dev/null +++ b/mi-pyt/docs/index.html @@ -0,0 +1,389 @@ +

Dokumentace

+

Jednou ze zásadních součástí každého kvalitního Python projektu je dokumentace. +Protože chceme, abyste vytvářeli kvalitní projekty, podíváme se tedy i na +dokumentaci.

+

Sphinx

+

Nejpoužívanějším nástrojem na vytváření dokumentace Python projektů je Sphinx. +Když jste se dívali do dokumentace Flasku, requests, clicku, flexmocku, pytestu, +betamaxu či Pythonu samotného, viděli jste dokumentaci vytvořenou ve Sphinxu.

+

Pro vytvoření základní kostry dokumentace se používá jednoduchý průvodce, +sphinx-quickstart.

+

Postupujte podle následující ukázky. Jsou v ní zobrazeny jen věci, +kde nestačí nechat výchozí hodnota; u ostatních otázek (dostanete-li je) +stačí výchozí hodnotu potvrdit (Enter).

+
$ . __venv__/bin/activate
+(__venv__) $ python -m pip install sphinx
+(__venv__) $ mkdir docs
+(__venv__) $ cd docs
+(__venv__) $ sphinx-quickstart
+Welcome to the Sphinx 1.8.1 quickstart utility.
+
+Please enter values for the following settings (just press Enter to
+accept a default value, if one is given in brackets).
+
+Selected root path: .
+
+You have two options for placing the build directory for Sphinx output.
+Either, you use a directory "_build" within the root path, or you separate
+"source" and "build" directories within the root path.
+> Separate source and build directories (y/n) [n]: 
+
+The project name will occur in several places in the built documentation.
+> Project name: coolthing
+> Author name(s): Pythonista Dokumentarista
+> Project release []:  0.1
+
+...
+
+Finished: An initial directory structure has been created.

Průvodce vytvoří ve složce docs několik souborů:

+
    +
  • conf.py – konfigurační soubor,
  • +
  • index.rst – vlastní text dokumantace,
  • +
  • Makefile, make.bat – spouštěcí soubory,
  • +
  • _static – adresář na obrázky, CSS apod.,
  • +
  • _templates – Adresář na vlastní šablony,
  • +
  • _build – adresář pro výstup, tedy hotovou dokumentaci.
  • +
+

Do gitu patří všechny nyní vytvořené soubory, kromě složky docs/_build, +která by měla být ignorována.

+

Zatím se nebudeme zabývat obsahem těchto souborů, ale zkusíme základní kostru +dokumentace sestavit do HTML.

+

Sphinx umí generovat dokumentaci ve více formátech (LaTeX, +manuálové stránky atd.), pro nás bude podstatné především HTML.

+
(__venv__) $ make html
+...
+The HTML pages are in _build/html.
+

Ve zmíněné složce byste měli najít index.html, ten si můžete prohlédnout +v prohlížeči.

+

Textový obsah v dokumentaci

+

Text dokumentace začíná v souboru index.rst a píše se ve značkovacím formátu +reStructuredText neboli rst. +Ten se od Markdownu liší v syntaxi, která je komplikovanější na +psaní, ale umožňuje dělat komplexnější věci.

+

Dokumentaci lze psát i ve formátu Markdown, +ale tato možnost je poměrně nová. +Jazyk Markdown nebyl navržen pro složitější strukturované texty +a nepodporuje přímo všechny možnosti, které Sphinx nabízí. +V dokumentaci se tak dočtete, jak chybějící možnosti doplnit +vložením reStructuredText do Markdownového dokumentu. +My budeme používat reStructuredText.

+

Pro přehled o tom, co reStructuredText umí a jakou má syntaxi, +můžete použít přehled z dokumentace Sphinxu, případně tahák.

+

V index.rst je seznam kapitol:

+
.. toctree::
+   :maxdepth: 2
+   :caption: Contents:
+

Tam můžete přidat další kapitoly:

+
.. toctree::
+   :maxdepth: 2
+   :caption: Contents:
+
+   intro
+   tutorial/foo
+   tutorial/bar
+   ...
+

Soubory s kapitolami je třeba vytvořit ve složce docs s příponou .rst +(např. tutorial/foo.rst). +Text lze pak přidávat samozřejmě do těchto souborů i do +index.rst.

+

Chcete-li odkazovat na některou sekci, označíme si ji pomocí .. _label::

+
.. _my-reference-label:
+
+Section to cross-reference
+--------------------------
+
+This is the text of the section.
+

Poté na ni lze odkazovat odkudkoli z dokumentace pomocí +konstrukce ref:

+
It refers to the section itself, see :ref:`my-reference-label`.
+It could refer to a different section as well :)
+

Co do dokumentace psát

+

Teď, když víte jak něco napsat, pojďme si povědět co vlastně psát. +K čemu dokumentace vlastně je?

+

Dobrá dokumentace vysvětluje, proč a jak by váš projekt měl někdo používat. +Jak říká Eric Holscher v jedné své prezentaci,

+

Když lidi neví, že váš projekt existuje,
+nebudou ho používat.
+Když lidi nepřijdou na to, jak váš projekt nainstalovat,
+nebudou ho používat.
+Když lidi nepřijdou na to, jak váš projekt použít,
+nebudou ho používat.

+
+

Pokud pracujete v malém týmu, teoreticky jde to všechno kolegům prostě říct, +ale potom se musíte spoléhat na to, že to nezapomenete (a neodejdete z týmu). +Mnohem lepší je dokumentaci sepsat co nejdřív, dokud máte všechno čerstvě +v hlavě.

+

Nechce-li se vám nastavovat Sphinx, můžete informace napsat aspoň do malého +README. Ale i tam by měl být stejný druh informací jako ve „velké“ dokumentaci.

+

Na první stránce dokumentace (nebo v README) typicky najdeme:

+
    +
  • krátký text o tom, co projekt dělá;
  • +
  • ukázku – u knihovny příklad kódu, u aplikace screenshot, u webové aplikace +odkaz na běžící instanci;
  • +
  • návod na instalaci;
  • +
  • odkazy na zbytek dokumentace;
  • +
  • odkazy pro přispěvatele – kde je repozitář, kde nahlásit chybu;
  • +
  • licenci.
  • +
+

Delší dokumentace knihoven pak většinou obsahuje:

+
    +
  • tutoriál – návod, který uživatele provede použitím a možnostmi knihovny;
  • +
  • popis architektury, návrhu, použitých konceptů;
  • +
  • dokumentaci API – popis všech veřejných modulů, tříd, funkcí a podobně;
  • +
  • podrobný návod jak přispívat.
  • +
+

Nastavení a rozšíření

+

Průvodce sphinx-quickstart generuje soubor s nastavením, conf.py, +ve kterém můžete měnit nastavení Sphinxu a jeho rozšíření, včetně detailů +jako jméno a verze projektu.

+

Průvodce automaticky aktivuje tři rozšíření, která jsou obecně užitečná. +To se ale může v jiných verzích Sphinxu měnit, proto teď nastavení +zkontrolujte a případně rozšíření doplňte:

+
extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.doctest',
+    'sphinx.ext.intersphinx',
+]
+

doctest

+

doctest je modul ze standardní knihovny, který najde v dokumentaci bloky kódu +a otestuje, jestli odpovídají ukázanému výstupu. +Rozšíření sphinx.ext.doctest integruje doctest do dokumentů +ve formátu reStructuredText.

+

Pro nás to bude způsob, jak testovat dokumentaci – tedy jestli jsou ukázky +kódu v ní stále platné. +Dá se sice použít i k testování samotného kódu, ale na to existují +lepší nástroje.

+

Můžete to dělat dvěma způsoby. První je mít v dokumentaci +příklad vypadající jako interaktivní konzole. +Takový příklad nemusí být odsazený ani ničím uvozený; stačí >>> na začátku.

+
>>> 1 + 1
+2
+

Doctest v tomto případě otestuje, že vše funguje, jak má. +V tomto případě se provede součet a zkontroluje se, zda výsledek je 2.

+

Druhý způsob je mít v dokumentaci nejdříve kód:

+
print('foo')
+

A dále někde jinde výstup volání:

+
foo
+

K tomu všemu složí několik direktiv:

+

.. testsetup::

+

Direktiva pro potřebný kód, který se musí provést, aby příklad fungoval, ale +nebude v dokumentaci zobrazen (např. kód pro vytvoření falešného objektu, +import...).

+

.. testcleanup::

+

Podobná direktiva jako .. testsetup:: provedená po skončení testů. +V dokumentaci nebude kód zobrazen.

+

.. doctest::

+

Test s interaktivní konzolí. V dokumentaci bude zobrazen, pokud nepoužijete flag +:hide:.

+

.. testcode::

+

Kód testu bez interaktivní konzole, co chcete kontrolovat, musíte dát na +standardní výstup. V dokumentaci bude zobrazen, pokud nepoužijete flag +:hide:.

+

.. testoutput::

+

Výstup posledního testcode bloku. V dokumentaci bude kód zobrazen, pokud +nepoužijete flag :hide:.

+

Kompletní příklad

+

Zde můžete vidět výše zmíněné direktivy použité dohromady. +Jedná se o umělý příklad, kdy použitou třídu připravíme v direktivě testsetup. +V praxi pak doctestem testujeme, jestli naše dokumentace odpovídá chování +naší implementace, třídu Parrot bychom tedy odněkud naimportovali.

+
The parrot module
+=================
+
+.. testsetup::
+
+   class Parrot:
+       def voom(self, voltage):
+           print('This parrot wouldn\'t voom if you put {} volts through it!'.format(voltage))
+
+       def die(self):
+           return 'RIP'
+
+
+   parrot = Parrot()
+
+The parrot module is a module about parrots.
+
+Doctest example:
+
+.. doctest::
+
+   >>> parrot.voom(3000)
+   This parrot wouldn't voom if you put 3000 volts through it!
+
+Test-Output example:
+
+.. testcode::
+
+   parrot.voom(3000)
+
+This would output:
+
+.. testoutput::
+
+   This parrot wouldn't voom if you put 3000 volts through it!
+
+You can use other values:
+
+.. testcode::
+
+   parrot.voom(230)
+
+.. testoutput::
+   :hide:
+
+   This parrot wouldn't voom if you put 230 volts through it!
+
+
+.. testcleanup::
+
+   parrot.die()
+

Testy se také dají např. zařazovat do skupin. Více najdete +v dokumentaci.

+
(__venv__) $ make doctest
+...
+Document: intro
+---------------
+1 items passed all tests:
+   3 tests in default
+3 tests in 1 items.
+3 passed and 0 failed.
+Test passed.
+1 items passed all tests:
+   1 tests in default (cleanup code)
+1 tests in 1 items.
+1 passed and 0 failed.
+Test passed.
+
+Doctest summary
+===============
+    3 tests
+    0 failures in tests
+    0 failures in setup code
+    0 failures in cleanup code
+...
+

Import z vlastního kódu

+

Pokud nemáte nainstalovaný vlastní balíček a budete z něj chtít v doctestu +importovat, pravděpodobně dostanete ImportError. +V takovém případě pomůže drobná editace na začátku conf.py. +Musíte přidat adresář, ze kterého lze váš kód importovat, do sys.path. +Pokud jste postupovali podle návodu výše, máte dokumentaci v adresáři docs, +je tedy potřeba přidat nadřazený adresář (..):

+
# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import sys
+sys.path.insert(0, os.path.abspath('..'))
+

Travis CI

+

Neexistuje zatím unifikovaný způsob, jak specifikovat závislosti pro sestavení +dokumentace. Proto, pokud chcete mít nějaký jednoduchý způsob, jak pouštět +doctesty na Travisu, vytvořte například soubor docs/requirements.txt +a do něj dejte závislosti potřebné pro sestavení dokumentace. +Je na vás, jestli tam budou pouze extra závislosti oproti těm v setup.py +(většinou pouze sphinx), nebo všechny závislosti, aby šel použít soubor +samostatně.

+

Poté na Travisu můžete udělat něco jako:

+
language: python
+python:
+- '3.7'
+install:
+- python setup.py install
+- pip install -r docs/requirements.txt
+script:
+- python setup.py test --addopts -v
+- cd docs && make doctest
+

Chcete-li jít s dobou, můžete vyzkoušet strukturovaný způsob závislostí +pro vývoj pomocí extras. Aktuálně pro to neexistuje standard, +ale vypadá to, že následující způsob je nejlepší kandidát na +standardizaci.

+

Do setup.py přidejte:

+
extras_require={
+    'dev':  ["sphinx"],
+}
+

Projekt pak lze nainstalovat pomocí .[dev] (tedy jméno balíčku a za ním +jméno extras v hranatých závorkách):

+
install:
+- python -m pip install .[dev]

autodoc

+

Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, +které průvodce přidává automaticky.

+

Nemáte-li toto rozšíření povolené, přidejte jej do conf.py:

+
extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.doctest',
+    'sphinx.ext.intersphinx',
+]
+

Rozšíření autodoc se používá takto:

+
.. automodule:: mymodule
+   :members:
+

Tento příklad na dané místo vygeneruje dokumentaci složenou z dokumentačních +řetězců jednotlivých funkcí, tříd a metod v modulu mymodule.

+

Pokud chcete selektivně vybrat, dokumentaci čeho chcete generovat, +můžete použít i +jiné direktivy.

+

Pro vygenerování hezké struktury si můžete pomoci příkazem sphinx-apidoc:

+
(__venv__) $ sphinx-apidoc -o docs mymodule
+

V dokumentačních řetězcích samozřejmě můžete použít reStructuredText a je to +dokonce žádoucí.

+

Zde je ukázka z betamaxu (Copyright 2013 Ian Cordasco):

+
class Betamax:
+
+    """This object contains the main API of the request-vcr library.
+
+    This object is entirely a context manager so all you have to do is:
+
+    .. code::
+
+        s = requests.Session()
+        with Betamax(s) as vcr:
+            vcr.use_cassette('example')
+            r = s.get('https://httpbin.org/get')
+
+    Or more concisely, you can do:
+
+    .. code::
+
+        s = requests.Session()
+        with Betamax(s).use_cassette('example') as vcr:
+            r = s.get('https://httpbin.org/get')
+
+    This object allows for the user to specify the cassette library directory
+    and default cassette options.
+
+    .. code::
+
+        s = requests.Session()
+        with Betamax(s, cassette_library_dir='tests/cassettes') as vcr:
+            vcr.use_cassette('example')
+            r = s.get('https://httpbin.org/get')
+
+        with Betamax(s, default_cassette_options={
+                're_record_interval': 1000
+                }) as vcr:
+            vcr.use_cassette('example')
+            r = s.get('https://httpbin.org/get')
+    """
+

Existují různé způsoby, jak dokumentovat argumenty, návratové hodnoty apod. +Zvídavým studentům doporučujeme podívat se na rozšíření Napoleon.

+

Odkazy na třídy a moduly

+

Máte-li zdokumentovaný modul, funkci, třídu, metodu apod., je možné na ni +odkázat pomocí konstrukce :mod:, :func:, :class:, :meth: a dalších +ze Sphinxové domény Python:

+
To test the parrot's electrical resistance, use :meth:`parrot.voom()`.
+

V této části dokumentace Sphinxu též najdete způsob, jak dokumentovat API +bez použití autodoc.

+

Všechny zdokumentované objekty se automaticky přidávají do rejstříku. +Chcete-li do rejstříku přidat něco navíc, použijte direktivu index.

+

README.rst

+

Když už se stejně zabýváme reStructuredTextem, je dobré váš README přepsat +nebo převést do stejného formátu. Na PyPI pak bude váš projekt vypadat lépe.

+

Při přejmenování na README.rst dejte pozor na patřičné změny v setup.py.

+

Read the Docs

+

Pokud svůj repositář na GitHubu změníte na veřejný, můžete využít službu +Read the Docs k hostování dokumentace ve Sphinxu. +Dokumentace se sestaví při každém pushnutí na GitHub.

+

Pokud Read the Docs použijete, nezapomeňte na dokumentaci odkázat +z README.rst.

\ No newline at end of file diff --git a/mi-pyt/flask/index.html b/mi-pyt/flask/index.html new file mode 100644 index 00000000..6acff63d --- /dev/null +++ b/mi-pyt/flask/index.html @@ -0,0 +1,365 @@ +

Webové aplikace: Flask

+

Python je víceúčelový jazyk. +Na minulém cvičení jsme tvořili aplikace pro příkazovou řádku, +nyní se podíváme na aplikace webové.

+

Webových frameworků pro Python je více, mezi nejznámější patří Django, +Flask nebo Pyramid.

+

Pro naše účely použijeme Flask, protože je nejrychlejší na pochopení a +nevyžaduje striktně použití MVC paradigmatu.

+

Flask

+

Flask opět můžete nainstalovat do virtualenvu, nejlépe použít projekt +z minulého cvičení:

+
$ cd project
+$ . __venv__/bin/activate 
+(__venv__) $ python -m pip install Flask
+

Základní použití Flasku je poměrně primitivní. +Do souboru hello.py napište:

+
from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def index():
+    return 'MI-PYT je nejlepší předmět na FITu!'
+

Pak aplikaci spusťte pomocí následujících příkazů. +(Na Windows použijte místo export příkaz set.)

+
(__venv__) $ export FLASK_APP=hello.py
+(__venv__) $ export FLASK_DEBUG=1
+(__venv__) $ flask run
+ * Serving Flask app "hello"
+ * Forcing debug mode on
+ * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
+ * Restarting with stat
+ * Debugger is active!
+ * Debugger PIN: 189-972-345
+

Na zmíněné adrese byste měli v prohlížeči vidět použitý text.

+

Proměnná prostředí FLASK_APP říká Flasku, kde aplikaci najít. +V daném souboru Flask hledá automaticky proměnnou jménem app. +(Jde nastavit i jiná.) +Proměnná FLASK_DEBUG nastavuje ladícím režim, který si popíšeme za chvíli.

+

V programu jsme jako app vytvořili flaskovou aplikaci. +Argument __name__ je jméno modulu – Flask podle něj hledá soubory, +které k aplikaci patří (viz static a templates níže).

+

Pomocí dekorátoru @app.route jsme zaregistrovali takzvaný view (pohled) – +funkci, která vrací obsah pro danou cestu v URL. +Tomuto spojení cesty a pohledové funkce se říká route (nebo počeštěně „routa“). +My konkrétně říkáme, že na cestě / (tedy na „domovské stránce“) bude +k dispozici obsah, který vrátí funkce index.

+

Více různých adres lze obsloužit jednoduše přidáním dalších funkcí:

+
@app.route('/')
+def index():
+    return 'Index Page'
+
+@app.route('/hello/')
+def hello():
+    return 'Hello, World'
+

Na adrese http://127.0.0.1:5000/hello/ pak uvidíte druhou stránku.

+

Ladící režim

+

Proměnná FLASK_DEBUG říká, že se aplikace má spustit v ladícím režimu: +je zapnutý příjemnější výpis chyb a aplikace se automaticky restartuje +po změnách.

+

Zkuste ve funkci hello() vyvolat výjimku (například dělení nulou – 1/0) +a podívat se, jak chyba v ladícím režimu „vypadá“: +Flask ukáže traceback podobný tomu z příkazové řádky a navíc vám na každé +úrovni umožní pomocí malé ikonky spustit konzoli. +Bezpečnostní PIN k této konzoli najdete v terminálu, kde server běží.

+

Ladící režim je užitečný, ale nebezpečný – návštěvníkům stránky může +(po prolomení celkem jednoduchého „hesla“) umožnit spustit jakýkoli pythonní kód. +Navíc aplikaci zpomaluje. +Používejte ho proto pouze na svém počítači.

+

Dynamické routy

+

Když vytváříte dynamický web, ne vždy můžete všechna URL znát dopředu. +Budete například chctít zobrazit informace o uživatelích na adresách +jako /user/hroncok/, ale nemůžete při každé registraci nového uživatele +přidávat novou funkci do kódu. +Musíte použít dynamické routy:

+
@app.route('/user/<username>/')
+def profile(username):
+    return 'User {}'.format(username)
+

Proměnnou část cesty ohraničíte lomenými závorkami a použijte jako parametr +funkce. Pokud chcete, můžete specifikovat, na jaký obsah se pravidlo vztahuje. +Například číselný idenifikátor článku pro adresy jako /post/42/ můžete zadat +takto:

+
@app.route('/post/<int:post_id>/')
+

Můžete použít různá pravidla, např.:

+
    +
  • string akceptuje jakýkoliv text bez lomítek (výchozí)
  • +
  • int akceptuje celá čísla (a pohledové funkci je předá jako int, ne text)
  • +
  • float akceptuje i desetinná čísla s tečkou (a předá je jako float)
  • +
  • path akceptuje text i s lomítky
  • +
+

Rout můžte definovat i víc pro jednu funkci. +Často se to používá s výchozí hodnotou argumentu:

+
@app.route('/hello/')
+@app.route('/hello/<name>/')
+def hello(name='world'):
+    return 'Hello, {}!'.format(name)
+

Získání URL

+

Opačným způsobem jak k routám přistupovat je, když potřebujete získat URL +nějaké stránky, například protože potřebujete zobrazit odkaz. +K tomu se používá funkce url_for(), která jako první parametr bere jméno +routy (neboli jméno funkce, která routu obsluhuje), a pak pojmenované argumenty +pro pravidla v dynamické routě:

+
from flask import url_for
+
+...
+
+@app.route('/url/')
+def show_url():
+    return url_for('profile', username='hroncok')
+

Tuto funkci jde použít jen uvnitř pohledové funkce, +Pokud ji chcete vyzkoušet například v interaktivní konzoli, +můžete použít speciální kontext:

+
>>> with app.test_request_context():
+...     print(url_for('profile', username='hroncok'))
+... 
+/user/hroncok/
+

Možná si říkáte, proč tu URL prostě nevytvořit ručně. +S takovým přístupem byste ale mohli narazit na problém, pokud cestu později +změníte – což se může stát např. i když web nasadíte na jiný server. +Generování URL vám také může zjednodušit nasazení statické verze stránek.

+

Pro URL v rámci vašich stránek proto doporučujeme url_for používat důsledně.

+

Šablony

+

Zatím jsou naše webové stránky poměrně nudné: obsahují jen prostý text, +nepoužívají HTML.

+

Předpokládáme, že víte co je to HTML a CSS. +Jestli ne, doporučujeme si projít základy těchto webových technologií +např. na stránkách MDN.

+

Klidně byste mohli udělat něco jako:

+
@app.route('/')
+def hello():
+    return '<html><head><title>...'
+

...ale asi by to nebylo příliš příjemné. +Python je jazyk dělaný na popis algoritmů, procesů a logiky spíš než obsahu. +Lepší je HTML dát do zvláštního souboru a použít ho jako šablonu +(angl. template). +Z Flasku vypadá použití šablony takto:

+
from flask import render_template
+
+@app.route('/hello/')
+@app.route('/hello/<name>/')
+def hello(name=None):
+    return render_template('hello.html', name=name)
+

Funkce render_template nejen vrátí HTML z daného souboru, ale umí do něj +i doplnit informace, které dostane v pojmenovaných argumentech.

+

Ukažme si to na příkladu: vedle souboru s kódem vytvořte složku templates +a v ní hello.html s tímto obsahem:

+
<!doctype html>
+<html>
+    <head>
+        <title>Hello from Flask</title>
+    </head>
+    <body>
+        {% if name %}
+            <h1>Hello {{ name }}!</h1>
+            <a href="{{ url_for('hello') }}">Go back home</a>
+        {% else %}
+            <h1>Hello, World!</h1>
+        {% endif %}
+    </body>
+</html>
+

Šablony používají (jako výchozí variantu) šablonovací jazyk Jinja2, +který se s Flaskem a jinými frameworky pro Python používá často. +Kompletní popis jazyka najdete v dokumentaci, ale +pro většinu stránek se obejdete s doplněním hodnoty ({{ promenna }}) +a podmíněným obsahem ({% if %}) jako výše, +případně s cyklem: {% for %}/{% endfor %}. Ve větších +aplikacích se pak hodí použití {% include ... %}, {% extends ... %} +a případně také tvorba maker {% macro ... %}/{% endmacro %}.

+

Veškerý kontext (proměnné) do šablony musí přijít z volání render_template(). +Navíc můžete použít vybrané funkce, např. url_for(). +(Jiné funkce známé z Pythonu ale použít nejdou – ač jsou podobné, je Jinja2 +jiný jazyk než Python.)

+

Filtry

+

Není úplně elegantní vzít nějaká data (např. tweety z Twitter API) a ještě před +předáním šabloně do nich cpát svoje úpravy (např. převod na HTML). +Od toho jsou tu filtry. Filtr transformuje hodnotu na řetězec, +který pak ukážeme uživateli.

+

Zde je například filtr time, který načte čas v určitém formátu +a převede ho do jiného:

+
from datetime import datetime
+
+@app.template_filter('time')
+def convert_time(text):
+    """Convert the time format to a different one"""
+    dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y')
+    return dt.strftime('%c')
+
+@app.route('/date_example')
+def date_example():
+    return render_template(
+        'date_example.html',
+        created_at='Tue Mar 21 15:50:59 +0000 2017',
+    )
+

V šabloně date_example.html se pak filtr použije pomocí svislítka:

+
{{ created_at|time }}
+

Pokud potřebujete velmi obecný filtr, je vhodné se podívat do seznamu těch vestavěných.

+

Escaping

+

V textu, který se vkládá do šablon, jsou automaticky nahrazeny znaky, které +mají v HTML speciální význam. +Zabraňuje se tak bezpečnostním rizikům, kdy se vstup od uživatele interpretuje +jako HTML.

+

Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, +bude výsledné HTML vypadat takto:

+
<!doctype html>
+<title>Hello from Flask</title>
+
+  <h1>Hello &lt;script&gt;alert(&#34;Foo&#34;)!</h1>
+

Některé prohlížeče (či doplňky do nich) proti podobným útokům různým způsobem +chrání. Budete-li na své stránky zkoušet „zaútočit”, zkontrolujte v konzoli +URL, které vaše aplikace v požadavku reálně dostává. +Pro příklad výše to může být /hello/%3Cscript%3Ealert(%22Foo%22)/.

+

Někdy je ovšem potřeba do stránky opravdu vložit HTML. +To se dá zajistit dvěma způsoby. Nejjednodušší je vestavěný filtr safe:

+
{{ "<em>Text</em>" | safe }}
+

V Pythonu pak lze použít jinja2.Markup, +čímž se daný text označí jako „bezpečný”.

+
import jinja2
+
+@app.template_filter('time')
+def convert_time(text):
+    """Convert the time format to a different one"""
+    dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y')
+    result = dt.strftime('<strong>%c</strong>')
+    return jinja2.Markup(result)
+

Při použití safe a Markup však vždycky myslete na to, aby nikdo +(ani nikdo mnohem chytřejší než vy) nemohl na vaší stránce provést něco +nekalého.

+

Statické soubory

+

Pokud budete potřebovat nějaké statické soubory (např. styly CSS nebo +obrázky), dejte je do adresáře static vedle souboru s kódem +a přistupujte k nim pomocí routy static:

+
url_for('static', filename='style.css')
+

V šabloně pak například:

+
<link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
+

Logování

+

Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím +HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného +formatu), ale také vypisovat různé chybové, informační či ladící hlášky na +straně serveru. Možností je použít například funkci print, ale ta není +dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní +s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování +logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření +samotné webové aplikace.

+

Řešením je použít standardní logovací modul logging, který řeší vše potřebné +(úrovně zpráv, filtry, formátování časového razítka a dalších meta-informací o +běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci +vaší webové aplikace pak nebudou z formátu výstupů zmatení). Protože používáme +Flask a ten také loguje tímto modulem, +stačí použít předpřipravený app.logger.

+
from flask import Flask
+
+app = Flask(__name__)
+app.logger.debug("I've just initialized the Flask app")
+
+@app.route('/')
+def index():
+    app.logger.warning('Someone is accessing the index page!')
+    return 'Index Page'
+

Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, +error, critical). Při spuštění aplikace v ladícím režimu se loguje vše +(navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody +setLevel, viz dokumentace modulu logging.

+

Větší Flask aplikace

+

Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze +použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet +aplikaci s databází a ORM modely, je nutné propojit Flask s dalšími knihovnami +(například flask-sqlalchemy, +nebo flask-pymongo).

+

Jiné frameworky postavené nad Model-View-Controller +paradigmatem mají tyto vlastnosti již zabudovány v sobě (například Django).

+

Následující sekce popisují některé zajímavé techniky, které se mohou u větších +a složitějších aplikací hodit.

+

create_app factory

+

Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí +funkce, tzv. application_factory, +standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se +neinicializuje hned při importu modulu, ale až při zavolání funkce. Voláním funkce +můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu +souboru). Díky tomu lze snadněji vytvářet Flask aplikace s různými konfiguracemi +pro testování nebo dokonce vytvářet více Flask aplikací v rámci jednoho Python skriptu.

+
def create_app(config=None):
+    app = Flask(__name__)
+
+    app.config.from_pyfile(config or 'config.py')
+    app.config['the_answer'] = 42
+    app.secret_key = os.environ.get('MY_SECRET', None)
+
+    return app
+

Blueprint moduly

+

Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do +samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky +„modrotisk” nebo také „modrák”). +Výhodou je, že můžete vytvořit blueprint (instanci +třídy Blueprint) s několika views, vlastní templates složkou a dalším +nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový +blueprint pak můžete využívat i v několika různých aplikacích a snadno tak +dosáhnout znovupouželnosti.

+
from flask import Blueprint
+
+auth = Blueprint('auth', __name__, template_folder='templates')
+
+@auth.route('/login')
+def login():
+    ...
+
+@auth.route('/logout')
+def logout():
+    ...
+
+@auth.app_template_filter('userlink')
+def user_link(username):
+    ...
+

Blueprint pak stačí ve Flask aplikaci registrovat +a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo +jiné přidat i prefix pro všechny cesty v blueprintu.

+
from flask import Flask
+from auth.views import auth
+
+app = Flask(__name__)
+# this will create the /auth/login and /auth/logout endpoints
+app.register_blueprint(auth, url_prefix='/auth')
+

V případě použití url_for je třeba cesty z blueprintu namespacovat, např.:

+
url_for('auth.login')
+

Vlastní podtřída Flask

+

Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat +výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které +budou použity pro HTTP požadavky a odpovědi, měnit výchozí konfiguraci flask a +spoustu dalšího. Nezapomeňte volat konstruktor nadtřídy.

+
from flask import current_app, Flask, Response
+
+class MIPYTResponse(Response):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.set_cookie('MI-PYT', 'best')
+
+
+class GreeterApp(Flask):
+    response_class = MIPYTResponse
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.greetings = 0
+
+    def greet(self):
+        self.greetings += 1
+        return 'Hello!'
+
+
+app = GreeterApp(__name__)
+
+
+@app.route('/')
+def greet():
+    return current_app.greet()
+
+
+@app.route('/number/')
+def greetings_number():
+    return str(current_app.greetings)
+

A další

+

Flask umí i další věci – například zpracování formulářů, chybové stránky nebo +přesměrování. Také existuje i řada rozšíření, +které mohou ušetřit práci s běžnými úkony jako například správa uživatelů, + tvorba REST API nebo integrace s různými službami.

+

Všechno to najdete +v dokumentaci.

\ No newline at end of file diff --git a/mi-pyt/generators/index.html b/mi-pyt/generators/index.html new file mode 100644 index 00000000..11ce43fc --- /dev/null +++ b/mi-pyt/generators/index.html @@ -0,0 +1,239 @@ +

Generátory

+

Dnes si popíšeme, jak v Pythonu fungují generátory, tedy funkce s příkazem yield. +Někteří z vás možná už nějaký jednoduchý generátor napsali, ale pojďme si je +vysvětlit od úplného začátku: od toho, jak se v Pythonu iteruje.

+

Iterace

+

Když je v Pythonu potřeba iterovat (např. příkazem for) přes nějakou kolekci +(seznam, řetězec, soubor, …), použije se iterační protokol, +který pracuje se dvěma druhy objektů: s iterovatelnými objekty a s iterátory.

+

Iterovatelné objekty (iterables) se vyznačují tím, že je na ně možné zavolat +funkci iter(). Ta vrátí příslušný iterátor:

+
>>> iter([1, 2, 3])
+<list_iterator object at 0x...>
+

Na iterátor pak je možné opakovaně volat funkci next(), čímž dostáváme jednotlivé +prvky iterace. +Po vyčerpání iterátoru způsobuje next() výjimku StopIteration:

+
>>> it = iter([1, 2, 3])
+>>> next(it)
+1
+>>> next(it)
+2
+>>> next(it)
+3
+>>> next(it)
+Traceback (most recent call last):
+  ...
+StopIteration
+>>> next(it)
+Traceback (most recent call last):
+  ...
+StopIteration
+

Cyklus for x in collection: ... tedy dělá něco jako:

+
iterator = iter(collection)
+while True:
+    try:
+        x = next(iterator)
+    except StopIteration:
+        break
+
+    ...  # tělo původního cyklu
+

Platí, že každý iterátor je iterovatelný: zavoláním iter() na iterátor +dostaneme ten stejný iterátor (nikoli jeho kopii) zpět. +Naopak to ale obecně neplatí: např. seznamy jsou iterovatelné, ale nejsou samy +o sobě iterátory. +Každé zavolání iter(seznam) vrací nový iterátor, který má svou vlastní +„aktuální pozici“ a iteruje od začátku.

+

Iterátor je ve většině případů „malý“ objekt, který si „pamatuje“ jen původní iterovatelný +objekt a aktuální pozici. Příklady jsou iterátory seznamů (iter([])), slovníků (iter({})), +n-tic nebo množin, iterátor pro range a podobně.

+

Iterátory ale můžou být i „větší“: třeba otevřený soubor je iterátor, z něhož next() +načítá jednotlivé řádky.

+

Generátory

+

Asi nejzajímavější druh iterátoru je tzv. generátor: funkce, která umí postupně +dávat k dispozici hodnoty. +Definuje se pomocí klíčového slova yield: každá funkce, která obsahuje yield, +je generátorová funkce (angl. generator function).

+
def generate2():
+    """generates 2 numbers"""
+    print('A')
+    yield 0
+    print('B')
+    yield 1
+    print('C')
+

Zavoláním takové funkce dostáváme generátorový iterátor (angl. generator iterator):

+
>>> generate2()
+<generator object generate2 at 0x...>
+

Voláním next() se pak stane zajímavá věc: funkce se provede až po první yield, +tam se zastaví a hodnota yield-u se vrátí z next(). +Při dalším volání se začne provádět zbytek funkce od místa, kde byla naposled +zastavena.

+
>>> it = generate2()
+>>> next(it)
+A
+0
+>>> next(it)
+B
+1
+>>> next(it)
+C
+Traceback (most recent call last):
+  ...
+StopIteration
+

Další použití generátorů

+

Vlastnost přerušit provádění funkce je velice užitečná nejen pro vytváření +sekvencí, ale má celou řadu dalších užití. +Existuje třeba dekorátor, který generátorovou funkci s jedním yield převede na context manager, +tedy objekt použitelný s příkazem with:

+
import contextlib
+
+@contextlib.contextmanager
+def ctx_manager():
+    print('Entering')
+    yield 123
+    print('Exiting')
+
+
+with ctx_manager() as obj:
+    print('Inside context, with', obj)
+

Vše před yield se provede při vstupu do kontextu, hodnota yield se předá +dál a vše po yield se provede na konci. +Můžeme si představit, že místo yield se „doplní“ obsah bloku with. +Funkce se tam na chvíli zastaví a může se tedy provádět něco jiného.

+

Vracení hodnot z generátorů

+

V rámci generátorové funkce můžeme použít i return, který funkci ukončí. +Vrácená hodnota se však při normální iteraci (např. ve for) nepoužije. +Objeví se pouze jako hodnota výjimky StopIteration, která signalizuje konec +iterace:

+
def generator(a, b):
+    """Yield two numbers and return their sum"""
+    yield a
+    yield b
+    return a + b
+
>>> it = generator(2, 3)
+>>> next(it)
+2
+>>> next(it)
+3
+>>> next(it)
+Traceback (most recent call last):
+  File "<stdin>", line 1, in <module>
+StopIteration: 5
+

Obousměrná komunikace

+

Oproti normálním iterátorům, které hodnoty jen poskytují, mají generátory metodu +send(), kterou je možné posílat hodnoty do běžícího generátoru. +Klíčové slovo yield totiž může fungovat jako výraz a tento výraz nabývá poslanou +hodnotu (nebo None, byl-li použit normální next()).

+
def running_sum():
+    total = 0
+    while True:
+        num = (yield total)
+        if num:
+            total += num
+
+it = running_sum()
+next(it)  # pro první iteraci nelze použít send() -- nečekáme zatím na yield-u
+it.send(2)
+it.send(3)
+assert next(it) == 5
+

Upřímě řečeno, metoda send() není příliš užitečná. +(Když byste něco takového potřebovali, radši si napište třídu, která si bude +stav uchovávat v atributech, a měňte ji třeba metodami. Bude to pravděpodobně +přehlednější.) +Existuje ale příbuzná metoda, která už je užitečnější: throw(). +Ta do generátoru „vhodí“ výjimku. +Z pohledu generátorové funkce to vypadá, jako by výjimka nastala na příkazu +yield.

+
def report_exception():
+    try:
+        yield
+    except BaseException as e:
+        print('Death by', type(e).__name__)
+    yield 123
+
>>> it = report_exception()
+>>> next(it)  # opět – v první iteraci nelze throw() použít
+>>> value = it.throw(ValueError())
+Death by ValueError
+>>> value
+123
+

Podobná věc se děje, když generátorový iterátor zanikne: Python do generátoru +„vhodí“ výjimku GeneratorExit. +Ta dědí z BaseException, ale ne Exception, takže klasické except Exception: +ji nechytí (ale např. finally funguje jak má). +Pokud generátor tuto výjimku chytá, měl by se co nejdřív ukončit. +(Když to neudělá a provede další yield, Python ho ukončí „násilně“.)

+
>>> import gc
+>>> it = report_exception()
+>>> next(it)
+>>> del it; gc.collect()  # zbavíme se objektu "it"
+Death by GeneratorExit
+Exception ignored in: <generator object report_exception at 0x...>
+RuntimeError: generator ignored GeneratorExit
+0
+

Delegace na podgenerátor – yield from

+

Máme následující generátor:

+
def dance():
+    yield 'putting hands forward'
+    yield 'putting hands down'
+    yield 'turning around'
+    yield 'jumping'
+    yield 'putting hands forward'
+    yield 'putting hands down'
+
+for action in dance():
+    print(action)
+

Opakuje se v něm jistá sekvence, kterou bychom jako správní programátoři chtěli +vyčlenit do samostatné funkce. +Pomocí samotného yield to ale jde celkem těžko:

+
def dance_hands():
+    yield 'putting hands forward'
+    yield 'putting hands down'
+
+def dance():
+    for action in dance_hands():
+        yield action
+    yield 'turning around'
+    yield 'jumping'
+    for action in dance_hands():
+        yield action
+
+for action in dance():
+    print(action)
+

Tohle počtu řádků příliš nepomohlo. Existuje lepší způsob – místo cyklu +můžeme použít yield from:

+
def dance_hands():
+    yield 'putting hands forward'
+    yield 'putting hands down'
+
+def dance():
+    yield from dance_hands()
+    yield 'turning around'
+    yield 'jumping'
+    yield from dance_hands()
+
+for action in dance():
+    print(action)
+

Navíc lze yield from použít jako výraz, který nabývá hodnoty +kterou podgenerátor vrátil (t.j. hodnota výjimky StopIteration).

+
def fibonacci(limit):
+    a = 0
+    b = 1
+    count = 0
+    while b < limit:
+        yield b
+        count += 1
+        a, b = b, a + b
+    return count
+
+def fib_annotated():
+    count = (yield from fibonacci(10))
+    print('LOG: Generated {} numbers'.format(count))
+
+for value in fib_annotated():
+    print('Got', value)
+
Got 1
+Got 1
+Got 2
+Got 3
+Got 5
+Got 8
+LOG: Generated 6 numbers

Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

\ No newline at end of file diff --git a/mi-pyt/install/index.html b/mi-pyt/install/index.html new file mode 100644 index 00000000..29fc86e6 --- /dev/null +++ b/mi-pyt/install/index.html @@ -0,0 +1,62 @@ +

V tomto kurzu budeme používat virtuální prostředí. +Jedná se o oddělené prostředí pro Python, kam se dají instalovat jednotlivé +knihovny, které jsou potom aktivní jen uvnitř. +Použití prostředí má dvě hlavní výhody:

+
    +
  • Je-li prostředí aktivované, +příkaz python spustí verzi Pythonu, se kterou bylo prostředí nainstalováno. +Takže pak např. v materiálech nemusíme mít speciální instrukce pro +Linux (python3) a Windows (py -3).

    +
  • +
  • Instalace knihoven nezasahuje do systémového nastavení, ani do jiných +virtuálních prostředí. +Můžeš tak oddělit jednotlivé projekty; v každém prostředí můžou být +nainstalované jiné verze knihoven. +A když se něco pokazí, adresář s virtuálním prostředím můžeš prostě smazat +a vytvořit znovu.

    +
  • +
+

Následují zrychlené instrukce; předpokládám, že Python (3.6 a vyšší) +už máš nainstalovaný a že znáš základy práce +s příkazovou řádkou.

+

Podrobný postup instalace Pythonu a vytvoření prostředí je je popsán +v příslušné lekci pro začátečníky. +Modul venv je součást standardní knihovny.

+

Unix (Linux, macOS)

+

Zkontroluj, že máš modul ensurepip:

+
$ python3.7 -m ensurepip --version
+pip 18.0 (nebo i jiná verze)
+

Jestli ne, postupuj podle lekce pro začátečníky – +jsou tam podrobnější instrukce. +Jinak použij:

+
$ mkdir project
+$ cd project
+$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
+$ . __venv__/bin/activate  # aktivace
+(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
+(__venv__)$ ...  # práce "uvnitř"
+(__venv__)$ deactivate  # vypnutí virtualenvu
+

V tomto kurzu lze případně využít i Python 3.6. Pokud máš 3.5 nebo ještě nižší, +doporučujeme aktualizovat.

+

Windows

+
> mkdir project
+> cd project
+> py -3 -m venv __venv__
+> __venv__\Scripts\activate
+(__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
+(__venv__)> ...  # práce "uvnitř"
+(__venv__)> deactivate  # vypnutí virtualenvu
+

Poznámky

+

Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu +pracovat.

+

Ono __venv__ je jen jméno adresáře. Můžeš si ho pojmenovat jak chceš; dokonce +nemusí být v rámci adresáře s projektem. +Někteří lidé mají všechny virtuální prostředí na jednom místě; dokonce existuje +nástroj virtualenvwrapper na správu takového řešení, případně pipenv, +který Python Packaging Authority doporučuje pro vývoj aplikací (my ale +budeme vyvíjet i knihovny).

+

Autoři tohoto textu tedy doporučují __venv__ v adresáři s projektem. +Při použití v kombinaci s Gitem nezapomeň tento adresář přidat do souboru +.gitignore.

+

Příkaz python -m pip install nainstaluje danou knihovnu – může to být i jiná +než requests jako výše.

\ No newline at end of file diff --git a/mi-pyt/magic/index.html b/mi-pyt/magic/index.html new file mode 100644 index 00000000..b419151d --- /dev/null +++ b/mi-pyt/magic/index.html @@ -0,0 +1,577 @@ +

Magie

+

Co z Pythonu dělá tak užitečný jazyk? +Z velké části je to zaměření na čitelnost kódu. Pythonu se někdy říká „spustitelný pseudokód“: syntaxe je inspirovaná zápisem abstraktních algoritmů v matematice, používá se málo speciálních znaků jako $, <<, &&, ?. +Čitelnosti je podřízena expresivita (proto v Pythonu nenajdeme makra jako v Lispu) i délka zápisu (některé věci se nedají napsat na jeden řádek).

+

Návrh jazyka (a knihoven pro něj) se řídí mimo jiné poučkou „There should be one– and preferably only one –obvious way to do it.“ +Existuje ideálně jeden zjevně nejlepší způsob, jak dosáhnout určité funkčnosti. +Úkolem programátora je tento způsob najít a použít. Náš cíl by měl být kód, který ostatní programátoři pochopí na první pohled. A pokud je to možné, měli by ho pochopit i neprogramátoři. Není mezi nimi pevná hranice – váš kód můžou číst lidi, kteří programovací jazyk v životě neviděli; programátoři silní v jiných jazycích; průměrní Pythonisté; nebo ostřílení veteráni. Čím víc jich dokáže kód pochopit, tím bude váš kód udržovatelnější.

+

S tím souvisí koncept „magie“. Magie je něco, co funguje, ačkoli tomu nerozumíme. Pro každého čtenáře kódu může být magie něco jiného: pro začátečníka bude nepochopitelný zápis zip(*args), matematik nemusí chápat princip dědičnosti tříd, ostřílený Pythonista nemusí chápat maticovou matematiku, neprogramátor netuší, jak funguje mobil nebo webová aplikace. Je to tedy subjektivní pojem, ale lze ho zobjektivnit: čím méně lidí váš kód pochopí, tím je kód magičtější.

+

Magie, která funguje, nevadí. Věci které nechápu, můžu stále používat – jen nevím jak fungují, a tudíž je neumím opravit. Problém nastane až v momentě, kdy se něco pokazí.

+

Přehlednost a udržitelnost kódu je samozřejmě potřeba vyvážit s ostatními aspekty. Kód musí být například dostatečně rychlý a optimalizace ho často znepřehlední. Proto je dobré optimalizovat až potom, co vím, že je kód správný a řeší opravdu problém, který potřebuji vyřešit. V ten moment napíšu testy a potom, když je potřeba, můžu optimalizovat – trochu přehlednosti vyměnit za rychlost.

+

Na jiný důvod, proč použít méně pochopitelné techniky, narazíme při psaní knihoven a frameworků. To je kód, který používá hodně programátorů – a často jsou to programátoři s méně zkušenostmi, než mají autoři knihovny. Tady proto bývá dobré občas použít nějakou tu magii – znepřehlednit kód knihovny, aby kód který knihovnu používá, mohl být přehlednější.

+

Typický příklad jsou dekorátory ve Flasku. Napsat dekorátor není úplně triviální, ale velice to zjednodušuje práci všem, co ve Flasku píšou web. Konstrukce @app.route je pro většinu lidí magická – nevíme přesně, co to dělá, ale to nám nebrání ji použít.

+

Velká moc a velká zodpovědnost

+

Druhý možný význam slova magie je něco, co neodpovídá „normálnímu“ chování podobných věcí.

+

Jazyk Python standardizuje syntaxi relativně malého počtu operací (operátory, volání funkcí, atributy, ...), způsobů řízení toku programu (cykly, with, ...) a strukturování kódu (moduly, def, class). +To, že je jich relativně málo, má dvě výhody: zaprvé fungují s ostatními části jazyka a zadruhé nebývá problém rozhodnout, který způsob je pro daný problém nejlepší.

+

Téměř všechno v Pythonu ale jde předefinovat. Operátor / nemusí jen dělit: můžu si napsat třídu pro jméno souboru, která umí pomocí / oddělovat adresáře *. +Cyklus for nemusí iterovat přes předem danou sekvenci prvků; iterovatelný objekt může poskytovat jakékoli hodnoty podle jakýchkoli pravidel. +Příkaz class dokonce vůbec nemusí vytvořit třídu, jak uvidíme později.

+

Ačkoliv si ale můžeme dovolit téměř cokoli, je dobré mít na paměti, že odchylky od „normálního“ chování jsou magické. Jakmile někdo použije divnou třídu, která předefinovává dělení, ve svém kódu, musí každý čtenář toho kódu nejen opustit představu o tom, co operátor / dělá, ale hlavně si předtím uvědomit, že / může dělat něco divného. To samé platí u „divných“ iterovatelných objektů nebo tříd. Odchylka od normálního chování, je-li nezbytná, by měla být dobře promyšlená a zdokumentovaná.

+

Nadefinujeme-li vlastní nestandardní – „magické“ – chování některých objektů, často se stane, že nebudou fungovat s ostatními prvky jazyka tak dobře, jako to co je zabudované. Předefinujeme-li < tak, že nebude mít nic společného s porovnáváním, bude se funkce sorted chovat podivně. Když u svých objektů předefinuji přístup k atributům, musím si dávat zvlášť pozor na to, aby fungovala funkce dir().

+

Následující principy (kromě jiných) je proto dobré při psaní knihoven používat jen po pečlivém zvážení, jestli by to nešlo i bez magie.

+

* Taková třída dokonce existuje ve standardní knihovně.

+

Speciální metody

+

Základní způsob, jak přizpůsobit chování objektů, jsou speciální metody. +Asi už víte, že všechny atributy, které začínají a končí dvojitým podtržítkem, jsou rezervované pro samotný Python, který je používá podle svých pravidel – například danou metodu volá, když je potřeba sečíst dvě čísla.

+

Speciální metody jsou popsané v dokumentaci. Zde uvedu jen přehled, který pokročilý Pythonista nosí v hlavě, aby věděl co je všechno možné. +Doporučuji si předtím, než nějakou naimplementujete, dokumentaci přečíst.

+

Metody pro předefinování aritmetických operátorů: +__add__, __sub__, __mul__, __div__, __floordiv__, __pow__, __matmul__, __lshift__, __rshift__, __or__, __xor__ a varianty s r a i (__radd__, __iadd__, atd.); +__neg__, __pos__, __abs__, __invert__.

+

Metody pro předefinování porovnávání: +__eq__, __ne__, __lt__, __gt__, __le__, __ge__, __hash__.

+

Metoda pro zavolání objektu jako funkce: +__call__.

+

Metody pro funkčnost sekvencí a kontejnerů: +__len__, __iter__, __next__, __reversed__; __contains__ pro operátor in.

+

Metody pro „hranaté závorky“: +__getitem__, __setitem__, __delitem__.

+

Převádění na řetězce: +__repr__, __str__, __format__.

+

Převádění na čísla: +__complex__, __float__, __index__, __round__, __floor__, __ceil__.

+

Převádění na bool (např. i v if): +__bool__.

+

Vytváření a rušení objektů: +__new__ (konstruktor – vytvoří objekt dané třídy), __init__ (inicializuje objekt dané třídy), __del__ (zavoláno před zrušením objektu).

+

Předefinování přístupu k atributům: +__getattr__ (zavolá se, pokud se atribut nenajde), __getattribute__ (zavolá se pro každý přístup k atributu), __setattr__, __delattr__, __dir__.

+

Implementace context manageru (pro with): +__enter__, __exit__.

+

Implementace deskriptoru (viz níže): +__get__, __set__, __delete__.

+

Implementace asynchronní funkcionality: +__await__, __aiter__, __anext__, __aenter__, __aexit__.

+

Předefinování hierarchie dědičnosti: +__instancecheck__, __subclasscheck__.

+

Dekorátory

+

Další věc, na kterou se podíváme, jsou dekorátory – způsob, jak si +přizpůsobovat funkce.

+

Nejjednodušší použití dekorátorů je registrace: +k funkci přidáme dekorátor a funkce se někam zaregistruje, uloží, +aby se dala zavolat později. +Typický příklad je @app.route ve Flasku.

+

My si pro příklad budeme chtít udělat dekorátor pro kalkulačku, +@register_operator, aby fungoval tento kód:

+
operators = {}
+
+@register_operator
+def add(a, b):
+    return a + b
+
+@register_operator
+def mul(a, b):
+    return a * b
+
+a = int(input('First number: '))
+operator_name = input('Operation: ')
+b = int(input('Second number: '))
+
+func = operators[operator_name]
+print(func(a, b))
+

Bez použití dekorátorů by se to dalo napsat takto:

+
def register_operator(func):
+    operators[func.__name__] = func
+
+def add(a, b):
+    return a + b
+
+register_operator(add)
+

S použitím dekorátoru je funkce register_operator téměř stejná, +jen použijeme speciální syntaxi se zavináčem.

+
def register_operator(func):
+    operators[func.__name__] = func
+    return func
+
+@register_operator
+def add(a, b):
+    return a + b
+

Použití dekorátoru je jen zkrácený zápis pro volání dekorátoru jako +funkce – poslední tři řádky předchozího příkladu jsou ekvivalentní tomuto:

+
def add(a, b):
+    return a + b
+
+add = register_operator(add)
+

Chování samotného @ je tedy celkem triviální. +Magie (složitost) spočívá v tom, že dekorátor je většinou funkce vyššího řádu: +bere jinou funkci jako argument a taky jinou funkci vrací. +V případě registrace vrací stejnou funkci jako dostala – ale to není povinné.

+

Často se setkáme s dekorátory, které dekorovanou funkci nějak modifikují. +Například můžeme napsat dekorátor, který v naší kalkulačce převede vstup +na reálná čísla. +Dělá to tak, že definuje novou funkci, která volá tu původní – ale před nebo +po tomto volání může dělat i něco jiného.

+
def to_floats(func):
+    def outer_function(a, b):
+        a = float(a)
+        b = float(b)
+        return func(a, b)
+    return outer_function
+
+@to_floats
+def add(a, b):
+    """Adds two numbers"""
+    return a + b
+
+print(add(1, '2'))
+

Takto funguje většina dekorátorů, které mění chování dekorované funkce. +Naráží s tím ale na jeden problém: nově nadefinovaná funkce má vlastní jméno +(a dokumentační řetězec a podobné informace), což kazí iluzi, že jsme +původní funkci jen trošku změnili:

+
print(add)
+help(add)
+

Řešení je jednoduché – zkopírovat jméno, dokumentační řetězec atd. z jedné +funkce na druhou. +Na to ve standardní knihovně existuje dekorátor jménem functools.wraps:

+
import functools
+
+def to_floats(func):
+    @functools.wraps(func)
+    def outer_function(a, b):
+        a = float(a)
+        b = float(b)
+        return func(a, b)
+    return outer_function
+

S wraps bude help(add) fungovat správně – ukáže původní jméno +a dokumentační řetězec.

+

Z volání wraps(func) je vidět, že jako dekorátor můžeme použít i volání +funkce, ne jen funkci samotnou. +Budeme-li chtít napsat dekorátor, který tohle umí, potřebujeme napsat +funkci ještě vyššího řádu – totiž funkci, která po zavolání vrátí dekorátor:

+
operators = {}
+
+def register_operator(name):
+    def decorator(func):
+        operators[name] = func
+        return func
+    return decorator
+
+@register_operator('+')
+def add(a, b):
+    return a + b
+
+@register_operator('*')
+def mul(a, b):
+    return a * b
+
+a = int(input('First number: '))
+operator_name = input('Operation: ')
+b = int(input('Second number: '))
+
+func = operators[operator_name]
+print(func(a, b))
+

Řádek @register_operator('+') dělá (jak už víme) to stejné, jako bychom hned +za funkcí napsali add = register_operator('+')(add).

+

Budete-li chtít napsat dekorátor, který bere argumenty, a přitom ještě +„mění“ dekorovanou funkci, dostanete se na tři funkce zanořené v sobě:

+
import functools
+operators = {}
+
+def register_operator(name):
+    def to_floats(func):
+
+        @functools.wraps(func)
+        def outer_function(a, b):
+            a = float(a)
+            b = float(b)
+            return func(a, b)
+
+        operators[name] = outer_function
+        return outer_function
+
+    return to_floats
+
+@register_operator('+')
+def add(a, b):
+    return a + b
+
+func = operators['+']
+print(func(1, '2'))
+

Dekorátorů se na jedné funkci dá použít víc:

+
@register_operator('×')
+@register_operator('*')
+def mul(a, b):
+    return a * b
+

Úplně stejně jako funkce se dají dekorovat i třídy. +Dekorátor dostane třídu jako první argument a třída se nahradí tím, +co dekorátor vrátí.

+

Deskriptory

+

Jeden z nejmagičtějších operátorů v Pythonu je ., tečka. +Je magický v obou významech – většina lidí ho používá, ačkoli nemá tušení, co přesně dělá, a dá se předefinovat tolika různými způsoby, že to vydá na celou přednášku.

+

Pomocí tečky zapisujeme tři operace: čtení atributu (print(foo.bar)), zapisování (foo.bar = 3) a mazání (del foo.bar). +Tady se zaměříme hlavně na nejmagičtější z nich, čtení.

+

Kdykoli atribut čteme pomocí tečky, hledá se na několika místech:

+
    +
  • na samotné instanci objektu,
  • +
  • pokud se tam nenajde, tak na třídě,
  • +
  • pokud se nenajde ani tam, tak na rodičovských třídách (v případě vícenásobné dědičnosti podle MRO),
  • +
  • a pokud stále není k nalezení, vyhodí se AttributeError.
  • +
+

To je trochu zjednodušený, ale užitečný model.

+

Speciální metody, které se nevolají pomocí tečky, přeskakují první krok: metoda __add__ tedy musí být definována na třídě, aby se zavolala pro a + b.

+

(Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

+
+

Podívejme se teď na získávání atributu trošku podrobněji. Je to poměrně komplikovaný proces a existuje několik způsobů, jak ho přizpůsobit. Nejjednodušší je dvojice speciálních metod:

+
    +
  • __getattribute__, která kompletně předefinuje funkci . pro čtení atributu, a
  • +
  • __getattr__, která se zavolá, až když se atribut nenajde normálním způsobem.
  • +
+

První z nich nedoporučuji používat, protože je příliš obecná (pokusy se z ní dostat ke stavu objektu končívají nekonečnou rekurzí). +Příklad druhé:

+
class Palette:
+    red = 255, 0, 0
+    green = 0, 255, 0
+
+    def __getattr__(self, attr_name):
+        prefix, sep, suffix = attr_name.partition('_')
+        if prefix == 'dark':
+            original_color = getattr(self, suffix)
+            return tuple(c//2 for c in original_color)
+        else:
+            raise AttributeError(attr_name)
+
+palette = Palette()
+print(palette.dark_red)
+

(Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

+

Metoda __getattr__ je většinou tak trochu kanón na vrabce: ve většině případů nepotřebujeme nastavit chování všech neexistujících atributů, ale jenom jednoho nebo několika konkrétních. +Například máme třídu pro 2D bod s atributy x a y a potřebujeme i atribut pro dvojici (x, y). +Toto se často dělá pomocí dekorátoru property:

+
class Point:
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+    @property
+    def pos(self):
+        return self.x, self.y
+
+point = Point(41, 8)
+print(point.pos)
+

Jak to ale funguje? Dekorátor property je třída, jakou můžete teoreticky napsat sami v Pythonu. +Je to deskriptor, objekt, který v rámci nějaké třídy popisuje jak přistupovat k nějakému atributu.

+

Nejlépe se deskriptory vysvětlí na příkladu:

+
# (Omluvte prosím češtinu v kódu)
+
+class Descriptor2D:
+    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
+
+    def __init__(self, name1, name2):
+        self.name1 = name1
+        self.name2 = name2
+
+    def __get__(self, instance, cls=None):
+        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
+        """
+
+        if instance is not None:
+            # Je-li instance nastavena, čteme atribut z ní.
+            return getattr(instance, self.name1), getattr(instance, self.name2)
+        else:
+            # Je-li instance None, čteme atribut přímo ze třídy `cls`;
+            # v tomto případě slušné deskriptory většinou vrací deskriptor samotný.
+            return self
+
+class Rect:
+    def __init__(self, x, y, w, h):
+        self.x = x
+        self.y = y
+        self.w = w
+        self.h = h
+
+    pos = Descriptor2D('x', 'y')
+    size = Descriptor2D('w', 'h')
+
+rect = Rect(1, 2, 3, 4)
+print(rect.pos)
+print(rect.size)
+
+# Čtení atributu přímo ze třídy:
+print(Rect.pos)
+

Deskriptory jsou tedy součást třídy – atributy s nějakým jménem. Popisují, jak se bude přistupovat k atributu daného jména.

+

Existují dva druhy deskriptorů: data descriptor a non-data descriptor. +Liší se v tom, jestli popisují jen, jak se daný atribut čte, nebo i jak se do něj zapisuje. +Výše uvedený deskriptor je non-data: ovládá jen čtení. Zápis funguje jako u normálních atributů: +přepíše aktuální hodnotu – a nová hodnota se pak použije místo volání deskriptoru:

+
rect.pos = 'haha'
+print(rect.pos)
+

Abychom tomu zabránili, můžeme na deskriptoru nadefinovat speciální metodu __set__ (nebo __delete__), která popisuje, +jak se atribut nastavuje (resp. maže). +Tím vznikne data descriptor:

+
class Descriptor2D:
+    def __init__(self, name1, name2):
+        self.name1 = name1
+        self.name2 = name2
+
+    def __get__(self, instance, cls=None):
+        if instance is not None:
+            return getattr(instance, self.name1), getattr(instance, self.name2)
+        else:
+            return self
+
+    def __set__(self, instance, new_value):
+        a, b = new_value
+        setattr(instance, self.name1, a)
+        setattr(instance, self.name2, b)
+
+    def __delete__(self, instance):
+        delattr(instance, self.name1)
+        delattr(instance, self.name2)
+
+class Rect:
+    # jako předtím
+
+rect = Rect(1, 2, 3, 4)
+rect.pos = 123, 456
+print(rect.pos)
+

Už zmíněný vestavěný deskriptor property je data descriptor. +Popisuje jak čtení, tak zápis atributu. Pokud mu nenastavíme funkci pro zápis, vyhodí ze své metody __set__ výjimku AttributeError se zprávou, že do atributu se zapisovat nedá. (To je trochu magická odchylka od normálního chování Pythonu, kdy atributy zapisovat jdou.)

+

Nejčastější příklad non-data deskriptoru je obyčejná funkce. +Každá funkce totiž funguje jako deskriptor: má speciální metodu __get__, která zajišťuje, že pokud je nastavena na třídě, daným atributem nedostaneme funkci, ale metodu (s „předvyplněným“ parametrem self).

+
def foo(self):
+    return 4
+
+class C:
+    foo = foo
+
+c = C()
+
+# Obyčejná funkce
+print(C.foo)
+print(foo)
+
+# Metoda
+print(C().foo)
+print(foo.__get__(c))
+

Protože je to non-data deskriptor, můžeme v jednotlivých instancích třídy +daný atribut přepsat něčím jiným, čímž metodu znepřístupníme.

+

Jako zajímavost uvedu non-data deskriptor, který přepisuje svůj vlastní atribut. +Funguje podobně jako @property, jen se výsledek vypočítá pouze jednou a uloží se jako normální atribut. +Při dalším přístupu k atributu už se použije uložená hodnota.

+
class reify:
+    def __init__(self, func):
+        self.func = func
+
+    def __get__(self, instance, cls=None):
+        if instance is None:
+            return self
+        val = self.func(instance)
+        setattr(instance, self.func.__name__, val)
+        return val
+
+class Vector:
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+    @reify
+    def length(self):
+        print('Running expensive computation...')
+        return (self.x ** 2 + self.y ** 2) ** 0.5
+
+vect = Vector(3, 4)
+print(vect.length)
+print(vect.length)
+print(vect.length)
+

Kompletní implementace je např. ve frameworku Pyramid jako pyramid.decorator.reify.

+

Konstruktor

+

Třídy v Pythonu můžou mít konstruktor – funkci, která se zavolá, aby +vytvořila objekt daného typu. +Toto není známá metoda __init__ – ta objekt nevytváří, ta dostane už +předpřipravený self, který jen naplní atributy. +Opravdový konstruktor se jmenuje __new__ a chová se jako classmethod: +místo self bere třídu, jejíž instanci má vytvořit.

+

Opravdový konstruktor se „hodí“ pro vytváření singletonů, tříd, které mají jen +jednu instanci:

+
class Singleton:
+    def __new__(cls):
+        try:
+            return cls._instance
+        except AttributeError:
+            cls._instance = super().__new__(cls)
+            return cls._instance
+
+assert Singleton() is Singleton()
+

Podobný trik lze použít pro třídu podobnou bool, která má pouze dvě instance: +bool(1) is bool(2).

+

Metoda __new__ se hodí, když chceme dědit z neměnitelné (immutable) +třídy jako tuple. +Metoda __init__ sice dostane self, ale cokoli z nadtřídy už nemůže měnit. +Je ale možné předefinovat __new__.

+

Normálně bere tuple jediný argument, tuple([1, 2]). +Chceme-li brát dva, dá se to udělat takto:

+
class Point(tuple):
+    def __new__(cls, x, y):
+        return super().__new__(cls, (x, y))
+
+print(Point(3, 4))
+

Metatřídy

+

Poslední věc, na kterou se podíváme, jsou metatřídy.

+

Začneme zlehka: pokud při definici třídy zadáme nějakou funkci jako pojmenovaný +parametr metaclass, funkce se zavolá s informacemi potřebnými pro vytvoření +třídy. +Ty můžeme použít, nebo úplně ignorovat a vrátit něco jiného:

+
def fake_metaclass(name, bases, namespace):
+    return 42
+
+class NotAClass(metaclass=fake_metaclass):
+    pass
+
+print(NotAClass)
+

Argumenty, které „metatřída” dostane, jsou tři: jméno třídy, n-tice +nadtříd a jmenný prostor – slovník s proměnnými, které vznikly vykonáním +těla příkazu class. +(Ve jmenném prostoru jsou implicitně nastavené záznamy __module__ +a __qualname__, které přidává samotný příkaz class.)

+
def fake_metaclass(name, bases, namespace):
+    print('name:', name)
+    print('bases:', bases)
+    print('namespace:', namespace)
+    return 42
+
+class NotAClass(int, metaclass=fake_metaclass):
+    foo = 123
+    def inc(self):
+        return self + 1
+

Když metaclass nezadáme, použije se výchozí metatřída, tedy třída třídy. +V Pythonu je to type. +Pokud ji zavoláme s vhodnými argumenty, dostaneme normální třídu:

+
MyInt = type('MyInt', (int, ), {'foo': 123, 'inc': lambda self: self + 1})
+
+three = MyInt(3)
+print(three.inc())
+

Kromě toho se type dá zavolat i s jedním argumentem; v tom případě vrátí +typ (třídu) daného argumentu. +(Tohle chování – funkce, která dělá úplně různé věci v závislosti na počtu +argumentů – v Pythonu často nevidíme. +Je to nešťastná výjimka, která přežívá z historických důvodů.)

+

Pojďme se podívat na třídy několika základních objektů:

+
# Třída základních objektů
+print(type(1))
+print(type("abc"))
+
+# Třída třídy – metatřída.
+# Třída většiny tříd v Pythonu je `type`
+print(type(int))
+print(type(type(1)))
+
+# Třída třídy třídy
+# Samotná `type` je jedna z té většiny tříd; její třída je `type`
+print(type(type))
+print(type(type(type(1))))
+

Objekty třídy type (tedy třídy) se normálně tvoří příkazem class. +Explicitně to můžeme napsat takto:

+
class NormalClass(metaclass=type):
+    foo = 123
+

Když budeme chtít chování třídy změnit, budeme postupovat podobně jako +u jiných objektů. +Kdybych chtěl celé číslo, přes které jde iterovat, podědím z int +a předefinuji __iter__. +Pokud chci třídu, přes kterou jde iterovat (tedy ne přes objekty dané +třídy – přes třídu samotnou!), podědím z type a předefinuji __iter__:

+
class IterableMeta(type):
+    def __init__(cls, name, bases, namespace):
+        cls.items = sorted(n for n in namespace
+                           if not n.startswith('__'))
+        super().__init__(name, bases, namespace)
+
+    def __iter__(cls):
+        return iter(cls.items)
+
+class SimpleEnum(metaclass=IterableMeta):
+    a = 1
+    b = 2
+    c = 3
+    d = 4
+
+print(SimpleEnum.a)
+print(list(SimpleEnum))
+

(V metatřídě se většinou používá cls místo self, aby bylo jasné, že +instance, se kterou pracujeme, je třída – ale to je jen konvence.)

+

Metatřídy se dědí. +Pokud v příkazu class nezadám explicitně metaclass, použije +se metatřída nadtřídy:

+
class AnotherEnum(SimpleEnum):
+    x = 10
+    y = 20
+    z = 30
+
+print(AnotherEnum.a)
+print(list(AnotherEnum))
+

Tímto způsobem lze vnuknout třídám magické schopnosti bez toho, aby +uživatel naší knihovny musel použít metaclass – stačí mu podědit z námi +připravené třídy.

+

Další věc, kterou metatřídy umí, je připravit počáteční jmenný prostor. +Metoda __init__ (nebo __new__) v metatřídě normálně dostane slovník, +což nemusí být vždy to, co potřebuji. +Můžu si chtít třeba „zapamatovat” pořadí, v jakém byly jednotlivé atributy +vytvořeny – a slovník toto pořadí neuchovává (alespoň v některých verzích Pythonu).

+

Na to existuje speciální metoda __prepare__, která se, když na metatřídě +existuje, zavolá pro vytvoření jmenného prostoru:

+
from collections import OrderedDict
+
+class OrderRememberingMeta(type):
+    def __prepare__(cls, name):
+        return OrderedDict()
+
+    def __init__(cls, name, bases, namespace):
+        cls.items = list(namespace)
+        super().__init__(name, bases, namespace)
+
+    def __iter__(cls):
+        return iter(cls.items)
+
+class OrderedEnum(metaclass=OrderRememberingMeta):
+    first = 1
+    second = 2
+    third = 3
+    fourth = 4
+    fifth = 5
+
+print(list(OrderedEnum))
+

Toho se dá využít třeba v mapování objektů na databázi (např. v Django Models +nebo SQLAlchemy), kdy chceme, aby pořadí sloupců tabulky odpovídalo +tomu, jak jsou sloupce/atributy nadefinovány ve třídě.

+

A další

+

Další (bohužel?) oblíbený trik je vnuknutí magických schopností modulu.

+

Naimportované moduly Python ukládá do slovníku sys.modules, aby při dalším +importu nemusel načítat znovu – sys.modules tedy slouží jako cache. +A tuto cache můžeme změnit (tzv. cache poisoning) – přidat si do ní +vlastní „modul“, který ovšem vůbec nemusí být modul, a tudíž může umět věci, +které moduly normálně neumí:

+
import sys
+
+sys.modules['fake'] = 'a string'
+
+...
+
+import fake
+
+print(fake[2])
+

Když toto uděláme přímo z modulu, uživatel naší knihovny dostane podstrčený +objekt hned při prvním importu. +K tomu se hodí proměnná __name__, jméno aktuálního modulu:

+
sys.modules[__name__] = ReplacementModule()
+

Jiný trik je registrace „built-in“ („superglobální”) proměnné:

+
import builtins
+builtins.ANSWER = 42
+
+...
+
+# Třeba v jiném modulu
+print(ANSWER)

Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy +užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

+

Úkol

+

Úkol není!

+

Budete-li chtít některé techniky z této lekce ve svém kódu (včetně semestrálky) použít, zamyslete se, jestli se problém nedá vyřešit jednodušeji, čitelněji, přehledněji, udržovatelněji. +Dobrý mág ví, kdy magii nepoužít.

\ No newline at end of file diff --git a/mi-pyt/micropython/index.html b/mi-pyt/micropython/index.html new file mode 100644 index 00000000..312628f0 --- /dev/null +++ b/mi-pyt/micropython/index.html @@ -0,0 +1,194 @@ +

MicroPython (na ESP8266/NodeMCU)

+

(Tato lekce bohužel, na rozdíl od předchozích, nejde jen tak vyzkoušet z domu – je potřeba speciální hardware.)

+

Dnes si ukážeme, jak lze Python použít na malých/vestavěných zařízeních.

+

Před sebou byste měli mít:

+
    +
  • vývojovou desku NodeMCU,
  • +
  • modrou LED,
  • +
  • pásek s RGB LED moduly,
  • +
  • několik drátků,
  • +
  • malé nepájivé pole.
  • +
+

Přichystejte si MicroUSB kabel. Pokud nemáte vlastní, několik jich můžeme zapůjčit.

+

Obsah lekce vychází z tutoriálů pro PyLadies (a, b), na které se můžete podívat, pokud tu bude něco vysvětleno příliš rychle.

+

Popis desky

+

V posledních letech se dá za relativně málo peněz pořídit počítač dost „velký” na to, aby se na něm dal spustit MicroPython – speciální implementace Pythonu pro prostředí s omezenou pamětí. +NodeMCU, které budeme používat my, obsahuje čip ESP8266, čip navržený jako ovladač WiFi k vestavěným systémům (např. k Arduinu). +Kromě samotného čipu a flash paměti, které se skrývají v oplechované krabičce, je na desce převodník napětí z 5 V (USB) na 3,3 V a datový převodník z USB na sériový protokol a jednotlivé piny procesoru jsou vyvedeny na „nožičky” desky.

+

V paměti je už nahraný firmware MicroPython; pojďme se k němu připojit.

+

Drivery a připojení

+

Postup připojení je jiný pro každý systém:

+
    +
  • Linux: Driver už je nainstalovaný; nainstalujte picocom, přidejte se do skupiny jako dialout (Fedora, nové Ubuntu) nebo uucp (Arch, některý Debian) (správnou skupinu zjistíte pomocí ls -l /dev/ttyUSB0) a zadejte picocom -b 115200 --flow n /dev/ttyUSB0.
  • +
  • Windows: Připojte se pomocí PuTTY (putty.exe). Nastavení:
      +
    • Session:Connection Type: Serial
    • +
    • Serial/Serial line: COM port (najdeš ve správci zařízení)
    • +
    • Serial/Speed: 115200
    • +
    • Serial/Flow Control: None
    • +
    +
  • +
  • Mac: screen /dev/tty.wchusbserial1420 115200
  • +
+

Kdyby byly pro Windows či Mac potřeba ovladače, dají se najít na stránkách výrobce.

+

Po připojení stiskněte tlačítko RST na desce. Měla by se objevit hlavička a nakonec známý pythonní prompt >>>.

+

MicroPython

+

Implementace MicroPython se chová téměř stejně jako CPython. Vyzkoušejte si ale některé rozdíly (porovnejte výstup MicroPythonu a Pythonu 3 na počítači):

+
>>> print
+>>> import math
+>>> math.pi
+>>> import random
+>>> random.randrange()
+

Hlavní omezení MicroPythonu je to, že chybí většina standardní knihovny. +Některé části (např math) jsou k dispozici, spousta ne. +Několik funkcí je na nestandardních místech se změněným rozhraním, např. generátor náhodných čísel:

+
>>> from os import urandom
+>>> urandom(1)[0]
+61
+

Vstup a výstup

+

Co má MicroPython navíc je přístup k hardwaru. +Zkusme zjistit hodnotu pinu 0, který je na NodeMCU normálně HIGH (3,3 V) a je spojen se zemí přes tlačítko FLASH.

+
from machine import Pin
+pin = Pin(0, Pin.IN)
+print(pin.value())
+

API MicroPythonu často používá metody tam, kde bychom čekali atributy, proto ne pin.value ale pin.value().

+

Konstanta Pin.IN konfiguruje daný pin pro čtení. +Zkusme si i zápis: zapojte stranu desky s piny D0-D8 do nepájivého pole a mezi piny D5 a G zapojte diodu. +Následující kód diodu rozsvítí:

+
from machine import Pin
+pin = Pin(14, Pin.OUT)
+pin.value(1)
+

Pro zhasnutí zadejte pin.value(0). (Opět jde o volání metody, není to pin.value = 0.)

+

Pin(14) odpovídá pinu označenému D5 – číslování, které používá procesor (a MicroPython), se bohužel liší od toho, které používá deska. +Odpovídající si označení lze zjistit z taháku.

+

Zkuste zajistit, aby dioda svítila, právě pokud je stisknuté tlačítko FLASH.

+

Ovládání konzole

+

Pravděpodobně jste si všimli, že konzole MicroPythonu automaticky odsazuje. +To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit.

+

Proto má konzole MicroPythonu speciální vkládací mód, který automatické odsazování vypíná. +Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D.

+

Existuje ale i nástroj jménem ampy, který umožňuje pustit předpřipravený skript. +Instaluje se jako adafruit-ampy:

+
$ python -m pip install adafruit-ampy
+

Po nainstalování vypněte existující připojení k desce (picocom/screen/PuTTY), +napište skript a spusťte ho pomocí příkazu run:

+
$ ampy -p PORT run script.py
+

Kde PORT je stejný port jako výše – např. /dev/ttyUSB0 na Linuxu, COM3 na Windows. +Pro více informací můžete nepřekvapivě použít příkaz ampy --help.

+

Od teď doporučuji psát kód vedle do editoru a spouštět jej pomocí ampy run.

+

Zkuste pomocí funkce time.sleep (která v MicroPythonu k dispozici je) diodou blikat v pravidelných intervalech.

+

Blikání

+

Na pravidelné blikání, technicky řečeno pulzně-šířkovou modulaci (angl. Pulse Width Modulation) +má MicroPython třídu PWM, které se dá nastavit frekvence (freq) v Hz a střída (duty) od 0 do 1024:

+
from machine import Pin, PWM
+from time import sleep
+
+led_pin = Pin(14, Pin.OUT)
+pwm = PWM(led_pin, freq=50, duty=512)
+

Výsledný signál – čtvercová vlna – lze použít pro ovládání +LED (střída určuje intenzitu světla), bzučáků (frekvence určuje výšku tónu), +servomotorků (délka signálu určuje úhel otočení), atd.

+

LED pásek WS2812

+

Na destičku se dá připojit spousta různých komponent. Jen je vždy potřeba ověřit v dokumentaci, že existuje knihovna pro daný protokol na MicroPython pro ESP8266. +Časté protokoly jsou I2C, OneWire, či SPI.

+

My připojíme pásek s moduly WS2812. +Každý modul obsahuje tři LED a čip, který umožňuje celý pásek ovládat jedním datovým pinem. +Používá vlastní protokol, který je v MicroPythonu pro ESP8266 implementován pod jménem NeoPixel.

+

Zapojení:

+
    +
  • GND - G
  • +
  • DI (data in) - D4
  • +
  • +5V - VU
  • +
+

Kód:

+
from machine import Pin
+from neopixel import NeoPixel
+
+NUM_LEDS = 8
+pin = Pin(2, Pin.OUT)
+np = NeoPixel(pin, NUM_LEDS)
+np[0] = (255, 255, 255)
+np.write()
+

Co znamenají čísla 0 a 255 na posledním řádku, jistě zjistíte experimentálně.

+

Flashování

+

Na našich destičkách je MicroPython už nahraný, ale kdybyste si koupili vlastní NodeMCU nebo chtěli firmware aktualizovat, budete ho potřebovat umět nahrát.

+

K tomu je potřeba nástroj esptool, který se dá nainstalovat pomocí:

+
$ python -m pip install esptool
+

Po instalaci esptool si stáhněte nejnovější stabilní firmware pro ESP8266 z micropython.org/download a zadejte:

+
$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
+

Hodnotu pro --port opět doplňte podle svého systému – např. /dev/tty.wchusbserial1420 na Macu, COM3 na Windows.

+

Destiček s čipem ESP8266 se vyrábí celá řada různých typů a některé mohou +potřebovat odlišné nastavení při flashování. +Popis všech možností nastavení je k nalezení v dokumentaci k esptool.

+

Je-li na desce nahraný MicroPython, tento příkaz by měl fungovat. U jiného firmware, (případně u poškozeného MicroPythonu), je potřeba při zapojování destičky do USB držet tlačítko FLASH.

+

Souborový systém

+

MicroPython pro ESP8266 obsahuje souborový systém nad flash pamětí, +se kterým pracují standardní pythonní funkce jako open a os.listdir. +Nahrajete-li soubor s příponou .py, lze jej pak v kódu importovat.

+

Existuje-li soubor main.py, naimportuje se automaticky po zapnutí (či resetu) +zařízení. +Není ho pak potřeba připojovat k počítači – stačí powerbanka nebo 3,3V zdroj.

+

Pro nahrání souborů do zařízení můžete použít příkaz ampy put:

+
$ ampy -p PORT put main.py
+

WebREPL

+

ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. +Dokonce se přes WiFi dá i ovládat.

+

Otevřete si stránku micropython.org/webrepl, přes kterou budete po připojení s destičkou komunikovat.

+

Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo použijte destičku jako samostatný access point:

+
# Existující síť:
+
+ESSID = ...
+PASSWORD = ...
+
+import network
+wlan = network.WLAN(network.STA_IF)
+wlan.active(True)
+if not wlan.isconnected():
+    print('connecting to network...')
+    wlan.connect(ESSID, PASSWORD)
+    while not wlan.isconnected():
+        pass
+print('network config:', wlan.ifconfig())
+
+# AP:
+
+ESSID = ...
+PASSWORD = ...
+CHANNEL = 3
+
+import network
+ap_if = network.WLAN(network.AP_IF)
+ap_if.active(True)
+ap_if.config(essid=ESSID, password=PASSWORD, authmode=network.AUTH_WEP, channel=CHANNEL)
+print('network config:', ap_if.ifconfig())
+

Nastavení WebREPL spusťte z interaktivní konzole:

+
>>> import webrepl_setup
+

S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše se připojte k IP vypsané z ifconfig(). +Měli byste dostat konzoli, jako přes USB. +Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat soubory.

+

Komunikace

+

Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu socket, +nebo protokol pro „internet of things“ (jako MQTT), ale +MicroPython pro ESP8266 má zabudouvanou i knihovnu pro HTTP: +ořezanou verzi známých Requests. +Následující kód stáhne data ze stránky +api.thingspeak.com/channels/1417/field/2/last.txt, +kde se objevuje poslední barva tweetnutá s hashtagem #cheerlights.

+

Výslednou hodnotu lze použít jako barvu modul v LED pásku.

+
import urequests
+
+url = 'http://api.thingspeak.com/channels/1417/field/2/last.txt'
+
+def download_color():
+    response = urequests.get(url)
+    text = response.text
+
+    if text and text[0] == '#':
+        color = text[1:7]
+
+        red = int(color[0:2], 16)
+        green = int(color[2:4], 16)
+        blue = int(color[4:6], 16)
+
+        return red, green, blue
+    return 0, 0, 0
+

Opravdové projekty používají lehčí protokoly než HTTP, například MQTT.

\ No newline at end of file diff --git a/mi-pyt/notebook/index.html b/mi-pyt/notebook/index.html new file mode 100644 index 00000000..5f9c9842 --- /dev/null +++ b/mi-pyt/notebook/index.html @@ -0,0 +1,116 @@ +
+
+
+

Jupyter Notebook

+

Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

+

Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). +V Jupyter Notebooku jsou psány i tyto materiály.

+

Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. +Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

+

Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

+
$ python -m pip install --upgrade pip wheel
+$ python -m pip install notebook
+

Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

+

Nainstalovaný Notebook pusťte pomocí:

+
$ python -m notebook
+

V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

+

Jak na Notebook

+

Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

+

Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

+

Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

+
str.l<TAB>
+! ls -a<SHIFT+ENTER>
+str.lower?<SHIFT+ENTER>

Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

+
+
+
+
+
+
In [2]:
+
+
+
1+1  # Nevypíše se (není poslední příkaz)
+2+2  # Vypíše se
+
+ +
+
+
+ +
+
+ + +
+ +
Out[2]:
+ + + + +
+
4
+
+ +
+ +
+
+ +
+
+
+
In [3]:
+
+
+
seznam = [5, 6, 3, 2]
+print(seznam)  # print() funguje
+seznam.sort()
+seznam         # Poslední výraz se vypíše
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[5, 6, 3, 2]
+
+
+
+ +
+ +
Out[3]:
+ + + + +
+
[2, 3, 5, 6]
+
+ +
+ +
+
+ +
+
+
+
+

Další možnosti, jako např. změna typu buňky na Markdown, jsou dostupné z menu nebo klávesovými zkratkami.

+
+
+
+ + diff --git a/mi-pyt/numpy/index.html b/mi-pyt/numpy/index.html new file mode 100644 index 00000000..3ea6f301 --- /dev/null +++ b/mi-pyt/numpy/index.html @@ -0,0 +1,4175 @@ +
+
+
+

Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky:

+
$ python -m pip install --upgrade pip
+$ python -m pip install notebook numpy scipy imageio matplotlib pillow
+
+
+
+
+
+
+
+

Mezitím, co se to bude instalovat, si stáhněte do adresáře static tyto soubory:

+ +

A až bude nainstalováno, spusťte si nový Notebook. (Viz lekce o Notebooku.)

+
+
+
+
+
+
+
+
+
+
+
+
+
+

NumPy

+
+
+
+
+
+
+

NumPy je základní knihovna pro vědce a analytiky, kteří pracují s Pythonem. Definuje typ pro n-rozměrné homogenní pole (nejčastěji čísel) a API pro práci s takovým polem.

+

Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

+

Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

+

Nejednoznačnost a zkratky

+

Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. +Na obojí se používají podobné nástroje. +Automaticky pouštěné skripty musí být samozřejmě robustní. Nástroje ke zkoumání dat ale bývají přívětivé k vědcům, často na úkor robustnosti nebo „dobrých programátorských mravů”. Například některé funkce tak trochu „hádají”, co uživatel chtěl, a v tutoriálech se setkáte se zkratkami jako import numpy as np či dokonce from numpy import *.

+

Toto je kurz programovací, kde nám záleží více na znovupoužitelném kódu než na jednom konkrétním výsledku. Budeme proto preferovat explicitní a jednoznačné operace. Ty jsou v použitých knihovnách vždy vedle zkratek k dispozici a popsány v dokumentaci.

+
+
+
+
+
+
+

Jak s polem pracovat? Nejprve si ho vytvoříme, nejlépe ze seznamu čísel:

+
+
+
+
+
+
In [1]:
+
+
+
import numpy
+array = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[1]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6],
+       [7, 8, 9]])
+
+ +
+ +
+
+ +
+
+
+
+

Každé pole má dvě základní, neměnné vlastnosti: tvar (shape), neboli velikost, a datový typ (dtype).

+
+
+
+
+
+
In [2]:
+
+
+
array.shape
+
+ +
+
+
+ +
+
+ + +
+ +
Out[2]:
+ + + + +
+
(3, 3)
+
+ +
+ +
+
+ +
+
+
+
In [3]:
+
+
+
array.dtype
+
+ +
+
+
+ +
+
+ + +
+ +
Out[3]:
+ + + + +
+
dtype('int64')
+
+ +
+ +
+
+ +
+
+
+
+

Tvar je n-tice, kde n je počet dimenzí pole; shape=(3, 3) dtype='int64' znamená pole 3×3 celých čísel. +Dimenzí může být libovolně mnoho, např. trojrozměrnou matici můžeme vytvořit z trojnásobně vnořených seznamů a NumPy ji „rozumně” vypíše:

+
+
+
+
+
+
In [4]:
+
+
+
cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
+print(cube.shape)
+cube
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
(2, 2, 2)
+
+
+
+ +
+ +
Out[4]:
+ + + + +
+
array([[[1, 2],
+        [3, 4]],
+
+       [[5, 6],
+        [7, 8]]])
+
+ +
+ +
+
+ +
+
+
+
+

Základní operace

+
+
+
+
+
+
+

Základní vlastnost NumPy polí je to, že aritmetické operace se skalárními hodnotami (např. čísly) fungují po prvcích.

+
+
+
+
+
+
In [5]:
+
+
+
array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[5]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6],
+       [7, 8, 9]])
+
+ +
+ +
+
+ +
+
+
+
In [6]:
+
+
+
array - 1
+
+ +
+
+
+ +
+
+ + +
+ +
Out[6]:
+ + + + +
+
array([[0, 1, 2],
+       [3, 4, 5],
+       [6, 7, 8]])
+
+ +
+ +
+
+ +
+
+
+
In [7]:
+
+
+
array / 2
+
+ +
+
+
+ +
+
+ + +
+ +
Out[7]:
+ + + + +
+
array([[0.5, 1. , 1.5],
+       [2. , 2.5, 3. ],
+       [3.5, 4. , 4.5]])
+
+ +
+ +
+
+ +
+
+
+
In [8]:
+
+
+
-(array % 4)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[8]:
+ + + + +
+
array([[-1, -2, -3],
+       [ 0, -1, -2],
+       [-3,  0, -1]])
+
+ +
+ +
+
+ +
+
+
+
+

Kromě aritmetických operací takto funguje i porovnávání. Následujícím výrazem dostanete pravdivostní tabulku, která má True na místech, kde pro příslušný prvek platí podmínka:

+
+
+
+
+
+
In [9]:
+
+
+
array > 5
+
+ +
+
+
+ +
+
+ + +
+ +
Out[9]:
+ + + + +
+
array([[False, False, False],
+       [False, False,  True],
+       [ True,  True,  True]])
+
+ +
+ +
+
+ +
+
+
+
+

Protože Python neumožňuje předefinovat chování operátorů and a or, logické spojení operací se tradičně dělá přes bitové operátory & (a) a | (nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:

+
+
+
+
+
+
In [10]:
+
+
+
(array > 3) & (array < 7)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[10]:
+ + + + +
+
array([[False, False, False],
+       [ True,  True,  True],
+       [False, False, False]])
+
+ +
+ +
+
+ +
+
+
+
+

Operace s jinými poli pracují po prvcích. Obě pole musí být stejně velké.

+
+
+
+
+
+
In [11]:
+
+
+
array + array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[11]:
+ + + + +
+
array([[ 2,  4,  6],
+       [ 8, 10, 12],
+       [14, 16, 18]])
+
+ +
+ +
+
+ +
+
+
+
In [12]:
+
+
+
array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
+
+ +
+
+
+ +
+
+ + +
+ +
Out[12]:
+ + + + +
+
array([[0, 2, 0],
+       [4, 0, 6],
+       [0, 8, 0]])
+
+ +
+ +
+
+ +
+
+
+
+

Sekvence (jako seznamy) jsou před operací převedeny na pole.

+
+
+
+
+
+
In [13]:
+
+
+
array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[13]:
+ + + + +
+
array([[0, 2, 0],
+       [4, 0, 6],
+       [0, 8, 0]])
+
+ +
+ +
+
+ +
+
+
+
+

Indexování

+
+
+
+
+
+
+

NumPy pole jde různými způsoby indexovat. Základní způsoby známe už ze samotného Pythonu – pole se chová jako sekvence menších polí:

+
+
+
+
+
+
In [14]:
+
+
+
array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[14]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6],
+       [7, 8, 9]])
+
+ +
+ +
+
+ +
+
+
+
In [15]:
+
+
+
array[0]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[15]:
+ + + + +
+
array([1, 2, 3])
+
+ +
+ +
+
+ +
+
+
+
In [16]:
+
+
+
array[0:-1]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[16]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6]])
+
+ +
+ +
+
+ +
+
+
+
In [17]:
+
+
+
array[0][1]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[17]:
+ + + + +
+
2
+
+ +
+ +
+
+ +
+
+
+
+

Na rozdíl od Pythonu se ale dá vícerozměrné pole indexovat přímo n-ticí. Toto je dokonce preferovaný způsob – přehlednější a mnohem rychlejší:

+
+
+
+
+
+
In [18]:
+
+
+
array[0, 1]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[18]:
+ + + + +
+
2
+
+ +
+ +
+
+ +
+
+
+
In [19]:
+
+
+
array[0:-1, 1:]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[19]:
+ + + + +
+
array([[2, 3],
+       [5, 6]])
+
+ +
+ +
+
+ +
+
+
+
+

Chceme-li vybrat určitý sloupec, řekneme si „kompletním intervalem“ (:) o všechny řádky:

+
+
+
+
+
+
In [20]:
+
+
+
array[:, 2]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[20]:
+ + + + +
+
array([3, 6, 9])
+
+ +
+ +
+
+ +
+
+
+
+

Další způsob specifický pro NumPy je indexování pravdivostní tabulkou.

+

Když potřebujete z matice vybrat prvky, pro které platí nějaká podmínka, napřed si vytvořte pole hodnot True/False:

+
+
+
+
+
+
In [21]:
+
+
+
array > 4
+
+ +
+
+
+ +
+
+ + +
+ +
Out[21]:
+ + + + +
+
array([[False, False, False],
+       [False,  True,  True],
+       [ True,  True,  True]])
+
+ +
+ +
+
+ +
+
+
+
+

To pak použijte jako index:

+
+
+
+
+
+
In [22]:
+
+
+
array[array > 4]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[22]:
+ + + + +
+
array([5, 6, 7, 8, 9])
+
+ +
+ +
+
+ +
+
+
+
+

Výsledek je jednorozměrný – informace o původních pozicích prvků se ztratí.

+
+
+
+
+
+
+

Pro úplnost uvedu ještě dva způsoby indexování. První je seznamem indexů, kterým můžete vybírat, přehazovat nebo i duplikovat konkrétní řádky:

+
+
+
+
+
+
In [23]:
+
+
+
array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
+
+ +
+
+
+ +
+
+ + +
+ +
Out[23]:
+ + + + +
+
array([[1, 2, 3],
+       [7, 8, 9],
+       [4, 5, 6],
+       [4, 5, 6]])
+
+ +
+ +
+
+ +
+
+
+
In [24]:
+
+
+
array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
+
+ +
+
+
+ +
+
+ + +
+ +
Out[24]:
+ + + + +
+
array([[3, 3, 1, 1],
+       [6, 6, 4, 4],
+       [9, 9, 7, 7]])
+
+ +
+ +
+
+ +
+
+
+
+

Druhý je indexování pomocí n-tice „řádkových souřadnic“ a n-tice odpovídajících „sloupcových souřadnic“:

+
+
+
+
+
+
In [25]:
+
+
+
array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[25]:
+ + + + +
+
array([2, 6, 7])
+
+ +
+ +
+
+ +
+
+
+
+

Trochu specifické je indexování vícerozměrných polí. U nich se často využije „kompletní interval“ (:):

+
+
+
+
+
+
In [26]:
+
+
+
cube
+
+ +
+
+
+ +
+
+ + +
+ +
Out[26]:
+ + + + +
+
array([[[1, 2],
+        [3, 4]],
+
+       [[5, 6],
+        [7, 8]]])
+
+ +
+ +
+
+ +
+
+
+
In [27]:
+
+
+
cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[27]:
+ + + + +
+
array([[1, 2],
+       [3, 4]])
+
+ +
+ +
+
+ +
+
+
+
In [28]:
+
+
+
cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[28]:
+ + + + +
+
array([[1, 2],
+       [5, 6]])
+
+ +
+ +
+
+ +
+
+
+
In [29]:
+
+
+
cube[:, :, 0]  # První sloupce
+
+ +
+
+
+ +
+
+ + +
+ +
Out[29]:
+ + + + +
+
array([[1, 3],
+       [5, 7]])
+
+ +
+ +
+
+ +
+
+
+
+

Má-li pole hodně rozměrů, je psaní spousty :, zdlouhavé a nepřehledné. Existuje proto speciální hodnota ... (Ellipsis), která doplní tolik „kompletních intervalů“ (:), aby souhlasil počet dimenzí:

+
+
+
+
+
+
In [30]:
+
+
+
cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[30]:
+ + + + +
+
array([[1, 3],
+       [5, 7]])
+
+ +
+ +
+
+ +
+
+
+
+

Broadcasting a změny

+
+
+
+
+
+
+

Už jsme si ukázali, že aritmetické operace se skalárními hodnotami se provede pro všechny prvky, zatímco operace mezi dvěma stejně velkými poli se provede po prvcích:

+
+
+
+
+
+
In [31]:
+
+
+
array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[31]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6],
+       [7, 8, 9]])
+
+ +
+ +
+
+ +
+
+
+
In [32]:
+
+
+
array * 3
+
+ +
+
+
+ +
+
+ + +
+ +
Out[32]:
+ + + + +
+
array([[ 3,  6,  9],
+       [12, 15, 18],
+       [21, 24, 27]])
+
+ +
+ +
+
+ +
+
+
+
In [33]:
+
+
+
array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[33]:
+ + + + +
+
array([[0, 2, 0],
+       [4, 0, 6],
+       [0, 8, 0]])
+
+ +
+ +
+
+ +
+
+
+
+

Jak je to ale s různě velkými poli?

+

Nemá-li sekvence, se kterou pracujeme, dost dimenzí, poslední dimenze se „rozšíří“, jako bychom pracovali v každém sloupci se skalární hodnotou. Tomuto „rozšiřování” se obecně říká broadcasting.

+
+
+
+
+
+
In [34]:
+
+
+
array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[34]:
+ + + + +
+
array([[1, 2, 3],
+       [4, 5, 6],
+       [7, 8, 9]])
+
+ +
+ +
+
+ +
+
+
+
In [35]:
+
+
+
array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
+
+ +
+
+
+ +
+
+ + +
+ +
Out[35]:
+ + + + +
+
array([[ 0,  2, 30],
+       [ 0,  5, 60],
+       [ 0,  8, 90]])
+
+ +
+ +
+
+ +
+
+
+
+

Podobné rozšiřování nastane, má-li některá dimenze velikost 1:

+
+
+
+
+
+
In [36]:
+
+
+
array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
+
+ +
+
+
+ +
+
+ + +
+ +
Out[36]:
+ + + + +
+
array([[ 0,  0,  0],
+       [ 4,  5,  6],
+       [70, 80, 90]])
+
+ +
+ +
+
+ +
+
+
+
+

Jednotlivé hodnoty v poli lze měnit:

+
+
+
+
+
+
In [37]:
+
+
+
array[0, 0] = 123
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[37]:
+ + + + +
+
array([[123,   2,   3],
+       [  4,   5,   6],
+       [  7,   8,   9]])
+
+ +
+ +
+
+ +
+
+
+
+

...a i na měnění se vztahuje broadcasting:

+
+
+
+
+
+
In [38]:
+
+
+
array[0] = 123
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[38]:
+ + + + +
+
array([[123, 123, 123],
+       [  4,   5,   6],
+       [  7,   8,   9]])
+
+ +
+ +
+
+ +
+
+
+
In [39]:
+
+
+
array[:] = 123
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[39]:
+ + + + +
+
array([[123, 123, 123],
+       [123, 123, 123],
+       [123, 123, 123]])
+
+ +
+ +
+
+ +
+
+
+
+

Obecně platí, že lze-li něčím vybírat prvky, lze tím i pole měnit:

+
+
+
+
+
+
In [40]:
+
+
+
array[(1, 2, 0), (0, 2, 1)] = 0
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[40]:
+ + + + +
+
array([[123,   0, 123],
+       [  0, 123, 123],
+       [123, 123,   0]])
+
+ +
+ +
+
+ +
+
+
+
+

Další způsob, jak pole měnit, je rozšířeným přiřazením.

+
+
+
+
+
+
In [41]:
+
+
+
array *= 2
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[41]:
+ + + + +
+
array([[246,   0, 246],
+       [  0, 246, 246],
+       [246, 246,   0]])
+
+ +
+ +
+
+ +
+
+
+
+

Tato operace není totéž co array = array * 2, ačkoli má stejný výsledek.

+

array *= 2 změní existující pole, zatímco array = array * 2 vytvoří nové pole, které pak přiřadí do původní proměnné.

+
+
+
+
+
+
+

Pozor na to, že není možné měnit typ pole:

+
+
+
+
+
+
In [42]:
+
+
+
try:
+    array /= 2
+except Exception as e:
+    print("Chyba!!", type(e), e)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
+
+
+
+ +
+
+ +
+
+
+
+

Tvoření matic, část 2

+
+
+
+
+
+
+

Časté druhy matic se dají vytvořit pomocí pomocných funkcí. Výsledky se dají použít přímo nebo naplnit vypočítanými daty:

+
+
+
+
+
+
In [43]:
+
+
+
numpy.zeros((4, 4))
+
+ +
+
+
+ +
+
+ + +
+ +
Out[43]:
+ + + + +
+
array([[0., 0., 0., 0.],
+       [0., 0., 0., 0.],
+       [0., 0., 0., 0.],
+       [0., 0., 0., 0.]])
+
+ +
+ +
+
+ +
+
+
+
In [44]:
+
+
+
numpy.ones((4, 4))
+
+ +
+
+
+ +
+
+ + +
+ +
Out[44]:
+ + + + +
+
array([[1., 1., 1., 1.],
+       [1., 1., 1., 1.],
+       [1., 1., 1., 1.],
+       [1., 1., 1., 1.]])
+
+ +
+ +
+
+ +
+
+
+
In [45]:
+
+
+
numpy.full((4, 4), 12.34)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[45]:
+ + + + +
+
array([[12.34, 12.34, 12.34, 12.34],
+       [12.34, 12.34, 12.34, 12.34],
+       [12.34, 12.34, 12.34, 12.34],
+       [12.34, 12.34, 12.34, 12.34]])
+
+ +
+ +
+
+ +
+
+
+
In [46]:
+
+
+
numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[46]:
+ + + + +
+
array([[1., 0., 0., 0.],
+       [0., 1., 0., 0.],
+       [0., 0., 1., 0.],
+       [0., 0., 0., 1.]])
+
+ +
+ +
+
+ +
+
+
+
In [47]:
+
+
+
numpy.diag([1, 2, 3, 4])  # Diagonální matice
+
+ +
+
+
+ +
+
+ + +
+ +
Out[47]:
+ + + + +
+
array([[1, 0, 0, 0],
+       [0, 2, 0, 0],
+       [0, 0, 3, 0],
+       [0, 0, 0, 4]])
+
+ +
+ +
+
+ +
+
+
+
+

U těchto funkcí lze obecně použít argument dtype, kterým specifikujeme datový typ:

+
+
+
+
+
+
In [48]:
+
+
+
int_zeros = numpy.zeros((4, 4), dtype='int8')
+print(int_zeros.dtype)
+int_zeros
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
int8
+
+
+
+ +
+ +
Out[48]:
+ + + + +
+
array([[0, 0, 0, 0],
+       [0, 0, 0, 0],
+       [0, 0, 0, 0],
+       [0, 0, 0, 0]], dtype=int8)
+
+ +
+ +
+
+ +
+
+
+
+

Další funkce tvoří jednorozměrné matice. Základní je arange, která bere stejné argumenty jako range v Pythonu:

+
+
+
+
+
+
In [49]:
+
+
+
numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
+
+ +
+
+
+ +
+
+ + +
+ +
Out[49]:
+ + + + +
+
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
+       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
+
+ +
+ +
+
+ +
+
+
+
+

Navíc umí pracovat s reálnými čísly (float). Pozor ale na to, že reálná čísla jsou nepřesná! arange k začátku sekvence postupně přičítá „krok”, takže chyba narůstá celkem rychle:

+
+
+
+
+
+
In [50]:
+
+
+
numpy.arange(0.0, 50.0, 0.3)[-1]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[50]:
+ + + + +
+
49.799999999999997
+
+ +
+ +
+
+ +
+
+
+
+

V krajních případech takto dokonce můžeme dostat pole jiné velikosti, než jsme zamýšleli. Proto arange používejte jen pro celá čísla; pro reálná je tu linspace, která bere začátek a konec intervalu, plus počet prvků:

+
+
+
+
+
+
In [51]:
+
+
+
numpy.linspace(0, 50, num=11)  # vždy 11 prvků
+
+ +
+
+
+ +
+
+ + +
+ +
Out[51]:
+ + + + +
+
array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])
+
+ +
+ +
+
+ +
+
+
+
+

Reshape

+
+
+
+
+
+
+

Ačkoli indexování polí v NumPy je dost mocné, v paměti jsou jednotlivé hodnoty reprezentovány jako (metadata a) jednorozměrné pole, známé z jazyka C (ačkoli samotné rozmístění prvků může být jiné než po řádcích, jak jsme zvyklí u C).

+

Je jednoduché změnit tvar pole, nezmění-li se tím celkový počet prvků:

+
+
+
+
+
+
In [52]:
+
+
+
array = numpy.arange(12)
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[52]:
+ + + + +
+
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
+
+ +
+ +
+
+ +
+
+
+
In [53]:
+
+
+
reshaped = array.reshape((3, 4))
+reshaped
+
+ +
+
+
+ +
+
+ + +
+ +
Out[53]:
+ + + + +
+
array([[ 0,  1,  2,  3],
+       [ 4,  5,  6,  7],
+       [ 8,  9, 10, 11]])
+
+ +
+ +
+
+ +
+
+
+
+

Pozor na to, že reshape sice vrací nový objekt, ale může (ale nemusí!) to být jen nový pohled na existující data. Změny v pohledu se projeví i v původním poli:

+
+
+
+
+
+
In [54]:
+
+
+
reshaped[2, 2] = -99
+reshaped
+
+ +
+
+
+ +
+
+ + +
+ +
Out[54]:
+ + + + +
+
array([[  0,   1,   2,   3],
+       [  4,   5,   6,   7],
+       [  8,   9, -99,  11]])
+
+ +
+ +
+
+ +
+
+
+
In [55]:
+
+
+
array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[55]:
+ + + + +
+
array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9, -99,  11])
+
+ +
+ +
+
+ +
+
+
+
+

Podobně tvoří pohledy i jednoduché indexování:

+
+
+
+
+
+
In [56]:
+
+
+
a_slice = array[2:4]
+a_slice[:] = -99, -99
+
+array
+
+ +
+
+
+ +
+
+ + +
+ +
Out[56]:
+ + + + +
+
array([  0,   1, -99, -99,   4,   5,   6,   7,   8,   9, -99,  11])
+
+ +
+ +
+
+ +
+
+
+
+

Potřebujete-li kopii dat, použijte metodu copy:

+
+
+
+
+
+
In [57]:
+
+
+
array.reshape((3, 4)).copy()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[57]:
+ + + + +
+
array([[  0,   1, -99, -99],
+       [  4,   5,   6,   7],
+       [  8,   9, -99,  11]])
+
+ +
+ +
+
+ +
+
+
+
+

Podobně jako reshape funguje transpozice, což je tak častá operace, že má jednopísmennou zkratku – atribut T. (Tohle hodně napomáhá tomu, že zápis maticových výpočtů v NumPy se podobá odpovídajícím matematickým vzorcům.)

+
+
+
+
+
+
In [58]:
+
+
+
reshaped.T
+
+ +
+
+
+ +
+
+ + +
+ +
Out[58]:
+ + + + +
+
array([[  0,   4,   8],
+       [  1,   5,   9],
+       [-99,   6, -99],
+       [-99,   7,  11]])
+
+ +
+ +
+
+ +
+
+
+
+

Až budete NumPy zkoušet, doporučuji si u nových funkcí najít, zda tvoří nová pole, vracejí pohled nebo modifikují původní pole. U některých funkcí najdete pojmenovaný argument inplace (modifikuje původní pole), případně out, („naplní“ jiné, existující pole).

+
+
+
+
+
+
+

Datové typy

+
+
+
+
+
+
+

Jak už bylo řečeno, matice v NumPy mají určené datové typy. Ty jdou nastavit ve většině funkcí, které matice tvoří, argumentem dtype:

+
+
+
+
+
+
In [59]:
+
+
+
numpy.zeros(4, dtype=int)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[59]:
+ + + + +
+
array([0, 0, 0, 0])
+
+ +
+ +
+
+ +
+
+
+
In [60]:
+
+
+
numpy.zeros(4, dtype=float)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[60]:
+ + + + +
+
array([0., 0., 0., 0.])
+
+ +
+ +
+
+ +
+
+
+
In [61]:
+
+
+
numpy.zeros(4, dtype=bool)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[61]:
+ + + + +
+
array([False, False, False, False])
+
+ +
+ +
+
+ +
+
+
+
+

Nejobecnější typ je object (jehož použitím ale přicházíme o většinu výhod NumPy).

+
+
+
+
+
+
In [62]:
+
+
+
numpy.array([0, 1.3, "foobar"], dtype=object)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[62]:
+ + + + +
+
array([0, 1.3, 'foobar'], dtype=object)
+
+ +
+ +
+
+ +
+
+
+
+

Kromě pythonních typů bere dtype i řetězcové specifikace typu:

+
+
+
+
+
+
In [63]:
+
+
+
numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
+
+ +
+
+
+ +
+
+ + +
+ +
Out[63]:
+ + + + +
+
array([  1,   8, -12], dtype=int8)
+
+ +
+ +
+
+ +
+
+
+
+

Znáte-li modul array ze standardní knihovny, můžete jeho specifikaci použít i tady:

+
+
+
+
+
+
In [64]:
+
+
+
numpy.zeros(4, dtype='<I')
+
+ +
+
+
+ +
+
+ + +
+ +
Out[64]:
+ + + + +
+
array([0, 0, 0, 0], dtype=uint32)
+
+ +
+ +
+
+ +
+
+
+
+

Navíc dtype umí řetězcové a bytestring typy. Tyto mají danou maximální velikost a nesmí obsahovat \0 (resp. znakem '\0' jsou ukončeny):

+
+
+
+
+
+
In [65]:
+
+
+
numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
+
+ +
+
+
+ +
+
+ + +
+ +
Out[65]:
+ + + + +
+
array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
+
+ +
+ +
+
+ +
+
+
+
In [66]:
+
+
+
numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
+
+ +
+
+
+ +
+
+ + +
+ +
Out[66]:
+ + + + +
+
array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
+
+ +
+ +
+
+ +
+
+
+
+

Typy v NumPy můžou být poměrně složité; např. existují i složené datové typy (records). Ty nebudeme používat, ale je dobré o nich aspoň tušit:

+
+
+
+
+
+
In [67]:
+
+
+
record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
+numpy.array([(1, 2, 'abc')] * 4, record_type)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[67]:
+ + + + +
+
array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
+      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
+
+ +
+ +
+
+ +
+
+
+
+

Maticové násobení

+
+
+
+
+
+
+

Kromě základních aritmetických operací se u vícerozměrných polí často setkáme s maticovým násobením. Předpokládám, že jako bakaláři jste se s ním už setkali a tušíte co dělá – jestli ne, tuto sekci ignorujte.

+
+
+
+
+
+
+

V Pythonu 3.5 byl na výzvu vědecké komunity do jazyka přidán operátor @ (mATrix multiplication), který je vyhrazen pro maticové násobení. V samotném Pythonu ani ve standardní knihovně není typ, který ho podporuje, ale matice v NumPy tuto operaci samozřejmě umí.

+
+
+
+
+
+
In [68]:
+
+
+
array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
+array2 = numpy.array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])
+array1 @ array2
+
+ +
+
+
+ +
+
+ + +
+ +
Out[68]:
+ + + + +
+
array([[ 1,  4,  9],
+       [ 4, 10, 18],
+       [ 7, 16, 27]])
+
+ +
+ +
+
+ +
+
+
+
+

Ve starších verzích Pythonu je potřeba používat metodu nebo funkci dot.

+
+
+
+
+
+
+

Důvod přidání operátoru @ byl prostý – zjednodušení zápisu maticových operací. Jako příklad uvedený v návrhu je uveden tento vzorec pro testování hypotéz v lineárním regresním modelu:

+

$ S=(H\beta-r)^T(HVH^T)^{-1} (H\beta-r) $

+

V NumPy se dá přepsat jako:

+
from numpy import dot
+from numpy.linalg import inv, solve
+

Pomocí funkce dot:

+
S = dot((dot(H, beta) - r).T,
+       dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
+

Pomocí metoody dot:

+
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)
+

Pomocí operátoru @:

+
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
+

Poslední varianta nápadně připomíná původní vzorec; u prvních dvou se člověk snadno ztratí ve změti závorek.

+
+
+
+
+
+
+

Booleovské hodnoty polí

+
+
+
+
+
+
+

Použijeme-li pole v příkazu if, NumPy nám vynadá. Standardní pythonní seznam je „pravdivý“ pokud obsahuje nějaké prvky, ale u pole, které má fixní velikost, je tahle informace téměř vždy zbytečná.

+
+
+
+
+
+
In [69]:
+
+
+
try:
+    if numpy.eye(3):
+        pass
+except ValueError as e:
+    print("Chyba!", type(e), e)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
+
+
+
+ +
+
+ +
+
+
+
+

Musíme říct přesně, co chceme.

+
+
+
+
+
+
In [70]:
+
+
+
if numpy.eye(3).any():
+    print('Alespoň jeden prvek je nenulový')
+if numpy.eye(3).all():
+    print('Všechny prvky jsou nenulové')
+if numpy.eye(3).size:
+    print('Pole obsahuje nějaké prvky')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Alespoň jeden prvek je nenulový
+Pole obsahuje nějaké prvky
+
+
+
+ +
+
+ +
+
+
+
+

Z historických důvodů existují dvě výjimky: pole s právě jedním prvkem má pravdivostní hodnotu podle daného prvku a prázdné pole je „nepravdivé“:

+
+
+
+
+
+
In [71]:
+
+
+
if numpy.ones((1, 1, 1, 1)):
+    print('Ano')
+if numpy.zeros((1, 1, 1, 1)):
+    print('Ne')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Ano
+
+
+
+ +
+
+ +
+
+
+
In [72]:
+
+
+
if numpy.ones((0, 0)):
+    print('Ano')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
+
+
+
+ +
+
+ +
+
+
+
+

Další operace

+
+
+
+
+
+
+

Modul numpy obsahuje spoustu základních funkcí, které pracují s maticemi; mimo jiné většinu funkcií z pythonního modulu math. Oproti math zvládají funkce z NumPy broadcasting.

+
+
+
+
+
+
In [73]:
+
+
+
array = numpy.linspace(0, numpy.pi, num=1000)
+array[:10]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[73]:
+ + + + +
+
array([0.        , 0.00314474, 0.00628947, 0.00943421, 0.01257895,
+       0.01572369, 0.01886842, 0.02201316, 0.0251579 , 0.02830264])
+
+ +
+ +
+
+ +
+
+
+
In [74]:
+
+
+
sine = numpy.sin(array)
+sine[:10]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[74]:
+ + + + +
+
array([0.        , 0.00314473, 0.00628943, 0.00943407, 0.01257862,
+       0.01572304, 0.0188673 , 0.02201138, 0.02515525, 0.02829886])
+
+ +
+ +
+
+ +
+
+
+
+

Další operace doporučuji hledat buď v Notebooku přes tab, v dokumentaci, nebo obecně na Internetu (kde najdete i případné knihovny, které implementují operace, které v NumPy nejsou).

+
+
+
+
+
+
+

Příklady použití

+
+
+
+
+
+
+

Dost teorie. Tahle n-rozměrná pole se používají na spoustu zajímavých věcí. Podívejme se na některé příklady.

+
+
+
+
+
+
+

Matematika a grafy

+
+
+
+
+
+
+

Jak se používají matice, jistě znáte z matematiky a cílem tohoto kurzu není vás to naučit. Ukážu ale pár ochutnávek.

+

Použijeme knihovnu Matplotlib, která vykresluje grafy. Jak ji použít dohledáte v dokumentaci nebo – často efektivněji – v galerii příkladů.

+

Matplotlib nemá automatickou integraci s Jupyter Notebookem, proto ji je potřeba po importu zapnout:

+
+
+
+
+
+
In [75]:
+
+
+
from matplotlib import pyplot
+
+# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
+%matplotlib inline
+
+ +
+
+
+ +
+
+
+
+

A teď můžeme nakreslit třeba graf funkce:

+
+
+
+
+
+
In [76]:
+
+
+
x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
+y = numpy.sin(x)                      # odpovídající hodnoty funkce
+
+pyplot.plot(x, y)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[76]:
+ + + + +
+
[<matplotlib.lines.Line2D at 0x7fab9ebd62d0>]
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
In [77]:
+
+
+
s = numpy.linspace(-10, 10, num=100)
+
+# meshgrid vrátí dvě 100×100 matice:
+# - jednu, kde v každém řádku jsou čísla od -10 do 10,
+# - druhou, kde v každém sloupci jsou čísla od -10 do 10.
+x, y = numpy.meshgrid(s, s)
+
+# vyhodnotíme (x**2 + y**2) pro každý prvek
+z = x ** 2 + y ** 2
+
+# výsledek vykreslíme jako obrázek
+pyplot.imshow(z)
+
+# přidáme legendu
+pyplot.colorbar()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[77]:
+ + + + +
+
<matplotlib.colorbar.Colorbar at 0x7fab9e6e56d0>
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
In [78]:
+
+
+
# Ta samá data můžeme vykreslit i ve 3D
+from mpl_toolkits.mplot3d import Axes3D
+
+fig = pyplot.figure()
+axes = fig.gca(projection='3d')
+
+surf = axes.plot_surface(x, y, z, cmap='viridis')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Obrázky

+
+
+
+
+
+
+

Typický barevný obrázek není nic než matice $m \times n \times 3$ čísel: $m \times n$ pixelů na šířku a výšku a 3 kanály pro červenou, zelenou a modrou barvu.

+

Knihovna pillow (nástupce knihovny PIL, který se stále importuje jako PIL) obsahuje nástroje na práci s obrázky, např. „nakresli čáru“ nebo „převeď na černobílý obrázek“ nebo „načti PNG“. Není postavena přímo na NumPy, ale umí obrázky převádět z a na NumPy pole, pokud máme NumPy nainstalované.

+

Knihovna imageio slouží k načítání a ukládání různých (njen obrázkových) formátů do/z NumPy matic.

+

Nás bude zajímat funkce imageio.imread, která pomocí Pillow/PIL načte obrázek jako 3D matici 8bitových čísel. Já načtu obrázek hada, vy najděte na internetu jakýkoli RGB obrázek a načtěte si ten.

+

Použitý obrázek je stažený z Wikimedia Commons a je pod licencí CC-BY-SA 3.0. Autor je uživatel Mokele na anglické Wikipedii.

+
+
+
+
+
+
In [79]:
+
+
+
import imageio
+img = imageio.imread('static/python.jpg')
+img
+
+ +
+
+
+ +
+
+ + +
+ +
Out[79]:
+ + + + +
+
Array([[[172, 173, 165],
+        [173, 174, 166],
+        [173, 174, 168],
+        ...,
+        [172, 171, 167],
+        [173, 172, 168],
+        [173, 172, 168]],
+
+       [[175, 176, 168],
+        [174, 175, 167],
+        [172, 173, 167],
+        ...,
+        [172, 171, 167],
+        [173, 172, 168],
+        [174, 173, 169]],
+
+       [[176, 177, 169],
+        [174, 175, 167],
+        [171, 172, 166],
+        ...,
+        [173, 172, 168],
+        [173, 172, 168],
+        [172, 171, 167]],
+
+       ...,
+
+       [[209, 211, 206],
+        [210, 212, 207],
+        [211, 213, 208],
+        ...,
+        [202, 203, 197],
+        [200, 201, 195],
+        [200, 201, 195]],
+
+       [[208, 210, 205],
+        [209, 211, 206],
+        [209, 211, 206],
+        ...,
+        [202, 203, 197],
+        [202, 203, 197],
+        [203, 204, 198]],
+
+       [[207, 209, 204],
+        [209, 211, 206],
+        [210, 212, 207],
+        ...,
+        [201, 202, 196],
+        [201, 202, 196],
+        [201, 202, 196]]], dtype=uint8)
+
+ +
+ +
+
+ +
+
+
+
+

Pomocí nám už známé knihovny matplotlib takovou matici můžeme zobrazit:

+
+
+
+
+
+
In [80]:
+
+
+
pyplot.imshow(img)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[80]:
+ + + + +
+
<matplotlib.image.AxesImage at 0x7fabd75fcc50>
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Podívejme se teď na strukturu matice:

+
+
+
+
+
+
In [81]:
+
+
+
img.shape
+
+ +
+
+
+ +
+
+ + +
+ +
Out[81]:
+ + + + +
+
(887, 1037, 3)
+
+ +
+ +
+
+ +
+
+
+
+

První rozměr jsou řádky (y); můj obrázek je 887 pixelů vysoký. Druhý jsou sloupce (x); tento obrázek má na šířku 1037 px. +Třetí rozměr jsou barevné kanály.

+
+
+
+
+
+
+

Pomocí indexování se můžeme na jednotlivé barevné kanály dostat: je to poslední index, takže řádky a sloupce nahradíme buď dvěma kompletními intervaly (:, :) nebo vynechávkou (...). Červený kanál tedy bude [..., 1], modrý [..., -1].

+

Zobrazení chceme černobílé; na to má matplotlib pojmenovaný argument cmap. Výchozí způsob obarvování je vhodný spíše pro grafy funkcí.

+
+
+
+
+
+
In [82]:
+
+
+
blue_channel = img[..., -1]
+pyplot.imshow(blue_channel, cmap='gray')
+
+ +
+
+
+ +
+
+ + +
+ +
Out[82]:
+ + + + +
+
<matplotlib.image.AxesImage at 0x7fabd75bfc50>
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Zajímavé využití obrázku jako matice je steganografie: ukrytí informace v obrazových datech.

+

Načteme jiný obrázek stejné velikosti, tentokrát černobílý (s módem L). Informace v něm schováme do posledního bitu modrého kanálu.

+
+
+
+
+
+
In [83]:
+
+
+
secret = imageio.imread('static/secret.png', pilmode='L')
+
+img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
+
+ +
+
+
+ +
+
+
+
+

Obrázek vypadá na první pohled stejně...

+
+
+
+
+
+
In [84]:
+
+
+
pyplot.imshow(img)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[84]:
+ + + + +
+
<matplotlib.image.AxesImage at 0x7fabd75813d0>
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

... ale v posledím modrém bitu se skrývá tajná informace.

+
+
+
+
+
+
In [85]:
+
+
+
pyplot.imshow(img[..., -1] & 1, cmap='gray')
+
+ +
+
+
+ +
+
+ + +
+ +
Out[85]:
+ + + + +
+
<matplotlib.image.AxesImage at 0x7fab9c631d90>
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Výsledek je dobré uložit v bezztrátovém formátu (PNG), aby se informace neztratila:

+
+
+
+
+
+
In [86]:
+
+
+
imageio.imsave('python.png', img)
+
+ +
+
+
+ +
+
+
+
+

Zvuk

+
+
+
+
+
+
+

Jako pole lze reprezentovat i zvukový záznam. Mám záznam, na kterém zkouším zpívat; pomocí funkce scipy.io.wavfile ho můžu načíst jako NumPy pole:

+
+
+
+
+
+
In [87]:
+
+
+
import scipy.io.wavfile
+sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
+print(sample_rate)
+sound
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
48000
+
+
+
+ +
+ +
Out[87]:
+ + + + +
+
array([[ -58,  -88],
+       [ -65,  -49],
+       [  56,  -18],
+       ...,
+       [   1,  231],
+       [ -85,  234],
+       [-118,  212]], dtype=int16)
+
+ +
+ +
+
+ +
+
+
+
+

Zvuk je stereo, má dvě stopy; jednu z nich si vykreslím:

+
+
+
+
+
+
In [88]:
+
+
+
channel = sound[..., 1]
+pyplot.plot(channel)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[88]:
+ + + + +
+
[<matplotlib.lines.Line2D at 0x7fab9c051b90>]
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Případně můžu využít možností Jupyter Notebooku a HTML a zvuk si přehrát:

+
+
+
+
+
+
In [89]:
+
+
+
from IPython.display import Audio
+Audio(data=channel, rate=sample_rate)
+print('(Zkuste si to sami; tento print vymažte)')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
(Zkuste si to sami; tento print vymažte)
+
+
+
+ +
+
+ +
+
+
+
+

Podívám se na detail první „noty”, kde je patrná vlna s nějakou frekvencí:

+
+
+
+
+
+
In [90]:
+
+
+
segment = channel[50000:55000]
+pyplot.plot(segment)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[90]:
+ + + + +
+
[<matplotlib.lines.Line2D at 0x7fab96685510>]
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
In [91]:
+
+
+
from IPython.display import Audio
+Audio(data=segment, rate=sample_rate)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[91]:
+ + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Jaká to je frekvence? Znáte-li analýzu signálů, tušíte, že na podobné otázky odpovídá Fourierova transformace. +NumPy obsahuje diskrétní Fourierovu transformaci v modulu numpy.fft spolu s funkcí, která spočítá odpovídající frekvence v Hz:

+
+
+
+
+
+
In [92]:
+
+
+
spectrum = numpy.fft.fft(segment)
+freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
+pyplot.xlabel('Frekvence (Hz)')
+pyplot.plot(freqs, numpy.abs(spectrum))
+
+ +
+
+
+ +
+
+ + +
+ +
Out[92]:
+ + + + +
+
[<matplotlib.lines.Line2D at 0x7fab965a4ad0>]
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

V tomto grafu hledám maximum. Můžu se zaměřit na prvních pár hodnot spektra:

+
+
+
+
+
+
In [93]:
+
+
+
pyplot.xlabel('Frekvence (Hz)')
+pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
+
+ +
+
+
+ +
+
+ + +
+ +
Out[93]:
+ + + + +
+
[<matplotlib.lines.Line2D at 0x7fab96514910>]
+
+ +
+ +
+ +
+ + + + +
+ +
+ +
+ +
+
+ +
+
+
+
+

Maximum je někde kolem 120 Hz; abych to zjistil přesně, použiji funkci argmax:

+
+
+
+
+
+
In [94]:
+
+
+
amax = numpy.argmax(abs(spectrum))
+amax
+
+ +
+
+
+ +
+
+ + +
+ +
Out[94]:
+ + + + +
+
13
+
+ +
+ +
+
+ +
+
+
+
+

... a najdu odpovídající frekvenci:

+
+
+
+
+
+
In [95]:
+
+
+
freqs[amax]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[95]:
+ + + + +
+
124.80000000000001
+
+ +
+ +
+
+ +
+
+
+
+

Což je podle seznamu not skoro H$_2$ (123,5 Hz).

+
+
+
+ + diff --git a/mi-pyt/numpy/python.jpg b/mi-pyt/numpy/python.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c01d299ee5e282b6e708eba651103d39d090aa22 GIT binary patch literal 126582 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 literal 0 HcmV?d00001 diff --git a/mi-pyt/numpy/sample.wav b/mi-pyt/numpy/sample.wav new file mode 100644 index 0000000000000000000000000000000000000000..7ba79adb13d002c574da8bf17cb7d9a2a673880a GIT binary patch literal 925262 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Θ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

(A=c(g?dKH!b2v;^K2eNcX0ayv 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

lDnNJ|0_hbDJhBJea>B! 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%0A^UMTaf?Qnj9vUz@4)&>AVr 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 *$(I(>kySg$!y#(f>7aYKg=;&Gy`!{|K{q^Hx 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 z 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 CW22!7~~gyrrx`U8)nT zpn}0_$`_oYjs88#8~jY)1qUc;@C*Ip|3hViBa|jMO-KFIa+UuFwF~~H=wJa&^nal9 zeiwS}FQgg%2a51VQ8_;$rT5>61UT-6*U+f&Tv`|IOM}CAMWJwNsuu1>=R<#s!=ZKJ zbf~SE9cn2yhn@%#&O$dspG5P}S+Ow`OVdKv#806UqEG0is2S=ZYKIsV4t*9BDoID< z^3Z{}rQ$(cQrZ|-g0ja|p$c)=M2@&PkrZJi-xtaM7N)=BvdMmN>Ey$>((+1NYI!NL|1prbZBfx(ITveC4SHKAsF2HoRhDZaQ$+xa+J zDK=1D8b`0iY-&OK=r!e#31m_^SstJR^38v9SJ_pil~W*dQD{Ah%EAeXXxh$Ay-Abq;Le2h2mwDo#LgJ@gtQi9$83M zjC@V=BI8LOpUXM%v&#Wj>gQQjWILn-0S}`XaTCzDld3v&gj3 ze^brqb(B4N0u77aMi-)9QDpQ+gq@~)Q3EK5+DiwcPSGDxJLq%NRr(qAwFYrEL|vfK zQSoF%R56)0DzmH=RZXslpHcn;nBmLuOUM)P+sW?no6BPHJIV6#Tgy@L%S#=ZRlbRA zCXYsHx*wTEZjO9Q3nRZ#i^z9WBXS;nj<XP`XPKYv2B&Bo;Ax>&a?nKiwm7X4`=i;ooC8C_y;)BYBJOuLfsEd;m z&wVbMIK^qSBk@k}#WiP{Xye=y3!TGai?d#=bqwi)Dqvhr}}3Iz}2Nkkgiw4futHn$U9d^`2HXGtc;NoSgZ~77v;Xje zqxl=)`Njio@elSE>>01XCKK#n;D2at?tr7=1?vlLs7dBC>uxr%1!gz+POh`s2rp$$ zv8v__!z!9R*PL(Gz}(f5n6q7F4>a(DasCrnxF7X2wp{mPM|2Bd=l;a@>P4)WKF%Dy zm?hTh*&ghsoxqOWrQk<)HfX}u1-;pgU^p8ZEMPwdz`hO^V#jL%8;o7B!NFUWCD_Lr z2J5jywt}q*T;41=&h7+{*v{Z2dyO5l`1)Vq}{}x-NNqHN#vbKKS4R3u(d&Ez9C@zDt6>92Lt)hpdNn}RO8o! z2P~Q1&GrT#up4)beGI-Zjd)3QW&SkC$?NLW{C$uX&yUAb>YO~i&c~zmOD1$eo?9El z&&?kPg*ZojJw*Al>-$I_Lb*SoPB=duINZ@;b_TnKO2@Gf%6%y~#}a6TXLDXye`K#v z7hxP3^)$T6R`XV#oD(#4QRPWlf-NJZ2iG8pm{Hc0pHQ zcl0LUyA5VLbP4uS*J5k5V2kxsW^`5HC+A}uk^g^KL>XbX8Vf6cNYenntFyM|F8m8} zu}r`bJE^+>e>oMf${qOW^#E2}Z9JnpTV#r`<)$wz2AZ;l!1wtR;U|!;FVdYhSzue6 zhjqnT;g?{_Lt7ULK?WUu;qQB zv$M$>j8A$$e1Ue@<*-1Q4AhU^`lCGupQ5YqN9e8LSqXoN8=AqA;Xi!THNZw{2lS96 zz!&QQD}^42y9YiJePQ`99DWXqfCvJ_QTSzO;8+^n85o&mZ9G#0{ull1Q(YTr2isTh z!I%bruzmmYO-cj1nJ(~uC#JD?v1T!akcw zpqV@l64)rb>xUqxJrsmYCWK|xMSzQz1lXYtFs={43MOPG!dhjmeq_4fI0lDBsy=Nj#Mqst&wXhrk_9%zH$pbS3zAmSAVzgmK_<8lRO%Z>ou7lt8Y%ARx zn6{PSgO>vsYOC>X>Fn=lzxHT{)jAI_NJ|6TEvX#Gv)~_iL=Qk; zfkhSW9e`!b0ptp;3Re0uXyyH(mpP7JT37)+k)-QK~A_EI8Jr4do zd*KJP9DZ!aQKlvE=edi13eGE7&NS8$thc^{e4E44rXrgS?8U$JfBn1;Tcl3|KMctE zkh^;!5BBP@xZfFAVJp~U$mSEe7u&8!{L}H1J0? zFaja7H|rzphW?Z7fgHVtym#tbY#!uRMw5(x(XIF+tluv~?mg2PcvtWbMVnDP&@FgK zr{x*oyPMsl=C^f!Ue2`R9Zi2e%~axrO+#M8vAL1#S^wq5WglYM)3Ij zfGEUAiLN-8;|Iks{#*>;SH(=eRov!}#2UU0-unARS$W2S7CSwnk_O=9RDnGiuhDiJQE#6ZOS3i(=?Howu*f8n8+?iUqmNTw1URcAj(23u@2it6KN>bqo%m(L}Taxou;|8p4w7cT1;QX9I8$)s3AS1 zob(U95i@83{f4V2bcz0;g7PEP$NH_9JVYPp7*&)D=q(wVkM-Rl+Dpr@-g`uYX&RlR z{j{9^rGu1T{z_To_sC^5<(9Q6v+O|Gt!-E zMoM*B9+y+(6M0#tSI^~nJmI4h>Tk)_BUw=0muVDJPh?S*L$y?a?566e<*Jris0ynk zs;1hclBh^kP8CuGRZlfoO;jaSUX>4fMm^LdRaebNygsV9ny3C$+wuR1x}-{|4Jx}@ zq!z0<)kPgtjnq^%K`m2v)D|^TC38xtK*d)t)Javw8KNAgjVk5rQrVrsDxb4gMLTQM zE!-{Yq;>YG2kNm}qdX_VDejz7rJd92zWP-uC(3!KKC5)j6;;d$t1M1tC!5pP$?GI? znmf#?fvaLj|GiVvsp%AQCORpdo(Lc06me!cFn#!o8aASf`=8%-P^(b(Xp{oV9L*^OGx`o^Cqlu6s;%cR#6q?rrspdrHlAkE^Bb zS2fHXtybfDnmb61b}OoX+>7e9J6=6-XR1T)NOcGI<6MidKU8ur*4gadRUh4A&Uv?v zbJI=Wym7yGqP(_FYVSuUv)9N;;oVj5asQq>$SLl9Rq4Gz(m;V^qkEQ#ah^ z&RfJu?G13!dD)x~Ze?e;TOapJI49li&Qmwi`Nwq}hBTMl49*T$IUn6XeRan;dAwFm zMXxN zotoZ#Cyn>aN#U0Xqx*lcg<1BZVIFH=J&JuTpv)66q+;)37Puz)45|rZ@+T*rc z&bi{YaD2BQ>MfNMatk5tGxZ3^d$fn}QaHz5LOtwLXWcbw4(ey2`$V;NKVy&dvKr;4 zaE7?OojLA)v|l1;ft%U+6ZxG%`dMybwDos*c1~xEyI!rr^<1}$v&PlxcQ>AM6wjRP zR&(aNG0sNR@htbH+Tmt&PP;eMa`%F|hV&=g3eH#ekunI+?Ui)$v}k4e9Tz-d=I1 zsrOD*^P-*MUVNve_gW41o~nx8JyqZPrW$#VR9Wvh!Vaj$-bMUAsG50eRSoZ?n&5R* zRlUnWcks%ikn;EAD$AQ* zO5{-w_n*=W{NChMLK(8lpS`SdtrvszCFD32`#FmkRBlPfhgdsCJ&CYI`A>-YceRc?}S!nkwNnR0YwlPu#Am0@^>m zmm5b>9Q9NNud_dq~E+vU-p zAGt>$8%sjIUQs9Ut*3(QTkfWJ4!N};PYOBG8|*~lyE^Zdg6!_zo6pPPzHp`cm)qBU=N5KDxEFHc zyGPwT?m4%UtGq<+8}|yn?b3)>-u;NN=bM|~{o8%woO9#3>)i*CdFPz7u7Mmmf#;ux z%-R6?b{DehxHH1t?;LbDLcW~9dwg|RSsi8dG7=2dk^HmDaebPXs1ZX{qtzMvnsb2LY#X_dC%3qZVQ#x+l6syt15zT zJdIZ!=US?aHxAb|RADcL%IZZx7Cb@UtNg#;g}rt1quUDOUuMYZFH-)m|1?5=(JIo5 zuU@)bU3a6@DYveA=cYrOd+G?RW!}3l!1Z?bci94Qm%FRwLH8%Q0BKLS$K)n=m0XX!*18wuJokv4Ac_+3hXcxxHjnx2b0F??lK4PBVGH8GxOOSh*RtK--O9rE#-8I(RuY$6o566uM*Q!by6gC6m3;^#2w|)T6IvYQESB!bwF%WJH#Alqvxyn z;*44?Vy3Dl2B}VBxGD}ytm>kcDk)~DN}{dmCwi$d zVyG%DN~th!t=fv*s;(G`qn}DIYAPWnsE<6CN-Qd=yS$FN#lKh2pkaN&tEf|an%atc z3;AF*6!$LkPO3HUpqg`1op^55g{N0jcr#TI`PSh1RTf@emEw6-1EfjGA^muaD$0{6 z#q+7FEGe!NsVmG;`4RUL`zpV&N3tT1P|3NgZnHb`AiE^rvfDB*zbw=6H0mUKDo?Wm zG7I7WYg570T6F4fY^C)50%NEv= z6PYWOxIt~GhpbMmz)}$~|VHOk=7@_$A5tx|i&(o66sU{BlbWM-_reGELA^mJ8;}_Q6jwp*}7<>avQP ze`Hx(O!+pQ>VrC4#uB0qf0ggpLHUrikk$BBJbR8@!Q0EqqO0s6Tsc@&k;g?&nUpHX zB(zN46kB9^aai8x$7CsSTjmjqVh_pCsq8HnIXMCRekow3qFm zSL`r7Wk>(VJTin22K&etD$j*{!EVqFwvdjq*>sBSq%UkexqJ!bf;PPiUrc-X3);=+ zQaaezB@n;SVLpw{@zb=A52ZPLJ=NyBDPYeiHGc<2k)<@BeWgY02pCh&(JHorfL2D2 z81~!vJo?BsBLCfBLRm~h*)`mINANo#&OcLC{s(C`nSdTg%lTaz!sE&2d=s?*Ysxx) zf|Bv=^gZ88Q;^S(ygSta!$}5Si`Mf&l$rOUYuGP^UnG4)SW#XB3@ROH8ShAuSbsm@ z+35qTf?a_UU{8sq2%eeN!PE4UElaO#L%IV`+EX}Bvvpvv(1=#r{ItyGrFC{W-*%|rj%NtBe;qfGl#%D9cDy=vG+LmoYN4zP z;Q{*>-tTAB*>6;hRiy|vg>KqEX_VzMr5!{sOgqYFf2SR$H}y4RX`Go)tznbV-K?Op zrag6qUBg>l6SfxvDVZ5h)e--jUPh6o2_-ju=_~f6E1L!MR4;)Y$OfcaPd$*&1oI=U zHZ$ott_$1QRLYK`N%l9?*+Lo#=9}!SEA?cB@NR?Y3TsX2c>}cHcLcr0p&lvG}%ql)6D7%Jk#Sn)*^fWBt6$VQz+8OkSOaF#g7 zQc4j)DR8fX&>|6ZJH?>K$t;rNT#SAZd8m#Uj&n=$5$6w)ks_e&IVc*@Kq^3aC=(^5 z1oQ*6H{GcsG%i-uqs+7&_u5ibgjA&p`s#G~>kac*d_l2UIxe-(v9R=nv@YEETQ&O9h@N<6IwbYShsqja<% zy0U$u0-YCGXt-!VD?}~SV?`Q|dOIb4q}-xBEyVkb#e1|z`aYr|jS(ej0or4%_?3o= z9#k9W`l1>26&)xI^kPks-h(YN{Lrbe=t8sk7)mJWLtj^)?x0WI=Kb-#H=wIrP)A;d zd@v#HM%Y1~gErvzJl+O!DHF{{Kbppq(;tul^LatUNl8nwGdPv!q@lbDY$*zYK`AYb zMxX3}v~3Wt2A+|dPX&`wKl%)r^$dOcG^^5N3nmy93n%9-fQj{xB_g{Z-S)W9v@%PWXI z{1tFd8;b;@r^q1ch;KZVNF!Q`9{BrBR1iOjO!!jo@+h>>Yf)ZgrWW|}GKqmyNmQpM zqBL554&@i4XplI9*3L@}#SWS$`l0s^qIF^(EfSMyk64SN7QTuJ6o%!?A<+{(btS&C zm-s49k`}AzrC5XBnpkQPCCflx`bA`xiKw`YqLvuhGsz58Q+l*g7RE^LVCK-0+CpDC zQjVe+HHwPLv~*Y2qhqowj-GTy_NBz?M=GIKQa=S*tJdTEfQG7BG+F&aebq;rs_xP! zoKLHrv;%fFI~A9)PCUsldpxf`Q3B@{-Baf%n-hsJxZA3eG|;(Em7N%w%tQ#$QrZYR6cDu*oSq?B2l?_?RLpseZCku`8HtiF?_ourtV8Y+qV^_^-m z!pVY}?lVe;u#QePDKLZW<+Oq2ds5i`6p~R$?>NoneU$II$}9({QgW9{Ep5QwrG6HBdj81UMG5pJ%E=YB)*9U;4GG;s)zu)kl7%j)p5zMBx^1mVN2GcRVh0gOgv=+xATo2>>Xg@y%NqK}$@!2#2 zz90?xJ(`6X;SPQUQa4ie;*Ole-_lMVD@XD_VTqPjmggDeIG$Dhf_Rg8ZaJQ(ky#P1 zH?JWF@b6?tUI{b*#_}_(B0KQO(&IU0Szbr}%d$!raVqnn@&ZdG)AH7GF-syZvRHYC z#gn&ieV$d73t5aj$)w!F-eblXK>Eg)>%h5po*lpp<1GEnw$Na*0Cot=hsJ_Jb{0=~^9U;)hsc20d!kDUaj<2I2KzpJxRz!$nJ68tahKJadC0plkm zzGDx7g|ZPiJG&vtPXZt1A@E^70yAbecC)UFJnXFK2)vk@Y#K(0*}&mhB1$7(5tO3_ zTY=}z!81AlZ{|nQf^8PRunLGf3(uP`3Ip4u3T##;0S~1WFjDdXcc>(6SxT^7A}>ai z8W?HXA+PT27_gL*QFHJS&PMsiF&}s;1*juq)R@ImarPQ<6pdpIX&7c{^Vtw^7IvjN ztObE{7aYw|B>yZA+U06 zkCjO`HV@%B`J8Y_qX;4N&!y32Cx4mDt9WF1x$$49hZD!GwyIfNaOrCC>5 z604kn?3nDxj>vXwx6H|g$(AgM>cLW|;mpYCEQ>13j?4M1h8l^ZKYJisuw<$YOk#$x zLaGkys(P{nY6i=pCbFVxDYFuFrM^elBvxBhXSZZ0b{1i)WF@v)_Fy;VT=qfsW#eUH z)JVvQN$mM_UVp#-h#GUPHkBu%q-rZP1;cvHVgIH zfOfL_G@g}4{VOU1oSVJq3k%s1(HxlQgE70930$2Wz;YRh>xsZ4ZvtGXM%ZmVi=Eep zz@brm74WHc@qgJezJ_hZjG-a$)erC`zypK#J&?Xn@f5)HR+tOiV&(Y1J>%FxPKE^+RK6KdInZlz?=bx=T+EcdHf!04!o?w{3=-6iFe>P{=-KF zX4+_=bw6XJ`99?H9PuB3A^8F@Xln4WJOS^7aB`khp(|-NQ_+jMxs0 zu64lbIf}e~0)FgdeE<7c2C;%MVD&(c!_s0_mjK~~F!O7K8QmIS$aaRGUQg_fPZVPq zFsBf240g+lB3>WhdbI#9{b=Mpoi)ZxauVA5EpWU#;kz9UOssCeDJu#&lnJxe%AykL zpeQiWasrpEEqe`2pBp?W>M3mZb8xf*lj{s{k}&5+Kgf*w=!e;3ZnmF86T%Cko*Lmj zdjL-<30uRnaq5K*C8MAF}V032$X3uwa1dt#%0B3PB@D4Kpo3TBxLW={Hp5!g9x z)ziRq)B{{_)nG5v09ep1VJ|b@j)$E~B|QacQo`=4m+cFio2p<{Y6*V2LBL-A6}B@C z^g!6O>;*635Zg@Gvj1@=WY}Qc(%f@X(|IePT%wfu4qdj+oS;d zP#-WEoim%vVsiyNO7{@*75Fz_z*2My;pYq(u+14D<0OKG)kD+K+(7DFKq;LKcEb)p zLR|xHqFX@y{0|NGA$YDdeiwyh8j!GH*|x}x1?$}pYz)vJyTKZ5JkaUELdaH`(LkP` z1%%-2e7`9OtCdgeA5)%hHskpUGmH;5-S}_jFaF59f~Cts{)btQ@PBw0lUb}Vb;MC~ z2No@j#Tr9my@}(C;1Tnei6{Ov^~G=l+%MBjSTkPiF+*^Fv;cancxyU|PdM(I<>I*+ zEFPGa;0X&F;t;%W{zATI zO&>ABEQ8mL5i`vW(Zx&^H{mn70oP4&?qC**@#eWWV|-ZMY!J2KiPO>iiE^9~!^|F0 z5twed%^Oi1&-wx0Ic?1;(amFX<@qTa5+a_Co6PRufC#Xb{Xyn{8+H`4(3FZ1cJ6548>!xAZ;IBlwko%ns( zJmaGgf23)KyfWgQb0WVYq9=ZjM}8AbBD|00WAVK4<^bC9EnjPri_vJyx#lRJZTj*B z<~DB)i=;NDGw)%3fp^p@SS+>U-@`(xjp@pBm~kB1Em%THKETZ9^1_o*sFrCH4E;g2Fqk?AiAfvDPaBgG01`Iz+~33HX$qvUj;|aTVU3_3ig<*!Db+H zbu&|f6=quS+6)YSH%EfGI2W)@fLOmVIBDht_%egCc2jV{EDBx#k!+Zm3ZK2(ej2;Se`)&p8_hOFIw40@}Z(hkw^J_1~Luei<8y{DGff-iLoP?fhu_mw(xm@PUc#?=xS*r%Yadi^=Ct zGLOR>jO$M~Iy}l01R`2)f2IkCmzjUUKOufi)4?xkOnAD93%4_G!_7@iKZ|J&)U*_S z4a59cq^)LB`q@lLT<7pV>O#1GH@sbc3xCp|!!L9;|FbUVf7AblXX*_8bp0^=MrZcl z=;Z!IoytF<%lcdO zxAcERyfV6p-$>_2yxx9cUCpnpEBH-x9>0wqh_Gcy+t!cOBm7Ewn4eoG@>A%^eq+7f zPpG&0j;`t_*A4up`d8#J%5SZI@)zkM{uJafRyXqx=wp5l#C@$N`loM z=%Ky@a@>1e8whf9{YUyT&i(!LrZSEn{GMhJ>f*HjxB1Oe6m|+VHw*=I5~W{l~~Rzn$$DM7wvh^Zk}~ zG5SDGKf5j9H?ej7ezv<`4EHwJ6J4yWYPCTr0u$`Hg{VbpE< z-un*Heza+V)s_Ww?KhPBoB!D+4z2@Rs;(^>^tKs-r}!R5+Uh|`n=Ke+e+Yn_AGEZ+ zz&=qRn1JhrwnYFWcYH^G22*SsSpGH+64{nPT7>7b1O9i!gP-gde1p-p8ou4}K?gG? zm}342Mw&rEQGBCq%*tR0?gJM+h=jN6UVSu((-(t7dUo)q{vlYe4+RVKgBB)` zJt4Rkvg%>aT|F{LsfPrk^$sANEevYtBSA}j zD(Il6w zoyfB*o>55`3ijx{!LPbh&`L)KeRYc9nEpPvrEdWb(f6!$u;-5Nc9gHPz)sUT&Z>0-e}q~qo;di_j<#R40#Sa4l`^C#=Y{(XJV zzlGrWF3FEG!;jZ7Ozpin5c$pDEqBGkd$4iz%vLNmhNi&DC&Ub0-W-;P6cIOL&*b8BSnxh36X+0l;U{1;|nc&90bx|#}X@65^YSF;l5QQiUM68BS+&;T@iaSDWGCXJ!WSIEB$>clc*BCcGc@7czCj z>&yrsr*%YK%J5@TI{e9$3V$$@!xK<9r_HAD8Khfbc7?AYT@kxET+TiU?=k2A!whx~W(dCpL(Q&Wtl?O9#M6&~0`S;TX2LOl}9ur;yPa%?fIKaOA~=W3NnvZ4EE|VqhxSggIUS zcB_u?;`eNNu!K#*x}z|Qk2T}(z}~!I6rTj7djm$2i$H{*3xxM5a9p;72TK>QZ2buw z>issq7;W>zBK|8FGcxg1b`@Bwrt_S3J1=0HiY2Bp=I>=V)^&WC9Sv{%4DgiCNaxJY zz=GzY5YTw)SV_NQE;}5Uvt=wa0Ol@B1uWrv=3hK_J(vi)08_XG);eI7gw_6ibC$QX zgMoFuKs<-#{cxL%^4e~K+m&K9@R!rt8I;f#ll$yNnrF9DYx^^uw~eWa{YPZB&~;jP zubM7$xFwm57pH^RMZROBg#)~5YJ*@J3U^#l2;2H*a`M z5wMlr3vC8M|E`FiOqF=`{0dHldG#M_53D8+M1*)XN{Z32hn8M@zh{E-{%UEoRENai z$UDwoF{Qoj*x9-AtscAKZ@2G(2GB<>4Tgp0ng?Ga^xcJRqajlTMWjBj2> zWVg+r)6VI@pEWii6^|YV>&EUX6q%5ZkG}3_Q8h8IAoGL!m#w8fz`v^(ePYX~Lc~9! zX}ql9T|2BB@s|2Q#P_zWN+62stD+yPEOW?~YJ3nSXU6qsyF!^UTW({r=`MWVw|lfJ zEM+xYf_9))F2nz$9agvJX%6czZ}Jp0S_}}y_zH^TU&+NjSp_iwOtVd(lWGWSjj`A< z{z4ViRClY4i&#hhMC27YBH>3GT|hpI$wPHx3i8V_Wq9I5-KlTFel$5I8UH;d6SuJm zMeamH#kQD$M<?w?6#bQNjK7gLi`QEujL0a`MYI+@oY_2| ze8`80*Zemg%^yP3QUJb+X*IE$SZR3vOuHl$#`~RMdBP{{yb!p%;=0;l-yT>Q*UzR2 zJv8Y<=S`LHEbv$D1atK|@aeoXiNOZCgnqVbhoAVI7Y#>pikN zBZrv8kq1oCh-~(K#3oxYegvBxFAZyq`)|EmY*WN*TP$KS@RdHYG43p$&`rV*sJ!s= zoW%#qFgvV{v07>s+u%HA@7)>vy;p~?ipap@#aqHt#jncGMrG!g;%DNyqJCp3qT8`4 z@w4%R@yhdq5!-mfct`k1=$4PZ_gLMv(do#?$6q@Cu|+OO$)JuVA9=S^RmKhslC9z zf%`2lt7WS(*h(Q*dp3*Ru%(e^HDt~;urxgdPj6Pf0bVnS!55JRM@sNOlwvXPs)^$H zAg{`UNn@Jr0QuDr46n8AF+1G$w-q4ks+$AQ@yxd)!DmwwUT;%@VH^QYm2vi-y#a~& z5b|~=xamvSF7Ouo01vptU^e%`_La}B1j|NxFnn}^zt&6h8`j1t45X8}ZdRIy0gmgFl+_ZlX2iW&kUIc#APrEeg$K8QTx;uX5WL+WKAH#N13-FygH>5+(<{`@P6(B;^|6v2<~OiKk>~EXU(B=6X1gI=*WUP+ z)h7P-#1;x=V|lP@82Bx{UGVLoZ5MuLSBF!wyK#Tn(Q*B4uTY%*7T1<-3Ta{etdEMa62S8V(Vfw>k5CyLqQ$*xb3mr?1$zc zIrM=!?LLg@S%d!ORB!-(a?ha|5VjEJ5Ho|)_PO3+hUx|w`^RE@-(*t3SFm`H#@@$# zC7)jxD~B3b`Cc;R!?`dYOo!F>Yn|0Ui@Di*GbvmF^SeLvuy9kXU~lM?;m>+(I8J{H zJ=Zo|4Rg!oXopdHYG@Hwwka{UeWTZhYhiwUU4IueGkvj=%pa69i!rZG7!=0}q7~-( z4NWaw1R94+I;T!=@|oghip~VI<1`rSx57JimF{jvn0J0fa4re3ubhFmU^QLNtTN}I z8{EX(>1ObVUT%BaG_16pFIMaEyuDt>#_Jf-3SMK6p(B&#GoN5q@B?NV^j0s#9CL*y zGVNIr=$JkLg{HX~!jprw@_;$Z5?P`(&_~68@Luull(uA6&Gb z!d=1j*AP7M1NCOild51&_Ct`{>_DDdg61|QR)f=!wt`7)IsuXBke>ovf!*O#S=p@D zL(O*ox$WYgwVCv7lT+shdQuh49ruCTus)E(v)hfB^Q{lBu^fDS7lSdTS9q8?9*Q%C z^%j%LRKcpVpPe3VhCHw0n{V_VpP&whYnXHXd)pd*x1IH5tQy-v1-FE|T)=|CEq%qro zrF6-}120o1r0=P-qb$$$HDKP4giicpPzUY51{x&vN7SYDyPG!t6S77<19xc5u+bQjoLLOyrGj=&zY{|&>TGfZSJfbHrhGt`VV8%;r0(nRsYdMUiN z2iX*?99Zuj^P&bkw^zeVI@p|| z9;7#rtiWV;0(#_K{3_owQp1A- zoAXP$C%>+T@F^x>r{KA|9(wgy%u)C0GSHLWXTzZ%&tg{Nz2Zz+pjg#5Yejk68FD|L zU17GPUN(tj<_nYh4p6vyfzkFE^wC-QNO-H~!ydpjc&nuM4yw*8-%Eim_K zlO}mrZxr#sTz*?eh+R6j1jhj8>}Pp4Gn!}9pQx%nL&M>Pdr9ZTJ0_R;bO+Tb7)edw z)xXDlN1OExwcGCpRHem00f;4Lj;MD!f?C3hHwh4%TEH5(fboF(ltsh^N5oICsDz$Z z9MH9Z3b97wQ;QU)u3T%bN~;S1X)2>=W!lJtutuI|F3}$SJy5CI(ra@DNLv-C zyWS^m1v|w@b5nG)TdB6`Ls|4aaTLf?@sUplQ;3@Bj-s9ZP3+fEvLWiZArP*9(mTXI z$g8&QFD~hYe3lNxFS;CMHuw1_U6?loLf9i+gtUGPJ$XxZP-hntbbqR&JBZ(OP3+C& zrn2@7r7~&6;@~p78r&8wOnfrBnOLjm@M&6OFQf$(uopx(oksN2HAD%tQDrj+`yDO$ zD!q*thX- zV+w)6EDGQBU=ttDosKWsg4-;H=V4ER_vtx0!H@xrm2?D{N({w-54_lEQaMF zlf%#_w8T6wExxz$W*zhZhfH}>+2&@RZDM{j8G<-7!CXc8GuVu#oxSIu2VTKXrY~6d zN&)ZSCf4p-AuoG^ zyh-e&peX$QFPj!%$~d5ZG)1tZvQn?J+s!fT2WAB)@2{8#G{o9|5ZDJxfpc>$))9^D zN4#G=AU6y(d%zoV5mY?Li(*Fv7}3Od<}dNuNF2;Rf9CVS8lV=g3|O=Xjz#w8d! zD(S7}FXnz-;KFXJKpu6Q53DLqT72Ro^vru;QsjRKT2jjwxeqW8XME7!57ZM#_V6F)ilW-!LxkbQ)OFl zJJvLjZmb8Fc2oSE-Q=Q5A-tVw{F^H&{QqPcLp>d%=waI|N0uffIlI3(%UTHkxBw~ z#4CmarDGisTXOJnb~=Hv+wrD+<`@G*4Hh z+BPB3pSyAuNEO^o62gUEhCfKQzFKkpjBpxd}%VtWoC`&0MDC6x{A}>G^3I>5BA{Ks?R2u z)5(-nZ*`bY(tRnPY2YNXXE1jDA4g{aEyb~f;qIPU+}#~Qu;5N`C&8VIySuwP!GgQH z1a}f#g1dWw@UR5#-D!CrIh@Px&a_llYgJeM)ktNw%e*MtCt6G~J`~rM^fG|dIMFtZ zR>qYN4YqexJrEmnxl^Ixu7BtR=$u7NW51tS7VWLQ6H4fcdSP47uWmvy^4b@n2p8df zu=~9M#)}r+tO)&OS8=X5?j^G|q9wLv{gj|++(kYqWCw=kn=GNt<^u2Mc?0aK&=FHE zG@trf*{900Yy5vr8vn7$=v_0HWm}K|ZfEva@vD(xw)nyOii!7bt<|WCriMaH>R53$v#lsup@Bh zn@7k}&J(NswDvt{Ba6NN+3BIfroCUswon5=Cwy#M`t9s9_10jUZSSDZ{Lx!(wOWnM zKx})6JzjcoLB;B1XQ)x`Bx6K)OR!Ve`pt91l)*;fZz6vVR1G=D{bN$AV?rRd=ZcjepOmv* zR8{*@jlizq4^UC!xcl-BW2Ckjr*?vt`po84W!wVQ-be+8HMSbtu*2BQI0bPM+l9YO z6;&VmigV_O9Ko7-mveMkTa2^I5fGQK=t3tug|vTSr|{mC$Ce-H%7%LY-%CX-jpY|3dV3J^Vc8fdcPZA@$$o{Qry4>mCQL^Kd& zlb{tyZ>O`4?nAe8+wH^Zs0C5FJ|YY3#`0(fk$I=v>h>SA3n{yfYr`&d#yHm2ugDtf zM0uk7-eH%ifdx|*&JNY=7oxfUVgEtDP>}ev^|5_O%FfW9bIc7ph1G1Z+zqN#fAf?x z#bg(DBSji_67;G2pznNe15F;a+D#IpToO^h*E zTw2@ZB+l2LAX$Au<~Rc`R0DT_v(^Tal|F2Z9akG$PZTGH^Z zgDX{+81?fUkqL-P9mQIm%pKrXb(|>xMpIw6+N2lV^)~FJ%G1IXti=UIUu?Oqn3e2m zZQK*|3B~jgBK}lj2YA9Ma;VFp$GV@;L6vgnTo<<=`LCwyhRk=L__1wVY;n|d1)FLp zZR;w)0LJR$iK_>0n6NR4Wlp4Zn-#3L?d*c9Tph4~OPKR;JeH_u>SJG48}#D|Vx^t} zo>^JZ7`&zTdZnur#1UzOdSY|1#l)xi{T#X5 zRgb#sI!3*+JHPIAA0z*Azi}6KIqDCWG-`+I8g<0|7~bfzh7*b-QPbSLsID$gR3R}x zDwl{BzT+Z-1ui=`+bM$cZhbhXm=u*j{2P_X^$zzCJwS?Oks`8~$PzWs z4TOeq;dgd+3Z`;*)Yr8R zXA?&wuefaCVeVA0jQhAc?sMc!HzjI;=oO$3<-V(O)c5Xr)MDp{Yq-YY3+{Y)l)D*D zCys?vi+rX%es1` z%tz#~df{WDW{_6?q+iREK|7gD?-xIULv3_Yc{YeAOA(FhI{1Q%^cnd)xG7`nNm7AL z{nc!jr@#X|5#*LuHQDWDvjxZ1m9nM(S5)|uC1o%@v4fhO8Kp17mZhuo~?4~ z7;08fK?T8R@2rWd4(O}0dN7;_V_)UJx}4W9cmyVKb=68IR}IZUmDy}j8IXAUvzt_6 z7x@Vs=1;+7HQcmSUu*>T;c3|c80ULWU*4;#x_Y0Z8+hV7AH{D_{lS%5E zV5sNWxc+*V$RBT0`k(b1Pr2*f-=c>9*v|Ij+kyUf_?$(PAGyKX7E zEqkc?lBlyP0iG{WV0vZu4k`SQy?tI4A0HrfTgC7)sy5zM{Kw{dU+@oV04i4_ydz6^ zJ-wRVLGMR=y^i2-GX}4pn|LnP2eGS|mkB@7viL{F_gbhx#aHL>RBNK@sC;UHoPf_= zr0OOUdlh6dFTY$x8*UL1wUcU&r$-^YDL#vYYL$E@|CQZTgu1T&k~8sT4OA~RQoWa3 zO2T=oO2tc@xsci{cj+xr2Z$H5%Fr{Z6#yo;)b zdV;4M7~<+0zCh`@CETDQ@%KHhe#JL&0e;y>RZmq+rKLw=D6O8z3f@xuT-$hQ@g~}% za^p?+&4V(W$s+Q^(HB%l?!Ao%tX|^CmY$5@(h-oXWb@QlE}}#Yr)Cu z3*Ie>)id!27UiA6i(4rNa6%l6Ph=xETFxeKao0uV7K!oN>8YN$YFL(6mmTmud?kvh zT%rVCFkMv!^+_rfTXmt2ii?BXhBa1}2-TBZAvM|6BiisIH52UnX8c}ge^*}&UZ?hw zJZ5UC2b>C55V0k%S*EV(CF*zGQel~>mIiO-h2XS&7#x)I!zX3>;EixHL&5~JJ|8DDj>W#jX__dh3#bAC^H7gfpL7M4 zUxP9bOp~S2V7^7mcUSjREA&z|$Yj8RdYn8@EP}@70{E;OWj(VDtsNc%)>l=qa-MIl z$OdRq$C?##1z3kOzk zvNE10yX7aFNgl$2yqB0Eev$?7TKS6a>-TE3youLB3HcBAu-}PkoK!)lu({=Va1qOj zigL94EPR=R==CLJ2{}k^$9E+g=i6*zgG-_+$-m`XIaQXEqg5;X=1Pkd{srtaYT(my zS**khw~=~^CrdmczfZ@z=bFlEG$L7;s6JVW60ztgN%szk#FC}QS|4*EG-r1zY3o1nKmAsPk!(I#HP+9rvJAgX6m{S80z zDw@!8?yX+$PUzxT@-N1VqpFxd#OAg(Hf=171mj#!ICv3D?MkL0IK3_5c?-&lCRUm3 z+zPx!YssBA*tlg(46rsAgQYnVDPuicuYr}pV^P(m5iQ(#v^#Z?C_cGf;CcQV{LC3H z9cPio;2wK&aPVG?A^PV9{fpZjanG=-88gzpAs*iK#t3ou>v|u4$ z!@|0^3lr(|2i*c&lj|-oTAA~l({JmRoadW}ZWV#V%;%t_+;tmSVnXB~qD;VkY>!S-1^prk5ho zl@p`g7w+87iL*gIIfE#tO=x!){X`@RKG2p^;J_Yt!@zldq07ki<~ACwF7!<-@qqK^ zXq#W$pbu}`KH`;0B~x*8bIra)gIbh2bBVg#6(eDbok))lz%`v=E^ynLO{T-jCxPvX zCh8ti&nbE+fqckK%=cg%Cq=qD;R39qBEb8cfrfEDH&CsyQ|KT(5u1^kP*xXJz|DRr z>d7(UotVU^WSomljNS>{^xqL!b)i`-F4MX{DK9J*aI144?Bjjrm7C2iR95gwOPR$o zm+31PqrteQ*NN)7xv0tCk3?B5sz1pUK{3Xcl*@E|a8z5!35++VUy3-kk?d{iiwa<3 zKh&kU87?6IWUa{z#`QTgo&h(??U}n}xlPDrx8RvjTi!M6xE*V&X1P{!q%499L7;ChwnU_pg9?y47|>TZ&DJC`RPL9BqfnBRWbJHPO@#S4sX43$QPGoSduY>6f*yvS{o$2=WmW^$9=R`%tbpV)q{p6CPe zQZRv=lB060zAiE&v(ydlihDY#%5MLV-OWHSyq}1awu6}MmWwVXo=gEwcVsY-bAAc= zDO{6iw)em%KO|S0-{q^|q1+Rc0E_#i7#bv#4Z>sP!eF;N#F{-t4`Y45CrV;36kq%f z7I;(k$4PQN{4ZOaZZ7$7ijtEWh0_N>fx0)A>|SeM+V@ zzsPw(VfkG+h0GK_B|e8QyN}`KVq18cOcZ>UFT?-Hjp4Ak8eS{P1qDR2AOcJ88SJI8 zi3t2j^w!m6XPrl8GYe$Y&wxVk=U%U>(lgJkGuP87NqE^cH;gRxc@DW>! zpG9TluYr2Ld>OP>{|m2>1@%%{9$6$DzAmPO3&|gKC;6*BEyp5jbPYFDje?>yA)!y-G& zm|s_@RbPgxnqRNW3X#)ftjLqHT@CJrYs4P+a)yBv_RPJyFuUYt=su>>1S*4@88dX@;k7}n*d~NCd8d=hN z9hKJ06;)mBjNB@3L_L-sxjAYd1COOCE3Wm*`&qFVj@o$nmN~WMh>*vZ=S`>nyKkR0VY>%E%;Q@zt{8ROf46B$?x7FLI zxZbbfir&g#rJbY8S4eQikuTp}}>PFBsz$4HxuhhBtWq`Q0bj ztbPyYQg6dU)yH6*mpI7h?Tw1zt&h6kjSUa>4ulV?l~Jcum2hjdEm)%31sA;X;Y$7w z;e`IZ@CPq__@(+Yyj^7@4p18NgXi?mp0A&KYl!hvQ(sh0clL(q*Is`e_HrVpHs$QP z!3_4&5=&``y+SOaIDTCBUNsZ#RZqOH2e^&k{8qd(J7nC zTk7_C#oTjmm22jAb=qs;c6i^}gJ^_{dof)i&vOgG23q4aG@HC!U;y>7#k@myg;&R1 z^LCmm-ZZqOV8RA{y4kU+ktImQ&ZIIPHd&IHj`glU-F*n zbbef7MHL{;Ej`IUZInOGDQ~a!y|BsQ?=x-v7miqv?kP9Ozj(%t^cH|I6d^x)6=i!r zg?i~E|Slp^d3AyDZub->u->|Q-&`n0nsSJKgTRK!;#0YH^C;Woqt6y3i^aJrfue$`N zL-zJBivFQ0u1_el$O=B%3qQZi8X7IuhxX!q{vBu#>p(r}pk9aS$&aBspesC8@j^@0 zUB80r@1K|3{ekKi|DK$US9`rsZTZsA>V5Xhcw78vV7E0EdBCW%{zAFZf8ZMX$;6b< z8oANmqe_JqQl11uu80~D$|YakA+%OT`cB68r>j>!Xj`GPDqpmaiVV$F zIYQl3&Cp>LC)5;dyYIXKp>`lvhgEV=R;q^vd&fc*y>8K_s6Ek|dNHDXQ9EdJywF1; zibV6;MQa7#UJdn;XIFg*V#{6cPN=+E8Lhu64p!i*&{3}w(MJ9b#g-|fMG~cC6m@2l ztH8n=7}~F%f)LY~h%d#W<@OqYMOYl9mudbKFz4QScSB>nPehcdLFAccq2*r1P)GG! zsG7PH8Ve@hK-Df(SzZf8lkuYobr8(Gqaje*LrY{g_!2?cQ^EO*3iTzbXdG28R9kf> z;>lj{_Wle#kz2v%>mF*S-ZO4r`t!v;@(m9ikvsjY>Y0B;d7;>T>QLd({m?Q0PAI}p z8Cvhp@elaLKxBF6pYaZdmVq)e!rRE-sL&nNAQVj*e<`0GRfkXtcsE;}BWg+~@bpTA zddhpyR5O&!o8VvZe)1oy{eD5U3f}Jv9gsIee~PBjQpuj79r7aarZRy$cgc_Cl@2Xd zV?((pr=xe<_xv28H9YhE=Al*okkEZ^Na(4m9D1cngz%&FkI9ezDe=l5Mtjz(LZJt0 z05Msch4#{}9qM>!v`Pw2;a)$3s?7UmetwX~+pCeGeQGNhiakSZu#B3 zEBWBxJK%lFh4 z|0DAyqXL&4`fsb#{!JAlGy{o_eQUS|49me-6kS)j(7^=34k;T>*cIOU8aN zgSGij?<6;Qjol|Nn~U^(uo2sUDK`SU`0ucA{>Q!Y@PG9$h?M>Y@yOdux>Vrzy%#b3 zKH{r4TfFm9$w%G<@eAl5SG_*&kvGE$f3`d2wRGpasnk^o#E#@3di>;;pch@?rF9#; z^5Em0uhdVeQ3s{8Ce=t>`WU+he;m+S5AA|Bc+bcmzeOV-WXUO9K)>*{7= z4c5Th1YX}f_MhHv7&H#|;)6+d8@=jdyVF}}=XiziaKO_FPwGA#r1~cNpZp@00%Ik_mLaVCY1A|`-J6z@LIWl(MvV* zp1XJG$Ig={nU_tx2c01vs2RTFP22-HW|o>P zMuG5f1ayYo;D;?ySwLs$B7Rjrf>6@{6qeke!eroCERZ4|xP8h8Rbr8wiq}au)s|cF zLT;k!Nz8`$SkT6EbyY$412Rtp7IlTul?~!|TlEqT_AM?Yc|Bq^6jN7Sl>9*y1<58g zb$pi1K#N!jYQzkY0(6mwvW|!Z{UbFxx%YCekm`oJDd%I=o)*N2AKV&Qi`&`M?uJa@ zo=d}R?RvXRKC#Q?OXRY}_RN1VDZ1hDeFtxsakek-ev=8gt;`OjNHWUm9Dki?S7J{TxYojYx6^{lkDe4kZujK?NRiNzoB1xj)mlMtbC^+ z?=6*}3lKjeH8N6^Y=uST6ui!x+f(Q%|KP@UCf?$|%GJ<-x4ayUb;CTq-+uk~L@R}-0YsBBu@*Ilkbg9gzRso$URtGYVK`f zQdb;ktZZjs6*3a*i{Gf@0s6Cs5^EG$0{+B;SNE`puFUW3$e#sWQ(}0mfQQp%6}N%+ zTZuKgUdC_(xh2Qy(G8K0iT%;b4ddA;saz9T&#jWrZ4>&fFCO`Ii2V^EbGw!@(pHz5 zT?;H`s^BU0BhO08nJ%+j>m5FPYRmtS6Tk>VN8 zcDdo`w3^9CS5^M*&WH}^N*cKA@+f@iLF}-$@T4&9e_;zThU>`guAc1XO3Ov=XF0;P zk=xuH*@ZHuz^|F~QEOL0Mo`vR_q~h;N=`MGTTXUL3ea$(+*xtZJru*xG3BI9x9R62 z@VhSMtRekLysT35?3BwYPq^}O1^UE>uD<+*d9ue9g`QHfIsNprD=0g-biDr#J$zQ` zyAIvC86%}-3fB#bjGWAw`^2WrC8vYR@`Fo`HIfxmus&++Dx(X{M_Y^Hf#%DW?jm=N zQvT`^$X4k1@}r^r)j85;XKtpGKf3gCgL{kKHW|n+RY@NuR--?7&EGTlhPIJ*{UfTQ z@k}A4d9bGh9EXZaA|{d9qJb)!s8{k+=XVdx!5B1i8*K}*OEVu zTrB=4)`+)^v>RdrI#%#h(bK#`<4e3X@kwkZ-3j`0v3MqKlJ~iIBld`BpaGQy@#ws0 zEq_Bd`#U&A^UyD7TJtTMR-*;VckbL9X==|OOmZiqo(|2&k>#2B!ZTFFOfm-jHjE{Xi4t0hM< z!b370X@8aiU2~Wja*`QwNOWbimXTl4JZYXu(1*YmlH(Zx5nv&WpxlSl^$@$%kBpK( z!A9yKGRjusr6>wbqiMq|=wD8KAY3r2%YgGUMQ#$u#bPvg=fFy8M!HGDq9@LRw)~E0 zCTgQ=&koklU!pE`OohAnQ!y)#h{@uM7$dUEla#ZZ_D+XSVanJ^l)Ou5{sxH(d_RYN z>@@U0qc6VD7w^Pe>N+S=fODkKyf+8a>8MyvzOmvMTD4d7Ql z9#2l)jq$}>V?>(gq*GJgV)wdl;X7TP;CawvaT}z@J;ht@3MbC^u6798jdUfkb_T z^8Nzz?Si=M{UPFU(|y9bjdcE;lkH;aIUt@<=2K3n2WZC`?;hXZf-rquT;ltA(5UBm z_sR1_g#6EFKt6&S_>uBIg1?qf?&o&;0k^;VKwFN^4f-h%sxNSIegL}kJ8si&qFqSl z7m;tgs$e5F=2rVT_-#q>qkJU}c>y?eS>#*qd+GTZ$eV#Q3Bf`Pfsgo;d`v9LjD8N8 z%a03sc0r_n)?}|Cn2A3~2j1dxkgQ|+b>vUnme=qb$TWUkS&w{^!B8CMcb2XE4zjgh zg1DD;gCr1$%b1_(r7m&P*`%}<# z^p@TI?Xs7D4qwX3vN~9d3;f!$wBJLn@$*rS4{hbZX{;*S@ocEyMP7p+1O0Ncjo)AH z^5@F${X(*$KVQ!B+sk-Ueh&ROOBM;$mDxj0_R?t7WXvO6mNAGD&E#%ods~clZN9 z$nOjqd<6A2m$UsE(9;BMO(7)JhVmZcW*$83M1P%ue_#9-yid)T_+GB}V^dZx5aKJy zIet=k$L}l8@_Casji$Y4Xvbgh;W%S=0pD9t<_9!R8{x-T|DzbeIJx!TUrxCK-qi9n z2>v;#tF$anpIz}2G3Jt!raWV-hrA0f7P1!nN%^z=A$+o%LGLeqCE8Jw`ufUq@IC@W z_i6C<4rBke-%pk!mslW&W*d^E<7K2@MZa6$#Ei&&J6Ys+lYZ(lwER$-4-&>jCncHBM?`+*VJn! zfXLpIas%dY4{s3n*-hbdbLMUb)`nhaUc1W#@cadQxs9bre!r1S;df+iRgts2jP%7s zEP1BOJ0NLqAm3ZBE2#a$6&OqT*f;;DE{MfW|#l-4gjh>t4g2KZw15nc5|isEJ^|?))z{aR<_OA)iuf zL^sm?s9u5@c|{ab%klHxE((AHnVoW~tKCTE?L;~D`HSFfCReA#3(iDmkcu91@;v~? zrUWB$i97(F<4!S8E)z32<1XdQTAMTI3ONyf^rK*PZWlG=Dba|t+)&Oc4dfZltZO(u zW3R}0DjsDemv#B;#~HLgXS*SsHK%b_swW~vYu=CHl-EH-arV24CBhp~o3nN+&RV_1 z1JPDI6-h}CDw-(GyINw0$SYFG3Y@t6a$dwXk#p)pq`~LnU$={!<1G(qkqqmjFxCiVGTKkjd>(DgZb{Tk98_94J78m2NS{fwJxW(KoPeY2^k7TwH32p(B z)E>FY#lT*pqnyO^Q*JHg?~qg7Y}pZQ#VIf`mw~yt#4V9M-8$LX^~cZu6q4jNIm&I9 zjmT5i9YDLWf;L4Uogb#&xs=@o$!;T(*>t43^Q7fo!`(qDT_XFtbG-YL`u;*&azZY5 zGm-ix@U9C|=TIcU&S*;ZQ&tCA77aj7*Id?c$MGp?Dg|1VVy+*SGmFroEI=|WCBN7n z_{D5TyKxMuKOY)|7V?a>{oQ=fK z^qII~--ty-*}iP2U@^j?;qHm&l(*1c6<6(H@f7QjbCmJSz7Q+L0gnhR<|i+PyC76(!O@Kmc$zo zZBQ(*41JjyEm2!r1po6QGOvv<(_*Dm%nl=e4R9-SqTy*LtHQ55)LjAIl*Edmp3N@{ z+b|Kvv5kcH`N2NSX&Zoj*phq`DHlXkIaWUgTi zQjWEET0ZLVfMN2@dWrs9|x1M3!eHL-5cG~y#OojES`jK z@J?6c51CcGYe(eg={z6DX9>LJ`?%<)6W)uUOy~*Utf<^IJSxxW_U@K0>Hfe=ejiwH z64ckg{%yZf5uL{;Y1v zyZWRbWgqAcpc)Ldvq?WrzvTURP;ExqL%Iv!D}gPS(Js{O?NXf|^o;CwChu4AeFw-H zw{;cLw6_~{CfiNt088?tnXfBSPkTF-yzNQT6Fkc5ls{3AwL__I9p$dnMZO_GnUgxR z-J&m{h-n)Gy2voy{gT?@fC16imBAW}p_JNtK1Z7v?-( zp!GnO%BS1dHsD+~(P^NwpUn?ljr0dIP2V>CC~rMw)z?KSGX=C_FQzBhk9cTq#zXjb zJ;2`AZS4nL7#=mJZG&uYeF21u-F7!TTd2RiZ6A=d#)4dMSeN5j zTsuIYHdFO-6QN_;X8L#2Sl=>7F+LHVw*3oHKN$ctBAns+wBQ}q%4ZR(p zw-$XmNS}k=i?*~rO1hk&R*dHPQ2MJb?TG*@ur*kotMDMbM!Nd+K?S0YKLW|1hCQbh zJjw+AC-{!gJXt5OM|B^d#1l4(es2POw;4mX z>Er8+$7k?!oxP<~yFbAVeXjTOJ*GPZvdcpqVw^s*+w@y_pNp}KeZ8*k7T}3J3+&NF z`Y-wh6d}^rfYw%w{l)qVkD7>`-7=&!=R)5 zt?%POJI&@c3Gpz_0%BPV$&g%vsbR=bM@ZCZE3R)}j zJCb>KmN~kMHmU$@9O@S?ksqgmvu7M zoGzfvG-X{H$lnmsH3U_p8PCSy+0u{qGu+?cY`)XSTol%mzw3NrpKi^1nL+H*y~H`4 zSM1Plpe3(3sx$Jel(?etDAFm#Ca^bG>SW@gjwWt_f-_gYg->_gX1?#&dsq)2^10Hz z`p=RywOCC(H*|fmLEiz4?qRUFHY*quB-m&rf4C?=_hUm&!_0? zuBDcE?92zZbBh}T_GdS})Sc0DSf9i0q+Y<^9(NQJ5yriHpf&tQFHXAs|Iu<2dM3K% zdI@}c-W)UEuj8_Pg2iQCBdFw=gC*GWK?Y zY<>Zh@`<36zX$E+l&fa8QVu@mct#a6ML<7V4C25Ym&7asvEdSXYJ@XbA*ZE`D9~+w zHp9sGmgh-DOmm$&UQyNsP++QwivQ*F#W%p2^k%JyXDnzhjfB(Xgfi7dWzGiCOi{e9 zZerP6UwqP~MN)%gWtNN5rk!}n7_DM<^Svi&Vsq9QClZ+-L<7cl9McR;BJQJ20+H9G zp{`WoFUD2{lT8$(taK))C~5j(U7QIk-?k#TSta6|2GrS^&+Vcr=ZZY0w#Y^~PjnqD zk9U%$EPqwR&(xFNq!dX^U+PLCVu3IHjXs6vSvgaS^GX;5_vIoN*27Mh5I>nZqL#@j z;+odb8;3MSL|4++$HKb?e9ez1ML&6@cj-b_3P<}hu~4~21#f+R@c{DY0%_jnI*2d=|J8I zt`+D4CGmL72ZCdFP#dS=>DbB?qP)j;w5beY)k{9FgIwUbA3@fs12V@j-Zd~6Z7)y> zN}3b4g*jv=n_uiG&>EVVy>_EQlKy&02HYoF{EUy9=zNVW36r zHGi8^<|BFDne8Su^d++=DeIv5(QY+K?QsyEmYV;W$)>VhWeV`UGN?YFM;K{;rS5}f zlnt9splCcaCrkwNjko7O+qjDN?syYWR~y>>Gv!8rh|mgjrTn%FZ69jNftvXf{K*Ub zrQuN>+GC-k0!S#??L_GA1W&d?>st7C)a*CY%xcpR8b_O$Acmbb>p+2+0zDJWC-aMm zq^%Y_g9v*HB&Vq+I(&Lz9)JSz8+ELOGpqPL!6bmc3goL-<_Il53$15+$`Z8mHMO?4>Fr~4!Njra*^`xh zYp&7OYo@5Z4!x(0M;W#48`^t{GWMGk&{o$9Th+#}Z9($*5j3hX_9aMF&rL&em!E@%e(q65Qu`DXn(mbMy}fMW z^LNiYF}3*IVYZs*@bCk@@ewXKxVXctp^w%v!jyf*``%^@oNGewbT!R+d&!J6OZmHN zs+&HhvdK%I%`_d%Q1dHzYne?yQ=ZX0%xs}=o0|4!xG7`?fx}kER3%MgO6p0<24Cpe0`jCX?Mxh~No<}$Sx=MAOfpHRJ2&(hkezSoji94_HaGPQ z^P65}j_8GEqh7%GYvz+4Ws*})0OIs3&e6wpE^`%Z>a)6!d8dCcr@*Mbp)>MV+U(H1 zNS~5-#mze1z$^zvbgph}j_ImqlU@P>btcn8cQzw*4%0<9G^6xb-t|CE*<=>#@n(bG z&$<1S8LHcuVfqQ^)V)Y|2$|#rXw|(Li{RX|>%+o#yV-w7DJ=%2A z&yh1unQhR&Kwl*Nd(#2=Wv*UhR%=69$4z(rw;8GLn(<(5&(@DXtlnV8=x^xPU#PdA zDXq6t_ur;B--qj0riQ*}3hVyJ5FgAh`a9c0@8--uo%eT5H2n|hub4{669x5o^E$X@ zq<(91LT_{(26->H{TggDiuODOvHD_A!sa5~#o!?66580h76`wmK)B9t?gdlKTaXsN z*NylbZPo?9Q+_P_2t4}7!9??Wu*EzI+K{flxeT)QsbGQG5ll9Vf|8_d0w(<=vmm&t z4+Oc)(LnO9uvyFVMZp(6FUV?+1j%^c$E*+T=?TFJy^-fV0^ghqF6yJfHa#_Xqj!_% zO7N@p^aOo1NCO?q_1mDNz7h=7=Yy5n1S|Caf`VGX3gYQIK}O0>NZ$IqPp=OK zPlN42Y5gkr7(@lhwXY}ZZTwylq|pz80{VV%E?62A(Hnwp`nTX%ur(;B*9GzQs$iPF z74)F|4Ejh=nfg=cPtg4-u)*Cx=!L;I`V#6C`cSYx_z?UNG@-4(@GP}H7JLde22*&` z4BECqYdPwz0Bz~@;b5OdvCX02Z@ni-ZqD;}EJzBHdlAaGr+=sZ zLqT-2lKNH$S}zLHnR&r0>h>6ukMx|NqM1dVJ%abTHt%-@|I(gsv|iOigXg*@V{=H5 zg18AUpnHPu9i#>A{ef;0Jk)IiBp=e$;oZJqh8_`oB;P%~8D5Ttp5?(Q#zqFSA~>tN z1yS%ck+}+AMh3sZhp)8#9^*VN{CUOqllnps162As`dP4xevM1~h2Nm(HsfsoyDr1Ra8Zg5JTYU^O{M z1jl)HBUl%_3i|MVYOpq_92^PyF-Io$ z$K0S)a6hO?p29&8^dxsPo(~QlQsz9$jtrIuhbSjIV}hs@!QNm1wErBO4cY}egJI0Z zNz9f`!M$K|0QM`XSMh8!ZCDY!43-4jg7U#zXkbJK;{(PMbYA3dRd6u4M7dHAqprTt zKb`V7LG$q7IrJSS$NwlX2jeR(yuJseAA^V>7QBxN#xmc}QqC&)HYzBqudz-{4c-U4 zgNl5X(ckLr3(XsXY|Qys^n=g*BDQzXo@eiZ_4LbvAdcQ1u(~tvFYs(H^L1Cyg1MWO ze!L%C4TkA0L0$3|V7*Dt_xjA|W%?BFwg)wszZ02DIhdOd;6@bOs16-J=r=(O){XS~ zpJ1qt!OC}+?~y?!@^;pL!gr}J2akdusWY1X5PYXA2bpzLP+srR_&l2OdWC);+zvKwgOFVnSkCE7Vyw+y=IBzlzYrMu~ox~a~syOX|@ zPNz4pN_EsychIqQYaLfl*9G+^*5B_~pS$Ve}(5C7cJk>UU-|W%OW=?}M(bCTEE% zoI4t#6CA9aX@Y*O8v3O+x*mG9`nHsgGC%3*=#mO@=9rB>wYaT|zO$v?$g?hdPO|-Y z)<-Y49r>$+K5#1O=b}%Xhz_%*UVwh`JZFeYcDeqa9mwZQbVh^G8K83of%OArz94;0 zHwQi1V*NLI;AC#Nz6wfgB!8fSqI2u0Ga>sYLZ_0)Ekoz9MyGI%Nk0z#-6s7#x{1%| zaLcy29t63$Etf9b46Gw)1#a#>_=FeaT-DP=3~cAi2wSGpB89 z^0YHck!g>Cs5sA#HDDX@xyT$u=J~_UBL6P4&HiSFA*&8XM%``?o94(-U6FBW+dq); zuA8=Y6SC|U(+&BtJ96Pn&9B+eK% zo6SVJTWA*Y+RUIaW~Kc4Q1A@dKcOvR@50@}&{@dlA#H6iEeqMypzgNeX?E&L#WQL1 z(~h$6EeU*yAYUOH-|RNb_65h zA!Tmn-3-$AM4JF67`;`IbbbEQ=se@yRWwlxnU%Zve8y~EN*T||dy#h+p!osizGEi; z1ue7D+A#Wr8qC{E)EC!wqTZ%(y*nd+JX(>F_7>&6ho|u=brJcJl3!8oZD#5c z+J6?UNL+B=UZ8clz)W9ES@CJ#XWDa%zPp14D66f9W~MOjlfc_F^kp$tiB5K$`9@PE zMo)e_pSIsb6ZMK2a}pXpnE`gMX+YT#Xl!cOmZmlQs>-U@gFfiW3Y?PiYEsV+tgc<5 zB@fSw!^7mPqS0C93etbs;e9(+xdLdcGBKvwq4{dSs#yljQVwWJht{hVt5Q)`y`St( zv~OFf<1y`?!b*4-KCGhrt<*o45k3Rj{@`x`WzA*2^rZfAl(CmFwG`eip{$Yg*#XAO z1jg(%`g{>(kD#q!s-k%-$cp(*W7fp}YRcNa^dqu9ecpoG>l(3V>8yC}0HIU2I!@G2g&qB?yN%f@3i_9K06*1P<6G;3fI*0WmleNx-p zHlzNj_B-ZsZrj~9V*I9~|Lfb{wu$XP|1@A-X+xBT&a5u0C~X+psZM*3Qyc)6K5u!V9~LrV(Rf_mEW zzOg+FJtM#<-U+=WXlF<0SV!xA<@Y@3ECTn;rES`;F{UnwJb7(0$)*MraG1r?@ z#J6$#6Z_KuG~$DqFTZkoT8sJBo^jcgwQLzDpn}Zd7|f@-%&XdHMCQX`SwCzi7T@np>5%R9pAsgMq`o!01;*-OS^jqpmpGpqFPXbfZ7OWKk@Y|iN%+~5}FhBpSc ztEKH@{<2Z$1zpm{gm-In0sE(J$!&6B;x*tQrhR)y=e1#-kF?2XmxPAcoTzV2!@+E%QYea&ZchBa;xYmVfEGn4kVHi6m5K3Cr)CLV!8<6X_BBJB{$N)Mlgb2>=} zy@lxGv5d6BlzY--;O4wP>A&%_v`xVIqAz{?Om}DP9BA)yga1yKw~e_?$<01B*o?z^ zVFI@>?E7XA@3L`YUgJN$ZbUoXPiL_y&2v+aHtmM5&*)DO-O)qeHFFs++01sc*yOhT zIT`Nbb0(j2jDh03tbHk11CeSt^TgxSag05#B74ON#@~ME-pBc%DrY&5QJ;kUyEQi{ z!=NhxZ68B9OX$?niPg2$udgBYU9;Vmt(W8f0 zeYUcTKVuZm1bq?Qg#7@$%Q-_O=KL}aP8NW+iJYm&@_YcFV@zWt zXHeZahqa_9=F%fASnH=CO}{Wh$=in>na5t#2Hw<0hL~(uaz4}lJsS_l+jDmRh5XCy zP$ZwTrr&=f!LnA>Wf%4sZ;|X94fssKXlrg;(35?vV9Zsr2G@b;JDcnq zTNwo5;Y2!LYb(2cHm7TB|K)`6ff0I~^l@El8|J&uyLhfQ5eVvnBHxbm&1@l8#nyL& z`Rry3I!3w6ZTq>-L>&6veu4JNuB9#MQrm29C})uoM4E3)+?L6p9gm^z(O@W#uzSF| zPv8#oekKv^XM*Is$EGGtI(Lk;#7`$OM3`6$gWMW0ppROjDcTBdpH1#2*^zD`bzCMQ z#%#OZEwi1#Wp3fN*)pUn=KfF8eZcQreGdS?_w$uRRHV#A85NQ!Nk%qhg~-fGC>dpw zBC<*$D`X`!HH^?M(N9xK($G%P68S!#|NHTOc|E?*^ZDFy?z!ilb?-fAiFyYzZ^`*n zE`336jW06=(ruZq#DhL+tfSLCa3hb8{0zO)kCmIF^d4h=1}w|uPx{oaU77c3X&+_e z^~~(2E4`i>440q5?guokX69^(w{tQ(mHeC*_9Ff4nan2fsvp)X(xrpm^pG?QauJ_+^^sR`TQ=*;x6y}>;WATEM4hy;$k-LsX#}owm9L(umyXFjq5YR=n_1t%jr6Zm zQXUbsCz1gEz9Co6&Duzx)6%0Yz-K}I}C*+1k`N}rcQ2>1=MRrw_r<5j6EW8k%M;j1jkcX{J>Al-|ap|H+vz^;|#g zfwrA@#*-776UG)q*=~@Ykrq?8N}A1F z_ldgCT7w}Sck&A4Uwp24o%cq}#c0atF zn|`kT37=}Rk!AF_EOVpL=V~v)S}iN7nUOS4-!j@2=mtfm?X`Di=F0R*pDStq@1gAK zu$RZ`y~j#!3#vmrh9Bh~MLq3O@srY~Fq;?Vrozr%c)kg({+qiOmiOXizvBc4$&i12 z^69gBTHgx$IX8pWOQtof{u8<9rKe_!XyYSPQ83LTK6@E(*UJ2Yo_;13E2bNAf8{B- zIOX+8`e^u{m%mpd01YM#nkV&*PQ>!FBt zV7Lsd6J?m9p<7q=)IC>!<*8W>PeV_qd0!^o zhdwfyv1vff6_xk|-R7#>Hif11FO;0Y4h~3S^HfkpkK^_ z2&izi(~7vqD*5{)_RdWY;TPZIB)vgY!P?pn-_^}g_4FK&{DuFVnN|Vk_qaknuvFE? zyRdYNc>Rk&@Vz3~vwP)m4%L7yYnE$=7d@$2in>|6+ z93~%zsljO?OWK)m^)HT8IUQ}p-O@^FS98(C`n|`y8t9-yS`&soH+Mggu*Wk)U~xJu zj7+ag*Wn7cD&0@JBj9ofj4ucC0Ie)gdl>o{1zTg3AFkAtw1<2y1^ix;u1dR`or}^v zpmk^eBtu+Wzg+{!__kUtQPb1nRIRXcKU4ksWCm2 zKIPwJGutnH9n9;^&x7e>>JLs2$#Sq;Hk$>W%u-`F$lmj7YC27eqrfy9Ok<4a$@F>e z)_`kXI!DdxJ(-ZclwOYFzV+^!bP*gK(9i4In`pLbo2!LjS|yU_inPC;I%sQzx=rBW z>U3_}KwD#duaOQ)F9vfh5KPzlSoMaAK|3gYP7QaDP;#ZTFMM`0-eGEtG_KkDZmYk3 z>9w%&SEjF-a%T#5>Ub_Yp!GWp45O@cxeaJ1&(c_Kht)S_pvd+87V^!PZ&n zBj#`*EoDynTgGWsqsU`@yoKie)5ak1?ae%n_WGjrPI$}{=|`FC(y5s`+G#)&YJj3= zq;oS1)3?E04ot6FF`s7!lB(J4K4y(JH5=`{nVAd^^JrJ|)3q7*xH1nJ>kRR8SJC!f z0rN;wYMOo?NT1X9C+M+!I+HwVZ_LBgU!u?6=?CgQ>3t52mP$8kW1MHx%}H}(xfyOm z3_*!y%KDc@#0|my8skbu^-~m`T?pr0 z^eFNP=)S{8nrpEmiZ~U89wmv@Nr@WidFnLK+5x`=r^p*|R}-=$U%DO6yI)KOKi@Xhqgn=27(u<5oRkvzU=o1kXU4 zM+rE&8n)_zsR2kY)JA!|7dNt__}CGjOFaF949LY1-}CY=r%d-+V#EHx~ zdbj`|DP!(Bo2Pu<*Y&&zI&Y5l+v>d%{1yP=6==G?wu||Gj0Wt)ekOQY8jK~IeFplsSc! zb6Q#n%+L6{n09nq<^$H(`!v1pGmn9D4H@_#+zf=1+1i_;zggBvANtS&ZQVwOFQyeP zAn~4KLCMldUoE7MJm~{qn(Nb1`&(i3PP#!K66f{I1=={>*ovmB)%lHn@jvxGr?X7+ z`)ly;V@WjkYz-Y}tvNZI`O){U!Sp3e;wDNzo%z&QSDUXFeR~;<>)?4A+vR08*pn=y zU3?2GGOyB(o~9uz%6xp%_L!%Y|ZJwgZ#EXpQ&Y4cUEQqPF00Xmd&5mEqw>~d_>(B zU_8sMR^mb%ae_@|^J7}9+_1RT^(ZAl{kWvdB$@STOxY4-&|Eyc0XJEH<){$Rr5w>p4BmyRkIj{xW{SsE<+tT;Q8Ln zmrkdEdAWY3pcpx5jj=Af_B627gPX!|HQGu#nZXZkZp4L;7*|m^_(d;+*w@GPQ63I@ zt6vrezE(d+%;oQFz&7b)nbtUQBiy%ix-&C`w)(Z1z6{GsoY2pY43boUi2+ ze7^a81zpXcOFje_b8yB{;C)SdZP3qf^fJ)+hr`D#baeAc+S@`ydlhXi)y_t+`~>b* zB;y>?b*6TfqqpTa=L`B>X_d^#EH&ox=H{sHJ+#->czSy#rXPGPM!yr$>q_+UfVsYz z4t>A5n`l0!YI8K0Zh^Ck#$!*(ySc`9i@B(lc0%8s;N>3U9}fThNcLXZoB*G%qRsIq zaa}IG4j1ZfE*}SbA9H^nn(3^q@!%S+{=?wffmWVIL+@lRF%Gfll-+F2O~TRond`~$ zowc8zuzqG_t~trcuQT>x*2@}eXd=3O0u`>XUe~jM=Air$nc8ULceMS76>yok>2F^D z^X3RUzc{+S(z;)d4_9E7R#z{QB)f2=VC?PS_%Kd(2nQMs$9LiGzo}a;wfkmX^TA`s zG~34r^zuB|*BIAS?;fTJEi&Irt`e8p zwr)n4w;9U6;{DL{R_kDEW|KLa2j@$@Uuurp;1_GPwE+DNN5>=4=wjdJ!TCIN|2Uf5 z;{9f8V~zITvJPL??^Eb^CHniErv5v=xkJAnq02pJ_kA$^L(1;NWA>AnCEVfu6+M2L zewXsUqY283u({I;MB|SG>o8B4frrkoZ^b=Y_<8VQGUZ|?i z+A=R(lU7vrvd}2KRGB(*K%5z_OFQ}G3sS17o>RQx>V3 za;p^qOIu^FX1op3kLi2og>K5;$>OP(9%h4_6^1A~fQ>mQ{lo9m!;JLbbd={a(;DGk zc(^g`4oAho*(FSZ!%k^~(8-vFz{SmQK34XJxoIzLlnf)&B*q*s?vx0P%HmushH=$c-u?dxTOs2%P%)-h?3utYApTRk7b?imMfW6~aB znmHPxk4HQoYu+ABuaV8-4CT%frLLz)dZofM@H;du9J-_(Wyv~M^uC_T=BC%B^~~4w z(9ZW>`frmq3OA)A;Ine*o?Z#wF<|NA`vB$Z$ha}tT#Pr~3&GSqj55!xBpEe^h=zDu zcrfj!&qwulvwp>lPIm^`7Q*cGIXL?i3@?WfJ~t>cUfz#E=_>H-3R6?r*3u``*{tnl z@b`tbp7gs*Se+J)|lq(Co+GK1m@|z&>`I& z)~27RyAA$64X>wTj3rZgILsJEw_(@uZ9>iAauX!L$<%JgT3EjbTZ6 zGhHFN;{>rXZVi8>Z-}cgN!h3MGe@6Kg}2j%#ydT1MUU%@VQczf*kDW>z;<7{LEqnn zeSUA!|0m*d>=cFYCHT$u^=|rA_(N=mZSXi>Optl$-}+n>WDg4K!S=Ek9oyvv{4SlT z-_4$_2rs6q)z9Pavana?iI4UDO*$H!eZ!t~y*#_MjCmxSJc{;qh0oI4&07bw_aVAi zW9)0hA9+C8P2uZwV0g#8?N#@UbgFSS2j}hP^ETx+YO}M97E8lx>2`mIf%k6X8>O9< z#@`pr-QcwWJPrqEYjb#J*rm;t*3~-v;R!g|hz34G%U{R^yE`4Mjnd%(W7>{Rwrk@Z z^gTTtr|b;hJHSzA<9jx&vaavf_Fv#xXD;8fCO%Kw$hOfG+ZUp<* zP(+^V7pqBXg1uqgKvP8IDdsmp-?dm_~dv|5~hM$e= zbT~LeM4PL_IMGMjqr3HRRU?!VjqqC8cFqeoiA=d78PC9l>>FI0~o#;IVl_i%iULcZcNAvP1c>ctB@73q|;^v&E-67%3&;afx z!F3rh-Vn-bBlr{uHI1ofC@H_uv9v6BO2L;XJ7hy%qdtQ7?!b7rk^NQZ{vbp*J z|9f6$pS5`B%l>`?*32h&&4{W@bg zV2-~v*T>P-xuSlaqW;%t-pz2BZmRA>U~6jLHkg;u;d_0YAxdQdF)B|7OK~}y{)guN z0dG^Vbn+=27Fr?G&F?_(=g1V*6HeD!3(u)LRU6Nv|KZlbEcl#a-dBew)3?#(-M(+Z zn;wSW*5NH}959!2@wIK>&eH5IylI!YKPV&3U+IJJxd8r$nv1U1+bDg{2g{A#^$)+w zdA$Sg$XJ6%wV8y@#?ud6+l{4~a`&N$H_c}+>tm$YNwR%f8~@@h-&)7p@w}3uyS^ry zvoc_NMjP|Z=JjZ34tx!Vm${xjjLsg?-WB?M)Yyl^PbcqZhx$fe)Oz_(8`ZU6#(K)J zqH22gA6c5;y#4~-0-j%KEEmAp)yiLGrmI*h=U81G;l74G&j`)U_5J3xJ$PH8tFiFZ zOPy2nT}vC+qV?Or)D^DsS}oV0iRR!d6`>u^fIT$`#r@j`rQAHkZxK-4)uPds+Vn@!cQj zJy|;E`$dE9Xj=(e(b_pi{sDa?7tcHeBzyEz#Aq%xy5ICwN@T1r=sQP1TG00&@x%Ne zH7~TQM(VZl{y(jq(EG2R4MKm}dYkxU3&H(q=pn(=Hqtzcfc1K{7t+#>(d5qdd~5m@ zZ}e5l2Usp|MVw1=X8BKcofdQg0l(HPILHm`u=!fO9)>=)unm%;G~BOOb^G}G_( z%6zB9S=y+8hO462k8z!YG^^9KcsAbqcKQw8TN1Q|!StUwD+t0rPSV64^V$?V#gzSr z2H4M=!rEx4m%8Zs8j!XyPv^jCW3YGi{YLQIfkw+J+Zsh&pr*LWFjEG$>!Hhz+AD?% zP7Bv5dx?@)8f!J9sDgGc^}Qk(D#2W1GOD_^%4xqg{MGQjhV@>+nrjKxi%-&I6*N=b z`?HPrQa!a+B0=FTjQujT@~NK>o+DamW)b zLvtf(uZx+u&`M~g)nDalzTUbn1*2cn#uIbV37l>9R6v<>R#6u{u_^GQOTt7Aa9rbkcHNzCZB$VIQB-|}HvUYD!tJH_ zz(00GqBT|9OjN@QYn`0+GUQ}IC9`}!D^U)j<;L*RMw!yuX#(dLC{feO?czx@^HEDL z)y%;l)N_~dxAwfJ(KiOc5VLZnHd}f35X!j3^GnsNgUYJwy{3MCg|(}c8mZSay=!gM zBFVw=DX1nZC-UmID9qRQrZ!$#*&G$64-|*_D%!XV|Gw6YoQcmg^yDhfPBF%dwN)A4 zDFACn$-fAS19C+b+xB5)f(jD;800t%- z!8n-eWb6a+rEO+-61uKWBFxZEZ+NYv#YI}5XU-=Y`)#zPLRz0|MwY1#%I6B<~iofW8|IoesMR9mq1Hm=Tk?rjvS zwJ%OQSg+7?nK0ez>I6SoU99^_Jm#~4|CU$r)G!SG8o<*D*$lhkIXzKKIdj)YpWXe= z>NAJ%rVHS%=MMK^yIn>o}O<8 zt~Fz&aoEykDVm8UTJ2#h4Ny)KV=v}SCvQrF?k{WqU%c{Xa<2>t@(q3EB5>EjIg6Ny z0!p7@4oWML!P9}ZiXPb*WX1|p3H-ICH!Bb!=y9QG-p(;wh z6po6R&2!Z*Oee@{a#!GJ0mnQ>Hs?p17lHp@b6OUJRsBBIuZygdUrD+jVdP5up(KiG z0B66kZ>oVYL4U=pn3noDOr}>*`xrS{N-yQSDGM7lSvh6RXluBs2nRKBx&k0?0S9$( zk(Q{cD?DUnW?l1nEv;=7oYq!`w+ZBjX>p(81aI&JG`42`q_O`(ODgPpd24KqQLdmV zR5DlV%+O{Q+7?p(6ysdZI^2(|zivj>@Q6GKgFSGI*GZoHQQr!(aS5)mjK^m#%W)EE zy<2+^n1|1`HG(Ydr`{vD{cWs)57TqBU5@ovFDzvR{tw4~iG&(S19}3reNI~3%X*#< zWBo|qkMW*owKankc?Pbz9W{QT?!#784vc&Z?&aQn1lM2UdM)7OU1cVtwz9@n(E9%g z^={T~FSxw~2F^v9znQ5c%AIT8Q*9N2tIu)D&v;S3Bel+^*;Ql-)nVn8(r+6S(glZU zEXsdtap3#h!5;Y7WUxK}t_#rAarBebeTJa$ zZocJMopn4f;cXjj4MGz=ae%sLC2NJuLU*_8bEYW#wPB<<9&iVqb}xRm5OqI~4)$y5 zO});sj{D-CeT-%f-uVCtGlMMdh_0K$4@|J!`_ne(lVvk;txIT_L#^tiJcpCmgY$W+ z&bKb@ZnFH}Pd_w|Z_tV+^EhR#?)o^#6ZEO7xWy?reN{O+3(1IZ3LGcK`X3E~Z$ZEJ z>+vdce5KWzV;)QLlw4xoW?C1s!wWoXU(@Qc`dV-N)8PeN@of4_mPfK|8^Z0Ep9 z5z>YqPTyKf=Y9`aD-%^Vq0T{*b|3VIfc4F&4BJV;Kc?BMm1K|NN{)fbaVUrvV+r;VL9zPPt zf15IsJby-hgn53?3Vq|Uutj_G;|p>FJRAN}X15#(8{oF^nO9<; z>oOO)1VO*oF7iBn^ES~O2 zGjOjw2u&~4b2Uvr$VaUHQM{M3l!l_``Y@YX!#9xrgJIvLiMz-2~t~J`(*6a|gd4l$4 z80{TK*vQ}Oj633NRJ{~tlC7)k#0HJaA=*$87CW8F6wulO38^9AHm*7~alJC`Xt z06b$rH5}cJF!H6=@-TDMOJ0lVR?b@4LzWoLaARY^Tf3XXv*H}DwVubwSke=$w;9bF zc+*SzTmsG~V7I$D>;Xfg(8*AvuL+xD!aiK(i1lzxuRr-*Wlm3xWzo|l`9s>9*ZSzU zw7IMoCdXURu)N9MJrS=o*PX&Ev8C^oWm_ueZ_6+neQb!e!j#zDd--(Z5P2%*i1mD< zTq8Zv|1fkj#;SbKU49JzgGH%E?h*9*QDzoCn#;^eEmT&|rwd$nHP_c!b9K>i)@B%CMct3<++sG)Q@e|QBk;uPbhwr{ zeN*e8i(2>6yl(NVKYrMc)ia7lQUtVQ7j$z8C~J{j7tuk9`T-uD_OMd`?f;g}^LYlheuN#p z0f=VTq_%OlRCc_62kEP~ z`hDmDL+z+Eq~FY?Gu%KA8DKY|8TmKE?2Ryn$-Iq2X?8b*;byq)s-3}fp>|;GLZ`Wz z4BP;RdyM}{_bAJs<7)ZXUg5=?nCrSLktX(Kx@+{pLGen9q-AgrYuw;c0)PzMpZ>-*JsSXz4Ht&51m% zR@!gIlZ|YCN-PCeb&S0gE^?~q=bdo7i{PQQ%s3>oa{pSfYkc2CZ~BfL-HO(}qKSNp z*Z!#FF<8oDWxqvZdJ?w+qqaVm&1b3aN6CT%As^22X?W0Td(`UcfqxArG3ubr5ja9m zE3u`vn~C_|-}{@$wCwK5qt;7NoV_1@IL)smXm5s5$ookz8;sXvvo5{IXaB6&?aPdO zv333lUXhhm|Hv!!Lbx!V@cfuONIS)P|2Y(nUxN5+`G|HY_bWO39X@nQY#k4g-;2on zpUJy_!d~)iU)&Ln#?QpVKR5my4~w0@L7twY;Rm^Reu!7Z-SO*?Ke-?dkgwR_Tx%K`Cp?4K-(bCcPzx9^W7)8mF@eO#B^sr*au`loX0*CGBGMq-kuGT;u(e*iw#&=E=NxW3tfiVR3NsNIamO zg~`M5qvS+fo9vV?Vp}YnlP{T-?2F$fzk2tpTtJ1A*2(9wO!7;-E;&89IH{cc9NQ)j z=&5;fSMmag?~6k~dRdYxCNxd(^4QJj zPm5)fw(;6zLA*3s7ju#wv2Zdzc1*5Gx+gK|l^ly5lFO5c$-~J^&+bb~`93r0lGID? zPwq~}f@N*eGFh1PNmeCiCnJ*^lF`Wp$vkgcB#n~3$<@hpP(PA1P3}mpNZJ_5)Fe@_ zS2Dq`yORU4Ns=cSlH8<~cFEkNNK!YsFzJ!}Xa@3WwUBl<$G*vbaYeE}PB%k0B(KKy zW-B}9IWT&Ize`~B7PB@KcJKA~Hhn&ooR>V6d<%O8z%W9;?UF@FIem>v#(--?vc#uX zvJ52ck_GzQ;mrr&d=^gM(Dyz5u1u=<+dAp(-=O58q+im|uRKY~B#q^g21yAm9*nh6 zMUCVy_}(4QNS4KO!FO6RE*^^g;{{2H_<6iLo`~b)r?FN1I?8>J91ZXK{%xe=#8<;t zv2gq|UK;nI@B=iwZ8X)FV~kTt<@s?-_{|F2OoLrcqK}N5!$Ve3HXFnkTEOhMI;^Ah zenxA4pVXZhN2tFptcla~(Uun7ME0^Rw25J1VjM^F9q0GFupssbx5P2DTDFvI5i%3g zdLO1Cyk|wPvqBGqX7PQ`57Q$4w2GI~Dt@L3JnHYZP(OZ1gL<7N`@GK=p}+c-z|@e2 zas{|9jGCsK4fTt zm&O%-e;DfGET_rhmV>*LkNdp;1P}X27KzC;p2g}e!DE-<#j8E*Pfr_$2VYBjXioR; zPo}gYhi~?~GalN8hIc1^R|}_Zgm;P)OuBzYt}h~U#<6*y;bmAwo7?RDUG$JQSesAK zYx}7;&F?$t6SHZ_cW7~z-)4ub`@m;A-7;$jJQM!Z@;dx^BM6?NH%uZA7U(t0M<;oI z8=iVI>3Fw~ykB7mSj`)i$&ut{{Dl@=S4ZM!O003;P!?+M*0`M|8HY{H>{+Ew>R1i z?=XjZV0fppZ<&u*$;xkOo%`t`yXZXc(;xQG#t!;@oSn0km+(t=Y>{|A z`Z}KGjhB;v9ntYGY4%yoSb}7_R3?t$v*k|`CpWy;IRSwmjbYB9|;jk%fY;{h2mD#%{<;g#C^Ca=1q)>c5aS9_T7hg$=#qCMHSS;sP zzt4+bXs1BV7xL;gl{2WCyitwfH_4$;E$8>pGUsynr1HioIW^;{IYnZjoIgX=oZ>Mj z=iGQ*PLp^%=^B4ZipL}RKSRE%zmnQ;#P2PNgBroldI!`i|9K822iMKzj2XRhFMhp@`JxY>GHPhQ^R*?qCFby6HG;@o>TBJPs)=M3EJzjQ_{YAi7uS$A%bpE$&iGe^RInG55lOab-J#d}VVjb)`-oB3K6n+xMQ&+n6cXGNxNd{n(( zGY#ZSz7Suk6faIs$A`|5{iiwD+RG$_M)0ueG9_KgmMN27ivQhr=m2HOi3%Z?{5?h<{-;lW<;$|`j$zpYg_3{~A zp$hG$EUxxGKUJUjhn~)h6=`Ip$-*OSq;9mK4rEth8r0P>L)&;wt!+x>L|HUF=lwv{ zMfnED)0XaHvow;IYlJel(BP)wRYl0rd*a#FTrSP6L|m-DQtX#!aM-Q-@2JP8{T@qx ze&P3?m&n%#(af-tzS6ERMUx+BcptKZj??6~gyXRBp+5KG}(lgZYx4;d9&=KDKJIwpPb@zg4rsDqF`FHO?ws z9@==(@GlQGr<`9s8>6DX*HLnW86%ue99_3Oe5<7hN zJ#n4q_-xNpZnE#C;9h1q&)3Ljwv&eWm3IH<{R{M<=lEW)b%jUZjStD^VJ^`DuXjG-73HFG}ZrA@ec2{YU2qwnt^j|=GU4Xey73Z z1#@0_oe`cyO`F3X^uk?yf4kY|li9_G=`8!`fz$NyCOXQCOFm1dX~OD$h0eE;#eST| z)0M_Jmo@({>-|=>$9uC%$qBTgK4|?GlsSV&v|QQg{5*G}bD(D_dk^ZG)7dqi0^m{ki zK8NfcL2fUgIlM?p%(K!~S`WXV_4i|4vZoFi-Zj1#ZzQ+7kTQMA_1oi5yzn2AJg<>i zo4hN=ZVt&9??=%Wdd1ab*l}fgB)7*sacuk#Z0(ZEW3^-;%e7eSN#1r&>cwlwz{*L@ zSUow&626XwmemL3DNkY?m0T4YBsY+eU$Kg7#e0$~ysHo|O9qjdbz{w>Ju7ZPY?Ry@ ztFr6+leHIVzi84h{vA8{Jx~A5+4Z-^u1O!d!~ks!^!+wSnqWTGv9e!?rIJZ- zbsPO*4$F5+JQ(lcQ<)EkQ|M~L_$uy%-?{N$b6iQz%QE^qj2nJ|GB(HAbdkyN9USo^ zdc-!IZlAea69>ob@iy~*FPgbKzJbDSkBj2NsP#n}O7>kx)zZf zHI8%AhvG}>&17>dm$~mXS^nOnTm0hFARQ<7e71f=vbTo3?B&Sv>&V;w@lke6w{%Es z$*y<~j9cZSubNsp^p$sIG~DIcy~@2!hY4V-%DeV-x{@ulij3Z?jp6Z;biI1>=r9k& zRdkqV=s$n4g_fpM!T-DGOTjf%9{EYJwQ)_7#c&7x=k9cvvE336%V3x%d}}A;DK^U* z_2z=5&87M`}FlHHNKIsO8+>DqmXWSm3qU2JSMJb#Fv#_n6Z$M=0; zn?nMArDJ&7YTA8{z%99Dx8k*MLg_$He2KoYk*HS!aL8wUuxqcJ@BnQ_|h-& z%6KvU*O)DLR#FzvFOGjUzzgf)Tcy}}9eFFO;yJhT&Gy9Oit)#mjc@Y>PfJdX+me>- zxXN*r{s!S&ui=4@vj^w+y(KBmt|}!5?-OxW(kOnN91aKBdv7Pl!+ALc*kBjMjY*DN z!D)CWDWgthUe)G&u>XXrd>~!%=1NI@ys#L4dmjE+j(6{ZSOPD<%$QH{{ngl+e7T(5 zm|`65@!ZjIyuR--hG&xT@s6ZMe1PoPm=uk5{XHw0hJVZZYy5x2`Z0r#H6vfX!RLx3 zBXF}mvXw7vF~SNAS)$uZ|;E#ar8u zw>RO*cfw^47I_Dpwmv*ZoU)Lw*B(I^-`Py6-+Z&Ng z)1EC-rcoS6%jgi7Xzww7tbwOtzD^8W{hF_OiHJ7O@u^Dnz#^h-ND!=bv0d1NlbECTF47yzy#n)Jtkx*H*gq_lGt7 zurnCffooMfC%%hzR`D%fVIF0LX2;}(;U~lS#_|Ms7tqJ=V}EpI{V%|!_L=wRcmP__ zr)S5B;Uga7LpaqOTyh0olG3T4MM<0Knrrcj5%l+oxaeYB>rD0+YdZ|3!^Sun$91xV zw>p=0U7Y*w@_}9%LUbVe8f6 zX}#Us`{~->g-4zE*-m?Z$C-j7H1SVEJGP>G5H#|PXQ>_CUwDTv!sqjvfeI|3_IUa4 zboBgu4ke7XGP!e<4j=d|3iw{i&ii2U8SE zC33Sk8@vb$uRA|XBRWw(_`8*bG)no~`9Z3}LtED7qu^V>&+??x1f%$EZZ*5j=t`G* ze;e6%8xQpj_{K!IYR?)R60gu^b29J-e!`-xl0!}uI4Kt&RBmm!gY0d~($2>c{g(&4 zCckZm*u?KGd`1)DegWHl7Z|TZdqr?8XJ|;O%BZm;OSd5^X-$%4vtW;4iS$FcjbpIZ zer5UZC(S-Ufty&lbHY{ePPkbd>i9I_yBa`#cGd1pu|PZ>RhGa9o1?DwWaeh`)t+_O ziRHSB@990T?j%98Ud$=DL=CHBuywi^CzCyw4){BYonXBW!m}^d&i7jT#d;3xlXH@0 zcz;v8z9|3Zg>gA+s+_gg$r`PU4;{CLcCb7D&~yIee{|?V$#=NaY`k<5+MY$jEtXu3 z&-cOC7t*8Ov0gtRGncCO13h^j-m*cBsn+5RIM=f{)o1vBE)Dq;T<&3Q-2`|-J7*)?C_4PD}A$v0uUeSm$*CH6)q@J)8+ z_q;s*OD?{hTpPRNMGq$B*&Sz+g;UAU4dm@QKH0JK{aW~JYxdP;+A4(q55jxf+NH~A z^X;%Z*&7~APKlfF$pJavhP*i&`CuctS)b3eS*)5XH))$AOMK4Haazu~$?Z8G#9wntdA~l+ z(a+5}Tfl#a9@D`d>)yD_94un{70cNU*DaF8Nv))H&gn^yoM-JTKN4R}4#W>~zV-Pt zF3veE*_Tr$sgUQ(I5E$!@fUDT0oTQOz?&yeQaMkRq?2cJb1q7@lW?*PG{q|aaRN_(ug*eC6uG*13u zqnA*tn%&YC$z}FHVZs&Jw(k9tuZ@F$x*W{|4tCBt1{yBLe8JDvn*=bMs zX!2h2lik|i{o0cZOz!n>fPLJL)mfzWXn3e^4|>0S=Wp%SzGV-0N>b6z@k7bRWRhL! zS;?dJfA3A|CEq1OlLJYOWWDE)+4-I9+k)g@`{>_;XIe50WDWG$Jy~O~`_80#a=lg6 zEO|HHpPb-<-%nF5n6&eKP;#ldAIBZWG{dt|$x&MEIpA7LLw%mM_!AAXx!!YWevS28 z&}eHWo06^|KFnGl2||7X(6moFdVjgz&$Pe%r*>+=UO{8M$R2feum3lzBu{d2vK!~f zW2gOlT4OPL)}LCbzu_Jg!1PMIT%8KwsFm!*Nk-xl<9RH0*`@2w0&i_~kK{3#W6kG= zBQ*JnydVGKVf%P?3R{hbN%q4e=vET^5x)5SqNd#}#MAhiH96>D1flgGdq^px_kl3uUFhg;z54e_2oX%vObX zmGATHH7}+++(ai>VQ2Uj=XshrQ`3X*Zm^ScgPgk==={_$XOSB6>kUw+5C7l|WcX!# z-MLOxl~V33C*Nw?KQ3jrxJYOl3h{}b&S~?G(y`6utI}okXm1)iN-SiR>&FU!CEF;XrTg6ao*+q5irzrI{MsD(b@a|iF~%x{kj*^ z+tNuQJ^kwTa$aZSE(*s)rYNL*P2;F8y1);a%Hi!y682?ccr}wRJST$0otd9RuR1lX z@q2V8S9Fc9MVI(Yl!kvqk_qA6%$XsR`A~$4pTuk0DUO(|w%UI|*&UhJMMl{nLdSQ? zZWHz9fH+l!!Y`S#oyWc+yqLK#e38ko{yXA!wGZXsX}{koY$5fQ3UIGkw_ zKFgdMj%Nym-!e3`%w^%r46lgD6h|^wgl99C`dunia2EgLOslXk(>9cZ&rdSfhd!BF z;fG8UWt)bT+Gr?pMoazA*7rM^uhKH$eKPZlC@H1G3VjXquCspL$?OwhW33WC$XqRI zMn&}DMuqczHyP*E&Iwir>nJpQox2LxxDmJBdB6UiRdFVLg!6)3+-hv)ZbNV%;U;r+ zzt8CGT|n=0%=k+03czJVUnS9CJ#A#8SCsU-OPVJPbVs6xdj_4{Q)`QY2fNcVz+b5F467as}KE*)yEvBop$nBkHJb%l%#ud)8 z|L8pbH_jIxc24mBZ{(mp-^9W72clcZ%`Qr8A5}I^NoVF9op%(9B3!3v{-l)6ntsJMF z-x163Y_-R6d*I5W*k3()pjwB*_Et8~q<7P3Kct=iL0i2rnHBOSZ-pz8_2Fn-YOnj# zaA~qjJKMrl$(&Fr8G)N`4nO<-2hRQk?fESl_Uk;OpVNx-Br{2a+3d|#;hJOzdv-)v z&azox-{o}{!tbQSFxJCU&YuiopY5bEx20jVfl=85@D^q zqUW6mUqzz4NaJ4~AE#lz#;$$aIG1|XDRkv!SOlhlykouDmNo6zwX-MD)p>#oc_e;i zn;m7B{S&@s31)Y9in93r!n6P9OwM;Kx#Re0VV2}uY`IU&*thJxN}zA*%+Yr^(|9Lv z)|&r6omD+zjz4q;bq?nb{-i%`4XQD(n70_$sp{yzg0$%qwAB=8-Tj z^P#o8DAdc$3HN0__SqZiX2ygPp7qZx2xnwAhuRr?U%9V_f|=Vx+05KKIdhA2r}%1tNb07c{b$BydUZ~J0s&k zEN5?eNak_xw}d+~ui;Vu!b6GJH?ty~pW(&Nyc)V?j)gApHCDMbnG@l8IC?tsUsw&_ zD>B>g?$^TO%Kf6fS(#06zanhUJQX&Gil zK}zBv&ycO(keSyw4gQ!rSij<#Z@Lq<*Yn@p1AIuGQf|KGIH`OgJ>fqR^&DL2bu#rl zC%wz@6nyD!*C}*{UquDV%H3y4<*ZIo#OETs??XJh7x~)7{nk9V+zxlh)@b`pk%KC_ zwKs`Au#RT&jyGC&C3BK zdwcpwZ!td~qn$MM=I@NyBVw!0^-n}*QBC)XSoE@}M9+yiIVP=`j#qw^dr?D0{~V&f zF-omZpZ4n&?QBW!@N6 zklv;K!+KgoD&IjkZTL!|Xwx5A#MjXdYp z;d~NzIH@i2F=}lc`l84MZrr>^A|KG^oo*V=Gt;d}?j}~r2D7^|t>m`a!(w0c^}fA$ zJC~?)nOkf2Nx(V5>@G&BcZ!EF7|zzFIkbs3w90Ep@9fQl6XvF!6)+I&^~D0J=-m(} z@+XLgbB4BxiD#0HgVfgv{sr0{h_1(Y_N$u<&A_mn)>@a;pXy})G@lM=IUCogH|pL> zvQMCYPJxdPP<;0G;B0X=1{>oFTI?iVsZX3Hyvyyp_ep>k-Ng8irv50&u*i)#r!>S+ z`cSN-r~E!B?#G|F_D60Ke4nOZEX6~{R>18yiFxx<+JNLZPV<;%Exl!>ueUmLq6ld8 z{BLO}AJahoK6w|6-Vu*DeY4LvM3;#Frqk>+)^;kUh0`$=Vm_X(6HXr%cNXDN^01OK z8GS+*dO=-!!Rhf#^1p+!wRx|q^S6rBMSrMBlGRnVvE9lG>_#=Si`JG7(UvD}3lHT( zbcZocO6{jpEKz@g&;2}w@AE8vWk>7~PuW|%aLesn=1-b9H`0*&&gvxPdH&jl!@PS7 z?UcRE3%Zw{QZShoM%!hZMb00hi#%rcYZwoxlk@b0>CUjU3J*AO_yDVN6CLFCm0sAKsO5N7!m@shuJ?MUF^N1<2&W?(|$h9$xQma*mZKYCO69rYLQq z5s;x7vilo4P!0E|9u#p(Ov!MeJ4R*Q7rM|rseJAM?aK5Mt#2imo({L9pOM*jgs(FL z$@Ko-v(wXkA_mSB5%59L+Lnu^H=9m3oo&?4m~Lh3EMlL`PMX|X5(B--C6oHJ)*6nVHPg1+r6S+-9_4h zV{{Wi?KM$@w&NJ%-9Z}ZzSH{DSubr5!c|^_%c(fYDmZ%!4#ykcYB(%u4u*&x_JMvj z=zktAcqVJ(4ixnq4zdco`@BDgUc1s31RvO>NlbrZJa2#c8?sgw6p}ptWZF%20{EtK^ zx)|kui6eik&wtHjLDthBxbr{id<>7pSWQ1V_kCCdwPt)X{m}IxtVJrO=W>)ZyR3WbDmw7!=iM3i{^&G%?S0*g3C+zdJ6FYt+aoX zguiKGrJO@3i-R5KXL%d`_E?WQXl-wYjbLA@t)=#VI`b+$&a!)+_vjhi;BFjbb2!i5 z{|Wr(&u|9s+Yj0}mybVtcI`XuzhXZq$6i1wXRylJDS9w$3r;uKsW{gz+HZDD-m$ZC zkXBZT;p9eJb#roYqA|Dv+G8)jl0eGk%C zAvR+*@}j8O=|i@p=CqbQ$8OFyRv_DMC1)m)6CZNm1 zDDzFysjC`!_#B*cKz~2+RFr0QXHOtb;i>q_nmaWP2zG_EBW@(fef)HQ(i_ z_<^kXoK)Jyihhxw?|y&Rsrw6w^9`$c3s1&gGV(otU*;JV4b%F_XHB)Yo?3^;$g-{O zg>Gk`*nhR(e z7W*l?M?}o`@u3~o@Nf9CCM+_-Rddgb#@%`;_OKMb*4izn9^8OZ=AAKz%o;^tZUZ_0tNky_~;^ z_KwewqYXbn2ED)}Mb!y=L1C1UPs@8@|xH?;6<7(U$@E_%_B`}*F8jJt+hXiD}C z2Xi|x7r>MI&x@^yfpI z>iZRNeJB5;=rv%N22a)1%g)6xbsr(azsZbaUq8mTx|HnvB;++;=VW8A&}D9g%iG{` zIR0PE99={fUQA9_RPH)@Mw%Hw*XT?hP2_ug%JU_3hQa)nWBE`v(gQ|$KA4Wt!5CJs z9@fDB6#m)E+43MEaO8MOivjp;%jBTn@V(!nf#f~Q_~AhWEzD3W!8gt8NK0o?M)Gxw-2jo5qO_a zW&=ObSh`Hsa+=N$F_y3BZaAF4uh1qGH>Y{Ebw0gpo_pSx+B+CQUn>kJA7>^hcbWMa zie?(}{SMOaIKHX|Xk-Xl8_Qqt0Q&A8@}%dBIK0mKc*UGPNN<`Nih4c|?X5Bg-O)oe z^B`Wjx&H&ayZNVP@^dc}vG)NM+e7B@CAgSn9c+f1S=zrT{FCVdCqvNPWVF!-Ej>h+ z>5bNU)Au^jk-CukbF8U{lwZYnJBx4l9&HY`*7|t=ES++pF^#5YUTdv)Wo>Pwi#SEC z&CT?-%lTyQfS*ocnk?mueVm`aBRZJI%G{=p`7FXQa8tz?s<``q5C2CEb5X#2-(`#w z!9T}%JMh;`v}W%1e2hEs=cAcE{K@0c*pbW{V;j!`9_rJ=m^yjagidptHf{tv`%C%O zEa%(Z;s1{>|C`J%o{a`*ur>csQ?xD?qq2?Ac@;kL9^kIV-`)(&`Mht(H$F_9qK5jE zL4{6No!)%9xu|=x{9L>tk9llwZ4csw8OQ(9fUeB)7oD~g8ZL!K67+eN`Yp9tf=}^# zk+c7jGo!FMD8d(BnjgFYzfD;*UCO+DZ_lKfcW0aL+rie?+C9e@@`JAsn!ZIu-v;JQ zoG8z3V`(=9e-~pJpne^mgs0RUVmzz)otm)T7uhf9&D$}C?|&>f5`8w}4QZLa!SB*Q zzoLQ}#|~{TKqEKvc^wyj;8~uik-P?v^D11=|K8ubiRhz({eb)6=05u|{{z!5^ZXwC zL|U3mJSSt;?B=VVBog0kV0o6$Z811L22VCR;(PS<;-pbc5-($Jv+?R4Wk0+i&dwg* zj?KzX!dri^p30DPd00-h*-pP(iwDhfS+@!gio29uzj;Zba(3?yp@Gu0=Ht91kMI;{ zBPX6hqGh9!-A^{LU9*@$YF-@|Q-Gu*-QkjihcD3>!qVHbl<`pr&vN0MBoC3DX_o&}Lp`F4oHc`D{Jc_UL6CUC}9Eui1 ztG2_I4}4Yd`vPeA6!iRt+%N^nkpb4xANqKfm+LKlvHfXZG`djzh5TBB(qDMT3R~}Q z@cpgO_qOz0YoN1{-(Un?`JJYL@>u2@-nE|S_#p4uCf>GhMSL%-UK{?`e|QZS7;)BP zm-4L@0>iH|+`KG<%riV_zsZmFr~Fd;z&l^wn*Z6Wf>He9Y2K`|=AfgvjaQ-hY&7$W zQD7-Cod&{7e``^;xU>u}Uk{$Y+pPbylxyI5Cs-&1rz>T1colr(jjxxiIVJfutMVX< z9xjUeYEku{;uZWTz0@33H|~b^d^_mlfBb#z%x6Q`ZEr2lH=c9+t}Tw^X!FnrjQx0A zE2_JZJeZlKTI0Xj_?wBK)`4HN#z}ALSH`?Ubo}kI+kD1rn1kQ`EZ5B^_F&iZT9(w# z>vBi^B5Tj*_{+P>Y~hjICxg#Vauc1(6Zje5>VLeOPnn+`Jbzysk4R*oT+DBI%So^A zLGyCVj3n05^L)bplQHW{p3r?D`V{sz`My!)({Dib3p}qiqYr{)CjaPeeLsN*E#+5y zn$Pu*^der_L44TL^gYqv!1X9~=$Jp6(?8(i2Ti@H_Z#B_sH~lPw`~PF%gW3QWk%G`Dx;*V%4(54ilS5$DbG3o?|DD}&-;1b_j%5_$F;BPzV0=hoRz@u zw)nO;+95+*Lu{4>t*^=echv4ibK1Y4c`oDj6gGIbn+~p;i!aPR-%QP)_l8Sa-^aou z&a$@FW@Qw~0j@0iD1Z)m;apJN+sW9U;Xmg3vy0cV@iS!-+sqdi2Jc#gtz;fPjrs0^iLcF( z=fl?pVEV;;dI55g1#k1qEFTY_FgH|+?$r?6RS`Sg%eUt=KmVf}s`kL|2lEGixXp^C zXAR5Kr{4Hf32pugTgoF1qSr;lYZ=WuU3c?BTfY1`_UTS^O(T~Sxg{&^zeFNEdvUwA z4~F%`@{fV9u$VNB`M$H}?vHA-u{f|2U!DOkPP>t#Fn?NuU;M+o$T{}W8T0g_IU9B_ z?@$Rp-z2;FwEJ&ZLEKSRjFgKlt%+v2#I~cw4847CC`R~`jGwfo!EJo78BSFi?=U{Po|QEmf(4a-55*G#(VMRP z^cp_54?LTQeFl=#VxHF}U&Y}ylaKDLoto%Wm>nMO-6%2?sFOom_1MQD^r8$M>(56& zuARqZ^Ba)q;$&|zd|%Q=2X@k}aN@mmd{$|;>n9fZ5^Son>rOS~hi;;oISKP+-Nb-# zywQip>&6Z?l&5OXOV;71rh%!3HdAEukMK5k7(3n}wmATk1W%S#?xz7S_$%s`G|p?y zcb7C9(TLwXhKrX$nnthSG@qZ-NH&L4B=gH$-6S`s@INq9x69n!ywuaAkHO?_r5_ZF z)G{+rLQET<<$jx1s*82g$nzb-<>GQ$1)QgNzZr^$c*YF8c6kuB@T{H|n_5RuR{r)1 zKY5e=YUeDY_;k?*aEedFEY9az8=##`O4sGjCu{3F@yqvU|AIK}XjDkvEZpz_ZjMY+E?}ycxs@)7Aze`+I zTu$VYnVp=dyom1KAR`$;6rXrsT10akJ>ru-^WjyB5l&IjOnwnsF)`RH=-g53t>oSh z<3TGiTV-)!MX>*5-0=teUh=L4SX{DB%G=3TR936CSf?|2c>-Pym9GM`SPn|bE|!v8 ze@dBx@*tz+BWsEQGp9yn1@)X$oR|PvQsnhGJgUQ^iFmQJcJqr$@4>^fTxG*b|tvz18>w47+IqiD2)3~U$iR#q6tC(TyG^ZF=K z&HqN`7zT+bTZ=30%z#}J5$mgJT{6ZTYZ+$KTtMmyH;)} zy%0?6%}+dQZN?xyRYCK3ZU3k0JJ&|f!?d>~abCXa3wfk>%xfdL zt$k{JWDo6g`gH1xOttZ;jMQblFO(0>D!2JQTI?~863_SCZ9Z$aR=$;A+X>TaAUL6q z@8RC99l%!?CXdLN z^-yYuvg@sY|4=?~l}y?=z1jbuwR!sK3)+c(-}kK({*_Oq?lRxc;?7VlZB+XmQoNgd zk0D9Tz%y1JZZPed0+;x7yVqpiMv;w=P&RQ)W)9$BMz5MC#VHDZ!-8y{#IJIF$k^knRq+|F|I9~bFhC60atT@Zz}HgR6MDmb8ALjlUD4 zNoc&kdL`PuLQ)o`?lzB49{3bgUuf?%if*HYi}CzzzX!;Gd|B{2S&HfZ6%Nd&VY|ui z5&7F6^#7^yOUTC$;JPULx`Q??RcjLn-tu&bpCjNH>)VTHV7&_|nyKt*B{!3o1A6}m zzF&}mzi{y*x#$JBdjf<%kkSl6GuW=c#p$4U9_3nrxg)Kq;(IM^mL(_EKo*~LZA}Ub z-iDsm!Ns@9U0>gtDihDhG-iXIWDhH`eND+*Yu2kPuQk~7>+&x{So=yWa(vEiUG?g+ zo)t)J1>Q!4$JSf{(dFIxk725$wX*aiGYoRTK7~vbRKF$*dYeA}i8GqcyDLO1E3&6| zli%Cf+B^B>P)6mV5$AQ0|2^cnEV+EZljp6oE$#h1d{0?EyonrhVe?V7tg%TiXOV|4 zG!P@az;{0^*2rrt@Q8S$ys}TpQ#94{Jx0e*@DWeTS3JooRWPP~2=%J+`>(Rek7}ct z{Lusa2@j}`|Gbw?ROcZvNH+bqHdockiSsS2enzFpdd;*sNmu^q5zj_~-Hf#y%q4BaXJdaW zj#?+;Iw_WWn5@LBk4}g!E}Ckq|`{C zG{t8~zd}YPk-YxoyGd$pY7c%qO+UBEPZuYF@eL>su)fc+9!ACN*g$ryhw`nxZOiw@ zr}@7_N|&V0o0Nd}eRMe=eQ3z0_4L0Wc%Db|()?3nnmNIzO5UCXOKh*L4q?fP)75*~ zkT_PY$zR^>X;C&Nt<~t(-+H$f27|;mOF$S~;Jv)&D($bOgU7UWoF&*ztL%wl?X20* zvQuPPr=o0JC9_l4Q7VV;x3b>x8UMA|+uERP#lGZb!MgEnMOdIKGP;pj_uE;&jLQEf zi+n2@6lRkerbZ*}aAX}=*7$xvA470=u?Xq_8?cSUEXTjLa9W_BBKk<;`4g;EPX4nw z*s8D`dD;ECsdl{``|vEwI35Ol(YTR16;Sw2dfk^@=!E7q*nl=NXM@GbbHFl;4vc51 zW{{_M=ze^&O?%~s;{A*CWfl2y?g~tHixJP^^>TjiJ$#))W=CT zR|9))&%O^E!o9B?@d$HOVrcfO8a(EC*PCx|$ez4H7s|kSwBMHIkj8<#78_I<-8z^9 ztF4boe0)*$`j}st;8_*#YFEnBcpedu6y^gRN$*U_RmUGIUO&+6--cN4U~#n`NmvEe-S zeil1FT0dX0>D}0^{p|llV}aFj=LwsfYk>wEk`S-#;@W17e1gXZ8{C$_i=dnT)3yl+XG zTR?8`Pvh-H@|1gJUaolhy?oSf?Ee{g&wpgjN`O0${6Iz{qO``*?%6P2chh*hPQ!Tp zguKwb^5VZ+^_Um0*UBuuBfoKL;y`%L9o^ey-QIHpwtE-gG&%@GNxTx6RvO*j9aJ=j zZqG-`wy0Hbk5lu;@H9hdseK6MZr50O5Z~J4CVRehqx}bioj>(^Fp+gii|TdVVjAC6 zd%$hTZ@X*sl>3jH!02(@{yEASo^%K4IhOu(u)zBB9nN!idqT>y(S@Loh-<#J@0Fc< zWX)j8;wW=)d+?{TG-98UmxNg1XD>@&C1898b7TDY$o;+>lAlE{hvQ`)+Ti%(G84TM zFNE0=1Cm#wY@sv4V3yE(ak-lb?zo*E#`krOMYDHh{wk*K)OcDB`;1ZAezRd8le7%7 zUBA1pcM{3GYKCJix)zqDn}hm~hzYWT=8!V|Nl*pSpI{-=^D>LA51eQ{;KSBoY_eYA z3wxyt*p2mJv^#jiI=r+&UHisM2Hnif&y7k1b*vYNZyIRGepJ`qr{Ov`vv-$+%xTSK zyQrDFZ!aegh9ljieVg3U-Mr>U;ge>9i_0Jyv+-KPt=DW3?V%Y?n6t_zo0w=fD>RqZ zT%;Af@#RN$dZY+5j-G!f&3}my#_|#Ql|CgSvXzvrh5xN=-f7vdTlvx>>bIs3Pl`F* zw92oH3nu}5AG`~j!()<}+NK-3u zCe6!9q7JMnay7ZYbvx+cb_^h?Z2xi2v@ zMkc_aVwXyL}QP100%~ej{HH~QU>Q7mVl~S@PP_ZT4vxcgpr{eg!>rWb(K%7t4AI;Y{Fq5rzrg>2=+swc>^m|a(wqN8 zkGt@)UT`xi8(5tkY>4ub<(a|z(VE~&bc1a=Pp8tR{1;71xfDH;@>x_gWoJ}A<#aS4 z<@Q87&oidTN~Qc3HAs=uP063goKnvEsrrdZDFvK;P{aDz64u`4vX7@?qEt#jvfYe5 z$Z73tTJNhQ3Z~3K&(4W7DP^p8ZJyW>6t!2!O{MneWKQXw_%3LZcrK*@eQ0V&dUI=C zn~)jzX$DuF-1DG)G86PgTkKr25uzjkVrtmiKaAMkmXHbJiWZ zzk@736!fq*Y@GGGuh{KB$U3Ro_)^u{tB2IB#9no_eyfo)VdA!KaSA|1^#)p}{Df!a zt=-CEMUp$`0_Vtyb<+mzNO^g2=v7|2x;S&Rcs0&ew55ab?Qs>A8!e_Chf}%4=#7=^ z!_Rin%ERn>4RJ>cW2tfCt@zCL7Gj6GtlZ;rr|OH@)6>~{q_&Ruq&(k#J?vr)snh<+ z`1hgPPOZZzCf<77JXk#EQi`6B;^*3l|A(rZ-S}d%@9~)FQTgibwD~z>p=o?+F>40y zXYot1cg6JgZD>9>ESuP+%{%DJ%J9y_r0`+uUCP*Na^1eeU)|jOnH#ouN6&m+7}`Rp6I=~nXV=0(snY-E34+QgPH zUE;IwKR1v!w)Ryf#Qgoj@Un6z^_9<@LQXJLHm7rox%g}5;Eu3HZfSyhH+k+=^7T)$ zOufVgqy6v8r~Qw|s^WJwPqzpDTV+w>+pp5Gn?L)084uDKpWH(C($kSD;`+OI`^u?f zi6Y)T!M4UXa>V!P+`&R*WG8Nw8N64nEDx@yus=C`{?97VJL%k~(M`JfuMtsvXJ!|^ z&kkTGNp5xe<!e5=F&Q(vbN~i3%xyMfFpH#62nQ#Y+jJ)+u*6ugI!{l)T>Wjs9g9{|(Nnw?A?Q zto?91qLwMYM;THMMWs?U)6+yEYs#vqbILbSM?Pz1%G#)D%I@fa6nAl^{OS2m(VZz* zq8up;qp{+UV)VL+as^V{@9TTFl&{!>3(=3k(5Qws>ZB}d_8oY2+S>A}^k=4#-C&YH4mkF#eLtkyNt zXLZIg|8ENt(Pb-(@&-Ar#49NJy%z2f<$p+HUbUjDja5~<6MLzdsNpsm~bw@|)Ms#z$u}SDab=m(lnkyQrgt$nR^js$YlQ zL?uQ1oH0vSE~+I$$)Nu2V*V$6ugBhX6qyvauAz-J2ffXekJ7>u(T=dHdC}g{O7pCX z!WUrm2*|6kA#I~K&9y!fPK^d?eGH6xhadU=MwBIN6QvJpM(w;C8U7F@V0K^ldQ>Rv zB{F>_`ZhV!|Bs?F;n?Wcq}BhT*K5f^(PqzoOZJa4g+?>U@zM3<>gZ5%Y_uggCc2rN zq+ZKtRPycUm*n>7_hhfAZPG5XWR0kJSU#GWtQFl7J`k--mW;Ogd^njS+MX;DZA!LQ zzI^mYvQf0y|EtNO(T!xq=)Gk1=q_W8?BNs9$z;B$LRcxv5tfTGhE@EJ!fVM})H@cw z9F~rr3@dnke^ew4qO9T7@T7NVlB>g=$xC6z@Yk?L_){1r?~CpUe-6iom&04bqv6o- zNH{qBU)VVOJe(1(4abU({LZCuc0V1I2-}Gm&0en>EIj?9`t@f_@2*W!lh`^Evyt? z0^93h%dim$kD}hQVQZyEh09PV#-wgIJABB~chMw|&y}=y3+!8fwncb0yc=~Yd7B+A zYll0-l<;Ku1nkZyKMd>PK?+Px`(z zU3ek6MA=Q@gye>Be{yQLFS#b{mHaH+n*1r8=3NhEPbas9b&~%JcO`d(Kl{Eac{p5? zJRS}rCvPXug`<+!!*`QM!zSvEPmT>&Bu|IGCjSa6CC`L2)!mWY;@LmS{TX&irYEb% z!hbiZ+tV<79cb@}KBukG6Lw|M34b z{Qe0mh8y6QCOWGB1P+x7PlbOa=Y@xp_t3Sp(Zk`D@Blc@C;tw!kj3KRkKqsCxR|_3 z&OZs$qg_L^J(m1DED_Gf>n-GDf4CvJG%ONsBWEw-;hOMH{F_Rq2jTWCQc(ww^U#cg zbYUnyj>W6hID0LeMzTKz)hZhI0}Xhd9&8HF;Nb-_a!8ps!@YFilhFPiPp5@Nqf23- zXaRYc8%_c5H{o01f21Kp)P*#@p@&{!+NinbGic*5SZ)f-IvF7=YxM{1X&k*C-X2X1 z+eZD_*TrE|QPyB%`^M2`7HmlPV$?UBugqswtaNwM!}O?f*izX;(YWyKs84u2njlK+ z8@?Qk2umgggvUf(m!iqxPto{rNAzx3An{7LDOwiFLwnwZHC(LTA}d+mQoctxD4NTf zjA!$g@CnVrPooFJXPnxwHEOE-gTCKxg~?M^qs-&m8fdc%OW8c!#>$@2XOE~2e*nis zX}+SVXt77w8a#ueDd7ZBWr&6&wDVciBs?gO(MH+Xtn(@PliE?k@WH47t6ZH0&l`4) zo(OM-cZ3UB;yqEl@Ofp*>Ei_}XqHA(=U*?>o$3@`W#kAHw+!&$fwp52MqwR{R`6w>8lxa9U~ zI{cfZy)*F=o=(M!p`!OOBJh49>XD-BaiN{;R??3XWzP}Kj|~^nHfb31;q1h_>i-nJm-yTY>cg_9 z6T&6l{hnACzUFtR@`DraTP?pLT;K$g(N>Wk@!#Rkwb2>gdo6n1Ypvv! zu(LR1ysTfN=yF&?nfBt5TvlXd^P5iGlABJH*T&swRv}s*R@BD5vUc~26b|qxjhz~j z4F9HopM+ak|8&v+=`zkZE75T#>PwvZ)2-+@T@;4 zN3vz}`19lJ*Jo_R_hH(wA3rdjjXKD44Q6G2*UlC`YC1bPlZ9H&pRHhncJMa8`*fW* z-$4^jD{&%xOy5sx|05RVAwK-D@9V;IVM??VemCgFO_uXWc&F8DxEpR(?!)jeboqrX zI?9$U4(p&(1@F6|bxo@Zv$F?P#Iu>Lc8l25JaT$hP~$Oi;H{C9{H;*C?t41_OGp2q z^IOXNjB4BP>3?kJKVcd6=U&eWM(e^-(YIkU^~#gwVR%$b84YZRPHSPAHeG~Wa3CT0BoJ`y^C`5oP;wy`q8sr*^$Lze=*~2%AK|9u1R#AUak$t zh-)9v#uD*rEK}Q*mzxgXw?c3QSaYb`TL$?COFt|69efv2>o~ixS9G}@?gztGPM#^L zjn+{@wl;x+e})OMY&Q0LBZ{Ssz6y(j?Hl|^#~yrzhTGA4E4;r&-*n`1S9l&TZji$~ zFulN|oF_qftjW#dd*0|A?(AlfJBb`S7y(E1TUvmz8--P3Ee3xD`!NEw%o9$p)kN2Oj zk*CA=;qn{~6C_hzws+tF5Q+ ziVwSpVw9%^AUW4;C#<4tvn)(SF9LGe%#F>EP>O2XW#u+O>#3pU;O)7EAmO zHf!}-1^jcpSq`5G=-h&SclGYL{#T0WdV%O;5yc5@Tof@3gu|!sIjY3xdcO*?MQp$h zyhuZazh(uFqCh6TJhn6|d^@1`v*L#W(X+TUfo?AsCv;=y-a+*xTA!xwDzf_)OSUq+ z#k1nkZaVrle|VWqTdwu?cwAY31MzzU>KzcPoYh}vwqPio8j5S3=}hx5KYwM95*x6D z989N^O~EssF25mnKa`#5;@M34wn0p?g|1E}!5yt^?I>R8!cJFUmuvZ6SsXJrtQ$Sa zW_O}bPp}!S_}P*4vNIpvhkVZ^A^r8$!S?}d!-DW(?NyFm5D$#Rr(WGoOUE zW;Z5^17@i^l>|J&-;WPFqTOx$?+MniU^Ga-uY~E@nxuHYm#kGLus&o?Wq9-&d(?qF z+GvC|K+HCPR4??bpBQ7CK9{pcVo12YBX;P`*4+}V0NWNhcmvLgpLSz(WNtdei83%juzs_J~7n-@yui~&qlW zvXag9+mRGK%PPLeKXhO%`iXg8W@Vn!UpJQI)o?R=aKb1fCz-fGr+2c>7ue*q;_zSj z{Q+9s!eY!~PtF=+E>lN@>D@5)dOS_;#iP8%K5Y-DvZeD_xLI`K1R4H?-Pxs=pNyi5 zYVTtn=$xO^EbBAj2O^pE^krXae_w=6*pa&0+Q!ZtWTRWMSWkH0QNN2>s%7luGi=mk zBkSg=aZ6M7v#F8IR8YQ&C!J$XR+3hGsh^_4wpi$-0Pxt1KNhpA$cw?Y3F zD>MZ6p3>6@@z5)vdRbc&*wHt9o5B`O1=X|SrcQDfFKcCD_#oQn2Z!ig&BwGcBm6hn z3UsfA^|kvbnx^&iX!2fgKF^9jW&GS+CSk0SQ;ebC(cc(!dK@QSWUtGGeBFK#fQ&p{b@b*3U4Hv!KfzO+VLnOLERHYp2xL$d{ZBIR6>baEMkA- z)}_43%cvM>%Ix_LHaa4@M zQ+~RlToE`<2@7d|DtcFKjJ(vd18X}Z?$#qrK ztI8v_6G>F}eE_-)SFf#dHN}`u>7yP!dPY{D8hcOuu#C&|OZq{p~S*{nET%gJhys_Jy;O zt5Lauy8X2?SKUv1f04YERJSrHMv{_Gy?ut>)YVRZJgkW_ePCZ7&z?)ojyyrz?#Go+ z$;^`|Hc^RMKG*U494=Kw|HpB!IT_iFYI!`JL;~L>hh=3~TGHkMI9QEMX-!v#qWpDm zzCiBgY4;MC#%g0ZI382(M{RzuPXAO08vMUKou=FY5$i~i;-hThljN!$t$R+K`vMfMg7D<&x=c1@lT!npTfp2XQLOS+T&7D8yeS!-|wmX3#m4?BHvMp z-yaZ-5*JNj-$t_UFB%2a6Av|0uO5FdqZkboQ)QQfsN{PoaYI^uyo~Y4(_)90$X$1J zD)R#!_=y&LOC$dOA$f(;`fp~eQUy%S`H}McR6D+@17F`*UZgc#>hkLuj4R5)@gebB z7wzXZw#Y9o`%UJz96wTCYb8UNBlMYTpFrEBaathR4FfX!@S` zd`9XhVzIi*Mg2>0y{R#19JdXm)6a>WyOX1r#h$(CMsqzsBL*87uJ(Nv{n@CjXouh0 zfYNid_XulIpO!UdnR@E2qcUUZTdWmLm1sZ;tN7fC);!_2H!1yq&iB)Dec#ICcps8I znvZ*xj5b!I8!EJCH)^6(ds^I?OviBbBcoIJfvK=uqu(`J8t$hf3o(dYc}|(3S{V$g zqAX-jUhPeIOz?DspL)tS=Zoif+cp*N6*O!d|2&_4`$0Rh8M2C7#H$~p(Yv&I3|ZMO zwtL63Im&E?|6#UqCWxoex;Nmvi5;F9{>DRo2*P8ibqvOF4r~fs;&D@&DE6mcvXL{D z??pboPaOrF0?Q5jUZ>1O+_UJ_lB+?GFN!1dZ&2bg98PKZ2wIxQ(84J7vPN6T%{yRNs?HR6#3Smf zT1Xm69TaoDq4zgHaz?p${46I@gB(W*7*2l5bKYk7?} zkEydpukRW?E%Lc5c*ld`N^%1U-$9~3ReC2`+NHh2e$J!YemvNQ$6t|xkICbCR_na> z(x;%i&y%z$K1>_sVbV?A;=EfY*#8d%y_I_#-A=Q-yJ5Ej*C(aI zwFy73vjyhn;4{thqsp!(FH>pbY&4rl3x}DPSQK9K)32|zIU;ve@4o`)W-?E-vHlj(f{O#z7VC_6B$h=6+`r$^sFCi+KB}o zjRQZXTH?YiND52+7f!86<@^U~4r67XL(#+9e;q8%;qg7Lris2msjSgllC%#_KcLBE zqqTi{zCSw6M*Xa(e_<)l5M9HStMup2XdV30$xoFdhjBhXUv!l1It`yY%o(P$*Z7{O zL{ugEhc&**gLJUt_#SWWwmbB;=y9uq?(#lo^tbrn`Eyf8nFiDpIrn=T9qtP1)rn;UcLxg6`kr!0oj4EIyu~@7MUtSX+MP z?Jw}>hkV*k?=nR5W%8EkZ5_-`v0JOi!wekE8g0kpJ#5p*G~=NEKau*?Brpw3_InaX z1AFMz1v(Vxv=+15^1j}D#Hx(&zq@{7Z}lyy`J5$L>di~)d<5oYpnXTHBgkEE_H8wY zz93I0*o4`1B54%0%KNA3*cvqI2bz^Mx)-n0+q-yf&e^x<@iZA-ijU^W^tFbJ3?t#= zQFe*8KL`Ij@3*3UE;9E&nY2$1xLaX%LFU69Sakv(eX0P0);`HDh%+bfLT~vUN)soG_ns5a4&$kw7M*rdYM}VIE}t_T zT{?LFiP}r`+0m2v$_!C+ln5&x35)`9qwr?(HJ&%ls?7(%Fe8Ci#gZ{yS17&3|LN@8 zYj`(+x7+}V*FZT8*9NKoJ`X)hoxWn_I?7Z9+ZxgG5%pGr?nT&k6;t;E`wF&btSEgx z`o0yGMzfCSS07}x)ai$MJ=u*Kc-9oR>gjt0I40vz9X(Be$sT^L6RcX3z-9i%zHw42 zC*IcEHWCmDWv`kTi-WT2fhK*x88oE{!K7_rp&+ENgu6Xjhbm^5Q`E=zT?P#OqX`_u?;=! zt<2MG$U`8ljaI9)G0y+xbns&~exyiavih&9`@Kjt!2-1)fe(4RnEo$hle*K#SLjSj z`Z<6mv=ZrcV3nRk(JJh1b+Ft8x}nMz42wifNOO65G)-nrU+iN$)>Zx!@egikfldIB4`2_4(e$dO=p0(`ysrI)~vRhf96 zCidNJ&0H?#C(Y>chkMA#T~Qt{N2 z-FVOm31&y?>U9>|T$imXDKhP+t!Kn#&&ZTjVWWF$qqp}B^?NH@Uk$C^z|)CnPzTN0 zYip5FNGJGp!tePke@`;k3Jx`JwIPng+#QA1ZPDfj|JRf0HR#+4eRi>ri%_>GDve>2 zKgZ$!Sg%>y`V!w4fOj$s?q?&r;Q1uaUZfefdKU9ti!Vb~5S}Vd= z7l_KL^BfJy60O$T3Dhg@Y=c{)qWo)moGKIjh9c*1^kxhmPl*_J{Rhb6fPY-01gU{e=%N6)lc#iJnlVU368B z^`yM*CAr{uMkter4KaXw2n?Op)mRk`gy zQTGnD;&H-7tE&=G7qLcJIJb|!)BdM&(f6?`XTW{a9Nu2z<(*p3AV+*E>#8VS#`k>DGf{Hy_Cey@*=M;$~0H9c~n)q*NyDU_?%07 zmt?KWMZHk)9#kt4)iyI-%j&tU%3JXQyN1R+^+b<-)t?0FYWjUlo4t*2Mnsilnpw$c zmkjr(W<$=%V&?+ylW>`iLWPz43Wh()>VG5B{0}$NM?=JFJw=l5cs78%v_aA5QMPTg zR=<%M*XN^#DA656eQ=_)ULHb~7W$kOt@F()G>~?Uo)$|M*Ve0AsT*~)Z>NcJ^?WO5 zPtJqz9H~YFEB6LDAH0pT9Xk2m-%g4;(U(5=($6H+JqoXJu$io__(Yuew4#;XHH!wM ze)y{^}S=s80xbFJZDPdAE+UlH*()80tbI;Vv`+8qS4 zT{s-??OCF|aj<+BC;t+4r?EED3E9r6s$%tX1G}=~Q;ljn$EiycpCV*Og_Y6+)bFWW zE&D+3wYQ;&HJF*Li)>}BVMDuairG0^-42O*b~WX*wz7)<^_}QcNq;4rfK^4Ee9?!> zo=3q8=yeW0pK14Vvhz9JI8M6$qt!p6)d4bgon(BCW7qZdY4oB#nnjz@bwBB_BG;KZ zkAN|Mv;ZErSkHQ!opAPwTK!!dF8Q5O)ZI>p65z~kZA4WkQ4|JaJL8o;RzjDyU#Omw z)*rO?(`p8sJV5uBz-e+7-jUX92ppyarW_HR4J&9qVRkXz6rF*#}da@|8f|&R|G~Wbf6?zX{vU4l3o_? z3bPjvX`vdrv_Y%ic!>r|x6peEyIdE>R(`T*Rz#syBT$!6t_VH+Dy)HWGKPL*uEe9u z5N+Zomt{B4h7Ynsx!INM`uUC(X{CNPz1|8ACkOE@_mGhXqp!_PX4mF*W8SAhQrS;h z+SOXfXAQx4i?UtGSq{68iu#nFEbI)cgR?d$%c0*NVwJymh&=kV z3Yw(4$p}~KDqkKpVOSbuRmfy9vVIQJA5GMi{(~8mKGlVdTb=lZ-u5PrwMS|?9eDbbkzwDPTJ>h8ux`0za`{$5`nfI73i za)0anJ!R+EUo{IwHafj)m0lOHsC(c##;-k_=~Vsejbz|&u{_sr$hj8Kc`u&KR|1Dvv#JinRC!%Rdks3`GgMq<#}Oy zm40O<|As+2C#4m3!fY11T7Km%9&?h>uc-bmZYK3r+up@e*1dlN))LmZ&v#<>bf;rD z^TKJCTkP=NR346=j_N3oV_Iw0EA^XtkCWhLtl-GW%&h|*v zv>&Rh{ZS93%wqPcm2%Fr`>K?E$sVYy_RL+i^JRIE z-k!F?cBQtrFTN1`J3C3anf+)^ivVjMedMtp>q|SE^4UvOHK^&gh<#?2oD>p9Mf8&! z45fnj{GEo*-L7QMUK_M7V_%>>K=$I-(EeNY%6(-Al$)8ITk^1d@2}b+)dJqd(YAy= z^^fa+nl|hEyr75KXn;mt zol0_-okDkl=WY;W(O1GA!91z^^cTQqtNmTu?Cbi#KBD*S8BULvneb)0Jwpeb8nN8Y z{JWf$^E=sm-w9JA?av!#SJ6_tj&|C+=?*9Tr$-}aM>y5xy~KmgO391w?pq_HJ?vk5 zK|hO}?(``zpST0^e%;G&d!R zI~}Dk%CvB*guUKiuBV*@8nm>B+07Yt);kLkpZ^E8Y1*7a<`>eRmD*kkpILPCDf=hK z+y7M7vz>Ue$G)ik+IuOr&+_`XixhuNx3_{TuYIe3*hO}het&KEeZpBRWx$o&=>`AV z4d37CxK)c>F|F-k}KW&t89>Pt#Jh#}_ zIK>Y83*xz?c(G@HYyz|Y!@?bu{-}j>Ipt6+RJ5saYH-udpObgQSXY`>s86A2S2ik zM_KV(5+A|wEj#HyQ+Kx$uC~}=zsXL&v#jQ~_UTO4&vLueb~^P?RH$x0r~g#3pXV92 zEk9a2Ur4<69{c*f6H(T%*=O0*m2B~wXgI;iVoSu)U$Kwd!M`}QTzz|4e`VkAO~rGy z(^#(A1s~hrlTJ(9qNh*At>3Wsvz)B=E;?=i>mIGF(cU(DmR7R!Ux}Azqv=YtKLe*T zV#$N4&>Ujnw}7NGIjC$0?W6vuO-$AHFL;&7Nf`gwZ*)e?dj$`2k&^iKoyK;Vo@4h< z+KCw7=yXdWr~PpaokmdCDHKUi{i%n-_MKm}3;hzWl5mpBMy&+e+Kcm#Xs0Y(GQ%|^ zn%>abL1z_|R=;UtK6*`u&(C%MUJ~1HbaLSuQun!&0R9mh=V6IrA9qNt{q}qv_1p?# zk#Ju8r~~Hz?6}$s-mGM=nwEbTWnTnyGqPQZ4%(wdGcKdu!}R2CC#2Na6`y*Mi7hEin>RUqWvi3e?@ZKj=1oU?m7h{;8LISDW}G&T*-yC7^EUK% zq`l^==xAr9`#4W!idN$ju&&b44Nf)LN7jGvY`ykofZ;7VbKLJ(x;G!pU-Ky+vmHq= z?6imRPy2_D(LOt9o%sDT`OU;OmDg`Nd)N=b&Am@xxrD}ZwRuXJb$IhXx-}KO7pXUe z&J)t^N{?I1}9K&Y;qKw=;R|sf@JwJ0J3S zP~F`_zeMx>E&%teV5vT}xLVKA*ePZJ0=(@^w@= zC69ZA3Ma~@lugu5dCBv1%GOMjPjRMEN~OdjDg6?4Qd%amq&$;&-1kQQXK)U{zxE>6 zN@k@Sw4CeAOAW3 z^tRpC^VsyoPAFK*Z|`(|!Y-%iysyM|zIYeE{)e**4)V~;Y4jErW4hn9Jk~tgK8GDx zNunq6S}S;oX*4K4sb>QVvB!x&vq*jidxR(2#lKbg??`@tGVk&HJ891tzGxATFoY&9 z=K+?m_6t~`rOGYjoe%NuK+3M{Xw zcbq5Lt?%ugt>=Z8&~PWF(d0**RCL(gJu%KdE1OU2pNNXn!qsWDJZ&G5`3Uug(%|Ln z;&$a;6>Wb4w?+Dz<~*x;JWx;YF1EY*9Wcz%UJo?s%C^49au3pHS9GYsP8VaH+WTHT z^}Lu|taJtO$CFM#EXU4O@U9|i{Ao98dzSD%cBLL_#bS)-^t>)QRtQzW*-%=Y7RLS#e;gm}&|r?R(W@ zLHxa4jN&|EQ1(Qv=h?FF_1_lH_5{kV%aY9Kvl&ko%B=Irwi=$9+;oE z4>t>#3$f0baqo7mltYy=_WNfCXFx)Vif{{}{NE`5H>t@Xeyq)YKjDPQbL{TVZpBQC zTTRq2BnJM(IA^R|oHmk>Y9u)uJHE-e4&OP!Cj)6J?5v0fNXJcF`^{|z1=PLDzPEvI z242P~p}f-jB*rL!7X51+bPSi%;MiF=3Ed>gU+_yG^AUG};df)5T~4z318tnArral~ zQk@@NOVPCw?D0AF{)!WtTG6g_r1_5cEDz%@-rv6X(7yS*gWE{iA>*hV^!0XnnorzY zlua%~_v7iJ0Y63SzVH~0em|161iQEn-Di@8W#D!4CEr#8{`avk z4>)tv4ncFX%+SwKTYO+aAXb`iNKfB3%HymAq0_)WKgG3x4LGk%utH}NdB}=mH*Y)z1KC|$l zX`EfLkMyoJ3OVU-zF;d}tb|)P&)cy=B6K$VFLvevE4EwT@!d)boN(}+-^+B){&}$P zbAHc7EuZow@O>vEx{0ZfxLJwm9>nw=*(I z@&E36M&k%o?&GsE2hE+MkyE<^$jBu336*v}P+h(~JO5JOIUM!8cNYQKeUcx&B@kKh zQ?F_36>_pDD4#k8pT^fV)YkiC<##@?VNj7zc3Ni2j6}MW{$QEyKB858dV6JBx*Mq` zzvae7|9{oSEBxpyeE)TDo(O6s&hlSdgARP%lg`|^-5Dc!`TPOy=bM?>CznJ!U_VFmY-<-bF0ymX^94SAM_ z>j1ylD_8TWEU(y}U5n2S9IC!E=GnGy*pKJX$_Z@jacy?LB=0lIr+Qj!C@yX*>(G$R z?@jlbvgx;rG_LW$b+lBB&3{xoHIykqGh5TxS)%8Go)=(|D#9Q>Bf2@rx}~1cRK@cd z{MI0LWFOB_hmC5XbUCdJ16Kif+Iz`MPC=U~a38FV<60gGgDo(bfl>=)R;JUY-aO%A zTKWXL7N2T3i}jeI*SEDc11-jAzXi>{%C-+xVjMs8GOIC!bydiMAY@l9q zmV7$S%!HA9wf!%d=;Cu1ob65uCa|1c_`avrbMv&CWkB6ty&)`EO>}(TZ+4KM;+e|p ztAXAdpl1W+YKgYS_?!zQJ!Mgf;!c3Rw47ItPmCOZqN`B8D|*z{&;9y;ndfYWF4gqe zhzIJTULSEtRdi{9l4WqaC4LVlaox1!4kxe{gv~8@|fI4ce3cvd-kq?p&(SX>!lYTfSy2@CciiHZh64{RN$$RJRRVREO?AET%6Pv=z&b z7B?5?-#f4$uNg0NlwWLZ{FTX_sZLG~2D2UQjJ3M?+|2!Yvl5qrSJ*yhU{OytsEy8%Zwb3h*9?F`z#;*6Iq-s*SCW-zDHiZ zr}^t}b32{bPIBjZzlmHepp#R`;7Kz5Ch1>5ZWoFe&(enX0CDp^e|rHsJ)ZYw{Eq`Kg8IKNTPT zfLW3r-5GRu{#TLUj^JwQxpW7}eR?+>W(fubxq@FrL7UM#P4F)rl=UUY+eP9Tf~4HS z-@eDA%0>FvqsDhIx=3!W(ACRuxih%n=E`4b=Wk&D3azUKU+L9-oBFR8998!?-+$iN z_g7f#AcKiujR@(icCMzjJX^mv#Kk|u{|bE1p_Gih?>$gw4T`+RW4*(U?b3&v07;BH zO8uVnWUF3(5^>H@eiw{S@X|Bl438Oui=_4!()1tv?h3x=Td(W!*5C&aj)da|(($3c z8*ypA2rsTR9)DNB?HFk_E;FkBLi^ci?@5yNH>uf0g8s(>rl(zhfbRl$G8^$9#^+OL z^RpgviUyO)ZX+SLuq5BJ*T1oeU&HPQ%lkJuSx+hwH0lDm&KPvjzC1i!_p!rU!LUO4 zQ!MZ|-tXXzrl9f$mhTu#Ihl2z0H2Y($uc8@edx2Be5Dr=Z(t#>vC`++-V^lUvT@zJ z;Qf(x-p5LxVblNP)xIEkH|fehG(01#bc~h1gB7j9ie5zdkI2L-?{|^$qp+Jr-nQ`u zd-Wirj*GVi8%f3?aBpN+jLSt5Yv6oZ-CuAtd(bclf*UxMG5C}OjV5UumFfqdt)%H= zxW7&c7JzjxKF^`g{ZVg`tjMeQvyeQ@N3RiRITU?*p<&t}o=N$hr~2CWujs=MH1G>v zz|4qP@S+kQz;m*gVJ+B?;NE)euk!m2ZpU~I!YPf;Mz=j)f@L$@nhRz zyVc)bERZuTQFe#627`U7=;|r@+a68Eqiqdbtdjb9Cx8DP@A5H8-Kf^rO2y~XuV=r$ z<)IF!bATP$$8X0Y;2U_egk?NyRQ5glmI%_JUrUs}X;vdL3hsa^>A}0q|9oir5}mI| zb}F#8x1wn-veAXb{w=yBoBN&U;WQq8W3+ul{^fuS<=?#aB^mnoPT(tG*k)wv4ouGq zu~&J~xhQ!!Xk?s)1~rA^!NZxzZc$jc=jNAH3w^UaJqF3hWquiJQb&QgE#x8`pgwOA?ll=9BPV@5vT2v6S@f2kGZ<`;)Bw z1n&>kILay~f(1CeK)kmXx8p3^A~k2HMn~_X$VfCjtfwWZ@Wi%$06AKLlOt*G2lVMX zCFX*E63Aw1eX-t;Xl0Dgo7ul_Nze+iv01r!V3-ZBz23dfGQFmaj><0eWVwlIH>S%h zR__ptH=ky$$DQ{{);oSP1ef5qowZq~ISfPXXX2nn0H9?T>M{!_Y+9(26&G3eJLLFqs{g4=5;u%A_4I| z^E>ft0y&)khSj`xtUYhBY;V$x%b+~y`9}2qgvVMdHoKN;LEj-(UR*VVm7 z$DRseNtLhUtqO{@?g_4He?9q`pQszW<@Y+d+)Kl|mpMw1happz7{V@9MK(EixK~5I^i-~0; zHY8*48R~un#&5xMTnzcOw!ZOPHcH*};*i>YFT*ZRFhNZJi@N`?2JxL7V-jnEZ9MR| z;s&(i8QKIt%BfxFHRc$LAGQ|Y_F!0$QL7ilo}1+FzoBbCxT`s>mTs~JNwNG%u$&VA zUeL!!@+V))y`&4;>!)y#A$TD8SzhNfTJ4d``O10NKk;_geE-w^%>{#dgTL@N_HqxR z>fJt_25khskayiI{}fZ}2s(b8=pQU3e@Dnh`k(;14X$4AB}`$Y`*1%-p$!9;C+6r2FL`$&Qa&ZR)W{srgoI!7>#=e!#p*@ByR{=0lp z)?iFf1w|eS+61M8+3@~`uPYjq2^#xp9o!#0uTJgY)}VS&BY4KQO2HFB7dMKx3GxM# z(P0Ss*VW7Tpjog^`3IF96g(2dcaql+$||2el>(cCht$dz+@qDh;P8m{X9x8`{4e;5 z`ALs5)j^P5iQK`%L1s`i3ic(+>HC(Txc83-d4lHJ%oRN5CzEe^f)ZMN5LVfOyY&7G z`MoUH76eZPIYE|2-QV#n8>s)n^ZSBAU|!>0!=PzULHjSktFQXa$-%urj-Wq|&edvB z&uV${N>Ea%96>0`>;uQCFs~5gN5x90TgH=WaBSjz>)-~8wt;8Kpf~o$8g~hh_qHjKLbHg+(EK|r= zHvGyI)bT9~PXA4tzocK;l*t&#`+_}&GB=u*RH~7B<$@R0&#qQAaJNUn$343pO)8V9 zhd@yhweC`{xPBi+%L@7|0m{P4)Bt1g;5L-Zt3(Y@J`9UAK~-%%0;1o^_HEj~6Kp+T zT^MI;fS{0Pxj`^RuT}A@j3;&dt*3r7I8+2tDG-+jNi%eO07gwf*4xud#sY^Ex52#v zuH{XIKR_ zmC9Da-=m36LDyh-Fan)QsaY96i|cy~tJeq3?(n>Y9)|=k!>$*}DISajS3A&kAq$!C zIV}vP%h=kU^kiBOlyAB_Ia{$8QkCD=6C24(v3nX zj|WRUJ499vk*70wd<=&BgSUepwEumqRVfdqQtH#$Yy{2HqzRk@v02(Mr)%Z&-V?TuL}E; z=#ba@<%!a2{A<(-ASzTh`8!;@2iV_eob6SWM}U(f~ltG^cXH@61Rf0 zBAV2siMIyt`BwNCU1W+zhE#ey{A zUga`rw=Bp{i;4agFMlg4&L;bGi*mmk8Kg5hIw`XJL&RN@Z@C8@;)o$D4g_eF2fgBK zW13*Ha$C^iEIWTcYg(G+U(d^Cz?<8_aU_utjTL1dOTe*4@O`2H`@i4FAsB%!fpL8^Cvp{9H@i5qz$%wTZt({aN6eGZ-U&d?9h4 zw(o~eg&=O{CQAR}`-5cQ61vXeZ*rsCVV*0_lHLHrhx({SUYar6EO?f@!`NfM;1HtKjEhv^);BGLY=)?o~nKSqTE$V2oqrW+|xhHWz9Dc9T5Ao3@;ax%e z`E6o4>2Ve~s7ukk(|mZGV=F~gYO0w{i~EdFs-Sa2vRK%&KhW=}sQDk1NFSU+yInXN z^Rc>E?=LhNrLWV*B~@TimZomOgUaYtkrX7A>?d|!=V@+Ie}=qdptFynP!=}wKJA=` z>m8uWMAmN7p=;JCgnx2)B&#us--Dhl^;Ab3R8UXrctACu*y8_t*qHU zq~)>THIjRb7OmEQz5gTWKHzpL-v@x7=S6lYD`i9(B@#(Ok(GWbWM+iyku5VBW$zVb z&y1odl$DGmBT2FksRFsO1}pC zNSD1Zw~${lJ+aMxtsB8IR#K$BH^E~*>!nc2m%;nKulM|{#4TX=SrA*UeG|V0T|CmYF_2|LT|w4X%cTReB5o^OU&gUoip1zRm`~! z7+e62`@Hue$kj_6*JlRuGA$Xs-`GO9%tz8c$a+pBx`5p%&}o>kI~t{CLj%s$2>O#w zUud%hnYJosBzs!dgAJpKN@yz-yp2i~6KV zf6rAjr~mn^H}88An}RW5I~k^?l6Gy`A@jj#1_}J8>w}DC93AtCwtqJEo96j0$Yo9` z0RCTEbH9&1&zbmMKWSXM!4h2P-6bU5R^#{=Zr9+1D(HN@zUHH`b)-~BIPQ%G4w+{w zbk!67mKf&(zegq}vP!SulQVw*5Ue0c(x((*^Bnd3IW&+n@hN|Bo^eh!$KBw+2VL|` zOxC_w68f3}$6uj`ulSjV;rKn{IN{wD@IDKUPbE&l zi@#U%C+tHo;+w(4?(7S0_x~?J9L4yXTsW%LA3Sqgs>aQOvu*>yo8(qYZ&VTmD6ZG% zNuC0z;6Ku#6=;t`@x4ixlAvEe+~|HBa}SFxH>}^JJF3BI6|z1{>KMiZheQbO;Y+-X zO5&YzL(GlHqDln7$}x z-Jr5DJwgwsMd_InLxP`4z?cJz8B00QnOt;Eyl!!~h)88Jy=h`$kT9OSAeJ>Ti62`l zs7k-32c5f&wIID!#}118X31U*+F2QlrT=sE_kASyvx&MS-!?ijX^flAWf1ALiafms z+}CL91j=~`O`Oxm1<=06w#n#seb~B5TIs?Jg`NMcuj@#%bpF|5VjEZMt! zugL#=iQm(moj(R0bU|}3u^;>6lU^umiMD1NSu^c4BZnWuUA53xUDP@-F_g_48Q)W` zOg75L&7w6cs;Rfedg~1`v73>6fI`-w>Q!d?umnm=2NHd7K^~I)D`S~&z7_Sq z#owji@-aEz)Rm5;Y7c+k!;}9bm(u&)mb7e+z8a&t+g!Vo?rlhh#vc0vTFi_;s^QCO zW>JU)E`s-8z!6WA!`1P}?I4oNlleg@y?*L|W>x=})A!jRJBrSN8y`l;#kKVmnBR~8 zb9$!)ddLW(aonbao*wpgb~3vtUMcA9D2VC)BARPx-tk&mtWVbjWzo`|;E|3N&Px(z zrt<@kcot?JAuUSNNVUD4nKZ1zHZ6vhtD)A0_$-%u4}xrKaA>Tzsw7cyJY9hP$nWhs zt`xnLW}V%W7lM~?bY1c(WM5=6&+phl z9~;+};27>|1m8upav8;6V1pbN{khY4(vXbz`TQLGgirqq;^<&jzpJrZ?n=FXpY|^W z1wgD|qH_>Ou5*FoUsiFmXtOc?%1P7G(ZTIxL~Iv613p>IF$z8hgTK6cP+MD#A}vU) z!7n%PM`rWRYMj}O>pYvarCG+-R2(_U4xe|LX9;-!j^#U36nTe!AA%cu#DhJ-$>0eR zA!)8x^|ds}q>os}#p^6nJ->+UmzG_6AUGSGVTT<6#p`5KyzZGFh2Jof*muc9PW&gn zc`w++K0-BGS%#9HZ-PtgKU@v+poM&%ea^H0!#PP(C!nz&6IXZ%25Z7Yaep&|$6Yw4 zDg3+w!{zCULbz?1c}+lb`S9<3a9RSF_VsRio=OXtDVFG9zAu7BY)cf;(jd}jr5<{s z&3pWdTlm)8tCFJe+UXemHAF4BK`eGeKMpzi`HdBEdI^p@XSnQ-jC zL2ENS24k@nuaMSBk7?kGsC% z-&BID7+<-~xu*N2>FS2`Xe+IcHm~8{I~3%`gR#~sti{*S=bc881HD%T#W+UPiQLP} zhAM@AIwz*%qfM|C$Delx71{VzSQ-za{d>_#7rNm$xXlhfzp-I+Bo>kRTRdANRif+@ z@jn*aV{{eFVF($L-T3m7!gp(}jPFHhiUe$@1-C!ZRlIWkh$q^@bqZ((qAmw!@P+4Z2Khju zCdfYPdTr0=rvnQ5^;K_GwDzw$@H5TsPULAIk0yYb9~W zedw<&+HYV~&!NMNV3&v^NWman+=Q00mkF%W8O`$G8Blrz=jCy|6K;JHp0}aq?}7|y z|5#9yl>UfZh%K;pz_4X>=?C+*@x<$}@;9j-^FvoxXB*uLlD<6*+>V;c zl1pRIV!R%bk93nCYMtUaBYD!u*4VFkkZd_e_T^$X{9t`?DcSfA->+~&?v7{fLrWL= zp+`J@KKK>ZwxY;d!PmjwKt!8l--$Zw1%X{y8OfYncEi4$7>)xcpgU)jCw`Pc^LWtD z+{Rl|u1d$m8Kb$ZhBmjJyb27`ffn0?QZ zu)@s7oJ}ewd94(b>QdR>Cu!EE@S9^65P=B5j;*w64S zeDAS$;7&V{@34dRqCEuhp39`YC`H-OY3SCxiTh$m(_U??;Flm7N(LM4b(w>LJ`X;F zvnS9;J`%N|odxUAhjZ%_4M_eW+V~{6Zk_fP>jVwizcqMP=dI$FMF$UqM_%*%(inzW z{oG;|H}(#G5=;2Qi2o$fzBZckbW3P;{z7n?Q^0Kh9CLRh-+F>!%ZvKPb$-r;O2lh1*w~@zkC}l^82O4b=yi|>( z?*yNN&~qg-jOl0+8+#B=e-U?0HSd5{pMaJ&g2yH^E{sdMn)Ro?6(phh1^vNfQ81MC z@MTZ{?tifI{*B(c+SNJ|ym#1JGR?k=*;d_OF^1Xp*)5cvu-$v_*`qoJFU<%>c_M=z ze~LDvp`WbM%PnwL@*gtq?!xc?3&cO<@qF&|(PCu6Bz9OGZ3OynWOwUJtg69Q!Jh?@ z+wDpiE5ekNoAap1TurS%4r0wni?Y_}N20;eW{@2`GN6;%+HXr^4T9h6GVsdks~`A{ zhLf})^C>KBMC+fCGV{rsyUcGaI(>_VyN8sS0?!}utjtF5TinZp?w$%VUINx?1O%L>m3R!g;4$j+t}GQH0_f$%|6<0F|- zpEwcmOBp~1(A+Uu*;{0M{u-s{bI*jWwMKbI;%1a1Q4k#-)Yf5psD{eWEQnhEakhF| z@GK7g6;VeHaC_4}{%>XA?vUxcL3Z`hXugc5F8a>xcVYZm%f6+ivWy>*4gIqACK$(Z zr%5++Zu%24u(R47k`r{Fwr_kQei#NnCBZB|l=V;m0og?2{hWaS&zUiG-PMmJ! zl%g)qEPulJqg7;3zbco`K5>o~7S+!KjRk=r^4V+1m-z?a7fD&S9S+k9nqS^k?lu`${&}d&XMbImTgVzcxBc zfY)}pg^i5i9b@@UmV0J9)W)K@0ZxL?DhL( z0Ddbk`Zp(IZ%|nJ&}51W_@i9mMK3md?>i&1gz)5=`EkbVH+oGl9l*xl+5>WGT&4q zbXsNur(QO9_H8jIVWtV{kedUvSHb*Cz(o`ebKUNG`vCi(ufpJ&RYw20a5`K~a`NW% z;Ck5J$y1L9w>dRDt7m_8n$-y~@2$;eJ^KjUT@6P$kM^mcCwe#-7I7j~1Ml^5PH)*@ zPna#JgvJI&3*dK|(>^@_8N?<&l|IpPp$$bG+=mBHqsiPp_y_(9{W` zcboqi)mv`G`;R#**O|)T{V)mf7c9PqUia(g_xRK;wE>31)FIjU=h5O{D#|?NS590|Z4yk06m8`yr zPks(w(WiQID(MuLHEvEy&NTXYB-or#10jpw`S9aHGPDG#TErN- zfM7YA?>_DS47vsIcU+?&hxY1`nOVuf45~$ZDHs1NuF8NPi;&x;;W?|juLVCuE!jaW z$gV7SYdp#yzy?@LZ?^a5F|~8@(<$f8znA%^CpQnN0CYk2k@kj>lWV;_Ro|za=2r^rYLo3V(aB4yb_`T!;=GChpP;3Fc;tTa zZ6w-UM&{)tJMyYCv_SsOC_FI-@6IyTFUW_{o~ehn^U=Cx(c)7^ToqksL$h;4sU0 zD}hE6RXlpAtC2xnsb9m3s)e1z4|CM;oT+~DhG=GZMs>%0s@9!R&1$jlm(>zGL-_v| ztqm7MTf-ltEn%oW=Y_~QmMU|NQ77=7Xnxo{IN&tC66XFBIdjr!cxys+^ukL{3hWV7 zG?HE6|C|hv*$I8`l4E&-Keatv#mF>d@gJeR>||K$u$c;3qg1LJ@07piRGvelG{au9 z?vm302f}SR6*r3Fp?c`}YFJbiyJL84f(l`eIiI|)=h_5MnpX}`$wB9w1jjD2s0+gF z02Qo`heOcQcDTtIJnh|lq|p!Io9b@eP@C*m)yzIpPi;0?KTUP&T`GSqR;%`!(+#$& zY52Bh)m;gHQP*^yTCIzX|6?`4PDigf!6)eyOQ)4aqr%

  • 7q~;c5NtQ0?+y)ZgiE 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%0DbcuZSrR8j<$tpp z^E-)p$*ScBD|p-BSR8~8mO+&97OR1oUB3ddzr$a75wyQqfFGI9H~PxTZ=28FeH$lS zMB7Fi#<=FS+*v%0A0;68UnyCEln92M?jceCVOIHiyzACF#!W=&Wuk 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

    MS~W4bR0HaHXsi^uZZFc>gn3 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

    )Bi>GZMGmC;k(})c LIM>nkapeC2&tab^ literal 0 HcmV?d00001 diff --git a/mi-pyt/numpy/secret.png b/mi-pyt/numpy/secret.png new file mode 100644 index 0000000000000000000000000000000000000000..02e442ff8ad3e32addf24abb2c4f840763e86822 GIT binary patch literal 4883 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 x^e-#*VP`51rGf9e*+a!nG*m2 literal 0 HcmV?d00001 diff --git a/mi-pyt/pandas/actors.csv b/mi-pyt/pandas/actors.csv new file mode 100644 index 00000000..74d7b11e --- /dev/null +++ b/mi-pyt/pandas/actors.csv @@ -0,0 +1,7 @@ +name,birth,alive +Terry,1942,False +Michael,1943,True +Eric,1943,True +Graham,1941,False +Terry,1940,True +John,1939,True diff --git a/mi-pyt/pandas/index.html b/mi-pyt/pandas/index.html new file mode 100644 index 00000000..ea94379e --- /dev/null +++ b/mi-pyt/pandas/index.html @@ -0,0 +1,7214 @@ +

    +
    +
    +
    +

    Analýza dat v Pythonu

    +

    Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

    +

    Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

    +

    Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

    +

    Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

    +

    Proces analýzy dat

    +

    Práce datového analytika se většinou drží následujícího postupu:

    +
      +
    • Formulace otázky, kterou chceme zodpovědět
    • +
    • Identifikace dat, která můžeme použít
    • +
    • Získání dat (stažení, převod do použitelného formátu)
    • +
    • Uložení dat
    • +
    • Zkoumání dat
    • +
    • Publikace výsledků
    • +
    +

    *(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*

    +

    S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: json, csv, případně doinstalovat requests, lxml pro XML či xlwt/openpyxl na excelové soubory.

    +

    Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.

    +
    +
    +
    +
    +
    +
    +

    Pandas

    +

    Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

    +
    +
    +
    +
    +
    +
    +

    Jak bylo řečeno u NumPy, analytici – cílová skupina této knihovny – mají rádi zkratky. Ve spoustě materiálů na Webu proto najdete import pandas as pd, případně rovnou (a bez vysvětlení) použité pd jako zkratku pro pandas. Tento návod ale používá plné jméno.

    +
    +
    +
    +
    +
    +
    In [1]:
    +
    +
    +
    import pandas
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Tabulky

    +
    +
    +
    +
    +
    +
    +

    Základní datový typ, který Pandas nabízí, je DataFrame, neboli lidově „tabulka”. Jednotlivé záznamy jsou v ní uvedeny jako řádky a části těchto záznamů jsou úhledně srovnány ve sloupcích.

    +
    +
    +
    +
    +
    +
    +

    Nejpoužívanější způsob, jak naplnit první DataFrame, je načtení ze souboru. Na to má Pandas sadu funkcí začínající read_. (Některé z nich potřebují další knihovny, viz dokumentace.)

    +

    Jeden z nejpříjemnějších formátů je CSV:

    +
    +
    +
    +
    +
    +
    In [2]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[2]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Případně lze tabulku vytvořit ze seznamu seznamů:

    +
    +
    +
    +
    +
    +
    In [3]:
    +
    +
    +
    items = pandas.DataFrame([
    +    ["Book", 123],
    +    ["Computer", 2185],
    +])
    +items
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[3]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    01
    0Book123
    1Computer2185
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    …nebo seznamu slovníků:

    +
    +
    +
    +
    +
    +
    In [4]:
    +
    +
    +
    items = pandas.DataFrame([
    +    {"name": "Book", "price": 123},
    +    {"name": "Computer", "price": 2185},
    +])
    +items
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[4]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    nameprice
    0Book123
    1Computer2185
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    V Jupyter Notebooku se tabulka vykreslí „graficky”. +V konzoli se vypíše textově, ale data v ní jsou stejná:

    +
    +
    +
    +
    +
    +
    In [5]:
    +
    +
    +
    print(actors)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
          name  birth  alive
    +0    Terry   1942  False
    +1  Michael   1943   True
    +2     Eric   1943   True
    +3   Graham   1941  False
    +4    Terry   1940   True
    +5     John   1939   True
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Základní informace o tabulce se dají získat metodou info:

    +
    +
    +
    +
    +
    +
    In [6]:
    +
    +
    +
    actors.info()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    <class 'pandas.core.frame.DataFrame'>
    +RangeIndex: 6 entries, 0 to 5
    +Data columns (total 3 columns):
    +name     6 non-null object
    +birth    6 non-null int64
    +alive    6 non-null bool
    +dtypes: bool(1), int64(1), object(1)
    +memory usage: 182.0+ bytes
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Vidíme, že je to tabulka (DataFrame), má 6 řádků indexovaných +(pomocí automaticky vygenerovaného indexu) od 0 do 5 +a 3 sloupce: jeden s objekty, jeden s int64 a jeden s bool.

    +

    Tyto datové typy (dtypes) se doplnily automaticky podle zadaných +hodnot. Pandas je používá hlavně pro šetření pamětí: pythonní objekt +typu bool zabírá v paměti desítky bytů, ale v bool sloupci +si každá hodnota vystačí s jedním bytem.

    +

    Na rozdíl od NumPy jsou typy dynamické: když do sloupce zapíšeme „nekompatibilní” +hodnotu, kterou Pandas neumí převést na daný typ, typ sloupce +se automaticky zobecní. +Některé automatické převody ovšem nemusí být úplně intuitivní, např. None na NaN.

    +
    +
    +
    +
    +
    +
    +

    Sloupce

    +
    +
    +
    +
    +
    +
    +

    Sloupec, neboli Series, je druhý základní datový typ v Pandas. Obsahuje sérii hodnot, jako seznam, ale navíc má jméno, datový typ a „index”, který jednotlivé hodnoty pojmenovává. Sloupce se dají získat vybráním z tabulky:

    +
    +
    +
    +
    +
    +
    In [7]:
    +
    +
    +
    birth_years = actors['birth']
    +birth_years
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[7]:
    + + + + +
    +
    0    1942
    +1    1943
    +2    1943
    +3    1941
    +4    1940
    +5    1939
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [8]:
    +
    +
    +
    type(birth_years)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[8]:
    + + + + +
    +
    pandas.core.series.Series
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [9]:
    +
    +
    +
    birth_years.name
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[9]:
    + + + + +
    +
    'birth'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [10]:
    +
    +
    +
    birth_years.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[10]:
    + + + + +
    +
    RangeIndex(start=0, stop=6, step=1)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [11]:
    +
    +
    +
    birth_years.dtype
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[11]:
    + + + + +
    +
    dtype('int64')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    S informacemi ve sloupcích se dá počítat. +Základní aritmetické operace (jako sčítání či dělení) se sloupcem a skalární hodnotou (číslem, řetězcem, ...) provedou danou operaci nad každou hodnotou ve sloupci. Výsledek je nový sloupec:

    +
    +
    +
    +
    +
    +
    In [12]:
    +
    +
    +
    ages = 2016 - birth_years
    +ages
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[12]:
    + + + + +
    +
    0    74
    +1    73
    +2    73
    +3    75
    +4    76
    +5    77
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [13]:
    +
    +
    +
    century = birth_years // 100 + 1
    +century
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[13]:
    + + + + +
    +
    0    20
    +1    20
    +2    20
    +3    20
    +4    20
    +5    20
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    To platí jak pro aritmetické operace (+, -, *, /, //, %, **), tak pro porovnávání:

    +
    +
    +
    +
    +
    +
    In [14]:
    +
    +
    +
    birth_years > 1940
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[14]:
    + + + + +
    +
    0     True
    +1     True
    +2     True
    +3     True
    +4    False
    +5    False
    +Name: birth, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [15]:
    +
    +
    +
    birth_years == 1940
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[15]:
    + + + + +
    +
    0    False
    +1    False
    +2    False
    +3    False
    +4     True
    +5    False
    +Name: birth, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Když sloupec nesečteme se skalární hodnotou (číslem) ale sekvencí, např. seznamem nebo dalším sloupcem, operace se provede na odpovídajících prvcích. Sloupec a druhá sekvence musí mít stejnou délku.

    +
    +
    +
    +
    +
    +
    In [16]:
    +
    +
    +
    actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[16]:
    + + + + +
    +
    0      Terry (1)
    +1    Michael (2)
    +2       Eric (3)
    +3     Graham (4)
    +4      Terry (5)
    +5       John (6)
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Řetězcové operace se u řetězcových sloupců schovávají pod jmenným prostorem str:

    +
    +
    +
    +
    +
    +
    In [17]:
    +
    +
    +
    actors['name'].str.upper()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[17]:
    + + + + +
    +
    0      TERRY
    +1    MICHAEL
    +2       ERIC
    +3     GRAHAM
    +4      TERRY
    +5       JOHN
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... a operace s daty a časy (datetime) najdeme pod dt.

    +
    +
    +
    +
    +
    +
    +

    Ze slupců jdou vybírat prvky či podsekvence podobně jako třeba ze seznamů:

    +
    +
    +
    +
    +
    +
    In [18]:
    +
    +
    +
    birth_years[2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[18]:
    + + + + +
    +
    1943
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [19]:
    +
    +
    +
    birth_years[2:-2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[19]:
    + + + + +
    +
    2    1943
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A navíc je lze vybírat pomocí sloupce typu bool, což vybere ty záznamy, u kterých je odpovídající hodnota true. Tak lze rychle vybrat hodnoty, které odpovídají nějaké podmínce:

    +
    +
    +
    +
    +
    +
    In [20]:
    +
    +
    +
    # Roky narození po roce 1940
    +birth_years[birth_years > 1940]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[20]:
    + + + + +
    +
    0    1942
    +1    1943
    +2    1943
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Protože Python neumožňuje předefinovat chování operátorů and a or, logické spojení operací se tradičně dělá přes bitové operátory & (a) a | (nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:

    +
    +
    +
    +
    +
    +
    In [21]:
    +
    +
    +
    # Roky narození v daném rozmezí
    +birth_years[(birth_years > 1940) & (birth_years < 1943)]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[21]:
    + + + + +
    +
    0    1942
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Sloupce mají zabudovanou celou řadu operací, od základních (např. column.sum(), která bývá rychlejší než vestavěná funkce sum()) po roztodivné statistické specialitky. Kompletní seznam hledejte v dokumentaci. Povědomí o operacích, které sloupce umožňují, je základní znalost datového analytika.

    +
    +
    +
    +
    +
    +
    In [22]:
    +
    +
    +
    print('Součet: ', birth_years.sum())
    +print('Průměr: ', birth_years.mean())
    +print('Medián: ', birth_years.median())
    +print('Počet unikátních hodnot: ', birth_years.nunique())
    +print('Koeficient špičatosti: ', birth_years.kurtosis())
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Součet:  11648
    +Průměr:  1941.3333333333333
    +Medián:  1941.5
    +Počet unikátních hodnot:  5
    +Koeficient špičatosti:  -1.48125
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Zvláště mocná je metoda apply, která nám dovoluje aplikovat jakoukoli funkci na všechny hodnoty sloupce:

    +
    +
    +
    +
    +
    +
    In [23]:
    +
    +
    +
    actors['name'].apply(lambda x: ''.join(reversed(x)))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[23]:
    + + + + +
    +
    0      yrreT
    +1    leahciM
    +2       cirE
    +3     maharG
    +4      yrreT
    +5       nhoJ
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [24]:
    +
    +
    +
    actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[24]:
    + + + + +
    +
    0    deceased
    +1       alive
    +2       alive
    +3    deceased
    +4       alive
    +5       alive
    +Name: alive, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tabulky a vybírání prvků

    +
    +
    +
    +
    +
    +
    +

    Prvky ze sloupců jdou vybírat jako u seznamů. Ale z tabulek v Pandas jde vybírat spoustou různých způsobů. Tradiční hranaté závorky plní několik funkcí najednou, takže někdy není na první pohled jasné, co jaké indexování znamená:

    +
    +
    +
    +
    +
    +
    In [25]:
    +
    +
    +
    actors['name']  # Jméno sloupce
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[25]:
    + + + + +
    +
    0      Terry
    +1    Michael
    +2       Eric
    +3     Graham
    +4      Terry
    +5       John
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [26]:
    +
    +
    +
    actors[1:-1]  # Interval řádků
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[26]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [27]:
    +
    +
    +
    actors[['name', 'alive']]  # Seznam sloupců
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[27]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namealive
    0TerryFalse
    1MichaelTrue
    2EricTrue
    3GrahamFalse
    4TerryTrue
    5JohnTrue
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Toto je příklad nejednoznačného chování, které zjednodušuje život datovým analytikům, pro které je knihovna Pandas primárně určena.

    +

    My, coby programátoři píšící robustní kód, budeme čisté indexování ([]) používat jen pro výběr sloupců podle jména. +Pro ostatní přístup použijeme tzv. indexery, jako loc a iloc.

    +
    +
    +
    +
    +
    +
    +

    Indexer loc

    +
    +
    +
    +
    +
    +
    +

    Indexer loc zprostředkovává primárně řádky, a to podle indexu, tedy hlaviček tabulky. V našem příkladu jsou řádky očíslované a sloupce pojmenované, ale dále uvidíme, že v obou indexech můžou být jakékoli hodnoty.

    +
    +
    +
    +
    +
    +
    In [28]:
    +
    +
    +
    actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[28]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [29]:
    +
    +
    +
    actors.loc[2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[29]:
    + + + + +
    +
    name     Eric
    +birth    1943
    +alive    True
    +Name: 2, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Všimněte si, že loc není metoda: používají se s ním hranaté závorky.

    +
    +
    +
    +
    +
    +
    +

    Použijeme-li k indexování n-tici, prvním prvkem se indexují řádky a druhým sloupce – podobně jako u NumPy:

    +
    +
    +
    +
    +
    +
    In [30]:
    +
    +
    +
    actors.loc[2, 'birth']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[30]:
    + + + + +
    +
    1943
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Na obou pozicích může být „interval”, ale na rozdíl od klasického Pythonu jsou ve výsledku obsaženy obě koncové hodnoty. (S indexem, který nemusí být vždy číselný, to dává smysl.)

    +
    +
    +
    +
    +
    +
    In [31]:
    +
    +
    +
    actors.loc[2:4, 'birth':'alive']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[31]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    birthalive
    21943True
    31941False
    41940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Když uvedeme jen jednu hodnotu, sníží se dimenzionalita – z tabulky na sloupec (případně řádek – taky Series), ze sloupce na skalární hodnotu. Porovnejte:

    +
    +
    +
    +
    +
    +
    In [32]:
    +
    +
    +
    actors.loc[2:4, 'name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[32]:
    + + + + +
    +
    2      Eric
    +3    Graham
    +4     Terry
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [33]:
    +
    +
    +
    actors.loc[2:4, 'name':'name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[33]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    name
    2Eric
    3Graham
    4Terry
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Chcete-li vybrat sloupec, na místě řádků uveďte dvojtečku – t.j. kompletní interval.

    +
    +
    +
    +
    +
    +
    In [34]:
    +
    +
    +
    actors.loc[:, 'alive']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[34]:
    + + + + +
    +
    0    False
    +1     True
    +2     True
    +3    False
    +4     True
    +5     True
    +Name: alive, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další možnost indexování je seznamem hodnot. Tím se dají řádky či sloupce vybírat, přeskupovat, nebo i duplikovat:

    +
    +
    +
    +
    +
    +
    In [35]:
    +
    +
    +
    actors.loc[:, ['name', 'alive']]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[35]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namealive
    0TerryFalse
    1MichaelTrue
    2EricTrue
    3GrahamFalse
    4TerryTrue
    5JohnTrue
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [36]:
    +
    +
    +
    actors.loc[[3, 2, 4, 4], :]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[36]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    3Graham1941False
    2Eric1943True
    4Terry1940True
    4Terry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexer iloc

    +
    +
    +
    +
    +
    +
    +

    Druhý indexer, který si v krátkosti ukážeme, je iloc. Umí to samé co loc, jen nepracuje s klíčem, ale s pozicemi řádků či sloupců. Funguje tedy jako indexování v NumPy.

    +
    +
    +
    +
    +
    +
    In [37]:
    +
    +
    +
    actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[37]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [38]:
    +
    +
    +
    actors.iloc[0, 0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[38]:
    + + + + +
    +
    'Terry'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Protože iloc pracuje s čísly, záporná čísla a intervaly fungují jako ve standardním Pythonu:

    +
    +
    +
    +
    +
    +
    In [39]:
    +
    +
    +
    actors.iloc[-1, 1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[39]:
    + + + + +
    +
    1939
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [40]:
    +
    +
    +
    actors.iloc[:, 0:1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[40]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name
    0Terry
    1Michael
    2Eric
    3Graham
    4Terry
    5John
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexování seznamem ale funguje jako u loc:

    +
    +
    +
    +
    +
    +
    In [41]:
    +
    +
    +
    actors.iloc[[0, -1, 3], [-1, 1, 0]]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[41]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivebirthname
    0False1942Terry
    5True1939John
    3False1941Graham
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jak loc tak iloc fungují i na sloupcích (Series), takže se dají kombinovat:

    +
    +
    +
    +
    +
    +
    In [42]:
    +
    +
    +
    actors.iloc[-1].loc['name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[42]:
    + + + + +
    +
    'John'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexy

    +
    +
    +
    +
    +
    +
    +

    V minulé sekci jsme naťukli indexy – jména jednotlivých sloupců nebo řádků. Teď se podívejme, co všechno s nimi lze dělat. +Načtěte si znovu stejnou tabulku:

    +
    +
    +
    +
    +
    +
    In [43]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[43]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tato tabulka má dva klíče: jeden pro řádky, index, a druhý pro sloupce, který se jmenuje columns.

    +
    +
    +
    +
    +
    +
    In [44]:
    +
    +
    +
    actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[44]:
    + + + + +
    +
    RangeIndex(start=0, stop=6, step=1)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [45]:
    +
    +
    +
    actors.columns
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[45]:
    + + + + +
    +
    Index(['name', 'birth', 'alive'], dtype='object')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Klíč se dá změnit tím, že do něj přiřadíme sloupec (nebo jinou sekvenci):

    +
    +
    +
    +
    +
    +
    In [46]:
    +
    +
    +
    actors.index = actors['name']
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[46]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    TerryTerry1942False
    MichaelMichael1943True
    EricEric1943True
    GrahamGraham1941False
    TerryTerry1940True
    JohnJohn1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [47]:
    +
    +
    +
    actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[47]:
    + + + + +
    +
    Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Potom jde pomocí tohoto klíče vyhledávat. Chceme-li vyhledávat efektivně (což dává smysl, pokud by řádků byly miliony), je dobré nejdřív tabulku podle indexu seřadit:

    +
    +
    +
    +
    +
    +
    In [48]:
    +
    +
    +
    actors = actors.sort_index()
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[48]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    EricEric1943True
    GrahamGraham1941False
    JohnJohn1939True
    MichaelMichael1943True
    TerryTerry1942False
    TerryTerry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [49]:
    +
    +
    +
    actors.loc[['Eric', 'Graham']]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[49]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    EricEric1943True
    GrahamGraham1941False
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pozor ale na situaci, kdy hodnoty v klíči nejsou unikátní. To Pandas podporuje, ale chování nemusí být podle vašich představ:

    +
    +
    +
    +
    +
    +
    In [50]:
    +
    +
    +
    actors.loc['Terry']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[50]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    TerryTerry1942False
    TerryTerry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Trochu pokročilejší možnost, jak klíč nastavit, je metoda set_index. Nejčastěji se používá k přesunutí sloupců do klíče, ale v dokumentaci se dočtete i o dalších možnostech. +Přesuňte teď do klíče dva sloupce najednou:

    +
    +
    +
    +
    +
    +
    In [51]:
    +
    +
    +
    indexed_actors = actors.set_index(['name', 'birth'])
    +indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[51]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alive
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Vznikl tím víceúrovňový klíč:

    +
    +
    +
    +
    +
    +
    In [52]:
    +
    +
    +
    indexed_actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[52]:
    + + + + +
    +
    MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
    +           labels=[[0, 1, 2, 3, 4, 4], [4, 2, 0, 4, 3, 1]],
    +           names=['name', 'birth'])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Řádky z tabulky s víceúrovňovým klíčem se dají vybírat buď postupně po jednotlivých úrovních, nebo n-ticí:

    +
    +
    +
    +
    +
    +
    In [53]:
    +
    +
    +
    indexed_actors.loc['Terry']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[53]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    alive
    birth
    1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [54]:
    +
    +
    +
    indexed_actors.loc['Terry'].loc[1940]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[54]:
    + + + + +
    +
    alive    True
    +Name: 1940, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [55]:
    +
    +
    +
    indexed_actors.loc[('Terry', 1942)]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[55]:
    + + + + +
    +
    alive    False
    +Name: (Terry, 1942), dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Kromě výběru dat mají klíče i jinou vlastnost: přidáme-li do tabulky nový sloupec s klíčem, jednotlivé řádky se seřadí podle něj:

    +
    +
    +
    +
    +
    +
    In [56]:
    +
    +
    +
    indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[56]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alive
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [57]:
    +
    +
    +
    last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
    +                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
    +last_names
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[57]:
    + + + + +
    +
    (Terry, 1940)      Gilliam
    +(Terry, 1942)        Jones
    +(Carol, 1942)    Cleveland
    +dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [58]:
    +
    +
    +
    indexed_actors['last_name'] = last_names
    +indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[58]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Eric1943TrueNaN
    Graham1941FalseNaN
    John1939TrueNaN
    Michael1943TrueNaN
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    NaN neboli NULL či N/A

    +
    +
    +
    +
    +
    +
    +

    V posledním příkladu vidíme, že Pandas doplňuje za neznámé hodnoty NaN, tedy "Not a Number" – hodnotu, která plní podobnou funkci jako NULL v SQL nebo None v Pythonu. Znamená, že daná informace chybí, není k dispozici nebo ani nedává smysl ji mít. Naprostá většina operací s NaN dává opět NaN:

    +
    +
    +
    +
    +
    +
    In [59]:
    +
    +
    +
    '(' + indexed_actors['last_name'] + ')'
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[59]:
    + + + + +
    +
    name     birth
    +Eric     1943           NaN
    +Graham   1941           NaN
    +John     1939           NaN
    +Michael  1943           NaN
    +Terry    1942       (Jones)
    +         1940     (Gilliam)
    +Name: last_name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    NaN se chová divně i při porovnávání; (NaN == NaN) je nepravda. Pro zjištění chybějících hodnot máme metodu isnull():

    +
    +
    +
    +
    +
    +
    In [60]:
    +
    +
    +
    indexed_actors['last_name'].isnull()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[60]:
    + + + + +
    +
    name     birth
    +Eric     1943      True
    +Graham   1941      True
    +John     1939      True
    +Michael  1943      True
    +Terry    1942     False
    +         1940     False
    +Name: last_name, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Abychom se NaN zbavili, máme dvě možnosti. Buď je zaplníme pomocí metody fillna hodnotou jako 0, False nebo, pro přehlednější výpis, prázdným řetězcem:

    +
    +
    +
    +
    +
    +
    In [61]:
    +
    +
    +
    indexed_actors.fillna('')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[61]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Nebo se můžeme zbavit všech řádků, které nějaký NaN obsahují:

    +
    +
    +
    +
    +
    +
    In [62]:
    +
    +
    +
    indexed_actors.dropna()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[62]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Bohužel existuje jistá nekonzistence mezi NaN a slovy null či na v názvech funkcí. C'est la vie.

    +
    +
    +
    +
    +
    +
    +

    Merge

    +

    Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

    +
    +
    +
    +
    +
    +
    In [63]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[63]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [64]:
    +
    +
    +
    spouses = pandas.read_csv('static/spouses.csv', index_col=None)
    +spouses
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[64]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthspouse_name
    0Graham1941David Sherlock
    1John1939Connie Booth
    2John1939Barbara Trentham
    3John1939Alyce Eichelberger
    4John1939Jennifer Wade
    5Terry1940Maggie Westo
    6Eric1943Lyn Ashley
    7Eric1943Tania Kosevich
    8Terry1942Alison Telfer
    9Terry1942Anna Söderström
    10Michael1943Helen Gibbins
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [65]:
    +
    +
    +
    actors.merge(spouses)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[65]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalivespouse_name
    0Terry1942FalseAlison Telfer
    1Terry1942FalseAnna Söderström
    2Michael1943TrueHelen Gibbins
    3Eric1943TrueLyn Ashley
    4Eric1943TrueTania Kosevich
    5Graham1941FalseDavid Sherlock
    6Terry1940TrueMaggie Westo
    7John1939TrueConnie Booth
    8John1939TrueBarbara Trentham
    9John1939TrueAlyce Eichelberger
    10John1939TrueJennifer Wade
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Mají-li spojované tabulky sloupce stejných jmen, Pandas je spojí podle těchto sloupců. V dokumentaci se dá zjistit, jak explicitně určit podle kterých klíčů spojovat, co udělat když v jedné z tabulek chybí odpovídající hodnoty apod.

    +

    Fanoušky SQL ještě odkážu na porovnání mezi SQL a Pandas.

    +
    +
    +
    +
    +
    +
    +

    Přesýpání dat

    +
    +
    +
    +
    +
    +
    +

    Dostáváme se do bodu, kdy nám jednoduchá tabulka přestává stačit. Pojďme si vytvořit tabulku větší: fiktivních prodejů v e-shopu, ve formátu jaký bychom mohli dostat z SQL databáze nebo datového souboru.

    +

    Použijeme k tomu mimo jiné date_range, která vytváří kalendářní intervaly. Zde, i v jiných případech, kdy je jasné, že se má nějaká hodnota interpretovat jako datum, nám Pandas dovolí místo objektů datetime zadávat data řetězcem:

    +
    +
    +
    +
    +
    +
    In [66]:
    +
    +
    +
    import itertools
    +import random
    +random.seed(0)
    +
    +months = pandas.date_range('2015-01', '2016-12', freq='M')
    +categories = ['Electronics', 'Power Tools', 'Clothing']
    +data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)}
    +                          for a, b in itertools.product(months, categories)
    +                          if random.randrange(20) > 0])
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Tabulka je celkem dlouhá (i když v analýze dat bývají ještě delší). Podívejme se na několik obecných informací:

    +
    +
    +
    +
    +
    +
    In [67]:
    +
    +
    +
    # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
    +data.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[67]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    categorymonthsales
    0Electronics2015-01-315890
    1Power Tools2015-01-313242
    2Clothing2015-01-316961
    3Electronics2015-02-283969
    4Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [68]:
    +
    +
    +
    # Celkový počet řádků
    +len(data)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[68]:
    + + + + +
    +
    67
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [69]:
    +
    +
    +
    data['sales'].describe()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[69]:
    + + + + +
    +
    count      67.000000
    +mean     4795.552239
    +std      3101.026552
    +min      -735.000000
    +25%      2089.000000
    +50%      4448.000000
    +75%      7874.000000
    +max      9817.000000
    +Name: sales, dtype: float64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pomocí set_index nastavíme, které sloupce budeme brát jako hlavičky:

    +
    +
    +
    +
    +
    +
    In [70]:
    +
    +
    +
    indexed = data.set_index(['category', 'month'])
    +indexed.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[70]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    categorymonth
    Electronics2015-01-315890
    Power Tools2015-01-313242
    Clothing2015-01-316961
    Electronics2015-02-283969
    Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Budeme-li chtít z těchto dat vytvořit tabulku, která má v řádcích kategorie a ve sloupcích měsíce, můžeme využít metodu unstack, která "přesune" vnitřní úroveň indexu řádků do sloupců a uspořádá podle toho i data.

    +

    Můžeme samozřejmě použít kteroukoli úroveň klíče; viz dokumentace k unstack a reverzní operaci stack.

    +
    +
    +
    +
    +
    +
    In [71]:
    +
    +
    +
    unstacked = indexed.unstack('month')
    +unstacked
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[71]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
    category
    Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
    Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
    Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
    +

    3 rows × 23 columns

    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Teď je sloupcový klíč dvouúrovňový, ale úroveň sales je zbytečná. Můžeme se jí zbavit pomocí MultiIndex.droplevel.

    +
    +
    +
    +
    +
    +
    In [72]:
    +
    +
    +
    unstacked.columns = unstacked.columns.droplevel()
    +unstacked
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[72]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
    category
    Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
    Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
    Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
    +

    3 rows × 23 columns

    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A teď můžeme data analyzovat. Kolik se celkem utratilo za elektroniku?

    +
    +
    +
    +
    +
    +
    In [73]:
    +
    +
    +
    unstacked.loc['Electronics'].sum()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[73]:
    + + + + +
    +
    103742.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jak to vypadalo se všemi elektrickými zařízeními v třech konkrétních měsících?

    +
    +
    +
    +
    +
    +
    In [74]:
    +
    +
    +
    unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[74]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
    category
    Electronics2966.09039.01450.0
    Power Tools2012.06807.0314.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A jak se prodávalo oblečení?

    +
    +
    +
    +
    +
    +
    In [75]:
    +
    +
    +
    unstacked.loc['Clothing']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[75]:
    + + + + +
    +
    month
    +2015-01-31    6961.0
    +2015-02-28    2578.0
    +2015-03-31    9131.0
    +2015-04-30     618.0
    +2015-05-31    4796.0
    +2015-06-30    8052.0
    +2015-07-31    7989.0
    +2015-08-31       NaN
    +2015-09-30      31.0
    +2015-10-31    7896.0
    +2015-11-30    7016.0
    +2015-12-31    7969.0
    +2016-01-31    8627.0
    +2016-02-29    4194.0
    +2016-03-31    2059.0
    +2016-04-30     471.0
    +2016-05-31    5410.0
    +2016-06-30    8663.0
    +2016-07-31    9817.0
    +2016-08-31    6969.0
    +2016-09-30    -735.0
    +2016-10-31    4448.0
    +2016-11-30    -259.0
    +Name: Clothing, dtype: float64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Metody stack a unstack jsou sice asi nejužitečnější, ale stále jen jeden ze způsobů jak v Pandas tabulky přeskládávat. Náročnější studenti najdou další možnosti v dokumentaci.

    +
    +
    +
    +
    +
    +
    +

    Grafy

    +
    +
    +
    +
    +
    +
    +

    Je-li nainstalována knihovna matplotlib, Pandas ji umí využít k tomu, aby kreslil grafy. Nastavení je trochu jiné pro Jupyter Notebook a pro příkazovou řádku.

    +

    Používáte-li Jupyter Notebook, zapněte integraci pro kreslení grafů pomocí:

    +
    +
    +
    +
    +
    +
    In [76]:
    +
    +
    +
    import matplotlib
    +
    +# Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):
    +%matplotlib inline
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    a pak můžete přímo použít metodu plot(), která bez dalších argumentů vynese data z tabulky proti indexu:

    +
    +
    +
    +
    +
    +
    In [77]:
    +
    +
    +
    unstacked.loc['Clothing'].dropna().plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[77]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab57c0470>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jste-li v příkazové řádce, napřed použij plot() a potom se na graf buď podívete, nebo ho uložte:

    +
    # Setup
    +import matplotlib.pyplot
    +
    +# Plot
    +unstacked.loc['Clothing'].plot()
    +matplotlib.pyplot.show()
    +matplotlib.pyplot.savefig('graph.png')
    +

    Funkce show a savefig pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce savefig aktuální graf zahodí; před dalším show nebo savefig je potřeba ho vykreslit znovu.

    +
    +
    +
    +
    +
    +
    +

    V kombinaci s dalšími funkcemi Series a DataFrame umožňují grafy získat o datech rychlý přehled:

    +
    +
    +
    +
    +
    +
    In [78]:
    +
    +
    +
    # Jak se postupně vyvíjely zisky z oblečení?
    +# `.T` udělá transpozici tabulky (vymění řádky a sloupce)
    +# `cumsum()` spočítá průběžný součet po sloupcích
    +unstacked.T.fillna(0).cumsum().plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[78]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5733160>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    In [79]:
    +
    +
    +
    # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
    +unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[79]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab567ae10>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další informace jsou, jak už to bývá, v dokumentaci.

    +
    +
    +
    +
    +
    +
    +

    Groupby

    +

    Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

    +
    +
    +
    +
    +
    +
    In [80]:
    +
    +
    +
    data.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[80]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    categorymonthsales
    0Electronics2015-01-315890
    1Power Tools2015-01-313242
    2Clothing2015-01-316961
    3Electronics2015-02-283969
    4Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Samotný výsledek groupby() je jen objekt:

    +
    +
    +
    +
    +
    +
    In [81]:
    +
    +
    +
    data.groupby('category')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[81]:
    + + + + +
    +
    <pandas.core.groupby.DataFrameGroupBy object at 0x7f4ab8363f28>
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... na který musíme zavolat příslušnou agregující funkci. Tady je například součet částek podle kategorie:

    +
    +
    +
    +
    +
    +
    In [82]:
    +
    +
    +
    data.groupby('category').sum()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[82]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    category
    Clothing112701
    Electronics103742
    Power Tools104859
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Nebo počet záznamů:

    +
    +
    +
    +
    +
    +
    In [83]:
    +
    +
    +
    data.groupby('category').count()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[83]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    monthsales
    category
    Clothing2222
    Electronics2222
    Power Tools2323
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Groupby umí agregovat podle více sloupců najednou (i když u našeho příkladu nedává velký smysl):

    +
    +
    +
    +
    +
    +
    In [84]:
    +
    +
    +
    data.groupby(['category', 'month']).sum().head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[84]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    categorymonth
    Clothing2015-01-316961
    2015-02-282578
    2015-03-319131
    2015-04-30618
    2015-05-314796
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Chceme-li aplikovat více funkcí najednou, předáme jejich seznam metodě agg. Časté funkce lze předat jen jménem, jinak předáme funkci či metodu přímo:

    +
    +
    +
    +
    +
    +
    In [85]:
    +
    +
    +
    data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[85]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    meanmediansumkurt
    category
    Clothing5122.7727276185.5112701-1.298035
    Electronics4715.5454554294.5103742-1.353210
    Power Tools4559.0869573769.0104859-1.044767
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Případně použijeme zkratku pro základní analýzu:

    +
    +
    +
    +
    +
    +
    In [86]:
    +
    +
    +
    g = data.groupby('month')
    +g.describe()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[86]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    countmeanstdmin25%50%75%max
    month
    2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
    2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
    2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
    2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
    2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
    2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
    2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
    2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
    2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
    2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
    2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
    2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
    2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
    2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
    2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
    2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
    2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
    2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
    2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
    2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
    2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
    2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
    2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A perlička nakonec – agregovat se dá i podle sloupců, které nejsou v tabulce. Následující kód rozloží data na slabé, průměrné a silné měsíce podle toho, kolik jsme v daném měsíci vydělali celých tisícikorun, a zjistí celkový zisk ze slabých, průměrných a silných měsíců:

    +
    +
    +
    +
    +
    +
    In [87]:
    +
    +
    +
    bin_size = 10000
    +by_month = data.groupby('month').sum()
    +by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
    +by_thousands
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[87]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    countsum
    sales
    0530651
    1000015218870
    20000371781
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [88]:
    +
    +
    +
    by_thousands[('sales', 'sum')].plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[88]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5588240>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    + + diff --git a/mi-pyt/pandas/spouses.csv b/mi-pyt/pandas/spouses.csv new file mode 100644 index 00000000..47ec344b --- /dev/null +++ b/mi-pyt/pandas/spouses.csv @@ -0,0 +1,12 @@ +name,birth,spouse_name +Graham,1941,David Sherlock +John,1939,Connie Booth +John,1939,Barbara Trentham +John,1939,Alyce Eichelberger +John,1939,Jennifer Wade +Terry,1940,Maggie Westo +Eric,1943,Lyn Ashley +Eric,1943,Tania Kosevich +Terry,1942,Alison Telfer +Terry,1942,Anna Söderström +Michael,1943,Helen Gibbins diff --git a/mi-pyt/pandas/style-table.css b/mi-pyt/pandas/style-table.css new file mode 100644 index 00000000..96378a77 --- /dev/null +++ b/mi-pyt/pandas/style-table.css @@ -0,0 +1,57 @@ +/* +Pandas table style from Brandon Rhodes' amazing Pandas workshop at PyCon 2015: +https://www.youtube.com/watch?v=5JnMutdy6Fw + +Copyright © 2015 Brandon Rhodes and available under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + */ + +body { + margin: 0; + font-family: Helvetica; +} +table.dataframe { + border-collapse: collapse; + border: none; +} +table.dataframe tr { + border: none; +} +table.dataframe td, table.dataframe th { + margin: 0; + border: 1px solid white; + padding-left: 0.25em; + padding-right: 0.25em; +} +table.dataframe th:not(:empty) { + background-color: #fec; + text-align: left; + font-weight: normal; +} +table.dataframe tr:nth-child(2) th:empty { + border-left: none; + border-right: 1px dashed #888; +} +table.dataframe td { + border: 2px solid #ccf; + background-color: #f4f4ff; +} diff --git a/mi-pyt/pyqt/basic-screenshot.png b/mi-pyt/pyqt/basic-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ece64175f5da02af7608f4ec92be6441789dabd6 GIT binary patch literal 52134 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 w!-xJcJSk3zUX7$6eRcf$ipL+9T=_{PKbZj9GUI v Pythonu: PyQt5 +

    Způsobů, jak dělat v Pythonu aplikace s GUI, je mnoho. Dá se použít zabudovaný, ale ošklivý Tkinter, nebo nějaký externí framework.

    +

    V tomto cvičení budeme používat framework Qt, protože je multiplatformní, používá se i v jiných oblastech, než je Python, +je dostatečně robustní a dá se na většinu systémů nainstalovat bez větších problémů.

    +

    Pomocí aplikace Qt Designer se dá navíc základní kostra GUI poměrně jednoduše naklikat, takže není nutné psát layout aplikace v kódu.

    +

    Instalace

    +

    Na tomto cvičení budete potřebovat balíček PyQt5 a aplikaci Qt5 Designer. +Pokud budete používat svůj počítač, prosíme vás o instalaci již předem, na cvičení toho bude opravdu hodně a nemůžeme si dovolit plýtvat časem.

    +

    PyQt5

    +

    Pokud máte Python alespoň 3.5 a jednu z platforem, pro které je připraven wheel na PyPI, stačí udělat:

    +
    (__venv__) $ python -m pip install --upgrade pip
    +(__venv__) $ python -m pip install PyQt5
    +

    Pro starší verzi Pythonu nebo 32bitový Linux to ale nebude fungovat. +V takovém případě můžete PyQt5 zkusit najít v balíčkovacím systému vaší distribuce (např. balíček python3-qt5 ve Fedoře nebo python3-pyqt5 v Debianu). +Virtualenv pak může vytvořit s přepínačem --system-site-packages, který zajistí, že i z virtualenvu uvidíte PyQt5 nainstalované z distribučního balíčku.

    +
    $ python3 -m venv --system-site-packages __venv__
    +

    Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů +(návod).

    +

    První aplikace níže by vám měla fungovat.

    +

    Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

    +

    Qt5 Designer

    +

    Na Linuxu najdete Qt5 Designer v balíčkách, třeba qt5-designer na Fedoře nebo qttools5-dev-tools na Debianu.

    +

    Na Windows (i na Macu) si můžete stáhnout instalátor Qt 5, který (doufáme) nainstaluje i Designer.

    +

    Pokud používáte na Macu homebrew, můžete to udělat i takto:

    +
    $ brew install qt5
    +$ brew linkapps qt5
    +

    Existují i Python wheely pyqt5-tools pro Windows obsahující Qt5 Designer. +Ten je pak potřeba pro spuštění dohledat v nainstalované lokaci.

    +

    NumPy

    +

    Do virtuálního prostředí s PyQt5 si nainstalujte i NumPy:

    +
    $ python -m pip install numpy
    +

    První aplikace

    +

    Napište si první aplikaci, ať vidíte, jak kód v PyQt vypadá. +Detaily toho, jak to funguje, si ukážeme později.

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +button = QtWidgets.QPushButton("Click to Exit")
    +button.setWindowTitle("Goodbye World")
    +button.clicked.connect(app.quit)
    +
    +button.show()
    +
    +app.exec()
    +

    O Qt, PyQt a PySide

    +

    Qt je aplikační framework napsaný v C++, který zjednodušuje psaní multiplatformních aplikací (od počítačů s Linuxem, Mac OS či Windows po různá vestavěná zařízení).

    +

    PyQt je knihovna, která umožňuje použít Qt z Pythonu. +Na rozdíl od samotného Qt je licencovaná pod GNU GPL v3, která (stručně řečeno) vyžaduje, aby programy napsané s použitím PyQt byly šířeny pod stejnou licencí a se zdrojovým kódem. +Tedy: kdokoliv, kdo dostane kopii programu, musí mít možnost dostat odpovídající zdrojový kód a má možnost tento kód dál šířit pod stejnou licencí.

    +

    Pokud by se vám tato licence nelíbila, je možnost použít PySide, které má permisivnější licenci a téměř stejné API jako PyQt, ale není tak stabilní.

    +

    Moduly Qt

    +

    Qt je rozděleno na několik tzv. modulů. +Pro grafická uživatelská rozhraní (GUI), kterými se budeme zabývat, použijeme hlavně QtGui a QtWidgets.

    +

    Dále je tu modul QtCore, který obsahuje mj. základní datové typy jako QString a QList (které PyQt +automaticky převádí na pythonní ekvivalenty a zpět) nebo třeba QRect – abstraktní obdélník.

    +

    Další moduly jsou nadstavby od vykreslování SVG nebo práci s multimédii (které se můžou hodit) po +třeba práci s SQL a XML nebo síťovou komunikaci, kde je pro Python pohodlnější použít jiné knihovny.

    +

    Specifika PyQt

    +

    Ačkoli se Qt dá použít z Pythonu, bohužel zjistíte, že ne všechno funguje a vypadá tak, jako kdyby to byla knihovna od základů napsaná pro Python. +Tady jsou některé zvláštnosti, na které se můžete připravit.

    +

    Jména a dokumentace

    +

    Qt pojmenovává funkce, metody a atributy konvencí camelCase, místo pythonistického snake_case. +PyQt tuto konvenci nemění: je užitečnější používat identická jména, a kromě toho knihovna PyQt vznikla ještě před PEP 8.

    +

    Hledáte-li dokumentaci, doporučuji zadat do vyhledávače qt5 <hledaný objekt>. +Dostanete se tak na dokumentaci pro C++ (např. QObject). +Hledáte-li pyqt5 <hledaný objekt>, dostanete se k dokumentaci pro Python, která ale většinou obsahuje doslova to samé +co verze pro C++ (např. pro QObject). +Občas však můžete narazit na nekompletní dokumentaci (např. pro QAbstractButton).

    +

    Rozdíly mezi C a pythonní verzí jsou většinou intuitivní (např. None místo NULL), ale jsou popsány +v dokumentaci PyQt.

    +

    Atributy

    +

    Qt zásadně používá pro přístup k atributům objektů funkce. +Funkce pro čtení se typicky jmenuje podle atributu, funkce pro nastavení má předponu set. +Namísto pythonního c = obj.color a obj.color = ... tedy použijeme c = obj.color() a obj.setColor(...).

    +

    Správa paměti

    +

    Python a C++/Qt mají, bohužel, rozdílný přístup ke správě paměti. +Python používá reference counting a garbage collection. +C++ má objekty s destruktory, což Qt zjednodušuje (alespoň pro C++) stromem vlastnictví.

    +

    Základní třída v Qt, ze které dědí téměř všechny ostatní, je QObject. +Ten má seznam potomků (children), o které se „stará“, a když uvolníme rodiče, uvolní se rekurzivně i všichni potomci. +Z Pythonu pak můžeme dostat chybu wrapped C/C++ object has been deleted. +Jinak ale kombinace QObject a pythonních objektů funguje dobře.

    +

    Větší problémy můžou nastat s pomocnými objekty, které nedědí z QObject a nemají potřebné „dynamické“ vlastnosti. +Takový objekt doporučujeme používat jen v rámci jedné funkce (t.j. neukládat si ho jinde), pokud si nejste jistí že +ho „nevlastníte“ i ve smyslu C++/Qt.

    +

    Občas se stane, že program spadne pro chybu jako nepovolený přístup do paměti. +Bez hlubší znalosti Qt a PyQt se taková chyba odstraňuje poměrně těžko, ale vaše znalosti C++ (z jiných kurzů) +a CPython C API (z minula) vám v tom pomůžou. +Doporučujeme dělat malé commity a psát jednoduchý kód.

    +

    Smyčka událostí, signály a sloty

    +

    Qt funguje na principu smyčky událostí (event loop). +Metoda QApplication.exec obsahuje v podstatě nekonečnou smyčku, která čeká na externí události (klik myši, +žádost OS o vykreslení okna atd.) a na jejich základě volá příslušné funkce – ať už interní +nebo námi definované.

    +

    Pro komunikaci mezi objekty v rámci aplikace pak Qt používá mechanismus signálů a slotů (variantu observer pattern). +Signál je vyslán (emitted) při události jako kliknutí na tlačítko, výběr položky z menu, zavření okna atp. +K signálu může být připojeno několik slotů, což jsou funkce, které se po vyslání signálu zavolají. +Kód, který vysílá signál, obecně neví o tom, kolik slotů je připojeno (a jsou-li nějaké).

    +

    V C++ jsou signály a sloty vždy staticky nadefinované na nějaké třídě, která dědí z QObject. +V PyQt takto musí být nadefinovány jen signály; za slot poslouží jakákoli pythonní funkce.

    +

    V příkladu výše jsme připojili signál clicked tlačítka na slot quit aplikace. +Stejně bychom mohli připojit jakoukoli funkci/metodu, která bere správný počet argumentů – v následujícím případě nula:

    +
        button.clicked.connect(lambda: print('Exiting program'))
    +

    V C++ je časté přetěžování funkcí (včetně signálů), což Pythonistům občas ztěžuje život. +PyQt většinou automaticky vybere variantu signálu podle připojené funkce, ale ne vždy je to možné.

    +

    Ukažme si to na následujícím kódu, který napojuje funkci print na dvě varianty signálu QComboBox.activated. +Ten se vyšle při výběru položky ze seznamu buď jako QComboBox.activated[int], kdy předává index vybrané položky, +nebo jako QComboBox.activated[str], kdy předává text položky:

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +# QComboBox - políčko pro výběr z několika možností
    +box = QtWidgets.QComboBox()
    +box.addItem('First Option')
    +box.addItem('Second Option')
    +
    +# Základní varianta napojí na activated[int]
    +box.activated.connect(print)
    +
    +# Výběr varianty signálu pomocí hranatých závorek
    +box.activated[str].connect(print)
    +box.activated[int].connect(print)
    +
    +box.show()
    +
    +app.exec()
    +

    Skládání GUI

    +

    Základní způsob, jak v Qt vytvářet grafické rozhraní, je skládání funkčních prvků (widgets) do +hierarchie oken, skupin a panelů.

    +

    Základní třída pro funkční prvky, QWidget, dědí z už zmíněného QObject. +Každý QObject může obsahovat potomky (children), a v případě QWidget se potomci vykreslují +jako součást svého rodiče. +Navíc může mít každý widget tzv. layout, který určuje pozici a velikost widgetů, které jsou +do něj přidané.

    +

    Ukažme to v kódu:

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +# Hlavní okno
    +main = QtWidgets.QWidget()
    +main.setWindowTitle('Hello Qt')
    +
    +# Layout pro hlavní okno
    +layout = QtWidgets.QHBoxLayout()
    +main.setLayout(layout)
    +
    +# Nápis
    +label = QtWidgets.QLabel('Click the button to change me')
    +# Přidáním do layoutu se nápis automaticky stane potomkem hlavního okna
    +layout.addWidget(label)
    +
    +# Tlačítko
    +button = QtWidgets.QPushButton('Click me')
    +layout.addWidget(button)
    +
    +# Funkcionalita
    +def change_label():
    +    label.setText('Good job. +100 points.')
    +
    +button.clicked.connect(change_label)
    +
    +# Spuštění
    +main.show()
    +app.exec()
    +

    Zabudovaných layoutů i widgetů existuje spousta, jednodušší +programy stačí „poskládat“ z nich a napojit je na logiku. +Pro složitější programy jsou pak možnosti, jak si widgety přizpůsobit.

    +

    Qt Designer

    +

    Na tomto cvičení si připravíme aplikaci pro editaci dlaždicových map (tile maps) +– obrázků složených z omezené nabídky čtverečků („dlaždic“), +známých mj. ze starých her.

    +

    Aplikace bude mít část s mapou, paletu pro výběr dlaždice ke kreslení a navíc +menu a panel nástrojů pro akce jako ukládání a otevírání souborů:

    +

    Obrázek aplikace

    +

    Vytvářet GUI v kódu je poměrně neefektivní, a tak existuje nástroj, kde si okna můžeme „naklikat“. +Jmenuje se Qt Designer a měli byste ho mít nainstalovaný. +Na školních počítačích se spouští příkazem designer -qt=5.

    +

    Spustíme Designer a vytvoříme v něm nové Main Window. +Do něj si z palety přidáme Scroll Area a doprava vedle něj List Widget. +Poté aplikujeme layout: na volnou plochu okna klikneme pravým tlačítkem a vybereme Lay Out ‣ Horizontally. +(Dá se to udělat i tlačítkem v liště.)

    +

    Pomocí Ctrl+R lze zkontrolovat, jak okno vypadá a jak reaguje na změny velikosti.

    +

    Potom přidáme položku do menu: místo Type Here napíšeme Map a pod něj podobně přidáme položky New a Quit.

    +

    V panelu Property Editor jde měnit vlastnosti jednotlivých prvků. +U skrolovacího okna nastavíme objectName na scrollArea. +U ListWidget nastavíme objectName na palette a sizePolicy ‣ Horizontal na Preferred. +V panelu ActionEditor najdeme položky pro New a Quit a nastavíme jim objectName na actionNew, resp. actionQuit.

    +

    Potom přes pravé tlačítko na nevyužité ploše okna přidáme lištu nástrojů (Add Toolbar) a z panelu +Action Editor do něj akci actionQuit přetáhneme.

    +

    Pomocí Ctrl+R opět zkontrolujeme, jak okno vypadá a jak po nastavení sizePolicy reaguje na změny velikosti.

    +

    V Designeru jde i napojovat signály. V panelu Signal/Slot Editor přidáme tento řádek:

    +
      +
    • Sender: actionQuit
    • +
    • Signal: triggered()
    • +
    • Receiver: MainWindow
    • +
    • Slot: close()
    • +
    +

    Pomocí Ctrl+R jde ověřit, že zavírání okna funguje.

    +

    Návrh okna uložíme do souboru mainwindow.ui.

    +

    Soubor s návrhem jde převést na pythonní zdrojový soubor pomocí programu pyuic5 nebo +ho vždy načíst přímo z programu. +My použijeme druhou variantu, je však dobré o pyuic5 vědět, kdybyste někdy potřebovali +základ pro vytváření UI v kódu (např. na vytvoření sady několika podobných tlačítek v cyklu).

    +

    Načíst .ui soubor z programu do předpřipraveného okna QMainWindow lze pomocí funkce uic.loadUi:

    +
    from PyQt5 import QtWidgets, uic
    +
    +def main():
    +    app = QtWidgets.QApplication([])
    +
    +    window = QtWidgets.QMainWindow()
    +
    +    with open('mainwindow.ui') as f:
    +        uic.loadUi(f, window)
    +
    +    window.show()
    +
    +    return app.exec()
    +
    +main()
    +

    Vlastní widget - Grid

    +

    Qt neobsahuje předpřipravený widget na dlaždicové mapy. Musíme si tedy vyrobit vlastní.

    +

    Mapu budeme reprezentovat jako NumPy matici (viz lekce o NumPy). +Zatím budeme používat dva druhy dlaždic: trávu (v matici reprezentovanou jako 0) a zeď (-1).

    +

    Velikost widgetu se zadává v pixelech. Musíme ho udělat dostatečně velký, aby se do něj vešla všechna políčka mapy. +Velikost jednoho políčka v pixelech zvolíme pro jednoduchost konstantou.

    +

    Souřadnice v Qt jsou v pixelech ve formě (x, y) – klasicky jak jsme zvyklí, x je horizontální souřadnice – +kdežto matice je uložená po políčkách (řádek, sloupec). +Abychom se v tom neztratili, je dobré hned ze začátku udělat funkce pro převod mezi souřadnými systémy +a důsledně rozlišovat (x, y) vs. (row, column).

    +
    CELL_SIZE = 32
    +
    +
    +def pixels_to_logical(x, y):
    +    return y // CELL_SIZE, x // CELL_SIZE
    +
    +
    +def logical_to_pixels(row, column):
    +    return column * CELL_SIZE, row * CELL_SIZE
    +
    +
    +class GridWidget(QtWidgets.QWidget):
    +    def __init__(self, array):
    +        super().__init__()  # musíme zavolat konstruktor předka
    +        self.array = array
    +        # nastavíme velikost podle velikosti matice, jinak je náš widget příliš malý
    +        size = logical_to_pixels(*array.shape)
    +        self.setMinimumSize(*size)
    +        self.setMaximumSize(*size)
    +        self.resize(*size)
    +

    GridWidget vložíme do QScrollArea, kterou jsme si vytvořili v Qt Designeru:

    +
    import numpy
    +
    +    ...
    +
    +    # mapa zatím nadefinovaná rovnou v kódu
    +    array = numpy.zeros((15, 20), dtype=numpy.int8)
    +    array[:, 5] = -1  # nějaká zeď
    +
    +    # získáme oblast s posuvníky z Qt Designeru
    +    scroll_area = window.findChild(QtWidgets.QScrollArea, 'scrollArea')
    +
    +    # dáme do ní náš grid
    +    grid = GridWidget(array)
    +    scroll_area.setWidget(grid)
    +
    +    ...
    +

    Po spuštění aplikace zatím nic nového neuvidíte, maximálně se trochu změní posuvníky. +Potřebujeme ještě zařídit, aby se data z matice vykreslovala do gridu. +Nejlepší je vykreslovat, kdykoliv nás OS (nebo Qt) vyzve, že potřebuje kus okna překreslit: +při prvním zobrazení, odminimalizování okna, ukázání nové části mapy přes scrollování. +Také je zbytečné vykreslovat obrázky mimo oblast, kterou je vidět na obrazovce.

    +

    K tomuto účelu nám poslouží událost (event). +Jak bylo řečeno v úvodu, na rozdíl od signálů a slotů, které zajišťují komunikaci v rámci aplikace, +události vznikají mimo aplikaci. +Jde například o kliknutí myší (mouse*Event), vstup z klávesnice (key*Event) +nebo žádost OS o překreslení okna (paintEvent). +Na poslední jmenovanou událost, paintEvent, teď budeme reagovat.

    +

    Události se obsluhují předefinováním příslušné metody, která jako argument bere objekt popisující +danou událost.

    +

    V rámci reakce na událost paintEvent můžeme používat QPainter, objekt, který generalizuje kreslení +na různé „povrchy“ jako widgety, obrázky, nebo i instrukce pro tiskárnu.

    +
    from PyQt5 import QtWidgets, QtGui, QtCore, uic
    +
    +
    +class GridWidget(QtWidgets.QWidget):
    +
    +    ...
    +
    +    def paintEvent(self, event):
    +        rect = event.rect()  # získáme informace o překreslované oblasti
    +
    +        # zjistíme, jakou oblast naší matice to představuje
    +        # nesmíme se přitom dostat z matice ven
    +        row_min, col_min = pixels_to_logical(rect.left(), rect.top())
    +        row_min = max(row_min, 0)
    +        col_min = max(col_min, 0)
    +        row_max, col_max = pixels_to_logical(rect.right(), rect.bottom())
    +        row_max = min(row_max + 1, self.array.shape[0])
    +        col_max = min(col_max + 1, self.array.shape[1])
    +
    +        painter = QtGui.QPainter(self)  # budeme kreslit
    +
    +        for row in range(row_min, row_max):
    +            for column in range(col_min, col_max):
    +                # získáme čtvereček, který budeme vybarvovat
    +                x, y = logical_to_pixels(row, column)
    +                rect = QtCore.QRectF(x, y, CELL_SIZE, CELL_SIZE)
    +
    +                # šedá pro zdi, zelená pro trávu
    +                if self.array[row, column] < 0:
    +                    color = QtGui.QColor(115, 115, 115)
    +                else:
    +                    color = QtGui.QColor(0, 255, 0)
    +
    +                # vyplníme čtvereček barvou
    +                painter.fillRect(rect, QtGui.QBrush(color))
    +

    Nyní by již mapa měla být v okně vidět barevně.

    +

    Obrázky

    +

    Protože barvičky jsou příliš nudné, přidáme do mapového widgetu obrázky.

    +

    Veškerou, ke cvičení i k úkolu potřebnou, grafiku najdete na GitHubu. +Je k dispozici pod public domain (tj. „dělej si s tím, co chceš“), pochází ze studia Kenney +a je (společně se další volně licencovanou grafikou) ke stažení z OpenGameArt.org.

    +

    Zatím budeme potřebovat jen dva obrázky:

    + +

    Nejprve si načteme SVG soubory jako objekty QSvgRenderer:

    +
    from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg, uic
    +
    +SVG_GRASS = QtSvg.QSvgRenderer('grass.svg')
    +SVG_WALL = QtSvg.QSvgRenderer('wall.svg')
    +

    A poté je na správných místech vyrendrujeme:

    +
                    ...
    +                rect = QtCore.QRectF(x, y, CELL_SIZE, CELL_SIZE)
    +
    +                # podkladová barva pod poloprůhledné obrázky
    +                white = QtGui.QColor(255, 255, 255)
    +                painter.fillRect(rect, QtGui.QBrush(white))
    +
    +                # trávu dáme všude, protože i zdi stojí na trávě
    +                SVG_GRASS.render(painter, rect)
    +
    +                # zdi dáme jen tam, kam patří
    +                if self.array[row, column] < 0:
    +                    SVG_WALL.render(painter, rect)
    +

    Model/View

    +

    Nyní trochu odbočíme a povíme si krátce o dalším podsystému Qt: o modelech.

    +

    Qt obsahuje framework, který mapuje informace do podoby tabulek, seznamů nebo obecných stromů. +Vzniklé modely se potom dají zobrazit ve specializovaných widgetech. +Samotná data můžou být uložena kdekoli – v paměti, SQL databázi, souborech a podobně. +Dokonce nemusí být všechna dostupná: existuje vestavěný model pro souborový systém, +který se dá zobrazit aniž by se procházely všechny soubory. +Když je informace potřeba, model se postará o její načtení. +Pomocí modelů a modelových widgetů lze informace i měnit, a pokud je model +zobrazen ve více widgetech zároveň, změny se projeví ve všech.

    +

    Obecné modely je bohužel relativně obtížné implementovat v Pythonu, protože používají třídy, +které nedědí z QObject, takže je potřeba sledovat, jestli je „vlastní“ Python nebo C++. +Naštěstí ale existují widgety se zabudovanými modely, které obsahují i samotná data. +Tyto modely je složitější napojit na existující aplikační logiku, ale pro většinu účelů postačí.

    +

    O obecných modelech si můžete přečíst v dokumentaci.

    +

    QListWidget - Paleta

    +

    Jeden z widgetů se zabudovaným modelem je QListWidget, který umí spravovat a zobrazovat +nějaký seznam. +My jsme si v Qt Designeru připravili QListWidget s názvem palette, který použijeme +jako paletu jednotlivých dílků, které budeme moci vkládat do mapy. +Položky se do tohoto modelu přidávají následovně:

    +
    def main():
    +    ...
    +
    +    # získáme paletu vytvořenou v Qt Designeru
    +    palette = window.findChild(QtWidgets.QListWidget, 'palette')
    +
    +    item = QtWidgets.QListWidgetItem('Grass')  # vytvoříme položku
    +    icon = QtGui.QIcon('grass.svg')  # ikonu
    +    item.setIcon(icon)  # přiřadíme ikonu položce
    +    palette.addItem(item)  # přidáme položku do palety
    +

    Stejným způsobem lze do palety přidat další položky: kromě trávy budeme na toto +cvičení potřebovat i stěnu. +Protože v úkolu bude položek více, je lepší si na to vytvořit funkci či metodu. +To necháme na vás.

    +

    Zatím jsme vytvořili paletu, ve které uživatel může položky vybírat. +Výběr položky aktivuje signál itemSelectionChanged, na který můžeme +navázat volání funkce. +(Pokud bychom měli pod kontrolou třídu widgetu, jako tomu je u třídy Grid, +mohli bychom místo toho i předefinovat metodu itemSelectionChanged().)

    +
    def main():
    +    ...
    +
    +    def item_activated():
    +        """Tato funkce se zavolá, když uživatel zvolí položku"""
    +
    +        # Položek může obecně být vybráno víc, ale v našem seznamu je to
    +        # zakázáno (v Designeru selectionMode=SingleSelection).
    +        # Projdeme "všechny vybrané položky", i když víme že bude max. jedna.
    +        for item in palette.selectedItems():
    +            row_num = palette.indexFromItem(item).row()
    +            print(row_num)
    +
    +    palette.itemSelectionChanged.connect(item_activated)
    +

    Nyní, když uživatel zvolí položku, vypíše se do konzole její pořadí. +Nás by ale spíš zajímalo, jak bude tato položka reprezentována v matici s mapou. +K položce v paletě můžeme uložit informace pomocí item.setData(<role>, <data>). +Rolí pro informace je spousta a několik z nich Qt používá pro vykreslování. +Pro vlastní data můžeme použít QtCore.Qt.UserRole. +V případě potřeby ukládat více dat můžeme dále zvolit QtCore.Qt.UserRole + 1 atd. +Pro případ, že budeme potřebovat rolí víc, je dobré si je vhodně pojmenovat.

    +
    VALUE_ROLE = QtCore.Qt.UserRole
    +
    +def main():
    +    ...
    +    self.palette.addItem(item)  # přidáme položku do palety
    +    item.setData(VALUE_ROLE, -1)  # přiřadíme jí data
    +    ...
    +
    +    def item_activated():
    +        for item in palette.selectedItems():
    +            print(item.data(VALUE_ROLE))  # čteme data stejné role z položky
    +

    Nyní byste měli mít v paletě trávu a stěnu s patřičnými čísly (0 a -1), které se vypisují do konzole při zvolení položky.

    +

    Nakonec si číslo místo vypisování uložíme do gridu, abychom ho mohli později použít.

    +
        def item_activated():
    +        for item in palette.selectedItems():
    +            grid.selected = item.data(VALUE_ROLE)
    +

    Klikání do gridu

    +

    Nyní nezbývá nic jiného, než pomocí klikání nanášet zvolené dílky do mapy. +K tomu opět použijeme událost, tentokrát událost kliknutí, tedy mousePressEvent.

    +
    class GridWidget(QtWidgets.QWidget):
    +    ...
    +
    +    def mousePressEvent(self, event):
    +        # převedeme klik na souřadnice matice
    +        row, column = pixels_to_logical(event.x(), event.y())
    +
    +        # Pokud jsme v matici, aktualizujeme data
    +        if 0 <= row < self.array.shape[0] and 0 <= column < self.array.shape[1]:
    +            self.array[row, column] = self.selected
    +
    +            # tímto zajistíme překreslení widgetu v místě změny:
    +            # (pro Python 3.4 a nižší volejte jen self.update() bez argumentů)
    +            self.update(*logical_to_pixels(row, column), CELL_SIZE, CELL_SIZE)
    +

    Zde víme, že kliknutí může změnit vykreslenou mapu pouze v místě kliknutí. +Pokud by ale kliknutí na určité políčko mohlo změnit obsah mapy někde jinde, +je lepší zavolat self.update() bez argumentů a říct tak systému, že se má překreslit celý widget.

    +

    Protože po spuštění aplikace není zvolena žádná položka a self.selected není definován, je rozumné prostě nějakou položku zvolit:

    +
    # Za přidáním položek do palety a napojení signálu
    +palette.setCurrentRow(1)
    +

    Více tlačítek myši

    +

    Můžete si vyzkoušet, že se mapa mění při použití jakéhokoliv tlačítka myši. +Je to proto, že mousePressEvent se stane, kdykoli na widgetu stiskneme libovolné tlačítko. +Pokud bychom chtěli řešit pouze levé (primární) tlačítko, můžeme zjistit, které tlačítko událost vyvolalo:

    +
                if event.button() == QtCore.Qt.LeftButton:
    +                self.array[row, column] = self.selected
    +            else:
    +                return
    +            self.update(*logical_to_pixels(row, column), CELL_SIZE, CELL_SIZE)
    +

    Na pravé tlačítko myši můžeme namapovat funkci mazání:

    +
                elif event.button() == QtCore.Qt.RightButton:
    +                self.array[row, column] = 0
    +

    Tažení myši

    +

    Pro splnění úkolu bude stačit objekty mazat a klást pomocí klikání na jednotlivá políčka. +Pokud však chcete poskytnout uživateli větší komfort, prozkoumejte další události +a můžete políčka nanášet/mazat i při kliknutí a táhnutí. +(Možná tu narazíte na problém, kdy se při příliš rychlém pohybu myši generují události +pro body příliš daleko od sebe. +Když program nestíhá, OS nebo Qt spojuje víc událostí pohybu myši dohromady a posílá +jen jednu poslední. +Jednotlivé body můžete spojit čárou pomocí knihovny bresenham.)

    +

    Menu a modální dialog

    +

    Naše aplikace bude umět vytvořit novou, prázdnou mapu. +Ukážeme si, jak vytvořit modální dialog pro volby (šířka a výška nové mapy). +„Modální dialog“ znamená okno, které musí uživatel zavřít, než může pracovat se zbytkem aplikace.

    +

    Layout okna nejprve naklikáme v Qt Designeru:

    +
      +
    1. Po spuštění zvolíme Dialog with Buttons Bottom a Create.
    2. +
    3. Přes pravé tlačítko pro dialog zvolíme Lay Out ‣ Vertically.
    4. +
    5. Nad tlačítka Cancel a OK přetáhneme z Widet Box Form Layout (layouty lze takto přímo vnořovat).
    6. +
    7. Do něj přetáhneme postupně dvakrát Label a Spin Box, abychom vytvořili formulář.
    8. +
    9. Přejmenujeme v panelu Property Editor jednotlivé přidané položky tak, aby dávaly v kódu smysl (widthBox, heightBox).
    10. +
    11. Poklikáním na Labely změníme jejich text.
    12. +
    13. Nastavíme v panelu Property Editor rozumné limity a výchozí hodnoty pro Spin Boxy.
    14. +
    15. Okno případně zmenšíme, aby nebylo zbytečně velké.
    16. +
    17. V menu zvolíme Edit ‣ Edit Buddies a táhnutím z Labelu na Spin Box nastavíme, ke kterému prvku se Label vztahuje.
    18. +
    19. V menu zvolíme Edit ‣ Edit Tab Order a zkontrolujeme, že pořadí, ve kterém bude prvky vybírat klávesa Tab, je rozumné.
    20. +
    21. Můžeme se vrátit zpět na Edit ‣ Edit Widgets.
    22. +
    23. Dialog uložíme jako newmaze.ui.
    24. +
    +

    Poté připravíme funkci pro zobrazení dialogu a pro jeho vyhodnocení:

    +
    def new_dialog(window, grid):
    +    # Vytvoříme nový dialog.
    +    # V dokumentaci mají dialogy jako argument `this`;
    +    # jde o "nadřazené" okno.
    +    dialog = QtWidgets.QDialog(window)
    +
    +    # Načteme layout z Qt Designeru.
    +    with open('newmaze.ui') as f:
    +        uic.loadUi(f, dialog)
    +
    +    # Zobrazíme dialog.
    +    # Funkce exec zajistí modalitu (tzn. nejde ovládat zbytek aplikace,
    +    # dokud je dialog zobrazen) a vrátí se až potom, co uživatel dialog zavře.
    +    result = dialog.exec()
    +
    +    # Výsledná hodnota odpovídá tlačítku/způsobu, kterým uživatel dialog zavřel.
    +    if result == QtWidgets.QDialog.Rejected:
    +        # Dialog uživatel zavřel nebo klikl na Cancel.
    +        return
    +
    +    # Načtení hodnot ze SpinBoxů
    +    cols = dialog.findChild(QtWidgets.QSpinBox, 'widthBox').value()
    +    rows = dialog.findChild(QtWidgets.QSpinBox, 'heightBox').value()
    +
    +    # Vytvoření nové mapy
    +    grid.array = numpy.zeros((rows, cols), dtype=numpy.int8)
    +
    +    # Mapa může být jinak velká, tak musíme změnit velikost Gridu;
    +    # (tento kód používáme i jinde, měli bychom si na to udělat funkci!)
    +    size = logical_to_pixels(rows, cols)
    +    grid.setMinimumSize(*size)
    +    grid.setMaximumSize(*size)
    +    grid.resize(*size)
    +
    +    # Překreslení celého Gridu
    +    grid.update()
    +
    +
    +def main():
    +    ...
    +
    +
    +     # Napojení signálu actionNew.triggered
    +
    +    action = window.findChild(QtWidgets.QAction, 'actionNew')
    +    action.triggered.connect(lambda: new_dialog(window, grid))
    +

    Další dialogy, které budeme potřebovat, jsou tak rozšířené (a mezi jednotlivými platformami tak různé), +že je Qt má předpřipravené. +Jsou to dialogy pro ukázání hlášky, výběr souboru, barvy nebo fontu nebo pro nastavení tisku.

    +

    Tyto předpřipravené dialogy mají typicky statické metody, které dialog vytvoří a přímo zavolají +exec() a vrátí výsledek.

    +

    Pro splnění úkolu (dalších položek v menu) se vám můžou hodit tyto dialogy:

    + +

    Třída pro GUI aplikace

    +

    Funkce main se nám pomalu rozrůstá a další funkce, které volá, musí být buď definované v ní (jako item_activated) +nebo musí brát relativně hodně argumentů (jako new_dialog). +Abychom si zjednodušili práci, můžeme logiku místo do funkce dát do třídy, ve které si důležité prvky +uložíme do atributů (self.grid, self.window, self.app atd.). +Doporučujeme udělat přípravu v __init__ a volání window.show() a return app.exec() dát do metody run.

    +

    A to je zatím vše! +Další vylepšení budete mít za úkol – nebo si aplikaci přetvořte podle svého uvážení.

    \ No newline at end of file diff --git a/mi-pyt/pyqt/pics/README/index.md b/mi-pyt/pyqt/pics/README/index.md new file mode 100644 index 00000000..02a24503 --- /dev/null +++ b/mi-pyt/pyqt/pics/README/index.md @@ -0,0 +1,11 @@ +These images were created by the [Kenney] studio, and were kindly released into +the Public Domain. +They can be downloaded from [OpenGameArt.org]. + +Thank you! + +[Kenney]: http://kenney.nl/ +[OpenGameArt.org]: http://opengameart.org/users/kenney + +The shark image was adapted from a fish image by Miro Hrončok and is released +into the Public Domain as well. diff --git a/mi-pyt/pyqt/pics/arrows/down.svg b/mi-pyt/pyqt/pics/arrows/down.svg new file mode 100644 index 00000000..6f0b270b --- /dev/null +++ b/mi-pyt/pyqt/pics/arrows/down.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/arrows/left.svg b/mi-pyt/pyqt/pics/arrows/left.svg new file mode 100644 index 00000000..2341affe --- /dev/null +++ b/mi-pyt/pyqt/pics/arrows/left.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/arrows/right.svg b/mi-pyt/pyqt/pics/arrows/right.svg new file mode 100644 index 00000000..00d20cec --- /dev/null +++ b/mi-pyt/pyqt/pics/arrows/right.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/arrows/up.svg b/mi-pyt/pyqt/pics/arrows/up.svg new file mode 100644 index 00000000..f88b60d7 --- /dev/null +++ b/mi-pyt/pyqt/pics/arrows/up.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/castle.svg b/mi-pyt/pyqt/pics/castle.svg new file mode 100644 index 00000000..2c4d0ec2 --- /dev/null +++ b/mi-pyt/pyqt/pics/castle.svg @@ -0,0 +1,130 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/dude1.svg b/mi-pyt/pyqt/pics/dude1.svg new file mode 100644 index 00000000..0badb730 --- /dev/null +++ b/mi-pyt/pyqt/pics/dude1.svg @@ -0,0 +1,120 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/dude2.svg b/mi-pyt/pyqt/pics/dude2.svg new file mode 100644 index 00000000..e47c48cc --- /dev/null +++ b/mi-pyt/pyqt/pics/dude2.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/dude3.svg b/mi-pyt/pyqt/pics/dude3.svg new file mode 100644 index 00000000..97ceec2c --- /dev/null +++ b/mi-pyt/pyqt/pics/dude3.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/dude4.svg b/mi-pyt/pyqt/pics/dude4.svg new file mode 100644 index 00000000..9aaba3b6 --- /dev/null +++ b/mi-pyt/pyqt/pics/dude4.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/dude5.svg b/mi-pyt/pyqt/pics/dude5.svg new file mode 100644 index 00000000..627c4616 --- /dev/null +++ b/mi-pyt/pyqt/pics/dude5.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/fish.svg b/mi-pyt/pyqt/pics/fish.svg new file mode 100644 index 00000000..ec3322b2 --- /dev/null +++ b/mi-pyt/pyqt/pics/fish.svg @@ -0,0 +1,97 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/fish2.svg b/mi-pyt/pyqt/pics/fish2.svg new file mode 100644 index 00000000..a8b38daa --- /dev/null +++ b/mi-pyt/pyqt/pics/fish2.svg @@ -0,0 +1,97 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/grass.svg b/mi-pyt/pyqt/pics/grass.svg new file mode 100644 index 00000000..dd68d54b --- /dev/null +++ b/mi-pyt/pyqt/pics/grass.svg @@ -0,0 +1,84 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/1.svg b/mi-pyt/pyqt/pics/lines/1.svg new file mode 100644 index 00000000..887b0960 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/1.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/10.svg b/mi-pyt/pyqt/pics/lines/10.svg new file mode 100644 index 00000000..e86ebe4c --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/10.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/11.svg b/mi-pyt/pyqt/pics/lines/11.svg new file mode 100644 index 00000000..c9cd02d9 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/11.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/12.svg b/mi-pyt/pyqt/pics/lines/12.svg new file mode 100644 index 00000000..20a23c92 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/12.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/13.svg b/mi-pyt/pyqt/pics/lines/13.svg new file mode 100644 index 00000000..7251a739 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/13.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/14.svg b/mi-pyt/pyqt/pics/lines/14.svg new file mode 100644 index 00000000..c56c30cb --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/14.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/15.svg b/mi-pyt/pyqt/pics/lines/15.svg new file mode 100644 index 00000000..d5b31fa6 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/15.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/2.svg b/mi-pyt/pyqt/pics/lines/2.svg new file mode 100644 index 00000000..1904b3ac --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/2.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/3.svg b/mi-pyt/pyqt/pics/lines/3.svg new file mode 100644 index 00000000..2374249e --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/3.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/4.svg b/mi-pyt/pyqt/pics/lines/4.svg new file mode 100644 index 00000000..bc827c71 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/4.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/5.svg b/mi-pyt/pyqt/pics/lines/5.svg new file mode 100644 index 00000000..ff303510 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/5.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/6.svg b/mi-pyt/pyqt/pics/lines/6.svg new file mode 100644 index 00000000..780819b6 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/6.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/7.svg b/mi-pyt/pyqt/pics/lines/7.svg new file mode 100644 index 00000000..fba19418 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/7.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/8.svg b/mi-pyt/pyqt/pics/lines/8.svg new file mode 100644 index 00000000..c2c78902 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/8.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/lines/9.svg b/mi-pyt/pyqt/pics/lines/9.svg new file mode 100644 index 00000000..b9098914 --- /dev/null +++ b/mi-pyt/pyqt/pics/lines/9.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/shark.svg b/mi-pyt/pyqt/pics/shark.svg new file mode 100644 index 00000000..533812b0 --- /dev/null +++ b/mi-pyt/pyqt/pics/shark.svg @@ -0,0 +1,57 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/wall.svg b/mi-pyt/pyqt/pics/wall.svg new file mode 100644 index 00000000..6931307f --- /dev/null +++ b/mi-pyt/pyqt/pics/wall.svg @@ -0,0 +1,94 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/wall2.svg b/mi-pyt/pyqt/pics/wall2.svg new file mode 100644 index 00000000..b68d8a88 --- /dev/null +++ b/mi-pyt/pyqt/pics/wall2.svg @@ -0,0 +1,94 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/mi-pyt/pyqt/pics/water.svg b/mi-pyt/pyqt/pics/water.svg new file mode 100644 index 00000000..eaa590cd --- /dev/null +++ b/mi-pyt/pyqt/pics/water.svg @@ -0,0 +1,71 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/mi-pyt/requests/index.html b/mi-pyt/requests/index.html new file mode 100644 index 00000000..574c8133 --- /dev/null +++ b/mi-pyt/requests/index.html @@ -0,0 +1,153 @@ +

    Requests

    +

    Knihoven pro HTTP klienty (tedy “programy, které stahují webové stránky“) +je celá řada. +Jedna z nich, urllib.request, je dokonce součástí standardní knihovny Pythonu. +Pokud tedy budete chtít HTTP používat a seznam závislostí +svého projektu nemůžete rozšířit o další knihovnu, jde to.

    +

    Mnohem snáze se vám ale bude pracovat s knihovnou Requests, +která má mnohem “lidštější” rozhraní a používá se mnohem jednodušeji. +Rozdíl je největší u pokročilejších vlastností +jako cookies, autentizace nebo sdílení spojení (Keep-alive), +které s Requests zvládnete i bez detailních znalostí protokolu HTTP.

    +

    Dokonce i v dokumentaci modulu urllib se píše: +The Requests package is recommended for a higher-level HTTP +client interface. +Zaměříme se tedy na Requests hned od začátku.

    +

    Knihovna Requests se instaluje standardním způsobem:

    +
    $ python -m pip install requests
    +

    Budeme předpokládat, že znáte alespoň základy HTTP protokolu, +a vrhneme se rovnou na příklad.

    +

    Pokud základy neznáte, můžete se podívat na +shrnutí pro začátečníky, +které vysvětluje vše potřebné.

    +
    >>> import getpass
    +>>> import requests
    +>>> username = input('Username: ')
    +Username: hroncok
    +>>> password = getpass.getpass()
    +Password: 
    +>>> r = requests.get('https://api.github.com/user', auth=(username, password))
    +>>> r.status_code
    +200
    +>>> r.headers['content-type']
    +'application/json; charset=utf8'
    +>>> r.encoding
    +'utf-8'
    +>>> r.text
    +'{"login":"hroncok"...'
    +>>> r.json()
    +{'avatar_url': 'https://avatars.githubusercontent.com/u/2401856?v=3', ...}
    +

    Tento příklad pracuje přímo se jménem a heslem. +To se většinou nedělá a webové API to často ani nepodporují. +Pokud na GitHub používáte dvoufaktorovou autentizaci, příklad nebude fungovat.

    +

    Příklady použití pro další HTTP metody najdete v dokumentaci.

    +

    Použití session

    +

    Hlavně v budoucnu se nám bude hodit použití tzv. +session.

    +

    Session má několik výhod. +První je, že využívá na pozadí jedno otevřené HTTP spojení a poskytuje tak +při více sousledných požadavcích výrazné zrychlení.

    +

    Dále pak session automaticky ukládá cookies a je možné u ní nastavit výchozí +hlavičky.

    +

    Zkuste si cookies vyzkoušet s httpbin.org – službou +k testování HTTP dotazů:

    +
    >>> session = requests.Session()
    +>>> session.get('http://httpbin.org/cookies/set/mipyt/best')
    +<Response [200]>
    +>>> r = session.get('http://httpbin.org/cookies')
    +>>> r.json()
    +{'cookies': {'mipyt': 'best'}}
    +>>> session.headers.update({'x-test': 'true'})
    +>>> r = session.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
    +>>> r.json()
    +{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Cookie': 'mipyt=best', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.19.1', 'X-Test': 'true', 'X-Test2': 'true'}}
    +

    GitHub API

    +

    Podíváme se teď, podobně jako v úvodním příkladu, na GitHub API, +které má poměrně jednoduchou autentizaci (od GitHubu přímo +získáte token). Stačí jít do nastavení a vyrobit nový token +(zatím není třeba zaškrtávat žádná oprávnění).

    +

    Ochrana přihlašovacích tokenů

    +

    Váš token je něco jako vaše heslo. +Nikomu je nesmíte ukazovat a nesmíte jej dát do Gitu. +Stane-li se přesto, že se k němu dostane někdo nepovolaný, +můžete jej v nastavení opět smazat.

    +

    Pomocí tokenu můžete z GitHubu získávat informace. +Prozatím token nastavte do proměnné, později jej schováme například do +konfiguračního souboru.

    +

    Tímto kódem lze například získat popis přihlášeného uživatele, tedy sebe sama.

    +
    >>> token = 'd7313dab254b7fd0d0f3ec3cbf754b3abce462d5'
    +>>> session = requests.Session()
    +>>> session.headers = {'User-Agent': 'Python'}
    +>>> def token_auth(req):
    +...     req.headers['Authorization'] = f'token {token}'
    +...     return req
    +... 
    +>>> session.auth = token_auth
    +>>> r = session.get('https://api.github.com/user')
    +>>> r.json()
    +

    Funkce session.auth v příkladu výše je autentizační funkce, +která nějakým způsobem modifikuje HTTP požadavek za účelem autentizace, +většinou přidává specifické hlavičky (jak je tomu i zde). +Lze ji nastavit buďto na celé session nebo předat argumentem auth s každým +požadavkem.

    +

    Existují předpřipravené funkce v modulu requests.auth, například +requests.auth.HTTPBasicAuth provádí základní HTTP přihlášení. +Dle specifikace zakóduje jméno a heslo pomocí +algoritmu base64 a přidá hlavičku Authorization.

    +

    Základní HTTP přihlášení +je tak běžné, že pro něj Requests mají zkratku – +místo HTTPBasicAuth se dá použít i dvojice (jméno, heslo):

    +
    >>> requests.get('https://httpbin.org/basic-auth/AzureDiamond/hunter2',
    +                 auth=requests.auth.HTTPBasicAuth('AzureDiamond', 'hunter2'))
    +>>> 
    +>>> requests.get('https://httpbin.org/basic-auth/AzureDiamond/hunter2',
    +                 auth=('AzureDiamond', 'hunter2'))
    +

    Všimněte si také hlavičky User-Agent. +Ta je potřeba při komunikaci s GitHub API explicitně nastavit. +Nastavení na objektu session zajistí, že tato hlavička +bude ve všech požadavcích.

    +

    Pokud budete chtít něco provést, například dát hvězdičku repozitáři s těmito +materiály, musíte tokenu nastavit patřičné oprávnění +(u hvězdičky je to public_repo). +To se dělá přes nastavení na GitHubu.

    +

    Hvězdičku pak přidáte takto:

    +
    >>> r = session.put('https://api.github.com/user/starred/pyvec/naucse.python.cz')
    +>>> r.text
    +''
    +

    Jak vidíte, API nevrací žádný text (žádné tělo odpovědi). +Můžete ale zkontrolovat návratový stav:

    +
    >>> r.status_code
    +204
    +

    Případně vyhodit výjimku, pokud je stavový kód divný (např 404 Nenalezeno, +401 Chybí oprávnění apod.):

    +
    >>> r.raise_for_status()
    +

    Pokud hvězdičku chcete odebrat, použijte metodu DELETE. +My ale věříme, že ji odebrat nechcete :)

    +

    Dokumentace ke GitHub API.

    +

    Chraňte své tokeny

    +

    Když ukládáte skript do gitu, mějte na paměti, že tokeny a klíče do něj nikdy +nepatří. Můžete je uložit do konfiguračního souboru, který bude gitem ignorován, +například takhle:

    +
    [github]
    +token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
    +

    A následně konfiguraci načtete pomocí modulu +configparser:

    +
    >>> import configparser
    +>>> config = configparser.ConfigParser()
    +>>> with open('auth.cfg') as f:
    +...     config.read_file(f)
    +>>> config['github']['token']
    +'d7313dab254b7fd0d0f3ec3cbf754b3abce462d5'
    +

    Do souboru .gitignore pak musíte přidat název ignorovaného souboru, např.:

    +
    auth.cfg
    +
    +

    Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže +ve výstupu git status.

    +

    Jelikož ostatní tento konfigurační soubor neuvidí, +je vhodné jim vysvětlit, jak takový soubor (s jejich údaji) vytvořit. +Můžete například vložit do gitu soubor auth.cfg.sample +s vymyšlenými údaji, či příklad uvést v README.

    +

    ConfigParser změní velikost písmen klíčů z konfiguračního souboru na malá. +Pokud potřebujete, aby byly klíče přesně tak, jak jsou v souboru, musíte +před načtením nastavit config.optionxform = str.

    +
    \ No newline at end of file diff --git a/mi-pyt/testing/index.html b/mi-pyt/testing/index.html new file mode 100644 index 00000000..2291b0a2 --- /dev/null +++ b/mi-pyt/testing/index.html @@ -0,0 +1,564 @@ +

    Testování

    +

    V tomto cvičení se budeme zabývat automatickým testováním kódu. +Modul unittest ze standardní knihovny už byste měli znát, +co to jsou jednotkové testy a k čemu slouží tedy rovnou přeskočím.

    +

    Pokud základy testování neznáte, projděte si +začátečnickou lekci o testování. +Obsah se zčásti překrývá, ale základní principy jsou tam vysvětleny trošku +podrobněji.

    +

    Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový +zápisek Michala Hořejška.

    +

    pytest

    +

    Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu +unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday +z cvičení o modulech.

    +
    import isholiday
    +
    +def test_xmas_2016():
    +    """Test whether there is Christmas in 2016"""
    +    holidays = isholiday.getholidays(2016)
    +    assert (24, 12) in holidays
    +

    Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a +nainstalujeme a spustíme pytest:

    +
    (__venv__) $ python -m pip install pytest
    +(__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py .                                                 [100%]
    +
    +=========================== 1 passed in 0.01 seconds ===========================
    +

    Všimněte si několika věcí:

    +
      +
    • V testovacím souboru stačí mít funkci pojmenovanou test_* a pytest pozná, +že se jedná o test.
    • +
    • V ukázce je použit obyčejný assert, nikoliv metoda z unittest.
    • +
    +

    Co se má testovat, se pytestu dá zadat pomocí argumentů příkazové řádky. +Můžou to být jednotlivé soubory nebo adresáře, ve kterých pytest +rekurzivně hledá všechny soubory začínající na test_. +Vynecháme-li argumenty úplně, hledá rekurzivně v aktuálním adresáři. +(To se často hodí, ale obsahuje-li aktuální adresář i vaše virtuální prostředí, +pytest prohledá i to a často v něm najde neprocházející testy.)

    +

    Pokud pytest nemůže naimportovat váš modul, můžete udělat několik věcí:

    +
      +
    • Nainstalovat svůj balíček (například v režimu develop).
    • +
    • Nastavit proměnnou prostředí PYTHONPATH na ..
    • +
    +

    Testovat nainstalovaný balíček je výhodnější – ověříte zároveň, že +nainstalovaný modul se chová dle očekávání. Je dobré testy psát tak, aby +šly spouštět z jakéhokoliv adresáře, a pro jistotu je spouštět odjinud, +než z adresáře s kódem. Odhalíte tím často balíčkovací chyby.

    +

    Pytest upravuje chování assertu, což oceníte především, pokud test selže:

    +
        ...
    +    assert (23, 12) in holidays
    +
    (__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py F                                                 [100%]
    +
    +=================================== FAILURES ===================================
    +________________________________ test_xmas_2016 ________________________________
    +
    +    def test_xmas_2016():
    +        """Test whether there is Christmas in 2016"""
    +        holidays = isholiday.getholidays(2016)
    +>       assert (23, 12) in holidays
    +E       assert (23, 12) in {(1, 1), (1, 5), (5, 7), (6, 7), (8, 5), (17, 11), ...}
    +
    +tests/test_holidays.py:6: AssertionError
    +=========================== 1 failed in 0.02 seconds ===========================
    +

    S obyčejným assertem si vystačíte pro většinu testovaných případů kromě +ověření vyhození výjimky. To se dělá takto:

    +
    import pytest
    +
    +def f():
    +    raise SystemExit(1)
    +
    +def test_mytest():
    +    with pytest.raises(SystemExit):
    +        f()
    +

    Více o základním použití pytestu najdete v dokumentaci.

    +

    Parametrické testy

    +

    Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. +Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen +v roce 2016, ale v jiných letech, nemusíme psát testů více, ani použít cyklus.

    +

    Nevýhoda více téměř stejných testů je patrná sama o sobě, nevýhoda cyklu je +v tom, že celý test selže, i pokud selže jen jeden průběh cyklem. Zároveň se +průběh testu při selhání ukončí.

    +

    Místo toho tedy použijeme parametrický test:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +def test_xmas(year):
    +    """Test whether there is Christmas"""
    +    holidays = isholiday.getholidays(year)
    +    assert (24, 12) in holidays
    +

    Zápis je určitým způsobem podobný knihovně click: funkce +s testem přijímá parametr vytvořený v dekorátoru. +Test se spustí pro každou uvedenou hodnotu, k jejich definici lze použít +jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité +n-tice např. seznam, množinu, range, vlastní generátor...

    +

    Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

    +
    (__venv__) $ python -m pytest -v
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] PASSED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] PASSED                           [100%]
    +
    +=========================== 5 passed in 0.02 seconds ===========================
    +

    Jednoduchým způsobem tak lze vyrobit z jednoho testu testů více. +Výhodou je, že každý se testuje zvlášť, což má vliv na čitelnost +výstupu, pokud nějaký test selže, a umožňuje to například testy pouštět +paralelně nebo distribuovaně. (Což s jedním testem, který více podmínek ověřuje +v cyklu, nejde, tedy alespoň ne jednoduše.)

    +

    Potřebujeme-li parametrizovat více argumentů, můžeme předat seznam jmen +argumentů a seznam jejich hodnot:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize(
    +    ['year', 'month', 'day'],
    +    [(2015, 12, 24),
    +     (2016, 12, 24),
    +     (2017, 1, 1),
    +     (2033, 7, 5),
    +     (2048, 7, 6)],
    +)
    +def test_some_holidays(year, month, day):
    +    """Test a few sample holidays"""
    +    holidays = isholiday.getholidays(year)
    +    assert (day, month) in holidays
    +

    Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, +abychom se ujistili, že testujeme správně. +Přidáme tedy dočasně na konec funkce getholidays() tento pesimistický kus kódu:

    +
        if year > 2020:
    +        # After the Zygon war, the puppet government canceled all holidays
    +        holidays = set()
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] FAILED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] FAILED                           [100%]
    +
    +=================================== FAILURES ===================================
    +_______________________________ test_xmas[2033] ________________________________
    +
    +year = 2033
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +_______________________________ test_xmas[2048] ________________________________
    +
    +year = 2048
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +====================== 2 failed, 3 passed in 0.03 seconds ======================
    +

    Fixtures

    +

    Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, +abyste získali to, co teprve chcete testovat. Příkladem může být například +inicializace objektu pro komunikaci s nějakým API.

    +

    V pytestu k tomuto účelu nejlépe slouží tz. fixtures, které se v samotných +testech používají jako argumenty funkcí.

    +
    import pytest
    +
    +@pytest.fixture
    +def client():
    +    import twitter
    +    return twitter.Client(...)
    +
    +def test_search_python(client):
    +    tweets = client.search('python', size=1)
    +    assert len(tweets) == 1
    +    assert 'python' in tweets[0].text.lower()
    +

    Fixtures se hledají pomocí jména: když má testovací funkce (nebo i jiná +fixture) parametr, podle jména tohoto parametru se najde odpovídající fixture. +Fixtures můžou být definovány v aktuálním souboru, +v pluginu, +konfiguračním souboru +a některé jsou zabudované přímo v pytestu.

    +

    Pokud potřebujete po použití s fixturou ještě něco udělat, můžete místo return +použít yield. +Často se to používá u zdrojů, které je po použití potřeba nějak finalizovat či +zavřít, například u databázových spojení. +Zde je ilustrační příklad, který si můžete rovnou vyzkoušet:

    +
    import pytest
    +
    +
    +class DBConnection:
    +    def __init__(self, name):
    +        print('Creating connection for ' + name)
    +        ...
    +
    +    def select(self, arg):
    +        return arg
    +
    +    def cleanup(self):
    +        print('Cleaning up connection')
    +        ...
    +
    +
    +@pytest.fixture
    +def connection():
    +    d = DBConnection('sqlite')
    +    yield d
    +    d.cleanup()
    +
    +
    +@pytest.mark.parametrize('arg', (1, float, None))
    +def test_with_fixture(connection, arg):
    +    assert arg == connection.select(arg)
    +

    Standardní výstup (stderr a stdout) z testů se normálně zobrazuje, +jen když test selže. +Chceme-li výstup vidět u všech testů, je třeba použít přepínač -s.

    +

    I fixtury jdou parametrizovat, jen trochu jiným způsobem než testovací funkce: +parametry předané dekorátoru pytest.fixture získáme ze speciálního parametru +request, který obsahuje informace o probíhajícím testu:

    +
    @pytest.fixture(params=('sqlite', 'postgres'))
    +def connection(request):
    +    d = DBConnection(request.param)
    +    yield d
    +    d.cleanup()
    +

    Hromadu dalších příkladů použití pytestu najdete dokumentaci v +sekci s příklady. +Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference +PyCon PL.

    +

    „Podvádění“

    +

    Při psaní testů se občas hodí trochu podvádět. Například když nechceme, +aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na +náhodě a podobně. Obecně se tomuto říká mocking * či test doubles a existuje více různých +knihoven, které to umožňují. Jednou z nich je flexmock.

    +

    * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít +pro funkcionalitu knihoven, které mají v názvu mock :)

    +

    Falešné objekty (fakes)

    +

    Při testování často potřebujeme nějaký objekt, který má určité atributy a +metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

    +
    class FakePlane:
    +    operational = True
    +    model = 'MIG-21'
    +    def fly(self): pass
    +
    +plane = FakePlane()  # this is tedious!
    +

    Flexmock umožňuje vytvoření objektu rychle a jednoduše:

    +
    plane = flexmock(operational=True,
    +                 model='MIG-21',
    +                 fly=lambda: None)
    +

    Částečně upravené objekty, třídy, moduly (stubs)

    +

    Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část +atributů nebo metod:

    +
    >>> import flexmock
    +>>> class Train:
    +...     def get_speed(self):
    +...         return 0
    +... 
    +>>> flexmock(Train, get_speed=200)
    +<flexmock.Mock object at 0x7f88501d8908>
    +>>> train = Train()
    +>>> train.get_speed()
    +200
    +

    Můžete tak zfalšovat i volání builtin funkcí, jako je například open():

    +
    >>> import sys
    +>>> import flexmock
    +>>> import builtins
    +>>> from io import StringIO
    +>>> flexmock(builtins, open=StringIO('fake content'))
    +<module 'builtins' (built-in)>
    +>>> with open('/etc/passwd') as f:
    +...     f.readlines()
    +... 
    +['fake content']
    +

    Očekávání (mocks, spies)

    +

    Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco +zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), +nebo jen sledujete, jestli se zavolala (spies). +(Příklady na odkazu.)

    +

    Integrace s pytestem

    +

    Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená +kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double +ale není nic těžkého a můžete to udělat sami (bez knihovny). +Pro přepsání nějaké metody, funkce apod. na omezenou dobu +můžete využít zabudovanou pytest fixturu +monkeypatch.

    +

    Varování

    +

    Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce +čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud +bude obsahovat daný obsah, musíte si trochu zapodvádět, protože nemůžete vědět, +co v tom souboru je doopravdy na daném systému, v daný čas.

    +

    Je ale jednoduché sklouznout do fáze, kdy jsou vaše testy natolik přemockované, +že už ani neplní svůj účel. Buďto proto, že příliš podvádíte a testy vždy +projdou, i když je implementace rozbitá; nebo proto, že při sebemenší úpravě +vnitřní implementace musíte vždy upravit i testy.

    +

    Mějte toto na paměti a k mockování se uchylujte až po vyčerpání „slušnějších” +možností. +Často jde trochu změnit kód, aby byl testovatelnější – například napsat funkci, +která čte soubor formátu /etc/passwd, ale jméno souboru jí předat argumentem.

    +

    Mohl by vás zajímat záznam z přednášky Should I mock or should I not? +z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění +při psaní testů.

    +

    Testování HTTP komunikace: betamax

    +

    Vaše programy často používají webová API. Při testování funkcionality API klientů +se vynoří řada problémů:

    +
      +
    • výsledky volání API mohou být pokaždé různé,
    • +
    • k některým volání API je potřeba mít přístupové údaje,
    • +
    • API může být zrovna nedostupné.
    • +
    +

    V zásadě můžete omockovat knihovnu requests tak, aby +jednotlivá volání jako get() apod. vracela předem definovanou odpověď. +Při ponoření do hloubky ale zjistíte, že komplexita takového mockování může +velmi přesáhnout komplexitu samotného kódu, který testujete. +Jednodušší je tak použít již hotové řešení. Jedno z nich je betamax.

    +

    Betamax umožňuje nahrát HTTP komunikaci do kazet (souborů), které se potom +použijí při testech. V zásadě to funguje takto:

    +
      +
    • Pokud daný HTTP požadavek ještě neproběhl, provede se a nahraje na kazetu.
    • +
    • Pokud již proběhl, použije se daná kazeta pro simulaci.
    • +
    +

    Betamax funguje pouze s knihovnou requests při použití session.

    +

    V kombinaci s pytestem můžete použít předpřipravenou fixture:

    +
    import betamax
    +
    +with betamax.Betamax.configure() as config:
    +    # tell Betamax where to find the cassettes
    +    # make sure to create the directory
    +    config.cassette_library_dir = 'tests/fixtures/cassettes'
    +
    +def test_get(betamax_session):
    +    betamax_session.get('https://httpbin.org/get')
    +

    Před spuštěním testu vytvořte složku tests/fixtures/cassettes. +Po spuštění testu ji prozkoumejte. +Měla by obsahovat soubor test_filename.test_get.json. +To je nahraná kazeta. Každý další průběh testu nevykoná GET požadavek, +ale pouze přehraje danou kazetu. Pokud chcete kazetu opět nahrát, prostě ji +smažte a pusťte test znovu.

    +

    Celé to ale funguje pouze, pokud kód vykonávaný uvnitř testu použije speciální +session, kterou máme od betamaxu. Jak to udělat?

    +

    Je třeba, aby implementační část kódu uměla session přejmout, například takto:

    +
    class Client:
    +    def __init__(self, session=None):
    +        self.session = session or requests.Session()
    +        ...
    +
    +def test_clent_foo(betamax_session):
    +    client = Client(session=betamax_session)
    +    assert client.foo() == 42
    +

    Pokud budete používat parametrizované testy, použijte +betamax_parametrized_session, aby kazety měly odlišné jméno při odlišných +parametrech.

    +

    Pro tip: Abyste nevytvářeli novou instanci třídy ve všech testech, můžete si +vytvořit vlastní fixture, která použije fixture betamax_session:

    +
    @pytest.fixture
    +def client(betamax_session):
    +    return Client(session=betamax_session)
    +

    Citlivé údaje

    +

    Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

    +

    Vyvstávají dvě otázky:

    +
      +
    1. Jak umožnit spuštění testů bez vlastního tokenu?
    2. +
    3. Jak citlivé údaje skrýt v kazetách a nedávat je do gitu?
    4. +
    +

    Na obě otázky se pokusím odpovědět jedním okomentovaným kódem:

    +
    with betamax.Betamax.configure() as config:
    +    if 'AUTH_FILE' in os.environ:
    +        # If the tests are invoked with an AUTH_FILE environ variable
    +        TOKEN = my_auth_parsing_func(os.environ['AUTH_FILE'])
    +        # Always re-record the cassetes
    +        # https://betamax.readthedocs.io/en/latest/record_modes.html
    +        config.default_cassette_options['record_mode'] = 'all'
    +    else:
    +        TOKEN = 'false_token'
    +        # Do not attempt to record sessions with bad fake token
    +        config.default_cassette_options['record_mode'] = 'none'
    +
    +    # Hide the token in the cassettes
    +    config.define_cassette_placeholder('<TOKEN>', TOKEN)
    +    ...
    +
    +@pytest.fixture
    +def client(betamax_session):
    +    return Client(token=TOKEN, session=betamax_session)
    +

    Co když ale nevíme, jak bude vypadat citlivá část požadavku, protože se teprve +někde spočítá a získá, jako například v případě Twitter API? +Na tuto otázku podrobněji odpovídá +dokumentace.

    +

    V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách +nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

    +

    Komprimované citlivé údaje

    +

    Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle +odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní +chování, viz dokumentace). +V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit +hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, +compress ani deflate:

    +
    betamax_session.headers.update({'Accept-Encoding': 'identity'})

    Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou +nijak transformována, více viz Wikipedia +a specifikace HTTP)

    +

    Které HTTP požadavky jsou stejné?

    +

    Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se +pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. +Pokud tedy na jedno URL provedete dva POST požadavky s jiným tělem, betamax +je bude považovat za stejné. Toto chování lze měnit zapnutím (nebo vypnutím) +různých matcherů. Těch je v betamaxu celá řada a je jednoduché napsat si +vlastní. Více informací najdete +v dokumentaci.

    +

    Mohl by vás zajímat záznam z přednášky If it Moves, Test it Anyway +z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak +testovat webové API klienty v Pythonu.

    +

    Testování aplikací ve Flasku

    +

    Pro testování aplikací ve Flasku se +používá app.test_client():

    +
    import pytest
    +
    +@pytest.fixture
    +def testapp():
    +    from hello import app
    +    app.config['TESTING'] = True
    +    return app.test_client()
    +
    +def test_hello(testapp):
    +    assert 'Hello' in testapp.get('/').get_data(as_text=True)
    +

    Pozor, metody na testovacím klientu vrací Response, ale trochu jinou, než tu +z requests. +Proto nelze použít přímo response.text; text dostaneme pomocí +response.get_data(as_text=True).

    +

    Testování aplikací v clicku

    +

    Podobně funguje testování aplikací v clicku. +Click obsahuje třídu CliRunner, která pomáhá s testováním:

    +
    from click.testing import CliRunner
    +
    +def test_push_force():
    +    runner = CliRunner()
    +    result = runner.invoke(git_cli_made_in_click, ['push', '--force'])
    +    assert result.exit_code == 0
    +    assert 'forced update' in result.output
    +

    Kam dát testy?

    +

    Dokumentace pytestu +uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +tests/
    +    test_app.py
    +    ...

    nebo do něj:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +    ...
    +    test/
    +        test_app.py
    +        ...

    První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. +Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný +Pythonní modul, ale jen sada souborů s testy.

    +

    Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné +moduly, ne jako součást vašeho balíčku. +Relativní importy (from ..appmodule import xyz) v testech nebudou fungovat.

    +

    Pozor na to, aby testy byly součástí archivu s balíčkem (setup.py sdist), ale +pokud zvolíte první variantu umístění, aby se neinstalovaly (setup.py install), +protože by tam kolidovaly s ostatními testy z jiných balíčků.

    +

    Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve +složce s testy.

    +

    Spouštění testů pomocí setup.py test

    +

    Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale +python setup.py test, což funguje i s jinými nástroji než je pytest. +Pokud pytest používáme, je proto dobré setup.py naučit spouštět pytest.

    +

    K tomu potřebujeme nakonfigurovat závislosti: v setup_requires musí být +pytest-runner a v tests_require pak pytest a další testovací závislosti +(flexmock, betamax...).

    +
    from setuptools import setup
    +
    +setup(
    +    ...,
    +    setup_requires=['pytest-runner', ...],
    +    tests_require=['pytest', ...],
    +    ...,
    +)
    +

    a přidat následující sekci do setup.cfg:

    +
    [aliases]
    +test=pytest

    Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude +podporovat další argumenty pytestu (jako -v). +Na to uživatel spustí pytest samotný.

    +

    Další informace jsou v dokumentaci pytestu.

    +

    Travis CI

    +

    Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky +na službě Travis CI při každém pushnutí na GitHub.

    +

    Travis CI je zadarmo pro veřejné repozitáře na travis-ci.org, pro soukromé +repozitáře je placená verze na travis-ci.com. V rámci studentského balíčku +můžete i tuto verzi využít zdarma.

    +

    Přihlaste se na travis-ci.com pomocí GitHubu (vpravo nahoře). +Pak opět vpravo nahoře zvolte Accounts +a povolte Travis pro váš repozitář.

    +

    Do repozitáře přidejte soubor .travis.yml:

    +
    language: python
    +python:
    +- '3.6'
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Uvedený příklad je pro Python 3.6. +Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

    +
    language: python
    +python:
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Verze Pythonu lze kombinovat:

    +
    language: python
    +python:
    +- '3.6'
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Po pushnutí by se na Travisu měl automaticky spustit test. +Více informací o použití pro Python najdete +v dokumentaci.

    +

    Kvíz

    +

    Co je špatně na této testovací sadě k funkci is_even()?

    +
    def is_even(n):
    +    return n % 2 == 0
    +
    +
    +@pytest.mark.parametrize('n', range(0, 1000, 2))
    +def test_is_even(n):
    +    assert is_even(n)
    +
    \ No newline at end of file diff --git a/pyladies/and-or/index.html b/pyladies/and-or/index.html new file mode 100644 index 00000000..d7393bda --- /dev/null +++ b/pyladies/and-or/index.html @@ -0,0 +1,87 @@ +

    Nebo anebo a

    +

    Vzpomínáš na tabulku operátorů +z lekce o Porovnávání? +Nyní si ji doplníme o další tři operátory, +které se hodí do podmínek:

    + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    andTrue and False
    2 < 3 and 5 < 3
    „a zároveň“
    orTrue or False
    2 < 3 or 5 < 3
    „a nebo“
    notnot False
    not 5 < 3 +
    „ne“

    Například, chceš-li zjistit, jestli je kterékoli z dvou čísel záporné, +můžeš napsat:

    +
    a = float(input("Zadej první stranu obdélníka: "))
    +b = float(input("Zadej druhou stranu obdélníka: "))
    +
    +if a <= 0 or b <= 0:
    +    print("Délka nemůže být záporná!")
    +

    Falešní kamarádi

    +

    Pozor na to, že and a or nejsou anglická slovíčka, ale operátory, +které spojují logické výrazy. +Na obě strany and i or patří výraz, jehož hodnota je True/False +(například porovnání).

    +
    if a <= 0 or b <= 0:
    +

    Může se zdát, že by se to dalo zkrátit a napsat if a or b <= 0: – „pokud +je A nebo B menší než 0“. +Ale to si Python přeloží na:

    +
    if (a) or (b <= 0):
    +

    ... tedy „pokud platí A, a nebo je B menší než 0“. +A to moc smyslu nedává. +(Kdy „platí“ celé číslo?)

    +

    Šťastná/Bohatá

    +

    Pro příklad použijeme and ve vylepšeném programu, který rozdává nejapné rady +do života. +Zkus si ho projít a okomentovat části, které nejsou na první pohled jasné.

    +
    # Tento program rozdává nejapné rady do života.
    +
    +print('Odpovídej "ano" nebo "ne".')
    +stastna_retezec = input('Jsi šťastná? ')
    +if stastna_retezec == 'ano' or stastna_retezec == 'Ano':
    +    stastna = True
    +elif stastna_retezec == 'ne' or stastna_retezec == 'Ne':
    +    stastna = False
    +else:
    +    print('Nerozumím!')
    +
    +bohata_retezec = input('Jsi bohatá? ')
    +if bohata_retezec == 'ano' or bohata_retezec == 'Ano':
    +    bohata = True
    +elif bohata_retezec == 'ne' or bohata_retezec == 'Ne':
    +    bohata = False
    +else:
    +    print('Nerozumím!')
    +
    +if bohata and stastna:
    +    # Je bohatá a zároveň štǎstná, ta se má.
    +    print('Gratuluji!')
    +elif bohata:
    +    # Je bohatá, ale není „bohatá a zároveň šťastná“,
    +    # takže musí být jen bohatá.
    +    print('Zkus se víc usmívat.')
    +elif stastna:
    +    # Tady musí být jen šťastná.
    +    print('Zkus míň utrácet.')
    +else:
    +    # A tady víme, že není ani šťastná, ani bohatá.
    +    print('To je mi líto.')
    +

    Všimni si co se stane, když zadáš něco jiného než „ano“ nebo „ne“.

    +

    Proměnná stastna nebo bohata se nenastaví, a když je ji potom +potřeba použít, program skončí s chybou.

    +

    O tom, jak se vypořádat s chybami, si povíme později.

    +
    \ No newline at end of file diff --git a/pyladies/asteroids/index.html b/pyladies/asteroids/index.html new file mode 100644 index 00000000..eab3f1f5 --- /dev/null +++ b/pyladies/asteroids/index.html @@ -0,0 +1,345 @@ +

    Hra typu Asteroids

    +

    Dnes to všechno – třídy, grafiku, seznamy, a tak dále – +spojíme dohromady do závěrečného projektu. +Doufám, že se ti bude líbit!

    +

    Zkusíme udělat klon hry Asteroids, +která poprvé vyšla na konci sedmdesátých let. +V našem podání bude hra nakonec vypadat nějak takhle:

    +

    Screenshot hry typu Asteroids

    +

    Projekt je to docela složitý a – jako většina +praktických projektů – využívá i některých věcí, které ještě na kurzu nebyly. +Věřím, že ale přesto zvládneš všechno pochopit nebo dohledat!

    +

    A ještě jedna věc: protože začátečnický kurz končí, +začneme kód psát v angličtině, aby se pak dal sdílet s celým světem.

    +

    Procházíš-li si projekt doma, je možné, že narazíš na +něco s čím si nebudeš vědět rady. +Kdyby se to stalo, prosím, ozvi se nám! +Rádi ti s projektem pomůžeme.

    +

    Vesmírná loď

    +

    První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesnicí.

    +
      +
    • Vesmírnou loď bude reprezentovat objekt třídy Spaceship.
    • +
    • Každá loď má vlastní atributy x a y (pozice), +x_speed a y_speed (rychlost), rotation (úhel natočení) a +sprite (2D objekt v Pygletu s polohou, rotací a obrázkem).
    • +
    • Loď má metodu tick, která obstarává +mechaniku týkající se lodi – posouvání, natáčení a ovládání.
    • +
    • Všechny objekty ve hře si budeme dávat do globálního seznamu objects. +Zatím tam bude jenom vesmírná loď.
    • +
    • Co se ovládání týče, stisknuté klávesy si uchovávej v množině (angl. set), +což je datový typ podobný seznamu, jen nemá dané pořadí +prvků a každý prvek v ní může být pouze jednou. +(Na množinu se dá dívat i jako na slovník bez hodnot.) +Je k dispozici tahák na množiny +a pythonní dokumentace obsahuje k množinám +tutoriál +i podrobný popis. +Vesmírná loď se pak do množiny „podívá” v rámci +své metody tick.
    • +
    • Můžeš použít sadu obrázků, +které nakreslil Kenney Vleugels +a zpřístupnil je zadarmo komukoli. Nebo si nakresli/stáhni vlastní!
    • +
    • Ve hře později použijeme velké množství +Sprite-ů a vykreslovat je jeden po druhém by trvalo docela dlouho. +Všechny Sprite-y proto přidej do kolekce +pyglet.graphics.Batch, +kterou pak Pyglet umí efektivně vykreslit najednou. +Do „batche” jde přidávat pomocí argumentu při vytváření Sprite() +a odebírat pomocí sprite.delete(). Například:

      +
      batch = pyglet.graphics.Batch()
      +sprite1 = pyglet.sprite.Sprite(obrazek, batch=batch)
      +sprite2 = pyglet.sprite.Sprite(obrazek, batch=batch)
      +
      +# a potom můžeš vykreslit všechny najednou:
      +batch.draw()
      +

      Kolekci batch si stejně jako objects uchovávej globálně.

      +
    • +
    • Aby se objekty hýbaly a otáčely podle svých středů, je dobré nastavit „kotvu“ +obrázku na jeho střed (jinak je kotva v levém dolním rohu):

      +
      image = pyglet.image.load(...)
      +image.anchor_x = image.width // 2
      +image.anchor_y = image.height // 2
      +self.sprite = pyglet.sprite.Sprite(image, batch=batch)
      +
    • +
    • Pro pohyb raketky půjde použít klávesy s šipkami doleva, doprava a rovně. +Šipky do stran raketu točí, šipka dopředu zrychluje pohyb tím směrem, kam je +raketka otočená.

      +
        +
      • Základní pohyb raketky je jednoduchý: k x-ové +souřadnici se přičte x-ová rychlost krát uplynulý čas +a to samé v y-ové souřadnici i pro úhel otočení:

        +
          self.x = self.x + dt * self.x_speed
        +  self.y = self.y + dt * self.y_speed
        +  self.rotation = self.rotation + dt * rotation_speed
        +

        Rychlost otáčení závisí na stisknutých šipkách (doleva nebo doprava). + V jednom případě je záporná, v druhém kladná. Vhodnou hodnotu zvol + experimentováním – začni třeba u 4 radiánů za sekundu. + Všechny podobné „magické hodnoty“ je vhodné definovat + jako konstanty – tedy proměnné, které na začátku nastavíš a nikdy + je neměníš. Bývá zvykem je označovat velkými písmeny a dávat je na + začátek souboru, hned za importy:

        +
          ROTATION_SPEED = 4  # radians per second
        +
      • +
      • Zrychlení je trochu složitější: k x-ové rychlosti +se přičte kosinus úhlu otočení krát uplynulý čas. +U y-ové osy se použije sinus.

        +
          self.x_speed += dt * ACCELERATION * math.cos(self.rotation)
        +  self.y_speed += dt * ACCELERATION * math.sin(self.rotation)
        +

        Všimni si v příkladu konstanty ACCELERATION. Tu opět zvol podle uvážení.

        +
      • +
      • Když máš hodnoty self.x, self.y a self.rotation spočítané, nezapomeň +je promítnout do self.sprite, jinak se nic zajímavého nestane.

        +

        Pozor na to, že funkce math.sin a math.cos používají radiány, +kdežto pyglet používá pro Sprite.rotation stupně. +(A k tomu je navíc 0° jinde, a otáčí se na opačnou stranu.) +Pro sprite je tedy potřeba úhel převést:

        +
          self.sprite.rotation = 90 - math.degrees(self.rotation)
        +  self.sprite.x = self.x
        +  self.sprite.y = self.y
        +
      • +
      • Když raketka vyletí z okýnka ven, vrať +ji zpátky do hry na druhé straně okýnka. +(Zkontroluj si, že to funguje na všech čtyřech stranách.)
      • +
      +
    • +
    +
      +
    • Bonus 1: Zkus si přidat několik raketek, +každou trochu jinak natočenou.

      +

      Každý jednotlivý objekt třídy Spaceship +si udržuje vlastní stav, takže by nemělo být složité +jich vytvořit víc (a všechny ovládat najednou).

      +
    • +
    • Bonus 2: +Možná sis všiml/a „skoku”, když +raketa vyletí z okýnka a vrátí se na druhé straně. +Tomu se dá zabránit tak, že +vlevo, vpravo, nahoře i dole vedle naší „scény” +vykreslíš celou scénu ještě jednou.

      +

      Pyglet na to má speciální nízkoúrovňové funkce, +kterými můžeš říct „tady kresli všechno posunuté o +X pixelů vlevo”. Úplné vysvětlení by bylo na dlouho, +takže si zatím jen zkopíruj kód:

      +
      from pyglet import gl
      +
      +def draw():
      +    window.clear()
      +
      +    for x_offset in (-window.width, 0, window.width):
      +        for y_offset in (-window.height, 0, window.height):
      +            # Remember the current state
      +            gl.glPushMatrix()
      +            # Move everything drawn from now on by (x_offset, y_offset, 0)
      +            gl.glTranslatef(x_offset, y_offset, 0)
      +
      +            # Draw
      +            batch.draw()
      +
      +            # Restore remembered state (this cancels the glTranslatef)
      +            gl.glPopMatrix()
      +

      Pro přehled, dokumentace k použitým funkcím je tady: +glPushMatrix, glPopMatrix, +glTranslatef.

      +
    • +
    +

    Povedlo se? Můžeš létat vesmírem? +Čas to všechno dát do Gitu!

    +

    Projdi si předchozí body, jestli máš opravdu všechno, a můžeš pokračovat dál!

    +

    Asteroidy

    +

    Přidej druhý typ vesmírného objektu: Asteroid.

    +
      +
    • Asteroidy a vesmírné lodě mají mnoho společného: +každý takový vesmírný objekt bude mít polohu, +rychlost, natočení a pravidla, jak se pohybuje. +Vytvoř proto třídu SpaceObject, +ve které bude všechno to společné, a z ní poděď +třídu Spaceship, ve které zůstane +kód specifický pro vesmírnou loď (t.j. ovládání +klávesnicí, obrázek lodě, začátek v prostředku +obrazovky).
    • +
    • Část kódu pro pohyb bude společná pro všechny +vesmírné objekty (např. věci kolem zrychlení); +část bude specifická jen pro raketku (ovládání +pomocí klávesnice). +Využij funkci super() z lekce o dědičnosti.
    • +
    • Napiš ještě třídu Asteroid, +která taky dědí ze SpaceObject, +ale má svoje vlastní chování: +začíná buď na levé nebo spodní straně obrazovky +s náhodnou rychlostí +a ke každému asteroidu se přiřadí +náhodně vybraný obrázek. +(V Asteroidech je levý a pravý okraj v podstatě + to samé; a stejně tak horní a spodní.)
    • +
    • A pak pár asterojdíků různých velikostí přidej +na začátku do hry.
    • +
    +

    Povedlo se? Máš dva typy objektů? +Čas to všechno dát do Gitu!

    +

    Zase si projdi, jestli máš všechno hotové, +a jdeme na další část!

    +

    Kolize

    +

    Naše asteroidy jsou zatím docela neškodné. Pojďme to změnit.

    +
      +
    • V této sekci bude tvým úkolem zjistit, kdy +loď narazila do asteroidu. +Pro zjednodušení si každý objekt nahradíme +kolečkem a budeme počítat, kdy se srazí kolečka. +Každý objekt bude potřebovat mít poloměr – atribut radius.
    • +
    • Aby bylo vidět co si hra o objektech „myslí”, +nakresli si nad každým objektem příslušné kolečko. +Nejlepší je to udělat pomocí +pyglet.gl +a trochy matematiky; pro teď si jen opiš funkci +draw_circle a pro každý objekt ji zavolej. +Až to bude všechno fungovat, můžeš funkci dát pryč.

      +
      def draw_circle(x, y, radius):
      +    iterations = 20
      +    s = math.sin(2*math.pi / iterations)
      +    c = math.cos(2*math.pi / iterations)
      +
      +    dx, dy = radius, 0
      +
      +    gl.glBegin(gl.GL_LINE_STRIP)
      +    for i in range(iterations+1):
      +        gl.glVertex2f(x+dx, y+dy)
      +        dx, dy = (dx*c - dy*s), (dy*c + dx*s)
      +    gl.glEnd()
      +
    • +
    • Když asteroid narazí do lodi, loď exploduje a zmizí. +Explozi necháme na později, teď je důležité odebrání objektu ze hry. +Dej ho do metody SpaceObject.delete, +protože vyndávat ze hry se dá jakýkoli objekt. +V této metodě musíš objekt jednak odstranit +ze seznamu objects a pak zrušit jeho Sprite, aby se už v rámci +batch nevykresloval.
    • +
    • A jak udělat ono narážení? +V rámci Spaceship.tick projdi +každý objekt, zjisti jestli vzdálenost mezi lodí +a objektem je menší než součet poloměrů +(t.j. narazily do sebe) a pokud ano, +zavolej na objektu metodu hit_by_spaceship.

      +

      Zjišťování vzdálenosti ve hře, kde se +objekty které vyletí ven vrací na druhé straně, +není úplně přímočaré, takže si příslušný kód pro teď jen zkopíruj:

      +
      def distance(a, b, wrap_size):
      +    """Distance in one direction (x or y)"""
      +    result = abs(a - b)
      +    if result > wrap_size / 2:
      +        result = wrap_size - result
      +    return result
      +
      +def overlaps(a, b):
      +    """Returns true iff two space objects overlap"""
      +    distance_squared = (distance(a.x, b.x, window.width) ** 2 +
      +                        distance(a.y, b.y, window.height) ** 2)
      +    max_distance_squared = (a.radius + b.radius) ** 2
      +    return distance_squared < max_distance_squared
      +

      Většina objektů v dokončené hře (např. oheň z +rakety, střela) nebude při kolizi s lodí dělat nic, +takže metoda SpaceObject.hit_by_spaceship +by neměla dělat nic (musí jen existovat). +Jen asteroid loď rozbije, takže předefinuj +Asteroid.hit_by_spaceship, aby +zavolala delete lodi.

      +

      Protože lodí může být v naší hře obecně více, musí asteroid +vědět, se kterou lodí se srazil, aby ji mohl rozbít. +Metoda hit_by_spaceship by tedy na to měla mít argument.

      +
    • +
    +

    Povedlo se? Konečně se dá prohrát? +Čas to všechno zkontrolovat, dát do Gitu a můžeme pokračovat!

    +

    Útok

    +

    Teď zkusíme asteroidy rozbíjet.

    +
      +
    • Raketka umí jednou za 0,3 s vystřelit laser. +Ulož si pro každou raketku (jako atribut) číslo, +které po každém výstřelu nastav na 0,3 +a pak ho v metodě tick nech klesat o 1 za vteřinu. +Když bude záporné, může hráč vystřelit znovu.
    • +
    • Když hráč drží mezerník a může vystřelit, vystřelí. +Ve hře se to projeví tak, že se přidá objekt nové třídy Laser. +Začne na souřadnicích raketky, s natočením raketky +a s rychlostí raketky plus něco navíc ve směru natočení.
    • +
    • Každý objekt třídy Laser si „pamatuje“, +jak dlouho ještě bude ve hře. +Na začátku se tohle číslo nastaví tak, aby přeletěl +zhruba něco víc než jednu obrazovku. +Když dojde čas, Laser zmizí.
    • +
    • Ve své metodě tick laser projde +všechny objekty, a pokud se s některým překrývá, +tak na něm zavolá metodu hit_by_laser. +U většiny objektů tahle metoda nedělá nic, +jen asteroidy bude rozbíjet.
    • +
    • Když se laser dotkne asteroidu, asteroid se +rozdělí na dva menší (nebo, je-li už příliš malý, zmizí úplně).

      +

      Rychlosti nových asteroidů si můžeš nastavit +podle sebe – důležité je jen, aby každý menší +asteroid letěl jinam. +Většinou bývají nové asteroidy rychlejší než ten původní.

      +
    • +
    • A to je vše! Máš funkční hru!
    • +
    +

    Povedlo se? Dá se i vyhrát? Čas to všechno dát do Gitu!

    +

    Dokončení a rozšíření

    +

    Chceš-li ve hře pokračovat, tady jsou další nápady. +Můžeš je dělat v jakémkoli pořadí – nebo si vymysli +vlastní rozšíření!

    +
      +
    • Je hra příliš těžká?

      +

      Můžeš přidat životy: na začátku jsou tři, +a dokud nějaký zbývá, raketka se po zásahu +asteroidem objeví znovu uprostřed, +s nulovou rychlostí. +Hra by taky při tomto „restartu” měla ignorovat +držené klávesy, dokud je hráč znovu nezmáčkne +(nejlépe pomocí pressed_keys.clear()).

      +

      Počet náhradních lodí můžeš ukázat ikonkami +na spodku obrazovky.

      +

      Bonus: Několik vteřin po +„restartu” může být raketka nezničitelná, +aby měla čas odletět, když je zrovna uprostřed +okýnka asteroid.

      +
    • +
    • Je hra příliš lehká?

      +

      Přidej úrovně: až hráč vystřílí všechny asteroidy, +postoupí na další úroveň, kde je asteroidů víc než v té předchozí.

      +

      Číslo úrovně můžeš ukázat pomocí +pyglet.text.Label.

      +
    • +
    • Je pozadí příliš černé?

      +

      V sadě obrázků v adresáři Backgrounds +si vyber pozadí, a vytapetuj s ním celý vesmír.

      +
    • +
    • Je hra moc strohá?

      +

      Přidej oheň a exploze! +Chovají se podobně jako Laser, +jen nic neničí a můžou třeba měnit barvu podle +toho, jak dlouho už jsou ve hře.

      +

      Na efekty můžeš použít obrázky +„Smoke particle assets”, +které nakreslil opět Kenney Vleugels. +Doporučuji „White Puff”, které můžeš zmenšit +(např. sprite.scale = 1/10), +přibarvit +(např. sprite.color = 255, 100, 0) +nebo částečně zprůhlednit +(např. sprite.opacity = 100).

      +

      Doporučuji si na efekty udělat nový Batch +a vykreslit ho před tím hlavním, aby efekty +nepřekrývaly herní objekty.

      +
    • +
    • Nepoznáš, kdy jsi prohrál/a nebo vyhrál/a?

      +

      Na konci můžeš ukázat veliký nápis GAME OVER nebo WINNER.

      +
    • +
    • Nudíš se?

      +

      V původní hře se občas objeví UFO, které občas +vystřelí na místo, kde je právě hráčova raketka, +takže pokud hráč stojí pořád na jednom místě a +jenom se točí dokola, UFO ho sestřelí. +Můžeš zkusit dodělat třídu Ufo +a z Laser podědit ShipLaser a UfoLaser.

      +
    • +
    +

    Povedlo se? Vypadá to a chová se to profesionálně? +Čas to všechno dát do Gitu!

    \ No newline at end of file diff --git a/pyladies/asteroids/screenshot.png b/pyladies/asteroids/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd8d12f78f1446843e58a4870344c18553153cb GIT binary patch literal 53112 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%0AI~l!L3%W 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 Y**g`xSE?W1OueV>dBbz1XC3bTF9PSSV*mgE literal 0 HcmV?d00001 diff --git a/pyladies/basic-functions/index.html b/pyladies/basic-functions/index.html new file mode 100644 index 00000000..96557cee --- /dev/null +++ b/pyladies/basic-functions/index.html @@ -0,0 +1,146 @@ +

    Užitečné funkce

    +

    Ukažme si pár základních funkcí, které Python nabízí.

    +

    Tato kapitola ukazuje výběr z nástrojů, které jsou ti v Pythonu k dispozici. +Tvůj cíl není naučit se vše nazpaměť, ale mít přehled o tom, co je zhruba +možné. +Detaily můžeš vždycky dohledat – ať už na taháku (které jsou, na rozdíl od +školy, vždycky povoleny!), v těchto materiálech, nebo v oficiální +dokumentaci či jinde na Internetu.

    +

    Můžeš si stáhnout i +tahák, +který se rozdává na srazech. +Doporučuji mít ho ze začátku při ruce. +Když narazíš na úkol, se kterým si nevíš rady, projdi si tahák a zamysli se, +která z funkcí by se dala použít.

    +

    Vstup a výstup

    +

    Tyhle funkce už známe. +print vypíše nepojmenované argumenty, oddělené mezerou. +Pojmenovaný argument end určuje, co se vypíše na konci (místo přechodu +na nový řádek); +sep udává, co se vypíše mezi jednotlivými argumenty (místo mezery).

    +

    Příklad opět spusť ze souboru, ne interaktivně:

    +
    print(1, 'dvě', False)
    +print(1, end=' ')
    +print(2, 3, 4, sep=', ')
    +

    Základní funkce pro načtení vstupu, input, +vypíše otázku, počká na text od uživatele a ten vrátí jako řetězec.

    +
    input('zadej vstup: ')
    +

    Kontrolní otázky:

    +
      +
    • Je input „normální“ funkce, nebo procedura?
    • +
    • Co bere funkce input jako argument?
    • +
    • Jaká je návratová hodnota funkce input?
    • +
    +
    +

    Řešení

    + + +

    Převádění typů

    +

    Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? +Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky. +Každý ze tří typů (angl. types) proměnných, které zatím známe, +má funkci, která vezme nějakou hodnotu a vrátí podobnou hodnotu „svého“ typu. +Na celá čísla je funkce int (z angl. integer), na reálná čísla je float +(z angl. floating-point), a pro řetězce str (z angl. string).

    +
    int(x)              # převod na celé číslo
    +float(x)            # převod na reálné číslo
    +str(x)              # převod na řetězec
    +

    Příklady:

    +
    3 == int('3') == int(3.0) == int(3.141) == int(3)
    +8.12 == float('8.12') == float(8.12)
    +8.0 == float(8) == float('8') == float(8.0)
    +'3' == str(3) == str('3')
    +'3.141' == str(3.141) == str('3.141')
    +

    Ne všechny převody jsou možné:

    +
    int('blablabla')    # chyba!
    +float('blablabla')  # chyba!
    +int('8.9')          # chyba!
    +

    …a jak si poradit s chybou, která nastane, +když použiješ špatnou hodnotu, si řekneme později.

    +

    Převádění a input

    +

    Převádění typů se často používá při načítání vstupu, třeba takto:

    +
    cislo = int(input('Zadej číslo: '))
    +

    Jak Python vyhodnotí tento výraz? +Zadá-li uživatel 42Enter, +funkce input vrátí řetězec'42'. +Ten pak funkce int vezme jako argument, udělá podle něj číslo a to +číslo vrátí:

    +
    cislo = int(input('Zadej číslo: '))
    +      #     ╰─────────┬─────────╯
    +cislo = int(        '42'          )
    +      # ╰────────────┬────────────╯
    +cislo =             42
    +

    Matematické funkce

    +

    Matematika je občas potřeba, takže se pojďme +podívat, jak v Pythonu pracovat s čísly.

    +

    Jedna zajímavá matematická funkce je k dispozici vždy:

    +
    round(cislo)    # zaokrouhlení
    +

    Spousta dalších není k dispozici od začátku programu. +Ne každý má rád matematiku, a ne ve všech druzích programu jsou takové operace +potřeba. +Proto musíš předem – typicky na začátku souboru – říct, že je budeš používat. +To se dělá naimportováním z modulu math:

    +
    from math import sqrt, floor, ceil
    +

    Naimportované funkce pak můžeš použít:

    +
    sqrt(cislo)                 # druhá odmocnina
    +
    +floor(cislo)                # zaokrouhlení dolů
    +ceil(cislo)                 # zaokrouhlení nahoru
    +

    Kdybys potřeboval/a goniometrické funkce jako sinus, jsou k dispozici taky. +Jen pozor na to, že počítají pro úhly v radiánech. +Hodnoty ve stupních je potřeba na radiány převést.

    +
    from math import sin, cos, tan, degrees, radians
    +
    +sin(uhel)       # sinus
    +cos(uhel)       # kosinus
    +tan(uhel)       # tangens
    +
    +degrees(uhel)   # převod z radiánů na stupně
    +radians(uhel)   # převod ze stupňů na radiány
    +

    Import a pojmenování souborů

    +

    Při importování je potřeba si dávat pozor na pojmenování souborů: +importuješ-li from math, nesmí se tvůj program jmenovat math.py.

    +

    Proč? Když Python v adresáři, ze kterého program pouštíš, najde soubor +math.py, bude se snažit importovat sin z něho místo +z předpřipravené sady matematických funkcí.

    +

    Náhoda

    +

    Nakonec si ukážeme dvě funkce, které vrací náhodná čísla. +Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají +náhodné karty.

    +

    Opět nejsou potřeba tak často a je potřeba je naimportovat. +Tentokrát z modulu random:

    +
    from random import randrange, uniform
    +

    Pak už se dají použít:

    +
    randrange(a, b)   # náhodné celé číslo od a do b-1
    +uniform(a, b)     # náhodné reálné číslo od a do b
    +

    Pozor na to, že randrange(a, b) +nikdy nevrátí samotné b. +Pokud potřebuješ náhodně vybrat ze tří možností, +použij randrange(0, 3), +což vrátí 0, 1, nebo +2:

    +
    from random import randrange
    +
    +cislo = randrange(0, 3)  # číslo je 0, 1, nebo 2
    +if cislo == 0:
    +    print('Kolečko')
    +elif cislo == 1:
    +    print('Čtvereček')
    +else:  # tady musí být číslo 2
    +    print('Trojúhelníček')
    +

    Pamatuj, když importuješ z modulu random, nesmí se tvůj soubor +jmenovat random.py.

    +

    A další

    +

    Python dává k dispozici obrovské množství dalších +funkcí a modulů, i když ne všem budeš ze začátku +rozumět. +Všechny jsou – anglicky – popsány v dokumentaci Pythonu, např. +vestavěné funkce, +matematika.

    \ No newline at end of file diff --git a/pyladies/basics/diagram.svg b/pyladies/basics/diagram.svg new file mode 100644 index 00000000..8617e530 --- /dev/null +++ b/pyladies/basics/diagram.svg @@ -0,0 +1,534 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pyladies/basics/dropbox.png b/pyladies/basics/dropbox.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbaf321b9f2315da7838e43bd1b03b656bd8567 GIT binary patch literal 41480 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 A;s5{u literal 0 HcmV?d00001 diff --git a/pyladies/basics/gitk.png b/pyladies/basics/gitk.png new file mode 100644 index 0000000000000000000000000000000000000000..08b671d94ba3664ebc3543c0287396e998e967da GIT binary patch literal 59093 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 literal 0 HcmV?d00001 diff --git a/pyladies/basics/index.html b/pyladies/basics/index.html new file mode 100644 index 00000000..d1fa7911 --- /dev/null +++ b/pyladies/basics/index.html @@ -0,0 +1,339 @@ +

    Git

    +

    Ať už programuješ nebo píšeš dokumenty, stává se, +že vytvoříš několik verzí. +Tuhle chceš archivovat část, která už není potřeba, +tamhle chceš svoji práci poslat k ohodnocení, +nebo dokonce kolegům, kteří na ni spolupracují. +A když se verze začnou kupit, může být problém se v nich vyznat.

    +

    Část těchto problémů řeší nástroje jako Dropbox či +Google Drive, se kterými ses možná již setkal/a. +Tam můžeš například sdílet svůj dokument s dalšími +lidmi nebo se můžeš vrátit k dřívější verzi dokumentu, +když něco pokazíš a nemůžeš si vzpomenout, jak to bylo +předtím. Příklad toho, jak to může vypadat, je zde:

    +

    Verzovací Rozhraní služby Dropbox

    +

    V tomto rozhraní ale vidíš pouze verze jednoho dokumentu a navíc +nemůžeš tušit, ke které verzi se to vlastně chceš +vrátit. Nevidíš ani čím se jednotlivé verze liší. +Pro větší projekt by byl takový způsob práce +neefektivní.

    +

    Programátoři proto používají mocnější nástroje na +správu verzí (angl. version control system. VCS). +Asi nejpopulárnější z nich je Git, se kterým +se teď seznámíme.

    +

    Budeme hodně pracovat s příkazovou řádkou. +Jestli se s ní ještě nekamarádíš, koukni se na +úvod.

    +

    Nezapomeň: $ na začátku se nepíše; +je tu proto, aby šlo poznat že jde o příkaz.

    +

    Instalace

    +

    Popis instalace Gitu najdeš +zde. +Jestli jsi instalaci přeskočil/a, projdi si ji teď.

    +

    Repozitář

    +

    Každý projekt, který budeš verzovat, musí mít pro sebe +vyhrazený adresář. +Vytvoř si tedy nový adresář a přepni se do něj (pomocí cd). +Pak vytvoř gitový repozitář (angl. repository) +pomocí příkazu git init:

    +
    $ git init
    +Initialized empty Git repository in .../.git/

    Na první pohled to vypadá, že se nic nestalo. +Tenhle příkaz totiž vytvořil skrytý adresář +.git, do kterého uložil nějaké informace. +Přesvědč se příkazem ls -a (Linux) nebo dir /a (Windows). +Adresář .git je schovaný proto, že +ho spravuje Git a ty bys v něm neměl/a nic měnit.

    +

    V repozitáři zatím nic není. +Zkus to ověřit příkazem git status, který +vypisuje informace o stavu repozitáře:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +nothing to commit (create/copy files and use "git add" to track)

    „On branch master” říká něco o větvích, k tomu se vrátíme později. +„No commits yet” říká, že zatím nemáš uloženou žádnou revizi. +A „nothing to commit” říká, že je adresář +prázdný – nejsou tu žádné soubory k verzování.

    +

    První revize

    +

    Teď si zkus do Gitu něco přidat!

    +

    Vytvoř soubor basnicka.txt a napiš do něj +nějakou básničku. +Měla by mít aspoň pět řádků, ať pak máme s čím pracovat. +Pak zkus znovu git status: Git oznámí, +že v adresáři je soubor, o kterém ještě „neví“.

    + + +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    basnicka.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    U každého nového souboru musíme Gitu říct, že +chceme jeho obsah sledovat. +Proveď to se svojí básničkou:

    +
    $ git add basnicka.txt

    a znovu zkontroluj stav repozitáře:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   basnicka.txt

    To, co je zelené („changes to be committed“), +se přidá do další revize (angl. commit), +kterou vytvoříš. +Pojď tedy vytvořit revizi:

    +
    $ git commit
    +[master (root-commit) eb0fcd9] První revize
    + 1 file changed, 6 insertions(+)
    + create mode 100644 basnicka.txt

    Po zadání tohoto příkazu se otevře editor, +do kterého musíš napsat nějaký popisek, +abys věděl/a, co tahle revize obsahuje za změny. +Pro začátek napiš jen První revize. +Předvyplněné řádky začínající # nech být +(nebo vymaž, podle chuti – Git je ignoruje). +Pak soubor ulož a zavři editor.

    +

    Jak na editory?

    +

    Na Windows, máš-li +správně nastavený Git, +se použije Poznámkový blok (Notepad) – stačí něco +napsat, uložit (Ctrl+S) a zavřít +(Alt+F4).

    +

    Na Linuxu a macOS se objeví editor v příkazové řádce, +který se jmenuje Nano. +Pozná se tak, že v dolních dvou řádcích má malou nápovědu. +Něco napiš, pomocí Ctrl+O +soubor ulož, potvrď jméno souboru (Enter) +a pomocí Ctrl+X editor zavři.

    +

    Nemáš-li Git nastavený podle instrukcí, objeví se přímo +v příkazové řádce Vim – poměrně složitý editor, který +se teď učit nebudeme. Pozná se tak, že úplně +spodní řádek je prázdný. +V takovém případě stiskni +Esc, napiš :q! (dvojtečka, Q, vykřičník) +a potvrď pomocí Enter. +Pak si nastav Git a zkus git commit znovu.

    +

    Znovu zkus vypsat stav repozitáře:

    +
    $ git status
    +On branch master
    +nothing to commit, working tree clean

    Tenhle krátký výstup znamená, že od poslední revize +se nic nezměnilo. +Což dává smysl – poslední revizi jsi právě vytvořil/a!

    +

    A co všechno je v téhle první/poslední revizi? +To ti poví příkaz git show:

    +
    $ git show
    +commit eb0fcd9317cbba3d9406ffe2918dfaad667f100f
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    První revize
    +
    +diff --git a/basnicka.txt b/basnicka.txt
    +new file mode 100644
    +index 0000000..558d133
    +--- /dev/null
    ++++ b/basnicka.txt
    +@@ -0,0 +1,6 @@
    ++Holka modrooká, nesedávej u potoka
    ++Holka modrooká, nesedávej tam
    ++
    ++V potoce je hastrmánek
    ++Zatahá tě za copánek
    ++Holka modrooká, nesedávej tam

    Vidíš unikátní +označení revize, +pomocí kterého se vždy bude dát dostat k této konkrétní +verzi projektu. +Pak je tam jméno autora a datum vytvoření, +popisek +a nakonec shrnutí změn: byl přidán soubor basnicka.txt +s nějakým obsahem.

    +

    Když je výpis moc dlouhý, můžeš se v něm pohybovat +(, , PgUp, PgDn) +a zpět se dostaneš klávesou Q jako Quit.

    +

    Kódování ve Windows

    +

    Pokud výpis nezvládá znaky s diakritikou, zadej před git show příkaz

    +
    > set LC_ALL=C.UTF-8
    +

    Tento příkaz nastaví aktuální terminál: když si otevřeš nové okno +s příkazovou řádkou, bude ho potřeba zadat znovu.

    +

    Druhá revize

    +

    Udělej v básničce nějakou malou změnu – změň slovo, +uprav interpunkci nebo přidej sloku. +Pak se opět zeptej Gitu na stav repozitáře.

    +
    $ git status
    +On branch master
    +Changes not staged for commit:
    +  (use "git add <file>..." to update what will be committed)
    +  (use "git restore <file>..." to discard changes in working directory)
    +    modified:   basnicka.txt
    +
    +no changes added to commit (use "git add" and/or "git commit -a")

    Soubor je opět červený! Něco se v něm změnilo! +Ale co? +Na to nám odpoví příkaz git diff.

    +
    $ git diff
    +diff --git a/basnicka.txt b/basnicka.txt
    +index 558d133..24e2384 100644
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@ -1,6 +1,9 @@
    +-Holka modrooká, nesedávej u potoka
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej u potoka
    ++Holka modrooká
    ++Nesedávej tam
    + 
    + V potoce je hastrmánek
    + Zatahá tě za copánek
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej tam

    Změny se ukazují po řádcích. +Červeně, s -, jsou ukázány +odebrané řádky; zeleně s + +řádky přidané.

    +

    Změnilo-li se na řádku jen jedno slovo nebo i písmeno, +celý řádek se ukáže jako smazaný a zase přidaný. +Dá se to nastavit i jinak, když je potřeba, +ale je dobré si na tento standard zvyknout.

    +

    Takhle se dá jednoduše zjistit, co se dělo od poslední verze. +Když ti program přestane fungovat (a v poslední uložené +revizi fungoval), použij git diff – +v jedné ze změn musí být chyba!

    +

    Řádek začínající @@ říká, +kde v souboru změna je (u mě začínal vypsaný kousek +souboru řádkem 1 a měl 6 řádků; v nové verzi je +opět od 1. řádku, ale narostl na 9).

    +

    Jsi-li se změnami spokojen/a, řekni Gitu, ať je +použije v další revizi:

    +
    $ git add basnicka.txt

    A pro úplnost se znovu koukni, co říká +status – co je zelené, přidá se do další +revize.

    +
    On branch master
    +Changes to be committed:
    +  (use "git restore --staged <file>..." to unstage)
    +    modified:   basnicka.txt

    Než uděláš druhou revizi, ještě řeknu něco o tom, +jak správně psát k revizím popisky. +Na to je totiž úzus, který téměř všichni programátoři +respektují: na prvním řádku je krátké shrnutí změn, +následuje prázdný řádek a pak detailnější popis důvodů +ke změně a případně změny samotné. +Snaž se délku řádků držet do zhruba 70 znaků; +vodítkem můžou být předvyplněné řádky začínající #. +Nemá cenu popisovat, co je jasné ze změn samotných, +zajímavé jsou hlavně širší souvislosti a důvody ke změnám. +Cokoli, co může přijít vhod, až se změny bude snažit někdo pochopit. +(Ten někdo můžeš být klidně ty, za pár měsíců.)

    +

    Můj popisek bude znít takhle:

    +
    Rozdělení dlouhých řádků
    +
    +Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +důvod je ukázat co dělá git diff.)

    Nebude-li se ti někdy dařit shrnout změnu +v 70 znacích, zamysli se, jestli neděláš moc velkou +změnu najednou – např. "změna řetězce X +a dopsání nového cyklu Y" by bylo lepší uložit +jako dvě různé revize.

    +

    Pomocí git commit vytvoř druhou revizi. +Pak ji zkontroluj:

    +
    $ git show
    +commit 1fcd654a331f290616c948d9841fd8d2a34aa6b4
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    Rozdělení dlouhých řádků
    +
    +    Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +    takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +    důvod je ukázat co dělá git diff.)
    +
    +diff --git a/basnicka.txt b/basnicka.txt
    +index 558d133..24e2384 100644
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@ -1,6 +1,9 @@
    +-Holka modrooká, nesedávej u potoka
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej u potoka
    ++Holka modrooká
    ++Nesedávej tam
    + 
    + V potoce je hastrmánek
    + Zatahá tě za copánek
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej tam

    Diagram

    +

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém +stavu můžou být soubory/změny, přikládám tento diagram:

    +

    Diagram revizí

    +

    Log

    +

    Teď, když máme za sebou první(ch) pár revizí, +si ukážeme několik příkazů, které nám umožní se +v nich orientovat. +První z nich je git log.

    +
    $ git log
    +commit 1fcd654a331f290616c948d9841fd8d2a34aa6b4
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    Rozdělení dlouhých řádků
    +
    +    Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +    takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +    důvod je ukázat co dělá git diff.)
    +
    +commit eb0fcd9317cbba3d9406ffe2918dfaad667f100f
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    První revize

    Git log vypíše všechny revize od té nejnovější až po +úplný začátek projektu.

    +

    Až budeš mít verzí tolik, že se nevejdou najednou +na obrazovku, můžeš se v logu pohybovat pomocí šipek a +PgUp/PgDn. +„Ven“ se dostaneš klávesou q.

    +

    Je spousta možností jak vypisovat historii pomocí git log. +Všechno je podrobně – možná až moc podrobně – +popsáno v dokumentaci; stačí zadat git help log. +„Ven“ z dokumentace se opět dostaneš klávesou q.

    +

    Já často používám git log --oneline --graph --decorate --cherry-mark --boundary. +Chceš-li tyhle možnosti studovat, začni v tomto +pořadí a dej si pauzu vždycky, když přestaneš +rozumět. :)

    +

    Když se na nějakou verzi budeš chtít podívat podrobněji, +napiš git show 5ff0b, kde místo 5ff0b +uveď prvních několik čísel z označení revize.

    +

    gitk

    +

    Z příkazové řádky se dá vyčíst všechno potřebné, +ale chce to trochu praxe. +Někdy je přehlednější použít grafické „klikátko“ jménem +gitk, které se dá spustit příkazem +gitk --all:

    +
    $ gitk --all
    +

    +

    Tenhle program vypadá celkem šeredně (skoro jako by ho +psali programátoři, které místo designu zajímá, co je +„vevnitř“), ale pro naše účely postačí. +Zkus se v něm trochu zorientovat, pak ho zavři, +udělej dalších pár revizí a koukni se na ně přes +git log a gitk --all.

    +

    Závěr

    +

    A to je všechno, co z Gitu zatím budeš potřebovat. +Vždycky, když uděláš git add soubor +a git commit, +aktuální verze souborů se uloží a už nejde (jednoduše) +smazat – pokud nesmažeš celý adresář .git. +Jednotlivé verze a změny od posledního uložení, +si umíš i prohlížet.

    +

    Možná to všechno zní jako zbytečně moc práce. +Máš tak trochu pravdu – naše projekty jsou zatím +dost malé na to, aby se jen pro ně vyplatilo učit Git. +Ale je dobré ho používat už od začátku. +Až bude správa verzí opravdu potřeba, bude se tenhle +trénink hodit.

    +

    Takže odteď, kdykoliv uděláš v rámci PyLadies funkční +verzi nějakého programu, pomocí git add a git commit si ji ulož do Gitu.

    \ No newline at end of file diff --git a/pyladies/branching/branch1.png b/pyladies/branching/branch1.png new file mode 100644 index 0000000000000000000000000000000000000000..837c74e32fa065a767604897277ab7a5dbe0bee1 GIT binary patch literal 5370 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 LEyZ$qi;({T4D~@Z literal 0 HcmV?d00001 diff --git a/pyladies/branching/branches.png b/pyladies/branching/branches.png new file mode 100644 index 0000000000000000000000000000000000000000..05b37b3c34105fb6d23e80e0e1f2c63764bebd24 GIT binary patch literal 6496 zcmX|`1yq#Z*S6^{X=x=yknS!)nh^;B0qKT8x*HT!I;5oLN0)RDj&yfQcMc^W^&bCg zecxGYW>_;k&ziH(-uHd&J)a<&uL$vI@K8`t2vw9{YNMc_Lc!lMIB4M66Ai-(yx>BW z4ct&r@X7u?P*Kt|sll7r?kXCJ*sJK|1T=hR_X{*ADAW%sFXeQ+=MS^|-s(*K?U6wc zJc?%GplZUPdHRtx?VGCSc>$ZUJp%>n)1MUe7^Qm+ zghf&)7knZ&;f>2Mw5QwT=k1UY7I6ADm+{REseN-ZxL)(y@9?sI#@E2_@WNOPHn9uI zkqtpJf@|W2pkd-UVt&ymDAM6zP5Of2)*L5ucb-Vf{ul!bi$l(P)R$fSO~*?VHkEfm z+l5$69jK&baf{xnTz9|m&yRlJL@@@&@gycCCB?^Af7tA&m+P5`F8vE3KrXqvPycp$fB~uied$m8PMfxLAwfDVf^q z9!*Y467)Ua5q6qa&lG*#zR{n|d2_ydc0QpMqt)HhDV0XErW89Xp zHT-E{#5LmUJVV3Y_}v#wd`iiO+cOvpW?*1&-0^VVm-sA|+jyQjIx{n~-euXurFw5~ zZ)+%{r@MPvOvW4eUQK8?Tgu3;f_Q^7RuwkB%X|BRfw3=mcof4Vc;Cz9?_(ud2V0_` zM|DPoMJoY2C>6X6{j5K}<59}Jf`;%xU>!-sd@F=p?@=-Z)+txDLu#L{CgAB*;oat7 zzKGPZCFVxrO$x$;%~lABR)|KzxFY2a4h|;mJ@%)|nV&w@D|_pTTyRfjZ zprHHDaNGu$<$4|ZD)-&-r8d8)hzLRk$*TpI4qd}5DNS~H;U){mUwN6QGSn!`a?grF z>+;kZRx7I>GeiVJ39=&u^3WI+UU%dY9|NEaw@eiEaOI-#sXVm4 zI1EnISth4`j<-1Z5m>pYw`A_&6iDIoFtk|?zZmMM+>HB6SopY56)~DDwrdrwIgKM+ zgyzsax~)!u_M8z_YC(kPe*s73$fNb4yF@YN_1u@$oHQ$CP-Wd{oQzN~iY5 z@?QnrUvGDlDt)1WjoAv)Xv8u|g$tgq$I5JNZE0o*4|R5S4h(P#3s3Vx?BC7OwVw8K zR#a59x3?QNyYGU1-uyYt5VSj8bQ>`!1;wvrp@=FBrD6<&ThA|V6T8+)f*7mm7?zm#%1W+a&eSLhf&C|^R1_lQCZ=s=~Aa$8!WR`#b{!Le% zot-^AJPZQeB9R#TLK|EJ^EumcT5Nos=6!llGr~dEd3?edt65ljwxYwKCVhU6DbgDu z>P_bPiTfg|J`TH$iAEdFVDjiPz>MHCS#wQ_=m{ML+~De&Kl;LIvc$uwh;SLNY^fHX z74o^xLU&wxdOE0>goFfiY$A|6O{N`zK!XoPa}`SU$`cY3>kOT&t+(0(Zu0W-?4!!1 z@2^r#1DinJgVTS?%slk^5jpwB`g#p?^`}vTv#!4WcL}ef$>KL(s0?E!larIBZjp$< zz(6>assC#TB&QbXClmQ}gB&sPgKnAJQ-R$vj8XQssS1}a#0*JB7Yr3G2%;k4C2mLK z`W*34^Xn5El-hiSdN8C7DTuMy#cpUO`=S*m^~s}o`8NyH32AAwK)^nJ{8;BO^YyWS z^;n)_uwl6-SXx@gAY-+)#}DReB1~|3-@}6+F)N+#&r~Wz5%F}~{xA^g9zFuT!SVe0 z?m|N)6A~2om$!0Uuc=5$Nhv6VK*^u1_XJ)3_Bx!edt-QI9I480ibGFv_Tv-q9Eg`O z`cxdT^rf6K$Hkj@XZaexdw&|&y#S!K%^v$lDy92Vr86K#;Czq1id*g7wH@T%7Q51z zVCEnK;xz7aNKAehHaM4uuf<|71Z>(};ba}(k*7Htc^AM%Ext?BQ&EXHFN#u8QL)nW zb83ZMJa4ru&G9dX0n%E6@FQdd{k)^;ZZ9XpAwkR?fm%z9Z&s2lG}w!7^-$D-#eM{+;NI8b8X_&`w! zAm2HDWmQX2&k`4sknkH!<2z;D9?p^g;n>dh8~)q)_i8d@gTKJ-xix^ z*XAoKD=*z*CnM#I{_L{OgE`xkoB&SPL$tPQ^}RPoD|5+Wh`kP%kg9prD7Y7^(sCXx9LI-l$4ZzmLH~lE5>Z2V;qjR;f_~Kqix3dil}(u#mc|+VVpw{wNO3nI%v=w{eB@bkIJmgifQ`Cr(9qDNZ;=Y+dbD(Ok`~>c zqoboICv~1ZD;ykD&(hppU48WE(QA-TKvy3>7PA?qTjiFK=>WmZg~vTn;NbkXT09Sd zc`9XT>c4q2(dKs<9v;5X;Ih5BiHU`EG*|Pgr0Q)t_4DV?ySlmz%RPtEg^rGn8k~QR z@4DO9H5U~rvy(6~K1>_A;PxynEn(sEx4%?UN=Z$fnVeJx;VG)B$urWvNj$1g>r#`( zomnA-D9Cv01xb@do3Tk^NIjtu-s5Q_q8Wvg&swTpl2>8-?V$hsj(7vbqJ$$>uoD$o z-mm}Erp9H+iA?PrONdaj^#6p7eV1xix|xB^!&7M*bSESrP}A7xy*2oaSn3=yk}UWOr@u%ANrpCY+cRYzcnl@3^GxcQn}*%C3hB?@A5=4&$NxgmQ(zg z>&Jj;t#x$NPIB&O(qPJ8^jA_YSEM?!AMgEH!&Rw--&3?=!A)1#9fLO^1orH;;jAp{ zG2VKqQ>R0Ar@t7bz1#Ilg`Jk9mQd0Q%8ZW11RXyF^TRjhHpukt6 zqwx^r_x=6-qoa`GpW3rkW(Z(PF)=Yy_8w+tt5c==Lzl|^R44vorJJ0MoVZT zpEk_7dFJqcxnGk8Xr6=)p-oqbSEsLm`WP@YexpMzfC<$!M zFTa;?ep57>+JvR~pAyW{|Mk?fWu@N!{$}W^JP5Cc`0veuRKomZzz|DIb<^)!y{p}} zhv5apow z@-oWg+K@twgRDp^8_6?AW!g!gGXx7^B@ zBGlNW7j2~PG0uZ!aVA_w&AtXnsKdMvH4kf@=5F_ncHYvLX%#{pDuj z3L!M2?nnD1X9p^^fc59Lwg4y;d2`&s$jJCTApxyuYR|aE6ZYSK%}q^TXhoba_NL@3 zF{t^>Ujl|iLq|va{7FhS6kV2;^&5BvK0ZD=8k%99Jp~n&&3&|LU7*a#uikiO@Lx}# zJ{=z)7xyf?@b61t?d$6Ux7AQr7c48qU}0r#JL#qc#0mI3`2=QijYmUat=^W}%ci$i zlb(8j8|5^y!~idx{OIN{DJ4bBC|y=7g6Rc|GM{kFlMM-#5gw#Xs&f*q{;M`-(SN3$ zvl0@x$;Xqi*g$7)_1-ij6l-m^+5(XK&SY_-SVs5U)WXvt=awMPgo?t#!ok2c&>Gy| z-$x#kpT^nz?dP<|88oBLci9(TI@@n5diqVuK zqA562cucc1G92CtzimJI#1((KmgTi{4UjEe*y-<-zNwIC?xNA6;+C^TqWd$=%tr5% zwcz03nMqK68{OS^F1f+DWNf$l zrVpSYo@_a8cPMSP@%^tw(Sp5Wxma6@*M*SK`e<5hye=JKsI7ha6Q8FQ`4j(AA+vvA zAU`kfKaGrfn-PX`y&IroBAIFXTU*v1g}X;?@ekgV_e7WX?H#Vr*_(WQdfG|6( zz(ZnX?!Cbgm+j^XCMg`?ay}u+WI{b%L7>^4X_6ECNmAN3<6B^KWI z>O~hAMIr1Hh&Y+JxVS_`XS=!-2m7GH`Ea?k_KWrm2$5+FW`^0AdEoj~F$c3-wOjiJ`A2^|dvEi^h<5md|NwRTeDGZO0QpLsXdU+uzm2%E6&38TOwEzJ@sG#ZDJ* zvFrWqHK0JDq))N2-}$YgVJDSjwSWmffRy|xiIV7{)$f&fp_)Hd3tWGIr{i6-dvVfu zGa{vag9Kk^-ewgqGiqy;zCCI=2m3|**0FUkV^Sy)w`}_(H~mPF7uHAf=>-mhX32R7 zUvFDk>-_0JMRXS1!2?xSVTbz+X@$K)icm z8B@nj_ev|Khuo+}+Rb?{0#wH>ploecIUQD=R9F#$f{vm2IA&|2sWB z1zv6B8m}>)qcP7$rjVEd6bcT9UoQD+l}<5;LgAgAPx$!8a&)@o6NmdHebEa9w>CG$ z#Ko5yT@~2ZcXxf(e&NQfxzGvvwAZyBcVG0=!MqC41jwQ>!+tP8m4j|uKh8Wn`5gb& zgAe})oRCN^Vkbc~*D^%F_Ts_#ztk;MY!+-Q+5||p&(=2pJ4QI?fI11btw^JDXU}&h z$Vf>)*Iiv-TUl9s8nLvpYHDht7k4iLjfE!S{?CGov9WP!NlAF(diNJHOT3!lfPjDq zU+b?a;=Ka{8GxH)WrLOSKYjdob-n$4Xv|^!1W*YTRVvuHxTctdghQR-Y6nOKTA*L= zuR*sPk@&CoCsAQd0vLkVb8~roJenJ(Stwwap-!M-cseAqTa*Kq(f+IAk$U&Hi;6kgg1CD!OuFW zZZB@T57D|*9(=!7HDI737ls8~{W0Ev zLoqr4u2|{6>>?tU<1jTavsv$ntz2(RGO^g$-oClI5)~C)JSjVWw~_O|1^ATKbDPvH zp72RRC?DZ`ffGNUpq&cvcjj10^Vx$Y0K?`me#&%ry{)kr1r8V=8=I0hmxhYUBWe}O zu4QVEt7#AWi2r57nk%}S4BpI5zlAhL;9*Z3vCm5WF?yGrcxDtW?@X^ax{E0Ghn3Lm zx61hkUS>?Y)ATUmJjC?6!#~fy?O_bc{QmuWYU=j-x&>WDV`Jm_`T5!Q$a15r#nEEZ znm7m4p3s63OY;y2)mJ*P(Iy2;jL_KUk&l2{e2?{1Y(mVf=(s&?BCk{ z8G#S*vSIBxHFW?MO>L5sHrU^%)YMdOo2!HbQh`Ih-Lh}4DdVD!vsL-8VkybVL2sm> z%ud;5x)l@MXZYmUFU!};&Z%c(she<(Bm+J1c3vP3%Mgn7>@IS{e9IZ(gShBqQJHB> zBd4FPt-NqG8Oan&OiB4~%03IM%*=zspyg=e$T$DyFdMz`TGH1W2x6I}G4l_QKWkkv zHP%D@eSOb)cx1ee7C}Rp?YsBf74F2e1?1L%2jl^@8^)(^5Xm`;(lUN$E=q zv%W;t24g~9m0V#eqiC&i_%5hk{9d%fv=zi`D$U(-c?i`h7N21U0|USsiH5bdtA~f> zQ})Zg`&WTlSLx3K@Ou--7iLE7b=MH*ufSQBf}n`ze{JlT-$!g@7`56xH8MZ)Z2oBb4PO+U$WnvvO{v<){Wo) z2SR|9;CcZ-C-Y-Q}`iWzf3Kj7AH}zCfk7H%=Q&@ zm@Wg&v~tyJ3U zy1&pqV}1$7@OrWqh~eQ@pR-6JdN9)YJE}nZSTnjQ7OnaN*a((64CTxVL4lt%Z=$an z;~iXIRAdWmqxWd66pZrK%m%`ro7d7p?jfwDQw-d^rEEFc|t_67kHh{$BlC1azXKdaZ9U@yJKnOUb|q%kJj>dk#r}kb_qia_|W| wuHwI68Ir;Q literal 0 HcmV?d00001 diff --git a/pyladies/branching/index.html b/pyladies/branching/index.html new file mode 100644 index 00000000..cdf5fd32 --- /dev/null +++ b/pyladies/branching/index.html @@ -0,0 +1,166 @@ +

    Větvení v Gitu

    +

    Takže, Git už znáš! +Teď to začne být trošičku složitější :)

    +

    Programátoři občas potřebují pracovat na dvou +věcech zároveň. +V projektu do práce se objeví se chyba, +která musí být opravená +ještě dnes, tak programátor/ka opustí, co zrovna dělá, +vrátí se k nějaké „stabilní” verzi, opraví chybu +a odešle ji zákazníkům. +A pak se vrátí k tomu, co dělal/a předtím – jen ještě +musí zakomponovat opravu chyby i do verze, na které +pracuje dlouhodobě.

    +

    Git na to má takzvané větve (angl. branches). +Na jedné „větvi” se pracuje, ale je možné se přepnout do +jiné (třeba starší) větve, udělat pár změn +a pak se zase přepnout do nové větve a +pokračovat dál nebo sloučit změny.

    +

    Větvení využijeme i při spolupráci více lidí – každý +dělá na vlastní větvi a když přijde čas, +tak se různé změny sloučí dohromady.

    +

    Podívej se, jaké máš větve ve svém repozitáři. +K tomu slouží příkaz git branch:

    +
    $ git branch
    +* master

    Je tam jenom jedna a jmenuje se master +– to je tradičně jméno „hlavní” větve.

    +

    K vytvoření nové větve znovu použiješ +git branch, jen tomu příkazu dáš navíc +jméno nové větve. +Třeba budeš chtít k básničce doplnit jméno autora, +tak větev pojmenuješ doplneni-autora.

    +
    $ git branch doplneni-autora
    +$ git branch
    +  doplneni-autora
    +* master

    Tenhle příkaz sice udělal novou větev, +ale nepřepnul do ní. +Hvězdička ve výstupu z git branch ukazuje, +že stále pracuješ v master. +Na přepnutí budeš potřebovat další příkaz:

    +
    $ git checkout doplneni-autora
    +Switched to branch 'doplneni-autora'
    +$ git branch
    +* doplneni-autora
    +  master

    Tak. Teď jsi „ve” větvi doplneni-autora. +Doplň nějaké jméno na začátek souboru basnicka.txt, +a pomocí git add a git commit udělej novou revizi. +Pak koukni na gitk --all, jak to vypadá:

    +

    Výstup programu `gitk` s větví doplneni-autora

    +

    Aktuální větev – doplneni-autora – je +zvýrazněná tučně a starší master je stále +na původní revizi.

    +

    Opusťme teď na chvíli práci na doplňování autora. +Vrať se do větve master a vytvoř z ní +větev doplneni-jmena. +Pak se na tuhle novou větev přepni.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git branch doplneni-jmena
    +$ git checkout doplneni-jmena
    +Switched to branch 'doplneni-jmena'
    +$ git branch
    +  doplneni-autora
    +* doplneni-jmena
    +  master

    Doplň jméno básně na začátek souboru (tedy na stejné místo, +jako je v druhé větvi název) a pomocí +git add, git commit ulož revizi. +Všechno zkontroluj přes gitk --all.

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu

    +

    Takhle nějak se dá postupovat v situaci popsané v úvodu: +opuštění rozpracované verze, přechod na „stabilní” +verzi master a začátek práce v jiné +části projektu.

    +

    Mezi jednotlivými větvemi se dá podle libosti přepínat, +jen je vždycky dobré před přepnutím udělat novou revizi +(git commit) a pomocí git status zkontrolovat, jestli je všechno +uložené v Gitu.

    +

    Na stejném principu funguje i spolupráce několika lidí +na jednom projektu: je nějaký společný základ +(master) a každý dělá na vlastní větvi, dokud není se svými změnami spokojený.

    +

    A až je některá větev hotová, může se začlenit +zpátky do master. Podívejme se jak na to.

    +

    Sloučení

    +

    Nedávalo by smysl historii projektu rozdvojovat, +kdyby pak jednotlivé větve nešly zase sloučit dohromady. +V Gitu je většinou slučování poměrně jednoduché, ale tento příklad schválně +ukazuje nejsložitější variantu, která může nastat.

    +

    Přepni se zpátky na master +a použij příkaz git merge, který +sloučí jinou větev s tou aktuální. +Příkazu musíš dát jméno větve, kterou chceš sloučit.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git merge doplneni-jmena
    +Updating 1fcd654..5c9bf93
    +Fast-forward
    + basnicka.txt | 3 +++
    + 1 file changed, 3 insertions(+)

    Sloučeno! Ono „Fast-forward” znamená, že +vlastně nebylo co slučovat – jen se do větve +master přidaly nové změny. +Zkontroluj v gitk --all, jak to vypadá.

    +

    A pak zkus sloučit i druhou větev: git merge doplneni-autora. +Tady to bude složitější: pravděpodobně se stane, že změny nepůjdou +automaticky sloučit a ve výstupu se objeví hláška +merge conflict (slučovací konflikt):

    +
    $ git merge doplneni-autora
    +Auto-merging basnicka.txt
    +CONFLICT (content): Merge conflict in basnicka.txt
    +Automatic merge failed; fix conflicts and then commit the result.

    A když ne?

    +

    Jestli se konflikt neobjevil, Git změny sloučil sám. +Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti +někdy „podaří“ konflikt udělat.

    +

    Když nastane konflikt, git status ukáže „both modified“ – tedy že byl soubor +změněný v obou slučovaných větvích:

    +
    $ git status
    +On branch master
    +You have unmerged paths.
    +  (fix conflicts and run "git commit")
    +  (use "git merge --abort" to abort the merge)
    +
    +Unmerged paths:
    +  (use "git add <file>..." to mark resolution)
    +    both modified:   basnicka.txt
    +
    +no changes added to commit (use "git add" and/or "git commit -a")

    V tom případě se na soubor podívej v editoru: objeví +se v něm obsah z obou konfliktních verzí, +společně se značkami <<<<<<<, ======= a >>>>>>>, které upozorňují na +místo kde konflikt nastal.

    +

    Značky ukáže i příkaz git diff, jehož výstup je teď trošku složitější:

    +
    $ git diff
    +diff --cc basnicka.txt
    +index bc7a2de,88e7ea5..0000000
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@@ -1,4 -1,4 +1,8 @@@
    +++<<<<<<< HEAD
    + +Holka Modrooká
    +++=======
    ++ (Lidová)
    +++>>>>>>> doplneni-autora
    +  
    +  Holka modrooká
    +  Nesedávej u potoka

    Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu +jako Python chybové hlášky: tedy aby ti co nejvíce pomohl. +Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se +ti řešení konfliktu co nejvíc usnadnit.

    +

    Proto hlavně nepanikař! +Soubor otevři v editoru a uprav tak, jak by měl vypadat. +Značky jako <<<<<<< smaž; řádky poskládej tak, jak by měly jít za sebou. +(A pracuješ-li na kódu, spusť testy a ověř, jestli všechno stále funguje.)

    +

    Pak soubor ulož a zadej git commit.

    +

    Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“ +(angl. merge commit), které – jako každé revizi – můžeš dát popisek. +Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.

    +
    $ git add basnicka.txt
    +$ git commit
    +[master 884b30a] Merge branch 'doplneni-autora'

    Povedlo se?

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master

    +

    Pokud ano, můžeš staré větve vymazat – všechny jejich +změny jsou v master a nemá na nich cenu +pracovat dál.

    +
    $ git branch --delete doplneni-autora
    +Deleted branch doplneni-autora (was f1cd9be).
    +$ git branch --delete doplneni-jmena
    +Deleted branch doplneni-jmena (was 5c9bf93).
    +$ git branch
    +* master

    Gratuluji, už umíš větvení a slučování!

    \ No newline at end of file diff --git a/pyladies/branching/merge.png b/pyladies/branching/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..7f74005ba258ffae89f67f3d376966a9418dbfef GIT binary patch literal 7185 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 Z&KM>ammu_^65P&%Xx-OWd#i$c@_$~mno0lw literal 0 HcmV?d00001 diff --git a/pyladies/circular-imports/index.html b/pyladies/circular-imports/index.html new file mode 100644 index 00000000..07858c6a --- /dev/null +++ b/pyladies/circular-imports/index.html @@ -0,0 +1,108 @@ +

    Cyklické importy

    +

    V domácích projektech budeš rozdělovat 1D Piškvorky na několik modulů. +Výsledek bude vypadat třeba nějak takhle: +(Šipky mezi moduly znázorňují importování.)

    +
    ┌──────────────────╮  ┌───────────────╮  ┌──────────────────╮ 
    +│      ai.py       │  │ piskvorky.py  │  │    hra.py        │
    +├──────────────────┤  ├───────────────┤  ├──────────────────┤
    +│                  │◀-│ import ai     │◀-│ import piskvorky │
    +├──────────────────┤  ├───────────────┤  ├──────────────────┤
    +│ def tah_pocitace │  │ def vyhodnot  │  │                  │
    +│                  │  │ def tah       │  │                  │
    +└──────────────────┘  │ def tah_hrace │  └──────────────────┘
    +                      │               │
    +                      └───────────────┘
    +                          ▲
    +                          │
    +                          │ ┌───────────────────╮
    +                          │ │ test_piskvorky.py │
    +                          │ ├───────────────────┤
    +                          └─│ import piskvorky  │
    +                            ├───────────────────┤
    +                            │ def test_...      │
    +                            │                   │
    +                            └───────────────────┘

    Jenže funkce tah_pocitace +většinou potřebuje volat funkci tah. +Co s tím? +Můžeš importovat aipiskvorky a zároveň +piskvorkyai?

    +
    ┌──────────────────╮  ┌───────────────╮
    +│      ai.py       │  │ piskvorky.py  │
    +├──────────────────┤  ├───────────────┤
    +│                  │◀-│ import ai     │
    +│ import piskvorky │-▶│               │
    +│                  │  │               │
    +│ def tah_pocitace │  │ def vyhodnot  │
    +│                  │  │ def tah       │
    +└──────────────────┘  │ def tah_hrace │
    +                      │               │
    +                      └───────────────┘

    Můžeme se na to podívat z hlediska Pythonu, +který příkazy v souborech vykonává. +Když má importovat soubor piskvorky.py, začne ho +zpracovávat řádek po řádku, +když tu (docela brzo) narazí na příkaz import ai. +Otevře tedy soubor ai.py +a začne ho zpracovávat řádek po řádku. +Brzy narazí na příkaz import piskvorky. Co teď?

    +

    Aby nenastala situace podobná nekonečné smyčce – +jeden soubor by importoval druhý, druhý zase první, +a tak stále dokola – +udělá Python taková malý „podvod“: +když zjistí, že soubor piskvorky.py +už importuje, zpřístupní v modulu ai +modul piskvorky tak, jak ho +má: nekompletní, bez většiny funkcí co v něm mají +být nadefinované. +A až potom, co dokončí import ai.py, +se vrátí k souboru piskvorky.py +a pokračuje v provádění příkazů def které v něm jsou. +Takový nekompletní modul může být občas užitečný, +ale ve většině případů se chová skoro +nepředvídatelně a tudíž nebezpečně.

    +

    Jinými slovy: když se dva moduly importují navzájem, +nemusí to fungovat podle očekávání.

    +

    Téhle situaci se budeš chtít vyvarovat.

    +

    Jak na to? Máš dvě možnosti.

    +

    Organizace modulů podle závislostí

    +

    První možnost je importovat funkci tah v modulu ai +a používat ji odtamtud. +To je jednoduché, ale nerespektuje účel modulu +ai, který má obsahovat jenom logiku +vybírání tahu počítače, a ne pomocné funkce, které +můžou být potřeba i jinde.

    +
    ┌──────────────────╮  ┌───────────────╮
    +│      ai.py       │  │ piskvorky.py  │
    +├──────────────────┤  ├───────────────┤
    +│                  │◀-│ import ai     │
    +│                  │  │               │
    +│ def tah_pocitace │  │ def vyhodnot  │
    +│ def tah          │  │ def tah_hrace │
    +│                  │  │               │
    +└──────────────────┘  └───────────────┘

    Pomocný modul

    +

    Druhá možnost je definovat nový, sdílený modul, +který se použije jak v piskvorky.py tak v ai.py.

    +

    Takový modul se často se pojmenovává +util.py (z angl. utility, pomůcka, nástroj).

    +
                  ┌──────────────────╮
    +              │ util.py          │
    +              ├──────────────────┤
    +              │ def tah          │
    +              └──────────────────┘
    +                      ▲  ▲
    +                      │  │
    +┌──────────────────╮  │  │  ┌───────────────╮
    +│      ai.py       │  │  │  │ piskvorky.py  │
    +├──────────────────┤  │  │  ├───────────────┤
    +│ import util      │──┘  └──│ import util   │
    +│                  │◀───────│ import ai     │
    +│                  │        │               │
    +│ def tah_pocitace │        │ def vyhodnot  │
    +│                  │        │ def tah_hrace │
    +│                  │        │               │
    +└──────────────────┘        └───────────────┘

    Nevýhoda pomocného modulu je ta, +že se z něj může stát neudržované „odkladiště“ +všeho kódu, který byl jednou potřeba na dvou +nebo více místech.

    +

    Pro kterou z možností se rozhodnout, záleží +na situaci. +Programování není vždycky jen exaktní věda!

    \ No newline at end of file diff --git a/pyladies/class/index.html b/pyladies/class/index.html new file mode 100644 index 00000000..93637b1f --- /dev/null +++ b/pyladies/class/index.html @@ -0,0 +1,253 @@ +

    Hodnoty a objekty

    +

    Než se dnes začneme zabývat třídami, +podíváme na objekty.

    +

    Co pro programátory znamená slovo objekt?

    +

    V Pythonu je to jednoduché – každá hodnota +(tj. něco, co můžeš uložit do proměnné, vrátit +z funkce nebo třeba seznamu) je objekt. +Některé jazyky (třeba Javascript, C++ nebo Java) mají +i jiné hodnoty než objekty, v některých +jazycích (třeba v C) objekty vůbec nejsou. +Ale v Pythonu mezi hodnotou a objektem není rozdíl, +takže je na jednu stranu trošku složitější pochopit, +v čem spočívá ta „objektovitost“, ale na druhou stranu +to zase není potřeba vědět do detailů.

    +

    Základní vlastnost objektů je to, že obsahují jak data +(informace), tak chování – instrukce nebo metody, +které s těmito daty pracují. +Třeba řetězce v Pythonu obsahují jak informace +(nějakou sekvenci znaků), tak užitečné metody jako +upper nebo count. +Kdyby řetězce nebyly objekty, musel by Python mít +spoustu funkcí jako str_upper a str_count. +Objekty spojují data a funkčnost dohromady.

    +

    Možná namítneš, že třeba len je funkce. +Je to tak, Python není „stoprocentně“ objektový jazyk. +Funkce len ale funguje i na +objektech, které s řetězci nemají nic společného.

    +

    Třídy

    +

    Data každého objektu jsou specifická pro konkrétní +objekt ("abc" obsahuje jiné znaky než +"def"), ale funkčnost – metody – bývají +společné pro všechny objekty daného typu. +Třeba řetězcová metoda count() by se dala +napsat zhruba jako:

    +
    def count(retezec, znak):
    +    pocet = 0
    +    for c in retezec:
    +        if c == znak:
    +            pocet = pocet + 1
    +    return pocet
    +

    … a ačkoliv bude vracet jinou hodnotu pro každý řetězec, +samotná metoda je společná všem řetězcům.

    +

    Tohle společné chování určuje +typ (angl. type) neboli třída (angl. class) daného objektu.

    +

    V jiných jazycích než Python 3 můžou slova „typ“ a „třída“ označovat různé +věci. Pro nás to budou synonyma.

    +

    Typ objektu umí zjistit funkce type:

    +
    >>> type(0)
    +<class 'int'>
    +>>> type(True)
    +<class 'bool'>
    +>>> type("abc")
    +<class 'str'>
    +>>> with open('soubor.txt') as f:
    +...     type(f)
    +... 
    +<class '_io.TextIOWrapper'>
    +

    A co je to třída? Třída je popis, jak se všechny objekty +daného typu chovají.

    +

    Například <class 'int'> obsahuje všechno, co je společné všem celým číslům: +že (a jak) se dají sčítat, jak takové číslo převést na řetězec, a tak dále.

    +

    Tvoření objektů třídy

    +

    Většinu tříd jde navíc v Pythonu zavolat, jako by +to byly funkce, a vytvořit tak nový objekt dané třídy:

    +
    >>> trida_retezcu = type("abc")
    +>>> trida_retezcu(8)
    +'8'
    +>>> trida_retezcu([1, 2, 3])
    +'[1, 2, 3]'
    +

    Chová se to stejně jako funkce str! Není to podivné?

    +

    Tady se musím omluvit: +materiály k funkcím +tak trochu lhaly. Funkce str, int, float apod. totiž vůbec +nejsou funkce – jsou to právě třídy:

    +
    >>> str
    +<class 'str'>
    +>>> type('abcdefgh')
    +<class 'str'>
    +>>> type('abcdefgh') == str
    +True
    +

    Ale dají se, podobně jako funkce, zavolat. +Třída tedy většinou obsahuje nejen „popis“, jak se +její objekty budou chovat, ale „umí“ takové objekty i vytvořit.

    +

    Vlastní třídy

    +

    A proč najednou tolik informací o třídách? +Protože si zkusíme napsat třídu vlastní.

    +

    Třídu se hodí napsat, když plánuješ mít ve svém +programu více objektů s podobným chováním. +Třeba karetní hra by mohla mít třídu Karta, +webová aplikace třídu Uživatel, +tabulkový procesor třídu Řádek.

    +

    My teď potřebujeme napsat program o zvířátkách. +Začni tím, že napíšeš třídu pro koťátka, která umí mňoukat:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print("Mňau!")
    +

    Tak jako se funkce definují pomocí def, +třídy mají klíčové slovo class, +za které napíšeš jméno třídy, dvojtečku a pak odsazené tělo třídy. +Podobně jako def dělá funkce, příkaz +class udělá novou třídu a přiřadí ji +do proměnné daného jména (tady Kotatko).

    +

    Třídy se tradičně pojmenovávají s velkým písmenem, +aby se nepletly s „normálními“ hodnotami.

    +

    Základní třídy (str, int atd.) +velká písmena nemají, a to hlavně z historických +důvodů – původně to byly opravdu funkce.

    +

    V těle třídy můžeš definovat metody, které vypadají +úplně jako funkce – jen mají první parametr self. +Ten si ale vysvětlíme později – napřed zkus zamňoukat:

    +
    # Vytvoření konkrétního objektu
    +kotatko = Kotatko()
    +
    +# Volání metody
    +kotatko.zamnoukej()
    +

    V tomhle příkladu si dej pozor na velikost písmen: +Kotatko (s velkým K) je třída – popis, jak +se koťátka chovají. +kotatko (s malým k) +je konkrétní objekt (angl. instance) té třídy: +hodnota, která reprezentuje kotě.

    +

    Když definuješ třídu (pomocí bloku class), neznamená to zatím, že ve tvém +programu je nějaké koťátko. +Třída je jako recept nebo manuál: když si koupíš kuchařku, budeš teoreticky +vědět jak upéct dort, jak bude takový dort vypadat a že se dá sníst. +Ale neznamená to ještě, že máš samotný dort!

    +

    Konkrétní objekt vytvoříš až zavoláním třídy. +Stejně jako zavoláním str() se dá vytvořit konkrétní řetězec, +volání Kotatko() vytvoří nový objekt tvé třídy, který už můžeš použít.

    +

    Mňau!

    +

    Atributy

    +

    Objekty vytvořené z „vlastních“ tříd mají funkčnost, kterou třídy jako str +nedovolují: máš možnost si definovat vlastní +atributy – informace, které se uloží k danému objektu. +Atributy se označují tak, že mezi hodnotu a jméno +jejího atributu napíšeš tečku:

    +
    mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +
    +micka = Kotatko()
    +micka.jmeno = 'Micka'
    +
    +print(mourek.jmeno)
    +print(micka.jmeno)
    +

    Na začátku jsme si řekli, že objekty spojují chování +a data. +Chování je definováno ve třídě; data se schovávají +právě v atributech jednotlivých objektů. +Podle atributů jako jmeno pak můžeš jednotlivá koťátka +rozlišit.

    +

    Asi sis všiml/a, že tečkou se dostaneš jak k metodám +převzaným z třídy, tak k atributům specifickým +pro konkrétní objekt. +Co se stane, když má atribut stejné jméno jako +metoda z třídy? Vyzkoušej si to:

    +
    micka = Kotatko()
    +micka.zamnoukej = 12345
    +micka.zamnoukej()
    +

    Parametr self

    +

    Teď se na chvíli vraťme k metodám. Konkrétně k parametru self.

    +

    Každá metoda má přístup ke konkrétnímu objektu, na +kterém pracuje, právě přes argument self. +Teď, když máš koťátka pojmenovaná, můžeš v metodě zamnoukej použít self +a dostat se tak ke jménu daného koťátka:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +
    +micka = Kotatko()
    +micka.jmeno = 'Micka'
    +
    +mourek.zamnoukej()
    +micka.zamnoukej()
    +

    Co se stalo? Výraz mourek.zamnoukej udělá metodu. +Když ji pak zavoláš (mourek.zamnoukej()), +objekt mourek se předá funkci zamnoukej jako první argument, self.

    +

    Onen první argument metody můžeš teoreticky pojmenovat i jinak než self, +ale když to uděláš, ostatní programátoři se na tebe budou koukat hodně divně.

    +

    Může taková metoda brát víc než jeden argument? +Může – self se doplní na první místo, +zbytek argumentů se vezme z volání metody. +Třeba:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +mourek.snez('ryba')
    +

    Metoda __init__

    +

    Co se stane, když koťátku zapomeneš nastavit jméno? +Metoda zamnoukej přestane fungovat:

    +
    >>> micka = Kotatko()
    +>>> micka.snez('ryba')
    +Traceback (most recent call last):
    +  File "<zvirata.py>", line 5, in snez
    +AttributeError: 'Kotatko' object has no attribute 'jmeno'
    +

    Aby tahle chyba nemohla nastat, můžeš zařídit, aby každé kotě muselo být +pojmenované – a to už od okamžiku kdy vznikne. +Jméno pak budeš zadávat už při vytváření kotěte, nějak takhle:

    +
    mourek = Kotatko(jmeno='Mourek')
    +

    To ale zatím nefunguje; musíš na to třídu Kotatko připravit.

    +

    Použij na to speciální metodu, která se jmenuje __init__ (dvě podtržítka, +init, dvě podtržítka). +To „opodtržítkování“ znamená, že tohle jméno je nějakým způsobem speciální. +Metodu __init__ totiž Python zavolá +automaticky, když vytvoří nový objekt. +Můžeš tedy napsat:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko('Mourek')
    +mourek.zamnoukej()
    +

    A teď už není možnost, jak vytvořit koťátko beze jména. +Metoda zamnoukej bude vždycky fungovat.

    +

    Jako u jiných funkcí je možné jméno koťátka zadat buď jako pojmenovaný +argument, nebo jako poziční. Obojí funguje stejně:

    +
    mourek = Kotatko('Mourek')  # 'Mourek' je hodnota prvního argument pro __init__ (po self)
    +micka = Kotatko(jmeno='Micka')  # 'Micka' je hodnota argumentu `jmeno`

    Metoda __str__

    +

    Podobných „opodtržítkovaných“ (speciálních) metod je víc. +Třeba metodu __str__ Python zavolá, když je potřeba +převést objekt na řetězec:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def __str__(self):
    +        return f'<Kotatko jmenem {self.jmeno}>'
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko('Mourek')
    +print(mourek)
    +

    A to je o samotných třídách zatím vše. +Příště si něco řekneme o dědičnosti. +A o štěňátkách.

    \ No newline at end of file diff --git a/pyladies/cmdline/index.html b/pyladies/cmdline/index.html new file mode 100644 index 00000000..6ef6982b --- /dev/null +++ b/pyladies/cmdline/index.html @@ -0,0 +1,276 @@ +

    Příkazová řádka

    +

    V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, +které programátoři používají na zadávání příkazů. +Na první pohled může vypadat nepřirozeně, ale dá se na ni zvyknout :)

    +

    Příkazová řádka +(respektive program, kterému se říká i konzole či terminál; +anglicky command line, console, terminal) +se na různých systémech otevírá různě:

    +
      +
    • Windows (české): Start → napsat na klávesnici „cmd“ → Příkazový řádek
    • +
    • Windows (anglické): Start → napsat na klávesnici „cmd“ → Command Prompt
    • +
    • macOS (anglický): Applications → Utilities → Terminal
    • +
    • Linux (KDE): Hlavní Menu → hledat Konsole
    • +
    • Linux (GNOME): Super → hledat Terminál
    • +
    +

    Nevíš-li si rady, zkus buď googlit, +nebo se zeptat e-mailem.

    +

    Po otevření konzole tě uvítá řádek, +kterým počítač vybízí k zadání příkazu. +Podle systému bude končit buď znakem $ nebo >, +před nímž můžou být ještě další informace:

    +
    +

    Unix (Linux, macOS)

    $
    +
    +

    Windows

    >
    +

    Podle systému se potom liší i samotné příkazy, které budeš zadávat.

    +

    Velikost písma

    +

    Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. +V záložce Písmo si pak můžeš vybrat větší font. +

    +

    Screenshot menu příkazové řádky

    +

    Na ostatních systémech hledej v nastavení, nebo zkus +Ctrl++ a +Ctrl+- (příp. se Shift).

    +

    První příkaz

    +

    Začneme jednoduchým příkazem. +Napiš whoami (z angl. who am I? – kdo jsem?) +a stiskni Enter. +Objeví se přihlašovací jméno. Třeba u Heleny by to vypadalo takhle:

    +
    +

    Unix

    $ whoami
    +helena
    +
    +

    Windows

    > whoami
    +pocitac\Helena
    +

    Znak $ nebo > je v ukázce jen proto, aby bylo jasné, že zadáváme +příkaz do příkazové řádky. +Vypíše ho počítač, většinou ještě s něčím před ním, +takže ho nepiš sama! Zadej jen whoami a Enter.

    +

    Stejně tak počítač sám vypíše přihlašovací jméno.

    +

    Aktuální adresář

    +

    Příkazová řádka pracuje vždy v nějakém adresáři (neboli složce, +angl. directory, folder). +Ve kterém adresáři zrovna je, to nám poví příkaz, který se podle systému +jmenuje pwd nebo cd (z angl. print working directory – vypiš pracovní +adresář, resp. current directory – aktuální adresář).

    +
    +

    Unix

    $ pwd
    +/home/helena/
    +
    +

    Windows

    > cd
    +C:\Users\helena
    +

    Aktuální adresář se většinou ukazuje i před znakem $ nebo >, +ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a +(nebo musel/a pracovat na počítači který před $ ukazuje něco jiného).

    +

    Co v tom adresáři je?

    +

    Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) +nám vypíše, co aktuální adresář obsahuje: všechny soubory, +včetně podadresářů, které se v aktuálním adresáři nacházejí.

    +
    +

    Unix

    $ ls
    +Applications
    +Desktop
    +Downloads
    +Music
    +
    +
    +

    Windows

    > dir
    + Directory of C:\Users\helena
    +05/08/2014 07:28 PM <DIR>  Applications
    +05/08/2014 07:28 PM <DIR>  Desktop
    +05/08/2014 07:28 PM <DIR>  Downloads
    +05/08/2014 07:28 PM <DIR>  Music
    +
    +

    Změna aktuálního adresáře

    +

    Aktuální adresář se dá změnit pomocí příkazu cd +(z angl. change directory – změnit adresář). +Za cd se píše jméno adresáře, kam chceme přejít. +Pokud máš adresář Desktop nebo Plocha, přejdi tam. Pak nezapomeň ověřit, +že jsi na správném místě.

    +

    Jsi-li na Linuxu nebo macOS, dej si pozor na velikost písmen: na těchto +systémech jsou Desktop a desktop dvě různá jména.

    +

    Jsi-li na Windows, cd už jsi používal/a – tento příkaz se chová různě +podle toho, jestli něco napíšeš za něj nebo ne.

    +
    +

    Unix

    $ cd Desktop
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd Desktop
    +> cd
    +C:\Users\helena\Desktop
    +

    Poznámka pro Windows

    +

    Pokud přecházíš do adresáře na jiném disku, +například D: místo C:, je potřeba kromě cd +zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    +

    Vytvoření adresáře

    +

    Co takhle si vytvořit adresář na Python? To se dělá příkazem mkdir +(z angl. make directory – vytvořit adresář). +Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě +naucse-python:

    +
    +

    Unix

    $ mkdir naucse-python
    +
    +

    Windows

    > mkdir naucse-python
    +

    Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na +prohlížení adresářů: zjistíš, že adresář se opravdu vytvořil!

    +

    Úkol

    +

    Zkus v nově vytvořeném adresáři naucse-python +vytvořit adresář test +a zkontrolovat, že se opravdu vytvořil.

    +

    Budou se hodit příkazy cd, mkdir a ls či dir.

    +
    +

    Řešení

    + + +

    Úklid

    +

    Teď vytvořené adresáře zase smažeme.

    +

    Nemůžeš ale smazat adresář, ve kterém jsi. +Proto se vrátíme na Desktop. +Ale nemůžeme použít cd Desktop – v aktuálním adresáři žádný Desktop není. +Potřebuješ se dostat do nadřazeného adresáře: toho, který obsahuje +adresář ve kterém právě jsi. +Nadřazený adresář se značí dvěma tečkami:

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop/naucse-python
    +$ cd ..
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop\naucse-python
    +> cd ..
    +> cd
    +C:\Users\helena\Desktop
    +

    Teď můžeš smazat vytvořený adresář naucse-python. +K tomu použij příkaz rm nebo rmdir +(z remove – odstraň, resp. remove directory – odstraň adresář).

    +

    Pozor!

    +

    Příkazová řádka nepoužívá odpadkový koš! +Všechno se nadobro smaže. Takže si dobře překontroluj, že mažeš +správný adresář.

    +

    Na Unixu za tento příkaz musíš napsat ještě jedno slovo: -rv (minus, +r, v). +To je takzvaný přepínač, který příkazu říká, že má smazat celý adresář +včetně všeho, co obsahuje (r), +a že má informovat o tom co dělá (v).

    +

    Obdobně i na Windows je potřeba zadat přepínač, který říká, že má smazat +adresář a veškerý jeho obsah. Tentokrát je to /S (lomítko, S). +Příkaz rmdir se automaticky ujistí, jestli to co mažeš opravdu chceš smazat.

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop
    +$ rm -rv naucse-python
    +removed directory: ‘naucse-python’
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop
    +> rmdir /S naucse-python
    +naucse-python, Are you sure <Y/N>? Y
    +

    Shrnutí

    +

    Tady je tabulka základních příkazů, se kterými si zatím vystačíme:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    UnixWindowsPopisPříklad
    cdcdzměna adresářecd test
    pwdcdvýpis aktuálního adresářepwd
    cd
    lsdirvýpis adresářels
    dir
    cpcopyzkopírování souboru + cp puvodni.txt kopie.txt +
    + copy puvodni.txt kopie.txt +
    mvmovepřesun/přejmenování souboru + mv puvodni.txt novy.txt +
    + move puvodni.txt novy.txt +
    mkdirmkdirvytvoření adresářemkdir test
    rmdelsmazání souborurm test.txt
    del test.txt
    rm -rrmdir /Ssmazání adresářerm -r test
    rmdir /S test
    exitexitukončeníexit

    Příkazů existuje samozřejmě daleko víc. +Dokonce každý program, který máš na počítači nainstalovaný, jde spustit +z příkazové řádky – a to většinou jen zadáním jeho jména. +Zkus, jestli na tvém počítači bude fungovat firefox, notepad, safari +nebo gedit.

    +

    Při učení Pythonu použiješ programy/příkazy jako python a git, které +zanedlouho nainstalujeme. +

    +

    Konec

    +

    Nakonec vyzkoušej ještě jeden příkaz. +Ten, který příkazovou řádku zavírá: exit.

    +

    Jako většina příkazů (kromě pár z těch základních) funguje exit +stejně na všech systémech. +Proto už nebudu používat ukázku rozdělenou pro Unix a Windows.

    +
    $ exit
    +

    Ve zbytku těchto materiálů budeme pro kód, který je potřeba zadat do +příkazové řádky, používat unixovské $. +S touto konvencí se setkáš i ve většině návodů na internetu. +Používáš-li Windows, je dobré si na $ zvyknout, i když ve své +řádce máš místo něj >.

    \ No newline at end of file diff --git a/pyladies/cmdline/windows-cmd-properties.png b/pyladies/cmdline/windows-cmd-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb2040b0a9a3ddd60c7965f13b38f64608fc0a6 GIT binary patch literal 23872 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 VS> literal 0 HcmV?d00001 diff --git a/pyladies/collaboration/gh-workflow-diagram.svg b/pyladies/collaboration/gh-workflow-diagram.svg new file mode 100644 index 00000000..5a33a8d8 --- /dev/null +++ b/pyladies/collaboration/gh-workflow-diagram.svg @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + „Hlavní” projektna Githubu + origin + ty + Tvůj projektna Githubu + + > + Lokální repozitář + + + + git pull + git push ty + pull request + + diff --git a/pyladies/collaboration/index.html b/pyladies/collaboration/index.html new file mode 100644 index 00000000..aebdac11 --- /dev/null +++ b/pyladies/collaboration/index.html @@ -0,0 +1,359 @@ +

    Spolupráce

    +

    „Opravdové” programy zřídka vznikají prací jednoho člověka. +Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým.

    +

    Každý člen týmu potřebuje mít přístup k práci ostatních. +K tomu se dá použít Git: někde na internetu si zařídí sdílený repozitář, +se kterým se všichni budou synchronizovat.

    +

    Pro samostudium

    +

    Pokud materiály čteš z domu a máš možnost se +v budoucnu dostat na nějaký sraz, zatím tuhle sekci přeskoč. +Na sraze pak popros zkušenější programátory, aby ti pomohli. +(Nechystáš-li se na sraz, můžeš pokračovat – +zvládnout se to dá.)

    +

    Open Source

    +

    Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného +zdrojového kódu. +První programy vznikaly v akademické sféře, kde byly zcela přirozeně sdíleny, +jako je to s poznatky mezi vědci běžné. +50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů +a technologií, které dnes používáme. +Pak se začalo programování postupně komercializovat a firmy začaly zdrojový +kód skrývat jako konkurenční výhodu. +Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

    +

    Některým programátorům tohle skrývání kódu hluboce vadilo. +Roku 1985 publikoval +Richard Stallman +GNU Manifesto, +kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a +odstartoval tak hnutí svobodného softwaru. +To prosazuje 4 následující svobody (převzato +z Wikipedie):

    +
      +
    1. svoboda používat program za jakýmkoliv účelem,
    2. +
    3. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
    4. +
    5. svoboda redistribuovat kopie programu,
    6. +
    7. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    8. +

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) +dostupná na Internetu a každý je používáme. +Jejich další sdílení je upraveno jednou z licencí, +které tyto základní svobody zaručují.

    +

    Ne všechny jsou v Pythonu (a těm co jsou zatím +nebudeš všem rozumět). Ne všechny jsou v Gitu. +Ne všechny jsou kvalitní – protože si +každý může zveřejnit co chce, na Internetu se válí +spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +A bohužel, ne všechny projekty mají přátelské autory.

    +

    Na druhou stranu ale open-source programy +mají svoje výhody: nejenom že se z nich může kdokoli +učit, ale každý může i zkontrolovat, jestli +dělají to, co dělat mají. +Populární open-source programy tě například +pravděpodobně nebudou špehovat (tj. hlásit autorovi, +co na počítači děláš), ani většinou neobsahují +reklamy: kdyby to dělaly, najde se +někdo kdo tyhle „funkce” odstraní a lidi – časem – +začnou používat opravenou verzi.

    +

    Některé příklady populárních open-source projektů:

    + +

    Jak vidno z posledního příkladu, nejen softwarové +projekty se dají vést takhle veřejně. +Tento kurz vychází z principů open source: +všechno know-how je sdílené a budeme rádi, když +se zapojíš.

    +

    Až příště uvidíš v materiálech chybu (nebo jestli o nějaké víž už teď), +dnes se dozvíš, jak ji opravit!

    +

    A co tvůj kód? Chceš ho taky dávat takhle veřejně k dispozici? +Nutné to samozřejmě není – Git se dá používat i +v uzavřeném týmu – ale na druhou stranu, +máš důvod proč to nedělat? +Zveřejňovat zdrojový kód se hodí už jen pro to, +aby ti s ním mohli zkušenější programátoři snadněji pomáhat.

    +

    GitHub

    +

    Na Internetu existuje spousta stránek, kam se dají nahrávat gitové repozitáře +s kódem – např. GitLab, +BitBucket, +Pagure nebo +Launchpad. +Aktuálně nejpopulárnější je ale GitHub, který si tady +ukážeme.

    +

    Jestli ještě nemáš uživatelský účet na github.com, jdi +tam a založ si ho.

    +

    Naklonování repozitáře (git clone)

    +

    Pro začátek zkusíme práci s repozitářem, který už vytvořil někdo jiný. +V příkazové řádce zadej příkaz, který ti oznámí kouč; něco jako

    +
    $ git clone https://github.com/naucse/prezencka
    +

    Vytvoří se ti nový repozitář – adresář se jménem +prezencka, ve kterém je nějaký soubor.

    +

    Na URL (adresu), kterou jsi v tomhle příkladě +použil/a, se můžeš podívat i v prohlížeči. +Uvidíš seznam souborů a spoustu odkazů k +informacím o repozitáři (například pod „commits” +je historie).

    +

    Přepni se do nového adresáře (cd prezencka) +a zkus se podívat na historii (gitk nebo git log). +Možná je krátká, ale hlavně, že nějaká je. +Máš na počítači kopii projektu, který založil někdo jiný!

    +

    Jak už napovídá název repozitáře, tvůj příspěvek do tohoto projektu bude +zápis do prezenčky: konkrétně přidání souboru s tvým jménem. +Jméno je to proto, aby nedocházelo ke kolizím: potřebujeme, aby příspěvky od +všech lidí, kteří prochází tenhle kurz, byly jiné.

    +

    Tvůj příspěvek bude ovšem veřejně vystaven na internetu. +Pokud nechceš vystavovat svoje občanské jméno, použij místo něj klidně +přezdívku, oblíbené jídlo nebo pár náhodných písmen. Ale:

    +
      +
    • když budeš pojmenovávat soubor, buď originální, aby nedošlo ke konfliktům, a
    • +
    • nesdílej nic, co nemáš právo sdílet (např. texty moderních písní).
    • +
    +

    Vytvoření větve

    +

    Pomocí git branch zjisti, na jaké jsi aktuálně větvi. +Měla by to být větev master.

    +

    Tuhle „základní“ větev je dobré používat jen na revize, na kterých se už +shodl celý tým. +Proto když chceš do projektu přispět, jako první krok si pro svůj příspěvek +udělej novou větev a přepni se do ní. +Například pomocí:

    +
    $ git branch pridani-jmena
    +$ git checkout pridani-jmena
    +

    Posílání změn (git push)

    +

    Teď se do projektu zapoj. +Přidej soubor pojmenovaný podle tvého jména (nebo přezdívky) +a dej ho do gitu (git add ...; git commit).

    +

    Teď zbývá „jen” změnu začlenit do původního sdíleného repozitáře. +To ale není jen tak: repozitář, který jsi +naklonoval/a, patří koučovi. A tomu by se asi +nelíbilo, kdyby kdokoliv na Internetu mohl přijít +a nahrát mu do repozitáře změny.

    +

    Spousta míst na Internetu (blogy, zpravodajství, e-shopy) funguje tak, že +vybraná skupina lidí, „editorů“, má právo měnit obsah, jak se jim líbí. +Takovým editorům musí správce projektu věřit, než jim přístup povolí.

    +

    S Gitem se používá trošku jiný mechanismus: +změny nahraješ do vlastního sdíleného +repozitáře, který máš právo měnit jen ty. +Majiteli původního projektu pak napíšeš +žádost o začlenění těch změn (angl. pull request). +Může to být třeba mail se slovy „Hele, na té a té +adrese mám nějaké změny, které by se ti mohly hodit! +Přidej je do svého projektu!”

    +

    Výhoda je v tom, že se do projektu – pokud je +veřejný – může zapojit kdokoliv. Nemusíš se +předem ptát, nemusíš dokazovat že jsi důvěryhodná +osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo +ne, to už je jiná věc – ale můžou posuzovat samotnou +změnu, ne důvěryhodnost jejího autora.

    +

    Služby jako github.com +ti umožňují si udělat vlastní sdílený repozitář (který bude k dispozici na +internetu) a zjednodušují začleňování změn (místo posílání mailů stačí +zmáčknout tlačítko). Pojďme se podívat, jak na to.

    +

    Přihlaš se na GitHub a pak zajdi na adresu +kterou jsi použil/a pro git clone. +Vlevo nahoře najdi tlačítko „Fork” a klikni na něj. +Tím si vytvoříš na GitHubu vlastní kopii repozitáře: +adresa by měla být něco jako +https://github.com/tvojejmeno/prezencka.

    +

    Kdybys měl/a v různých kopiích repozitáře zmatek, +přijde vhod malé vysvětlení: jedna kopie je původní +projekt na GitHubu, kam správce projektu dává +aktuální „oficiální“ nebo „hlavní“ verzi. Další kopie na GitHubu +je „tvoje“ a můžeš si do ní nahrát co chceš +(nejčastěji v ní ale zveřejňuješ změny, které můžou +být užitečné pro ostatní). +Tyhle dvě kopie existují na serverech GitHubu a jsou volně dostupné +přes internet.

    +

    Třetí kopii repozitáře pak máš u sebe na počítači. +K té se dostaneš jen ty.

    +

    Z „hlavní“ verze si stáhneš práci ostatních členů týmu; +do tvého projektu na GitHubu dáváš své změny, aby je ostatní mohli +schválit a začlenit do „hlavní“ verze.

    +

    Diagram tří repozitářů

    +

    A teď, jak z tvého počítače nahrát změny na GitHub? +Git si u každého repozitáře na tvém počítači +pamatuje adresy, odkud se dají stahovat +a kam se dají posílat změny. +Seznam těchhle adres ti ukáže příkaz git remote -v. +Třeba:

    +
    $ git remote -v
    +origin  https://github.com/naucse/prezencka (fetch)
    +origin  https://github.com/naucse/prezencka (push)
    +

    Tenhle výstup znamená, že pod zkratkou „origin” +se schovává adresa, ze které jsi repozitář +naklonoval/a.

    +

    Přidej si podobnou zkratku pro vlastní repozitář na GitHubu. +Nezapomeň nahradit tvojejmeno za jméno účtu, +který máš na GitHubu ty. (Pozor, v příkazu je tvojejmeno dvakrát!)

    +
    +
    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    +

    a zkontroluj si, že se to povedlo:

    +
    +
    $ git remote -v
    +origin  git@github.com:naucse/prezencka.git (fetch)
    +origin  git@github.com:naucse/prezencka.git (push)
    +tvojejmeno      https://github.com/tvojejmeno/prezencka (fetch)
    +tvojejmeno      https://github.com/tvojejmeno/prezencka (push)
    +

    Tolik k nastavení – git remote add +stačí udělat jednou pro každý repozitář. +Pak už můžeš změny nahrávat pomocí:

    +
    +
    $ git push tvojejmeno pridani-jmena
    +

    což znamená: pošli na adresu uloženou pod zkratkou +tvojejmeno +větev pridani-jmena.

    +

    Funguje? Podívej se na +https://github.com/tvojejmeno/prezencka +v prohlížeči a ujisti se, že tam tvoje změny jsou.

    +

    Žádost o začlenění (pull request)

    +

    Teď zbývá požádat autory původního projektu, +aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +GitHub na to má mechanismus zvaný pull request (žádost o začlenění).

    +

    Jdi na stránku původního projektu (na adresu, +kterou jsi použil/a na začátku pro +git clone). +Měl/a bys tam vidět oznámení o své nově nahrané větvi +s velkým zeleným tlačítkem Compare & pull request. +Klikni na něj. Pokud chceš, tak dopiš/změň popisek +toho, co tahle změna obnáší. +Pak zmáčkni další tlačítko.

    +

    Jestli tlačítko Compare & pull request nevidíš, běž na adresu +své kopie repozitáře a stiskni tlačítko New pull request. +Vyber, co kam chceš začlenit, dopiš/změň popisek a pak zmáčkni +Create pull request.

    +

    Hotovo; teď je na autorech projektu, aby +se na změny podívali a přijali – nebo začali diskusi +o tom, jak je ještě vylepšit. +(Diskutovat se dá na stránce pull requestu nebo přes mail.)

    +

    Pro samostudium

    +

    Procházíš-li materiály z domu, musíš teď počkat, +než si někdo tvé žádosti všimne a začlení ji. +To může trvat i pár dní; kdyby to bylo přes týden, +tak se na stránce pull requestu zkus připomenout.

    +

    U přidání jména do prezenčky se to asi nestane, ale kdybys potřeboval/a +na změně před začleněním ještě trochu zapracovat (třeba i po +pár dnech diskuse), nebyl by to problém. +Přepni se na svém počítači do větve pridani-jmena, udělej další revize, +a pomocí git push tvojejmeno pridani-jmena +pull request aktualizuj.

    +

    Aktualizace (git pull)

    +

    Když budou tvé změny – a změny od ostatních – +začleněné, můžeš si aktualizovat lokální repozitář. (To je ten, +který máš u sebe na počítači.)

    +

    Nejdřív se přepni zpět do větve master. +Teď už nebudeš pracovat na pridani-jmena; tahle větev už je odeslaná.

    +

    To se dělá příkazem +git pull origin master (stáhni změny +z větve „master” z adresy pod zkratkou „origin”). +Pomocí gitk --all nebo git log +se můžeš podívat, jak se projekt mezitím vyvinul.

    +

    Tohle git pull je dobré provést vždycky předtím, než začneš pracovat na +nové změně/větvi. +Zaručíš tím, že projekt, který měníš, je „čerstvý“.

    +

    Gratuluji! Právě jsi prošel/prošla „kolečkem“, +které většina programátorů dělá denně: udělání nějaké změny, +odeslání kolegům na kontrolu a začlenění a stažení změn od ostatních.

    +

    Hlášení chyb (issues)

    +

    Občas nastane situace, kdy v nějakém projektu +na GitHubu najdeš chybu, ale nemáš čas nebo +znalosti, abys ji opravil/a. V takovém případě +často na GitHubu na stránce projektu pod záložkou Issues +najdeš seznam nahlášených problémů. +Nenajdeš-li mezi nimi „svoji” chybu, můžeš ji +nahlásit – stačí kliknout na New Issue +a můžeš psát, kdy chyba nastává, co program dělá +špatně a co by měl dělat místo toho.

    +

    Některé projekty nepoužívají Issues na GitHubu. +Kdybys záložku Issues nenašel/nenašla, podívej se +do dokumentace projektu, jestli tam není odkaz na +seznam chyb.

    +

    README: Informace pro ostatní

    +

    Pokud vytváříš projekt a chceš, aby do něj přispívali i ostatní, +je potřeba aby věděli, co tvůj projekt dělá, k čemu se hodí, +jak se používá a podobně.

    +

    Na základní informace o projektu/repozitáři se používá soubor README +(z angl. read me, čti mě). +Do tohoto souboru patří mj.:

    +
      +
    • název projektu,
    • +
    • stručný popis projektu (jedna až dvě věty),
    • +
    • krátký návod k instalaci projektu,
    • +
    • krátký návod ke spuštění projektu,
    • +
    • krátký návod k používání projektu, případně odkaz na rozsáhlejší dokumentaci,
    • +
    • pokud má projekt testy, informace o tom, jak je spustit,
    • +
    • informace o tom, jak se zapojit do vývoje projektu,
    • +
    • informace o autorech projektu,
    • +
    • informace o licenci (více se licencích dozvíš později).
    • +
    +

    README by mělo být členěné a jeho přečtení by nemělo zabrat uživateli hodinu, +většinou stačí krátké úderné informace s případným odkazem někam dál. +Nemusíš tedy například vysvětlovat v každém projektu, jak se instaluje Python. +Stačí říct, že Python je potřeba (a v jaké verzi) +a odkázat uživatele na patřičný návod. +Je také třeba brát v úvahu, kdo bude README číst. +Píšeš-li program pro jiné vývojářky a vývojáře, +často nemusíš zabrušovat do detailů.

    +

    GitHub (a spousty jiných podobných služeb) umožňuje pro README použít nějaký +značkovací jazyk, například Markdown. +Je možné pak používat nadpisy, obrázky apod.

    +

    A v neposlední řadě: aby se do projektu mohl zapojit +kdokoli z celého světa, bývají open-source projekty v angličtině. +Jména proměnných, komentáře, dokumentace – všechno +je primárně v anglické verzi. +Tenhle kurz je česky, aby byly začátky jednodušší, +ale jestli se ti programování zalíbilo a chceš +v něm po kurzu pokračovat dál, bez angličtiny +to bude velice složité.

    +

    Licence

    +

    Aby sdílení fungovalo i pro právní stránce, +nestačí když nahraješ kus kódu na Internet. +Musíš taky oficiálně oznámit, že si s ním ostatní můžou hrát. +Na svůj kód totiž máš autorské právo, podle kterého ostatní nesmí tvůj program +používat, natož vylepšovat, dokud jim to nepovolíš. +Pro formální udělení tohohle povolení se používají licence, které píšou +právníci.

    +

    Problematika licencí může být, bohužel, docela složitá. +Když to ale zjednodušíme na minimum, budeš +chtít jen zajistit, aby každý mohl tvůj výtvor +používat, učit se z něj, předávat ho dál +a vylepšovat ho. V tom případě vyber třeba +licenci MIT.

    +

    Pokud chceš navíc zabránit tomu, že si tvůj kód +někdo vezme a začne ho „vylepšovat“ a vydělávat na +něm, aniž by se o vylepšení podělil s ostatními, +zkus licenci AGPL.

    +

    A tyto materiály jsou pod ještě jinou licencí – +CC BY-SA – +protože výše jmenované licence jsou dělané na programy, ne na text.

    +

    Kód se nejčastěji licencuje tak, že text licence +dáš do souboru jménem LICENSE a přidáš do Gitu. +Je dobré licenci zmínit i v souboru README.

    +

    Chceš-li si o licencích přečíst něco víc, odkážu tě na +choosealicense.com, +případně creativecommons.org +a opensource.org.

    \ No newline at end of file diff --git a/pyladies/comparisons/index.html b/pyladies/comparisons/index.html new file mode 100644 index 00000000..998cf5fd --- /dev/null +++ b/pyladies/comparisons/index.html @@ -0,0 +1,184 @@ +

    Porovnávání

    +

    Pamatuješ si ještě, co je to operátor?

    +

    V domácím projektu jsme si ukázali základní aritmetické operátory. +Přidáme-li jeden další (//), jsou to tyhle:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    +, -, *, /1 + 1Základní aritmetika
    --5Negace
    //; %7 // 2; 7 % 2Dělení se zbytkem (celočíselné dělení); zbytek po dělení
    **3 ** 2Umocnění (3 na druhou)

    Python ale zná i další druhy operátorů. +Důležité jsou operátory porovnávací. +Zkus si co dělají! +(Buď z programu pomocí print, +nebo pusť python z příkazové řádky.)

    + + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    ==, !=1 == 1, 1 != 1Je rovno, není rovno
    <, >3 < 5, 3 > 5Menší než, větší než
    <=, >=3 <= 5, 3 >= 5Menší nebo rovno, větší nebo rovno

    Hodnoty provnání jsou takzvané booleovské hodnoty +(angl. boolean, podle G. Boolea). +V Pythonu je můžeš použít vždycky, když potřebuješ vědět, jestli něco platí +nebo neplatí. +Jsou jenom dvě – buď True (pravda), nebo False (nepravda).

    +

    Jako všechny hodnoty, True a False můžeš přiřadit do proměnných:

    +
    pravda = 1 < 3
    +print(pravda)
    +
    +nepravda = 1 == 3
    +print(nepravda)
    +

    Všimni si, že rovnost zjistíš pomocí dvou rovnítek: 3 == 3. +Jedno rovnítko přiřazuje do proměnné; dvě rovnítka porovnávají.

    +

    Slova True a False můžeš +v programu použít i přímo, +jen si dej pozor na velikost písmen:

    +
    print(True)
    +print(False)
    +

    Podmínky

    +

    Teď oprášíme program na výpočet obvodu a obsahu.

    +

    Otevři si v editoru nový soubor. +Jestli ještě v adresáři, kde máš soubory ke kurzům Pythonu, +nemáš adresář pro tuto lekci (třeba 02), vytvoř si ho. +Nový soubor ulož do něj pod jménem if.py.

    +

    Do souboru pak napiš následující program:

    +
    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Program spusť. Funguje?

    +

    Co se stane, když jako stranu zadáš záporné číslo? +Dává výstup smysl?

    +

    Tady je vidět, jak počítač dělá přesně, co se mu řekne. Nepřemýšlí o významu. +Bylo by dobré uživateli, který zadá záporné číslo, +přímo říct, že zadal blbost. Jak na to?

    +

    Nejdřív zkus nastavit proměnnou která bude True, +když uživatel zadal kladné číslo.

    +
    +

    Řešení

    + + +

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. +K tomu můžeš použít dvojici příkazů if (pokud) +a else (jinak):

    +
    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +cislo_je_spravne = strana > 0
    +
    +if cislo_je_spravne:
    +    print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +    print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +else:
    +    print('Strana musí být kladná, jinak z toho nebude čtverec!')
    +
    +print('Děkujeme za použití geometrické kalkulačky.')
    +

    Neboli: po if následuje podmínka (angl. condition), +což je výraz, podle kterého se budeme rozhodovat. +Za podmínkou je dvojtečka. +Potom následují příkazy, které se provedou, pokud je podmínka pravdivá. +Všechny jsou odsazeny o čtyři mezery.

    +

    Čtyři mezery neznamenají, že musíš čtyřikrát zmáčknout mezerník! +K odsazení použij klávesu Tab, která vloží správný počet mezer. +(Pokud ne, nemáš správně nastavený editor – podívej se do lekce o instalaci.) +Pomocí Shift+Tab můžeš odsazení zase zmenšit.

    +

    A ani Tab není vždycky potřeba. +Pokud napíšeš řádek s if bez chyby, některé editory za tebe další řádek odsadí automaticky.

    +

    Po téhle části stačí napsat neodsazené else:, zase s dvojtečkou na konci, +a odsazené příkazy, které se provedou v opačném případě.
    +Potom můžeš psát příkazy, které se provedou vždycky – ty odsazené nebudou, +podmíněná část programu už skončila.

    +

    Vzato čistě technicky, odsazení nemusí být o čtyři mezery. +Může být třeba o dvě nebo o jedenáct, nebo se dokonce dá místo mezer použít +tabulátor. +V rámci jednoho bloku musí být ale odsazení vždycky stejné, +takže když pak na jednom programu spolupracuje více lidí, musí se shodnout. +No a na čtyřech mezerách se shodla většina Pythonního světa.

    +

    Další podmíněné příkazy

    +

    Někdy není else vůbec potřeba. +V následujícím programu se nedělá nic navíc, pokud je číslo nenulové:

    +
    cislo = int(input('Zadej číslo, přičtu k němu 3: '))
    +if cislo == 0:
    +    print('Jé, to je jednoduché!')
    +print(cislo, '+ 3 =', cislo + 3)
    +

    Někdy je naopak potřeba podmínek několik, +k čemuž slouží příkaz elif – kombinace else a if. +Dává se „mezi“ bloky if a else. +Příkazů elif může být za jedním if-em několik, +ale vždy se provede jen jedna „větev“: +ta první, jejíž podmínka je splněna.

    +
    vek = int(input('Kolik ti je let? '))
    +if vek >= 150:
    +    print('A ze kterépak jsi planety?')
    +elif vek >= 18:
    +    # Tahle větev se např. pro "200" už neprovede.
    +    print('Můžeme nabídnout: víno, cider, nebo vodku.')
    +elif vek >= 1:
    +    print('Můžeme nabídnout: mléko, čaj, nebo vodu')
    +elif vek >= 0:
    +    print('Sunar už bohužel došel.')
    +else:
    +    # Nenastala ani nedna ze situací výše – muselo to být záporné
    +    print('Pro návštěvy z budoucnosti bohužel nemáme nic v nabídce.')
    +

    Zanořování

    +

    Příkazy if se dají zanořovat (angl. nest). +V odsazeném (podmíněném) bloku kódu může být další if s dalším odsazeným +kódem. +Třeba u tohoto programu, který rozdává nejapné rady do života:

    +
    stastna = input('Jsi šťastná?')
    +bohata = input('Jsi bohatá?')
    +
    +if stastna == 'ano':
    +    # Tenhle kus kódu se provede, když je "šťastná"
    +    if bohata == 'ano':
    +        print('Gratuluji!')
    +    else:
    +        print('Zkus míň utrácet.')
    +else:
    +    # Tenhle kus kódu se provede, když není "šťastná"
    +    if bohata == 'ano':
    +        print('Zkus se víc usmívat!')
    +    else:
    +        print('To je mi líto.')
    +
    \ No newline at end of file diff --git a/pyladies/course.json b/pyladies/course.json new file mode 100644 index 00000000..cb4192c9 --- /dev/null +++ b/pyladies/course.json @@ -0,0 +1,1768 @@ +{ + "api_version": [ + 0, + 3 + ], + "course": { + "description": "Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba.", + "edit_info": { + "branch": "main", + "url": "https://github.com/encukou/naucse-python" + }, + "lessons": { + "beginners/and-or": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "and-or/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/and-or/index.md", + "title": "Nebo anebo a", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/and-or/info.yml", + "static_files": {}, + "title": "Nebo anebo a" + }, + "beginners/basic-functions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "basic-functions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Funkce input vrací hodnotu, se kterou může program dál pracovat.\nZařadil bych ji tedy mezi „normální“ funkce.

    \n

    Jako argument bere input otázku, na kterou se uživatele zeptá.

    \n

    Návratová hodnota funkce input je řetězec s odpovědí uživatele.

    " + } + ], + "source_file": "lessons/beginners/basic-functions/index.md", + "title": "Užitečné funkce", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/basic-functions/info.yml", + "static_files": {}, + "title": "Užitečné funkce" + }, + "beginners/circular-imports": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "circular-imports/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/circular-imports/index.md", + "title": "Cyklické importy", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/circular-imports/info.yml", + "static_files": {}, + "title": "Cyklické importy" + }, + "beginners/class": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "class/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/class/index.md", + "title": "Třídy", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/class/info.yml", + "static_files": {}, + "title": "Třídy" + }, + "beginners/cmdline": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", + "Založeno na tutoriálu Django Girls." + ], + "content": { + "path": "cmdline/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    \n

    Unix

    $ cd naucse-python\n$ mkdir test\n$ ls\ntest\n
    \n

    Windows

    > cd naucse-python\n> mkdir test\n> dir\n05/08/2014 07:28 PM <DIR>  test\n
    " + } + ], + "source_file": "lessons/beginners/cmdline/index.md", + "title": "Úvod do příkazové řádky", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/cmdline/info.yml", + "static_files": { + "windows-cmd-properties.png": { + "path": "cmdline/windows-cmd-properties.png" + } + }, + "title": "Úvod do příkazové řádky" + }, + "beginners/comparisons": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "comparisons/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Taková proměnná se dá nastavit pomocí tohoto kódu:

    \n
    strana = float(input('Zadej stranu čtverce v centimetrech: '))\ncislo_je_spravne = strana > 0\n
    " + } + ], + "source_file": "lessons/beginners/comparisons/index.md", + "title": "Porovnávání", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/comparisons/info.yml", + "static_files": {}, + "title": "Porovnávání" + }, + "beginners/def": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "def/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def obsah_obdelnika(a, b):\n    return a * b\n\nprint('Obsah obdélníka se stranami 3 cm a 5 cm je', obsah_obdelnika(3, 5), 'cm2')\n
    " + } + ], + "source_file": "lessons/beginners/def/index.md", + "title": "Definice funkcí", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/def/info.yml", + "static_files": {}, + "title": "Definice funkcí" + }, + "beginners/dict": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "dict/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/dict/index.md", + "title": "Slovníky", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/dict/info.yml", + "static_files": {}, + "title": "Slovníky" + }, + "beginners/exceptions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "exceptions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/exceptions/index.md", + "title": "Výjimky", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/exceptions/info.yml", + "static_files": {}, + "title": "Výjimky" + }, + "beginners/expressions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2019." + ], + "content": { + "path": "expressions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/expressions/index.md", + "title": "Vyhodnocování výrazů", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/expressions/info.yml", + "static_files": {}, + "title": "Vyhodnocování výrazů" + }, + "beginners/files": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "files/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " + } + ], + "source_file": "lessons/beginners/files/index.md", + "title": "Soubory", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/files/info.yml", + "static_files": {}, + "title": "Soubory" + }, + "beginners/first-steps": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019.", + "Část této kapitoly je založena na materiálech DjangoGirls.", + "Část této kapitoly je založena na kurzu Geek Girls Carrots.", + "Původní DjangoGirls tutoriál přeložila do češtiny skupina dobrovolníků.\nPoděkování patří hlavně: Davidovi (dakf), Kristýně Kumpánové,\nVeronice Gabrielové, Tomáši Ehrlichovi, Aničce Jaegerové,\nMatějovi Stuchlíkovi, Filipovi Sivákovi a Juraji M. Bezručkovi." + ], + "content": { + "path": "first-steps/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/first-steps/index.md", + "title": "První krůčky", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/first-steps/info.yml", + "static_files": {}, + "title": "První krůčky" + }, + "beginners/fstring": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2018-2019." + ], + "content": { + "path": "fstring/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/fstring/index.md", + "title": "Šablony (formátovací řetězce)", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/fstring/info.yml", + "static_files": {}, + "title": "Šablony (formátovací řetězce)" + }, + "beginners/functions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "functions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Funkce print zavolaná bez argumentů napíše prázdný řádek.

    " + } + ], + "source_file": "lessons/beginners/functions/index.md", + "title": "Funkce", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/functions/info.yml", + "static_files": { + "call-anatomy.svg": { + "path": "functions/call-anatomy.svg" + } + }, + "title": "Funkce" + }, + "beginners/hello-world": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "hello-world/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/hello-world/index.md", + "title": "První program", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/hello-world/info.yml", + "static_files": {}, + "title": "První program" + }, + "beginners/inheritance": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "inheritance/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/inheritance/index.md", + "title": "Dědičnost", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/inheritance/info.yml", + "static_files": {}, + "title": "Dědičnost" + }, + "beginners/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install/index.md", + "title": "Instalace Pythonu", + "vars": { + "coach-present": false + } + }, + "linux": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/linux.html" + }, + "license": "cc-by-sa-40", + "slug": "linux", + "solutions": [], + "source_file": "lessons/beginners/install/linux.md", + "subtitle": "Linux", + "title": "Instalace Pythonu – Linux", + "vars": { + "coach-present": false + } + }, + "macos": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/macos.html" + }, + "license": "cc-by-sa-40", + "slug": "macos", + "solutions": [], + "source_file": "lessons/beginners/install/macos.md", + "subtitle": "macOS", + "title": "Instalace Pythonu – macOS", + "vars": { + "coach-present": false + } + }, + "windows": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/windows.html" + }, + "license": "cc-by-sa-40", + "slug": "windows", + "solutions": [], + "source_file": "lessons/beginners/install/windows.md", + "subtitle": "Windows", + "title": "Instalace Pythonu – Windows", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/install/info.yml", + "static_files": { + "windows_32v64-bit.png": { + "path": "install/windows_32v64-bit.png" + }, + "windows_add_python_to_path.png": { + "path": "install/windows_add_python_to_path.png" + } + }, + "title": "Instalace Pythonu" + }, + "beginners/install-editor": { + "pages": { + "atom": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/atom.html" + }, + "license": "cc-by-sa-40", + "slug": "atom", + "solutions": [], + "source_file": "lessons/beginners/install-editor/atom.md", + "subtitle": "Atom", + "title": "Instalace Atomu", + "vars": { + "coach-present": false + } + }, + "gedit": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/gedit.html" + }, + "license": "cc-by-sa-40", + "slug": "gedit", + "solutions": [], + "source_file": "lessons/beginners/install-editor/gedit.md", + "subtitle": "Gedit", + "title": "Instalace Geditu", + "vars": { + "coach-present": false + } + }, + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install-editor/index.md", + "title": "Instalace editoru", + "vars": { + "coach-present": false + } + }, + "kate": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/kate.html" + }, + "license": "cc-by-sa-40", + "slug": "kate", + "solutions": [], + "source_file": "lessons/beginners/install-editor/kate.md", + "subtitle": "Kate", + "title": "Instalace Kate", + "vars": { + "coach-present": false + } + }, + "notepad-plus-plus": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/notepad-plus-plus.html" + }, + "license": "cc-by-sa-40", + "slug": "notepad-plus-plus", + "solutions": [], + "source_file": "lessons/beginners/install-editor/notepad-plus-plus.md", + "subtitle": "Notepad++", + "title": "Instalace Notepadu++", + "vars": { + "coach-present": false + } + }, + "others": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/others.html" + }, + "license": "cc-by-sa-40", + "slug": "others", + "solutions": [], + "source_file": "lessons/beginners/install-editor/others.md", + "subtitle": "Nastavení", + "title": "Nastavení editoru", + "vars": { + "coach-present": false + } + }, + "vscode": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/vscode.html" + }, + "license": "cc-by-sa-40", + "slug": "vscode", + "solutions": [], + "source_file": "lessons/beginners/install-editor/vscode.md", + "subtitle": "Visual Studio Code", + "title": "Instalace Visual Studio Code", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/install-editor/info.yml", + "static_files": { + "gedit_indent.png": { + "path": "install-editor/gedit_indent.png" + }, + "gedit_linenums.png": { + "path": "install-editor/gedit_linenums.png" + }, + "gedit_prefs.png": { + "path": "install-editor/gedit_prefs.png" + } + }, + "title": "Instalace editoru" + }, + "beginners/list": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "list/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def vyber_chybne(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        if jmeno[0].islower() or prijmeni[0].islower():\n            vysledek.append(zaznam)\n    return vysledek\n\ndef vyber_spravne(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        if not jmeno[0].islower() and not prijmeni[0].islower():\n            vysledek.append(zaznam)\n    return vysledek\n\ndef oprav_zaznamy(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        vysledek.append(jmeno.capitalize() + ' ' + prijmeni.capitalize())\n    return vysledek\n
    " + } + ], + "source_file": "lessons/beginners/list/index.md", + "title": "Seznamy", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/list/info.yml", + "static_files": {}, + "title": "Seznamy" + }, + "beginners/local-variables": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "local-variables/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
      \n
    • pi je globální – nepřiřazuje se do ní ve funkci;\nje „vidět“ v celém programu.
    • \n
    • Proměnné obsah jsou v programu dvě – jedna globální,\na jedna je lokální pro funkci obsah_elipsy,\nprotože do ní tahle funkce přiřazuje.
    • \n
    • Proměnné a jsou taky dvě, podobně jako obsah.\nTady byl chyták: příkaz a = a + 3 nemá žádný smysl;\ndo a se sice uloží větší číslo, ale vzápětí funkce obsah_elipsy skončí\na její lokální proměnná a přestane existovat.
    • \n
    • Proměnná b je jenom lokální – jako parametr funkce obsah_elipsy.
    • \n
    • Proměnná obsah_elipsy je globální (a je v ní funkce).
    • \n
    \n

    A pro úplnost

    \n
      \n
    • Klíčová slova from, import, def, return neoznačují proměnné.
    • \n
    • Jméno modulu math taky neoznačuje proměnnou.
    • \n
    • Proměnná print se dá považovat za globální.\n(Ve skutečnosti existuje zvláštní kategorie zabudovaných (angl. builtin)\nproměnných – ty jsou „ještě globálnější“.)
    • \n
    \n
    " + } + ], + "source_file": "lessons/beginners/local-variables/index.md", + "title": "Lokální proměnné", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/local-variables/info.yml", + "static_files": {}, + "title": "Lokální proměnné" + }, + "beginners/modules": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "modules/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/modules/index.md", + "title": "Moduly", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/modules/info.yml", + "static_files": {}, + "title": "Moduly" + }, + "beginners/nested-traceback": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "nested-traceback/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/nested-traceback/index.md", + "title": "Chybové hlášky ze zanořených funkcí", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/nested-traceback/info.yml", + "static_files": {}, + "title": "Chybové hlášky ze zanořených funkcí" + }, + "beginners/print": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "print/index.html" + }, + "css": ".err-lineno {\n display: inline-block;\n background-color: #FCC;\n}\n.err-exctype {\n display: inline-block;\n background-color: #CFC;\n}\n", + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/print/index.md", + "title": "Print a chybové hlášky", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/print/info.yml", + "static_files": {}, + "title": "Print a chybové hlášky" + }, + "beginners/reassignment": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "reassignment/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    celkem = 0\n\ndelka_trasy = 8\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 45\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 9\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 21\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\nprint('Celkem jsem ušla', celkem, 'km')\n

    Příkaz celkem = celkem + delka_trasy vypočítá hodnotu\ncelkem + delka_trasy, tedy přičte aktuální číslo k součtu.\nVýsledek uloží opět do proměnné celkem.\nNová hodnota celkem se pak použije v dalším průchodu cyklem.

    \n

    Na začátku je celkem 0 a na konci se celkový součet všech čísel vypíše.

    " + } + ], + "source_file": "lessons/beginners/reassignment/index.md", + "title": "Přepisování proměnných", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/reassignment/info.yml", + "static_files": {}, + "title": "Přepisování proměnných" + }, + "beginners/str": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019.", + "Jako jeden z příkladů byl použit úryvek z povídky „Chlap, děd, vnuk, pes a hrob“ Jana Wericha." + ], + "content": { + "path": "str/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    >>> print(".\\".")\n.".\n>>> len(".\\".")\n3\n>>> ".\\"."\n'.".'\n
    " + } + ], + "source_file": "lessons/beginners/str/index.md", + "title": "Zápis řetězců", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/str/info.yml", + "static_files": { + "quote-comic.svg": { + "path": "str/quote-comic.svg" + } + }, + "title": "Zápis řetězců" + }, + "beginners/str-index-slice": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "str-index-slice/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Nedostal/a – dostal/a jsi šesté písmeno.

    " + }, + { + "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯
    " + }, + { + "content": "

    Zápis retezec[5:] vybere podřetězec od znaku číslo 5 dál.

    " + }, + { + "content": "

    Zápis retezec[od:do] vybere podřetězec od pozice od do pozice do.\nKdyž jednu z hodnot vynecháš, vybírá se od začádku, resp. do konce.

    \n
    retezec = 'čokoláda'\nprint(retezec[:4])      # → čoko\nprint(retezec[2:6])     # → kolá\nprint(retezec[-3:])     # → áda\nprint(retezec[:])       # → čokoláda\n
    " + }, + { + "content": "
    slovo = input('Slovo: ')\npozice = int(input('Které písmeno zaměnit (od nuly)? '))\nnovy_znak = input('Nové písmeno: ')\n\nzacatek_slova = slovo[:pozice]\nkonec_slova = slovo[pozice + 1:]\nnove_slovo = zacatek_slova + novy_znak + konec_slova\n\nprint(nove_slovo)\n
    " + } + ], + "source_file": "lessons/beginners/str-index-slice/index.md", + "title": "Výběr z řetězců", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/str-index-slice/info.yml", + "static_files": {}, + "title": "Výběr z řetězců" + }, + "beginners/str-methods": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "str-methods/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    jmeno = input('Zadej jméno: ')\nprijmeni = input('Zadej příjmení ')\ninicialy = jmeno[0] + prijmeni[0]\nprint('Iniciály:', inicialy.upper())\n

    Způsobů, jak takový program napsat, je více.\nLze například zavolat upper() dvakrát – zvlášť na jméno a zvlášť na příjmení.

    \n

    Nebo to jde zapsat i takto –\nmetoda se dá volat na výsledku jakéhokoli výrazu:

    \n
    jmeno = input('Zadej jméno: ')\nprijmeni = input('Zadej příjmení ')\nprint('Iniciály:', (jmeno[0] + prijmeni[0]).upper())\n

    Doporučuji spíš první způsob, ten se smysluplnými názvy proměnných.\nJe sice delší, ale mnohem přehlednější.

    " + } + ], + "source_file": "lessons/beginners/str-methods/index.md", + "title": "Řetězcové funkce a metody", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/str-methods/info.yml", + "static_files": {}, + "title": "Řetězcové funkce a metody" + }, + "beginners/testing": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "testing/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/testing/index.md", + "title": "Testování", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/testing/info.yml", + "static_files": {}, + "title": "Testování" + }, + "beginners/tuple": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "tuple/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/tuple/index.md", + "title": "N-tice", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/tuple/info.yml", + "static_files": {}, + "title": "N-tice" + }, + "beginners/variables": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "variables/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Program, který vypíše správný výsledek, může vypadat třeba takhle:

    \n
    print('Obvod čtverce se stranou 356 cm je', 4 * 356, 'cm')\nprint('Obsah čtverce se stranou 356 cm je', 356 * 356, 'cm2')\n
    " + }, + { + "content": "
    print('Obvod čtverce se stranou 123 cm je', 4 * 123, 'cm')\nprint('Obsah čtverce se stranou 123 cm je', 123 * 123, 'cm2')\n
    " + } + ], + "source_file": "lessons/beginners/variables/index.md", + "title": "Proměnné", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/variables/info.yml", + "static_files": {}, + "title": "Proměnné" + }, + "beginners/venv-setup": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2018." + ], + "content": { + "path": "venv-setup/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/venv-setup/index.md", + "title": "Nastavení prostředí", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/venv-setup/info.yml", + "static_files": { + "dirs.png": { + "path": "venv-setup/dirs.png" + } + }, + "title": "Nastavení prostředí" + }, + "beginners/while": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "while/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from random import randrange\n\nsoucet = 0\nwhile soucet < 21:\n    print('Máš', soucet, 'bodů')\n    odpoved = input('Otočit kartu? ')\n    if odpoved == 'ano':\n        karta = randrange(2, 11)\n        print('Otočil/a jsi', karta)\n        soucet = soucet + karta\n    elif odpoved == 'ne':\n        break\n    else:\n        print('Nerozumím! Odpovídej "ano", nebo "ne"')\n\nif soucet == 21:\n    print('Gratuluji! Vyhrál/a jsi!')\nelif soucet > 21:\n    print('Smůla!', soucet, 'bodů je moc!')\nelse:\n    print('Chybělo jen', 21 - soucet, 'bodů!')\n
    " + } + ], + "source_file": "lessons/beginners/while/index.md", + "title": "Cyklus While", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/beginners/while/info.yml", + "static_files": {}, + "title": "Cyklus While" + }, + "git/basics": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "basics/index.html" + }, + "css": ".green { color: #0a0; }\n.red { color: #a00; }\n.yellow { color: #a50; }\n.strong { font-weight: bold; }\n.blue { color: #0aa; }\n", + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/basics/index.md", + "title": "Git", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/git/basics/info.yml", + "static_files": { + "diagram.svg": { + "path": "basics/diagram.svg" + }, + "dropbox.png": { + "path": "basics/dropbox.png" + }, + "gitk.png": { + "path": "basics/gitk.png" + } + }, + "title": "Git" + }, + "git/branching": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "branching/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/branching/index.md", + "title": "Větvení v Gitu", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/git/branching/info.yml", + "static_files": { + "branch1.png": { + "path": "branching/branch1.png" + }, + "branches.png": { + "path": "branching/branches.png" + }, + "merge.png": { + "path": "branching/merge.png" + } + }, + "title": "Větvení v Gitu" + }, + "git/collaboration": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsali Petr Viktorin a Oskar Hollman, 2015-2017." + ], + "content": { + "path": "collaboration/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/collaboration/index.md", + "title": "Spolupráce a Open source", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/git/collaboration/info.yml", + "static_files": { + "gh-workflow-diagram.svg": { + "path": "collaboration/gh-workflow-diagram.svg" + } + }, + "title": "Spolupráce a Open source" + }, + "git/ignoring": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsal Petr Viktorin, 2017." + ], + "content": { + "path": "ignoring/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/ignoring/index.md", + "title": "Ignorování souborů", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/git/ignoring/info.yml", + "static_files": {}, + "title": "Ignorování souborů" + }, + "git/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017" + ], + "content": { + "path": "install/index.1.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/install/index.md", + "title": "Instalace Gitu", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/git/install/info.yml", + "static_files": {}, + "title": "Instalace Gitu" + }, + "intro/json": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "json/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/json/index.md", + "title": "JSON", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/intro/json/info.yml", + "static_files": {}, + "title": "JSON" + }, + "intro/pyglet": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017.", + "Ikonku hada vytvořil Martin Berube." + ], + "content": { + "path": "pyglet/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pyglet/index.md", + "title": "Grafika", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/intro/pyglet/info.yml", + "static_files": { + "had.gif": { + "path": "pyglet/had.gif" + }, + "had.png": { + "path": "pyglet/had.png" + }, + "had2.png": { + "path": "pyglet/had2.png" + }, + "pong.py": { + "path": "pyglet/pong.py" + } + }, + "title": "Grafika" + }, + "intro/turtle": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "turtle/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(100)\nleft(90)\nforward(50)\nleft(90)\nforward(100)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nleft(20)\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nleft(20)\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "

    Vypíšou se čísla od 0 do 4!\nProgram funguje steně, jako kdybys napsal/a:

    \n
    i = 0\nprint(i)\n\ni = 1\nprint(i)\n\ni = 2\nprint(i)\n\ni = 3\nprint(i)\n\ni = 4\nprint(i)\n

    V sekvenci range(5) jsou čísla 0, 1, 2, 3 a 4. Je jich celkem pět.

    " + }, + { + "content": "
    from turtle import forward, penup, pendown, exitonclick\n\nfor i in range(10):\n    forward(10)\n    penup()\n    forward(5)\n    pendown()\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, penup, pendown, left, exitonclick\n\nfor i in range(20):\n    forward(i)\n    penup()\n    forward(5)\n    pendown()\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nfor i in range(4):\n    forward(50)\n    left(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, right, speed, exitonclick\n\n# Třikrát:\nfor i in range(3):\n\n    # Nakresli čtverec (kód zkopírovaný z předchozí úlohy a odsazený)\n    for j in range(4):\n        forward(50)\n        left(90)\n\n    # Otoč se o 20°\n    left(20)\n\nexitonclick()\n
    " + } + ], + "source_file": "lessons/intro/turtle/index.md", + "title": "Želva a cykly", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/intro/turtle/info.yml", + "static_files": { + "turtle-dashed.png": { + "path": "turtle/turtle-dashed.png" + }, + "turtle-dashed2.png": { + "path": "turtle/turtle-dashed2.png" + }, + "turtle-hexagons.png": { + "path": "turtle/turtle-hexagons.png" + }, + "turtle-rect.png": { + "path": "turtle/turtle-rect.png" + }, + "turtle-square.png": { + "path": "turtle/turtle-square.png" + }, + "turtle-squares.png": { + "path": "turtle/turtle-squares.png" + }, + "turtle-stairs.png": { + "path": "turtle/turtle-stairs.png" + } + }, + "title": "Želva a cykly" + }, + "projects/asteroids": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "asteroids/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/projects/asteroids/index.md", + "title": "Asteroids", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/projects/asteroids/info.yml", + "static_files": { + "screenshot.png": { + "path": "asteroids/screenshot.png" + } + }, + "title": "Asteroids" + }, + "projects/github-api": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "github-api/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/projects/github-api/index.md", + "title": "Github API", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/projects/github-api/info.yml", + "static_files": {}, + "title": "Github API" + }, + "projects/pong": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Praha napsal Oskar Hollmann s použitím kódu Petra Viktorina, 2016." + ], + "content": { + "path": "pong/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def vykresli():\n    ...\n    # Vykresleni micku\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        pozice_mice[0] + VELIKOST_MICE // 2,\n        pozice_mice[1] + VELIKOST_MICE // 2,\n    )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])]:\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            x + TLOUSTKA_PALKY,\n            y + DELKA_PALKY // 2,\n        )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            SIRKA // 2 + 1,\n            y + DELKA_PULICI_CARKY\n        )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # A nakonec vypiseme skore obou hracu\n    nakresli_text(\n        str(skore[0]),\n        x=ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='left',\n    )\n\n    nakresli_text(\n        str(skore[1]),\n        x=SIRKA - ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='right',\n    )\n
    " + }, + { + "content": "
    from pyglet.window import key\n...\ndef stisk_klavesy(symbol, modifikatory):\n    if symbol == key.W:\n        stisknute_klavesy.add(('nahoru', 0))\n    if symbol == key.S:\n        stisknute_klavesy.add(('dolu', 0))\n    if symbol == key.UP:\n        stisknute_klavesy.add(('nahoru', 1))\n    if symbol == key.DOWN:\n        stisknute_klavesy.add(('dolu', 1))\n\n\ndef pusteni_klavesy(symbol, modifikatory):\n    if symbol == key.W:\n        stisknute_klavesy.discard(('nahoru', 0))\n    if symbol == key.S:\n        stisknute_klavesy.discard(('dolu', 0))\n    if symbol == key.UP:\n        stisknute_klavesy.discard(('nahoru', 1))\n    if symbol == key.DOWN:\n        stisknute_klavesy.discard(('dolu', 1))\n...\n
    " + }, + { + "content": "
    import random\n...\ndef reset():\n    pozice_mice[0] = SIRKA // 2\n    pozice_mice[1] = VYSKA // 2\n\n    # x-ova rychlost - bud vpravo, nebo vlevo\n    if random.randint(0, 1):\n        rychlost_mice[0] = RYCHLOST\n    else:\n        rychlost_mice[0] = -RYCHLOST\n    # y-ova rychlost - uplne nahodna\n    rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST\n\n# nastavit vychozi stav pro start hry\nreset()\n
    " + } + ], + "source_file": "lessons/projects/pong/index.md", + "title": "Praktické cvičení: Pong", + "vars": { + "coach-present": false + } + } + }, + "source_file": "lessons/projects/pong/info.yml", + "static_files": { + "pong.png": { + "path": "pong/pong.png" + } + }, + "title": "Praktické cvičení: Pong" + } + }, + "long_description": "

    Zde najdeš materiály, které se používají na začátečnických kurzech PyLadies\nv Praze, Brně a Ostravě.

    \n

    Jednotlivé lekce jsou určeny naprostým začátečníkům, žádné předchozí\nznalosti nejsou nutné. Instrukce jsou uvedeny pro operační systémy Linux,\nWindows i macOS.

    ", + "sessions": [ + { + "materials": [ + { + "lesson_slug": "beginners/cmdline", + "title": "Úvod do příkazové řádky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/install", + "title": "Instalace Pythonu", + "type": "lesson" + }, + { + "lesson_slug": "beginners/venv-setup", + "title": "Nastavení prostředí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/first-steps", + "title": "První krůčky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/install-editor", + "title": "Instalace editoru", + "type": "lesson" + }, + { + "lesson_slug": "git/install", + "title": "Instalace Gitu", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf", + "title": "Tahák na klávesnici (PDF)", + "type": "cheatsheet" + } + ], + "serial": "1", + "slug": "install", + "source_file": "courses/pyladies/info.yml", + "title": "Instalace" + }, + { + "materials": [ + { + "lesson_slug": "beginners/hello-world", + "title": "První program", + "type": "lesson" + }, + { + "lesson_slug": "beginners/print", + "title": "Print a chybové hlášky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/variables", + "title": "Proměnné", + "type": "lesson" + }, + { + "lesson_slug": "beginners/comparisons", + "title": "Porovnávání", + "type": "lesson" + }, + { + "lesson_slug": "beginners/and-or", + "title": "Nebo anebo a", + "type": "lesson" + } + ], + "serial": "2", + "slug": "hello", + "source_file": "courses/pyladies/info.yml", + "title": "První program" + }, + { + "materials": [ + { + "lesson_slug": "beginners/expressions", + "title": "Vyhodnocování výrazů", + "type": "lesson" + }, + { + "lesson_slug": "beginners/functions", + "title": "Funkce", + "type": "lesson" + }, + { + "lesson_slug": "beginners/basic-functions", + "title": "Užitečné funkce", + "type": "lesson" + }, + { + "lesson_slug": "intro/turtle", + "title": "Želva a cykly", + "type": "lesson" + }, + { + "lesson_slug": "beginners/while", + "title": "Cyklus While", + "type": "lesson" + }, + { + "lesson_slug": "beginners/reassignment", + "title": "Přepisování proměnných", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf", + "title": "Tahák s užitečnými funkcemi", + "type": "cheatsheet" + } + ], + "serial": "3", + "slug": "loops", + "source_file": "courses/pyladies/info.yml", + "title": "Cykly" + }, + { + "materials": [ + { + "lesson_slug": "git/basics", + "title": "Git", + "type": "lesson" + }, + { + "lesson_slug": "git/branching", + "title": "Větvení v Gitu", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/basic-git/basic-git-cs.pdf", + "title": "Gitový tahák", + "type": "cheatsheet" + } + ], + "serial": "4", + "slug": "git", + "source_file": "courses/pyladies/info.yml", + "title": "Správa zdrojového kódu" + }, + { + "materials": [ + { + "lesson_slug": "beginners/str", + "title": "Zápis řetězců", + "type": "lesson" + }, + { + "lesson_slug": "beginners/str-index-slice", + "title": "Výběr z řetězců", + "type": "lesson" + }, + { + "lesson_slug": "beginners/str-methods", + "title": "Řetězcové funkce a metody", + "type": "lesson" + }, + { + "lesson_slug": "beginners/fstring", + "title": "Šablony (formátovací řetězce)", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf", + "title": "Řetězcový tahák", + "type": "cheatsheet" + } + ], + "serial": "5", + "slug": "def-str", + "source_file": "courses/pyladies/info.yml", + "title": "Řetězce" + }, + { + "materials": [ + { + "lesson_slug": "beginners/def", + "title": "Definice funkcí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/nested-traceback", + "title": "Chybové hlášky ze zanořených funkcí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/local-variables", + "title": "Lokální proměnné", + "type": "lesson" + } + ], + "serial": "6", + "slug": "def", + "source_file": "courses/pyladies/info.yml", + "title": "Definice funkcí" + }, + { + "materials": [ + { + "lesson_slug": "beginners/exceptions", + "title": "Výjimky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/modules", + "title": "Moduly", + "type": "lesson" + }, + { + "lesson_slug": "beginners/testing", + "title": "Testování", + "type": "lesson" + }, + { + "lesson_slug": "beginners/circular-imports", + "title": "Cyklické importy", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/exceptions/exceptions-cs.pdf", + "title": "Výjimkový tahák", + "type": "cheatsheet" + } + ], + "serial": "7", + "slug": "tests", + "source_file": "courses/pyladies/info.yml", + "title": "Testování" + }, + { + "materials": [ + { + "lesson_slug": "git/collaboration", + "title": "Spolupráce a Open source", + "type": "lesson" + }, + { + "lesson_slug": "git/ignoring", + "title": "Ignorování souborů", + "type": "lesson" + }, + { + "lesson_slug": "beginners/files", + "title": "Soubory", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/basic-git/basic-git-cs.pdf", + "title": "Gitový tahák", + "type": "cheatsheet" + } + ], + "serial": "8", + "slug": "foss", + "source_file": "courses/pyladies/info.yml", + "title": "Spolupráce a Open-Source" + }, + { + "materials": [ + { + "lesson_slug": "beginners/list", + "title": "Seznamy", + "type": "lesson" + }, + { + "lesson_slug": "beginners/tuple", + "title": "N-tice", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf", + "title": "Tahák na seznamy", + "type": "cheatsheet" + } + ], + "serial": "9", + "slug": "list", + "source_file": "courses/pyladies/info.yml", + "title": "Seznamy" + }, + { + "materials": [ + { + "lesson_slug": "intro/pyglet", + "title": "Grafika", + "type": "lesson" + }, + { + "lesson_slug": "projects/pong", + "title": "Praktické cvičení: Pong", + "type": "lesson" + }, + { + "external_url": "http://pyladies.cz/v1/s012-pyglet/pong.py", + "title": "Kód celé hry Pong", + "type": "link" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf", + "title": "Tahák na Pyglet", + "type": "cheatsheet" + } + ], + "serial": "10", + "slug": "pyglet", + "source_file": "courses/pyladies/info.yml", + "title": "Grafika" + }, + { + "materials": [ + { + "lesson_slug": "beginners/dict", + "title": "Slovníky", + "type": "lesson" + }, + { + "lesson_slug": "intro/json", + "title": "JSON", + "type": "lesson" + }, + { + "lesson_slug": "projects/github-api", + "title": "Github API", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf", + "title": "Slovníkový tahák", + "type": "cheatsheet" + } + ], + "serial": "11", + "slug": "dict", + "source_file": "courses/pyladies/info.yml", + "title": "Slovníky" + }, + { + "materials": [ + { + "lesson_slug": "beginners/class", + "title": "Třídy", + "type": "lesson" + }, + { + "lesson_slug": "beginners/inheritance", + "title": "Dědičnost", + "type": "lesson" + } + ], + "serial": "12", + "slug": "class", + "source_file": "courses/pyladies/info.yml", + "title": "Třídy" + }, + { + "materials": [ + { + "lesson_slug": "projects/asteroids", + "title": "Asteroids", + "type": "lesson" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/sets/sets-cs.pdf", + "title": "Množinový tahák", + "type": "cheatsheet" + }, + { + "external_url": "https://pyvec.github.io/cheatsheets/game-physics/game-physics-cs.pdf", + "title": "Tahák na geometrii a fyziku 2D her", + "type": "cheatsheet" + } + ], + "serial": "13", + "slug": "asteroids", + "source_file": "courses/pyladies/info.yml", + "title": "Závěrečný projekt" + } + ], + "source_file": "courses/pyladies/info.yml", + "title": "Začátečnický kurz", + "vars": { + "coach-present": false + } + } +} \ No newline at end of file diff --git a/pyladies/def/index.html b/pyladies/def/index.html new file mode 100644 index 00000000..d087fcc2 --- /dev/null +++ b/pyladies/def/index.html @@ -0,0 +1,217 @@ +

    Definice funkcí

    +

    Dříve jsme +volali funkce, které napsal někdo jiný:

    +
    print('Ahoj světe!')
    +

    Dnes si ukážeme, jak psát funkce vlastní.

    +

    K čemu jsou funkce?

    +

    Často se stává, že kód, který dělá nějakou jednoduchou věc, není úplně +jednoduchý. +Jako příklad uvedu nám už známý kód, který v určitém řetězci zamění znak +na dané pozici:

    +
    zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +

    Z takového kódu není na první pohled jasné, co přesně dělá. +Zvlášť když kód použiješ ve složitějším programu.

    +

    Dá se to vyřešit komentářem: ten, kdo bude program číst, si může přečíst +co to má dělat. Samotný složitější kód pak může ignorovat.

    +
    # Ve slově `slovo` zaměnit znak na pozici `pozice` za `novy_znak`;
    +# výsledek bude v proměnné `nove_slovo`.
    +zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +

    Ještě lepší ale bude si vytvořit funkci, která tenhle složitější postup +provede. +Jakmile takovou funkci vytvoříš, ve složitějším programu pak můžeš místo kódu +výše psát jen:

    +
    nove_slovo = zamen(slovo, pozice, novy_znak)
    +

    Podobně fungují funkce, které už znáš: můžeš zavolat print(123), aniž bys +potřeboval/a znát jakékoli detaily postupu, kterým se číslo převede na +jednotlivé číslice a ty se pak vykreslí na obrazovce. +Nebo řekneš želvě forward(100) a nezatěžuješ se tím, jak si želva „pamatuje“ +svůj aktuální úhel natočení nebo jak se vlastně kreslí čára.

    +

    Funkce umožňuje pojmenovat nějaký kousek programu, který se pak dá +použít pomocí jména bez detailních znalostí toho, jak to vevnitř funguje.

    +

    Definice funkce

    +

    Protože už znáš if a for, které mají jednořádkovou hlavičku a odsazené tělo +příkazu, neměl by ti zápis funkce připadat příliš zvláštní:

    +
    def zamen(slovo, pozice, novy_znak):
    +    """V daném slově zamění znak na dané pozici za daný nový znak."""
    +    zacatek = slovo[:pozice]
    +    konec = slovo[pozice + 1:]
    +    nove_slovo = zacatek + novy_znak + konec
    +    return nove_slovo
    +
    +print(zamen('kočka', 1, 'a'))
    +print(zamen('kačka', 2, 'p'))
    +

    Jak to funguje?

    +

    Funkce se definuje příkazem def, za nějž napíšeš jméno funkce, +pak do závorky seznam parametrů, které funkce bere, a pak dvojtečku.

    +

    Potom následuje odsazené tělo funkce – příkazy, které funkce provádí.

    +

    Tělo může začít dokumentačním řetězcem (angl. docstring), který popisuje +co funkce dělá. +To může být jakýkoli řetězec, ale tradičně se uvozuje třemi uvozovkami +(i v případě že je jen jednořádkový).

    +

    Příkazem return pak můžeš z funkce vrátit nějakou hodnotu.

    +

    Při volání funkce se hodnoty, se kterými funkci +zavoláš, přiřadí jednotlivým parametrům. +Takže když zavoláš třeba zamen('kočka', 1, 'a'), +můžeš si představit, že se provede toto:

    +
    # Nastavení proměnných podle zadaných argumentů
    +slovo = 'kočka'
    +pozice = 1
    +novy_znak = 'a'
    +
    +# Samotné tělo funkce
    +zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +return nove_slovo
    +

    Už víš, že volání zamen('kočka', 1, 'a') je výraz. +Aby ho Python vyhodnotil, udělá celý postup výše a jako hodnotu výrazu dosadí +návratovou hodnotu – tedy to, co následuje po return.

    +

    Tělo funkce může mít více příkazů – včetně podmínek, cyklů a podobně. +Následující procedura třeba vypíše skóre daného hráče a k tomu hlášku:

    +
    def napis_hlasku(nazev, skore):
    +    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
    +
    +    print(nazev, 'skóre je', skore)
    +    if skore > 1000:
    +        print('Světový rekord!')
    +    elif skore > 100:
    +        print('Skvělé!')
    +    elif skore > 10:
    +        print('Ucházející.')
    +    elif skore > 1:
    +        print('Aspoň něco')
    +    else:
    +        print('Snad příště.')
    +
    +napis_hlasku('Tvoje', 256)
    +napis_hlasku('Protivníkovo', 5)
    +

    Cvičení

    +

    Zkus napsat funkci, která vrátí obsah obdélníka daných rozměrů. +Příslušný vzoreček je S = a×b, +kde a a b jsou délky stran.

    +

    Funkci zavolej a výsledek vypiš.

    +
    +

    Řešení

    + + +

    Vracení ukončuje funkci

    +

    Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou +návratovou hodnotu ven z funkce a zároveň ukončí provádění funkce.

    +

    Chová se tedy trochu jako break, jen místo cyklu opouští celou funkci.

    +

    Podobně jako break se dá použít v případech, kdy potřebuješ od uživatele +dostat odpověď – a opakuješ dotaz tak dlouho, dokud požadovanou odpověď +nedostaneš. +Třeba, chceš-li odpověď „ano“ nebo „ne“:

    +
      +
    • Takhle se zjišťuje odpověď ano (Pravda) nebo ne (Nepravda) na danou otázku:
        +
      • Pořád dokola:
          +
        • Zeptej se na otázku; zapamatuj si odpověď.
        • +
        • Je-li odpověď „ano“:
            +
          • Výsledek je Pravda. Hotovo; dál nepokračuj.
          • +
          +
        • +
        • Jinak, je-li odpověď „ne“:
            +
          • Výsledek je Nepravda. Hotovo; dál nepokračuj.
          • +
          +
        • +
        • Pouč uživatele, ať odpoví „ano“ nebo „ne“. +
          (a zkus to znovu – viz „Pořád dokola“)
        • +
        +
      • +
      +
    • +
    +
    def ano_nebo_ne(otazka):
    +     """Vrátí True nebo False podle odpovědi uživatele"""
    +    while True:
    +        odpoved = input(otazka)
    +        if odpoved == 'ano':
    +            return True
    +        elif odpoved == 'ne':
    +            return False
    +
    +        print('Nerozumím! Odpověz "ano" nebo "ne".')
    +
    +# Příklad použití
    +if ano_nebo_ne('Chceš si zahrát hru? '):
    +    print('OK! Ale napřed si ji musíš naprogramovat.')
    +else:
    +    print('Škoda.')
    +

    Stejně jako if nebo break je return příkaz, ne funkce. +Kolem „své“ hodnoty nepotřebuje závorky.

    +

    Vrátit nebo vypsat?

    +

    Podívejme se teď na následující program, který vypíše obsah elipsy:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    return pi * a * b
    +
    +print('Obsah elipsy s poloosami 3 a 5 je', obsah_elipsy(3, 5), 'cm2')
    +

    Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic +nevrací. +Procedura může výsledek třeba vypsat na obrazovku:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    print('Obsah je', pi * a * b)  # Pozor, `print` místo `return`!
    +
    +obsah_elipsy(3, 5)
    +

    Program takhle funguje, ale přichází o jednu z hlavních výhod funkcí: +možnost vrácenou hodnotu použít i jinak jež jen v print.

    +

    Funkci, která vrací výsledek, můžeš použít v dalších výpočtech:

    +
    def objem_eliptickeho_valce(a, b, vyska):
    +    return obsah_elipsy(a, b) * vyska
    +
    +print(objem_eliptickeho_valce(3, 5, 3))
    +

    ... ale s procedurou, která výsledek přímo vypíše, by to nešlo. +Proto je dobré psát funkce, které spočítané hodnoty vrací, +a zpracování výsledku (např. vypsání) nechat na kód mimo funkci.

    +

    Další důvod proč hodnoty spíš vracet než vypisovat je ten, že jedna funkce se +dá použít v různých situacích. +Proceduru s print by nešlo rozumně použít tehdy, když nás příkazová +řádka vůbec nezajímá – třeba v grafické hře, webové aplikaci, nebo pro ovládání +robota.

    +

    Podobně je to se vstupem: když použiju v rámci své funkce input, bude se +moje funkce dát použít jen v situacích, kdy je u počítače klávesnice a za ní +člověk. +Proto je lepší funkcím potřebné informace předávat jako argumenty +a volání input (nebo čtení textového políčka či měření čidlem robota) +nemít ve funkci, ale vně, v kódu, který funkci volá:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    """Vrátí obsah elipsy s poloosami daných délek"""
    +    # Jen samotný výpočet:
    +    return pi * a * b
    +
    +# print a input jsou "venku":
    +x = float(input('Zadej délku poloosy 1: '))
    +y = float(input('Zadej délku poloosy 2: '))
    +print('Obsah je', obsah_elipsy(x, y))
    +

    Samozřejmě existují výjimky: procedura, která přímo vytváří textový výpis +(např. tabulku), může používat print; funkce, která načítá textové informace +(jako ano_nebo_ne výše), zase input. +Když ale funkce něco počítá, nebo když si nejsi jistý/á, +je dobré ve funkci print ani input nemít.

    +

    None

    +

    Když funkce neskončí příkazem return, +automaticky se vrátí hodnota None.

    +

    Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, +a znamená „nic“.

    +
    def nic():
    +     """Tahle funkce nic nedělá """
    +
    +print(nic())
    +

    Procedury v Pythonu vracejí právě toto „nic“.

    \ No newline at end of file diff --git a/pyladies/dict/index.html b/pyladies/dict/index.html new file mode 100644 index 00000000..8b3bde22 --- /dev/null +++ b/pyladies/dict/index.html @@ -0,0 +1,136 @@ +

    Slovníky

    +

    Další základní datový typ, který si představíme – +po číslech, řetězcích, seznamech a n-ticích – +jsou slovníky (angl. dictionary, dict).

    +

    Podobně jako seznamy, slovníky v sobě obsahují další hodnoty. +Na rozdíl od seznamů, ve kterých jsou všechny prvky +uspořádané do jedné sekvence, ve slovnících máme dva druhy +prvků: takzvaný klíč (angl. key) a hodnotu (angl. value). +Každému klíči je přiřazena jedna hodnota.

    +

    Slovník můžeš použít, když máš několik kousků +informací, které se dají pojmenovat, ale chceš s nimi +pracovat jako s jednou proměnnou.

    +

    Tady je slovník, který má tři klíče, a k nim příslušné tři hodnoty:

    +
    >>> ja = {'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7]}
    +

    Hodnoty ze slovníku můžeš získat podobně jako +ze seznamu, jen místo indexu (pozice) použiješ klíč:

    +
    >>> ja['jméno']
    +'Anna'
    +

    Zeptáš-li se na neexistující klíč, nebude se to Pythonu líbit:

    +
    >>> ja['věk']
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in &lt;module&gt;
    +KeyError: 'věk'
    +

    Hodnoty jdou podle klíče i měnit:

    +
    >>> ja['čísla'] = [3, 7, 42]
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42]}
    +

    ... nebo přidávat:

    +
    >>> ja['jazyk'] = 'Python'
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42], 'jazyk': 'Python'}
    +

    ... nebo ubírat příkazem del, podobně jako u seznamů:

    +
    >>> del ja['čísla']
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'jazyk': 'Python'}
    +

    Vyhledávací tabulka

    +

    Trochu jiné použití slovníku, než sdružování +„různých“ typů informací, je takzvaná +vyhledávací tabulka (angl. lookup table). +V ní mají typicky všechny hodnoty stejný typ.

    +

    Taková tabulka se hodí vždycky, když je potřeba +přiřadit nějaké hodnoty jiným hodnotám. +Jako v telefonním seznamu, kde každému jménu přísluší +nějaké číslo, nebo v překladovém slovníku, kde jsou slovům +přiřazeny překlady.

    +
    cisla = {
    +    'Maruška': '153 85283',
    +    'Terka': '237 26505',
    +    'Renata': '385 11223',
    +    'Michal': '491 88047',
    +}
    +
    +barvy = {
    +    'hruška': 'zelená',
    +    'jablko': 'červená',
    +    'meloun': 'zelená',
    +    'švestka': 'modrá',
    +    'ředkvička': 'červená',
    +    'zelí': 'zelená',
    +    'mrkev': 'červená',
    +}
    +

    Iterace

    +

    Když dáš slovník do cyklu for, dostaneš klíče:

    +
    >>> popisy_funkci = {'len': 'délka', 'str': 'řetězec', 'dict': 'slovník'}
    +>>> for klic in popisy_funkci:
    +...     print(klic)
    +str
    +dict
    +len
    +

    Pokud chceš hodnoty, stačí použít metodu values:

    +
    >>> for hodnota in popisy_funkci.values():
    +...     print(hodnota)
    +řetězec
    +slovník
    +délka
    +

    Většinou ale potřebuješ jak klíče tak hodnoty. +K tomu mají slovníky metodu items, +která bude v cyklu for dávat dvojice:

    +
    >>> for klic, hodnota in popisy_funkci.items():
    +...     print('{}: {}'.format(klic, hodnota))
    +str: řetězec
    +dict: slovník
    +len: délka
    +

    Existuje i metoda keys(), která vrací klíče.

    +

    To, co keys(), values() a items() vrací, jsou speciální objekty, +které kromě použití ve for umožňují další +operace: například pracovat s klíči jako s množinou. +V dokumentaci +Pythonu je to všechno popsáno.

    +

    V průběhu takového for cyklu nesmíš +do slovníku přidávat záznamy, ani záznamy odebírat:

    +
    >>> for klic in popisy_funkci:
    +...     del popisy_funkci[klic]
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +RuntimeError: dictionary changed size during iteration
    +

    Hodnoty u už existujících klíčů ale měnit můžeš.

    +

    Jak udělat slovník

    +

    Slovník se dá vytvořit dvěma způsoby. +První, pomocí {složených závorek}, jsme už viděli; +další využívají funkci dict. +Ta, ve stylu str, int či list, převede cokoli, co jde, na slovník.

    +

    Slovník je ovšem dost specifická struktura – +čísla nebo typické seznamy na něj převádět nejdou. +Můžeme ale na slovník převést jiný slovník. +Nový slovník žije svým vlastním životem; +následné změny se promítnou jen do něj.

    +
    barvy_po_tydnu = dict(barvy)
    +for klic in barvy_po_tydnu:
    +    barvy_po_tydnu[klic] = 'černo-hnědo-' + barvy_po_tydnu[klic]
    +print(barvy['jablko'])
    +print(barvy_po_tydnu['jablko'])
    +

    Druhá věc, která jde převést na slovník, je +sekvence dvojic klíč/hodnota:

    +
    data = [(1, 'jedna'), (2, 'dva'), (3, 'tři')]
    +nazvy_cisel = dict(data)
    +

    A to je vše, co se na slovník dá převést.

    +

    Jako bonus umí funkce dict ještě +brát pojmenované argumenty. +Každé jméno argumentu převede na řetězec, +použije ho jako klíč, a přiřadí danou hodnotu:

    +
    popisy_funkci = dict(len='délka', str='řetězec', dict='slovník')
    +print(popisy_funkci['len'])
    +

    Pozor na to, že v tomhle případě musí být klíče +pythonní „jména“ – musí být použitelné jako jména proměnných. +Například takhle nejde zadat jako klíč řetězec +"def" nebo "propan-butan".

    +

    Pojmenované argumenty jde kombinovat s ostatními +způsoby vytvoření dict.

    +

    A to je zatím ke slovníkům vše

    +

    Chceš-li mít všechny triky, které slovníky umí, +pěkně pohromadě, můžeš si stáhnout +Slovníkový tahák.

    +

    Kompletní popis slovníků najdeš +v dokumentaci +Pythonu.

    \ No newline at end of file diff --git a/pyladies/exceptions/index.html b/pyladies/exceptions/index.html new file mode 100644 index 00000000..c7575e4e --- /dev/null +++ b/pyladies/exceptions/index.html @@ -0,0 +1,171 @@ +

    Výjimky

    +

    Pojďme si prohloubit znalosti o chybách, neboli odborně o výjimkách +(angl. exceptions).

    +

    Vezmi následující funkci:

    +
    def nacti_cislo():
    +    odpoved = input('Zadej číslo: ')
    +    return int(odpoved)
    +

    Když uživatel nezadá číslice, ale třeba text cokolada, +nastane výjimka jménem ValueError (chyba hodnoty) a Python vypíše +odpovídající chybovou hlášku.

    +
    Traceback (most recent call last):
    +  File "ukazka.py", line 3, in nacti_cislo
    +    cislo = int(odpoved)
    +ValueError: invalid literal for int() with base 10: 'cokolada'
    +

    Program volá funkci int() pro něco, co nedává smysl jako číslo. +Co s tím má chudák funkce int dělat? +Není žádná rozumná hodnota, kterou by mohla vrátit. +Převádění tohoto textu na celé číslo nedává smysl.

    +

    Až funkce nacti_cislo nejlíp „ví“, co se má stát, když uživatel nezadá +číslice. +Stačí se uživatele zeptat znovu! +Kdybys měl/a funkci, která zjistí jestli jsou v řetězci jen číslice, +mohlo by to fungovat nějak takhle:

    +
    def nacti_cislo():
    +    while True:
    +        odpoved = input('Zadej číslo: ')
    +        if obsahuje_jen_cislice(odpoved):
    +            return int(odpoved)  # máme výsledek, funkce končí
    +        else:
    +            print('To nebylo číslo!')
    +            # ... a zeptáme se znovu -- cyklus `while` pokračuje
    +

    Kde ale vzít funkci obsahuje_jen_cislice? +Nemá smysl ji psát znovu – funkce int sama nejlíp pozná, co se dá převést na +číslo a co ne. +A dokonce nám to dá vědět – chybou, kterou můžeš zachytit.

    +

    Ono „obsahuje_jen_cislice“ v Pythonu existuje. Dokonce několikrát. +Místo řešení problému to ale spíš ilustruje, v čem problém spočívá:

    +
      +
    • Řetězcová metoda isnumeric vrací True pokud řetězec obsahuje číslice: +'123'.isnumeric() je pravda; 'abc'.isnumeric() nepravda. +Problém je, že funkci int potřebuje jeden konkrétní druh číslic: +pro řetězce jako '½' nebo '௩三๓໓' (trojka v tamilském, japonském, +thajském nebo laoském písmu) platí isnumeric, ale int si na nich +vyláme zuby stejně jako na 'abc'.
    • +
    • Řetězcová metoda isdecimal vrací True pokud řetězec obsahuje arabské +číslice 0-9. To už je lepší, ale stejně to úplně nesedí: int si poradí +s mezerou na začátku, např. s ' 3', ale funkce isdecimal takový řetězec +odmítne.
    • +
    +

    Chceš-li zjistit jestli funkce int umí daný řetězec převést na číslo, +nejlepší je použít přímo funkci int.

    +

    Ošetření chyby

    +

    Pro zachycení chyby má Python příkaz try/except.

    +
    def nacti_cislo():
    +    while True:
    +        odpoved = input('Zadej číslo: ')
    +        try:
    +            return int(odpoved)
    +        except ValueError:
    +            print('To nebylo číslo!')
    +

    Jak to funguje? +Příkazy v bloku uvozeném příkazem try se normálně provádějí, ale když +nastane uvedená výjimka, Python přeskočí zbytek bloku try a provede všechno +v bloku except. +Pokud výjimka nenastala, přeskočí se celý blok except.

    +

    Druhy chyb

    +

    A co je to ValueError? To je typ chyby. +Podobných typů je spousta. +Všechny jsou popsané v dokumentaci; pro nás jsou (nebo budou) důležité tyto:

    +
    BaseException
    + ├── SystemExit                     vyvolána funkcí exit()
    + ├── KeyboardInterrupt              vyvolána po stisknutí Ctrl+C
    + ╰── Exception
    +      ├── ArithmeticError
    +      │    ╰── ZeroDivisionError    dělení nulou
    +      ├── AssertionError            nepovedený příkaz `assert`
    +      ├── AttributeError            neexistující atribut/metoda, např. 'abc'.len
    +      ├── ImportError               nepovedený import
    +      ├── LookupError
    +      │    ╰── IndexError           neexistující index, např. 'abc'[999]
    +      ├── NameError                 použití neexistujícího jména proměnné
    +      │    ╰── UnboundLocalError    použití proměnné, která ještě nebyla nastavená
    +      ├── SyntaxError               špatná syntaxe, program je nečitelný/nepoužitelný
    +      │    ╰── IndentationError     špatné odsazení
    +      │         ╰── TabError        kombinování mezer a tabulátorů v odsazení
    +      ├── TypeError                 špatný typ, např. len(9)
    +      ╰── ValueError                špatná hodnota, např. int('xyz')

    Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, +vždy najdeš v příslušné chybové hlášce.

    +

    Když odchytáváš obecnou výjimku, +chytnou se i všechny podřízené typy výjimek – +například except ArithmeticError: zachytí i ZeroDivisionError. +A except Exception: zachytí všechny výjimky, které běžně chceš zachytit.

    +

    Nechytej je všechny!

    +

    Většinu chyb není potřeba ošetřovat.

    +

    Nastane-li nečekaná situace, je téměř vždy +mnohem lepší program ukončit, než se snažit +pokračovat dál a počítat se špatnými hodnotami. +Navíc chybový výstup, který Python standardně +připraví, může hodně ulehčit hledání chyby.

    +

    Zachytávej tedy jenom ty chyby, které očekáváš – víš přesně, která chyba může +nastat a proč; máš možnost správně zareagovat.

    +

    V našem příkladu to platí pro ValueError z funkce int: víš že uživatel +nemusí vždy zadat číslo ve správném formátu a víš že správná +reakce na tuhle situaci je problém vysvětlit a zeptat se znovu.

    +

    Co ale dělat, kdyš uživatel chce ukončit program a zmáčkne +Ctrl+C? +Nebo když se mu porouchá klávesnice a selže funkce input? +Nejlepší reakce na takovou nečekanou situaci ukončit program a informovat +uživatele (nebo lépe, programátora), že (a kde) je něco špatně. +Neboli vypsat chybovou hlášku. +A to se stane normálně, bez try.

    +

    Další přílohy k try

    +

    Pro úplnost: kromě except existují dva jiné bloky, +které můžeš „přilepit“ k try, a to else a finally. +První se provede, když v try bloku +žádná chyba nenastane; druhý se provede vždy – ať +už chyba nastala nebo ne.

    +

    Můžeš taky použít více bloků except. Provede se vždy maximálně jeden: +ten první, který danou chybu umí ošetřit.

    +
    try:
    +    neco_udelej()
    +except ValueError:
    +    print('Tohle se provede, pokud nastane ValueError')
    +except NameError:
    +    print('Tohle se provede, pokud nastane NameError')
    +except Exception:
    +    print('Tohle se provede, pokud nastane jiná chyba')
    +    # (kromě SystemExit a KeyboardInterrupt, ty chytat nechceme)
    +except TypeError:
    +    print('Tohle se neprovede nikdy')
    +    # ("except Exception" výše ošetřuje i TypeError; sem se Python nedostane)
    +else:
    +    print('Tohle se provede, pokud chyba nenastane')
    +finally:
    +    print('Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`')
    +

    Vyvolání chyby

    +

    Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

    +

    Často se to stává když píšeš nějakou obecnou funkci. +Třeba funkci na výpočet obsahu čtverce. +Co se stane, když někdo zavolá obsah_ctverce(-5)?

    +
      +
    • Zadal-li ono -5 uživatel, je potřeba mu vynadat a zeptat se znovu.
    • +
    • Naměřil-li -5 nějaký robotický aparát, je potřeba ho líp zkalibrovat.
    • +
    • Vyšel-li čtverec se stranou -5 v nějakém výpočtu, je nejspíš potřeba opravit +chybu v tom výpočtu.
    • +
    +

    Samotná funkce obsah_ctverce ale „neví“, proč ji někdo volá. +Jejím úkolem je jen něco spočítat. +Měla by být použitelná ve všech případech výše – a v mnoha dalších.

    +

    Když někdo zavolá obsah_ctverce(-5), neexistuje správný výsledek, který by +funkce mohla vrátit. +Místo vrácení výsledku musí tato funkce signalizovat chybu. +S tou se pak může program, který obsah_ctverce(-5) zavolal, +vypořádat – vynadat uživateli, zkalibrovat měřák, nebo, pokud na chybu není +připravený, sám skončit s chybou (a upozornit tak programátora, že je něco +špatně).

    +

    Jak na to prakticky? +Chybu můžeš vyvolat pomocí příkazu raise. +Za příkaz dáš druh výjimky a pak do závorek nějaký popis toho, co je špatně.

    +
    def obsah_ctverce(strana):
    +    if strana > 0:
    +        return strana ** 2
    +    else:
    +        raise ValueError(f'Strana musí být kladná, číslo {strana} kladné není!')
    +

    Podobně jako return, i příkaz raise ukončí funkci. +A nejen tu – pokud na tuhle konkrétní chybu není program předem připravený, +ukončí se celý program.

    +

    Ze začátku není u raise příliš důležité dumat nad tím, který typ výjimky je +ten správný. +Klidně „střílej od boku“. +ValueError bývá často správná volba.

    \ No newline at end of file diff --git a/pyladies/expressions/index.html b/pyladies/expressions/index.html new file mode 100644 index 00000000..86368a94 --- /dev/null +++ b/pyladies/expressions/index.html @@ -0,0 +1,71 @@ +

    Vyhodnocování výrazů

    +

    Už víš, že Python se dá použít jako kalkulačka: dokáže spočítat +hodnotu výrazu (angl. expression) jako 3 * (5 + 2). +Jak to ale vlastně dělá? +Jak se vyhodnocují výrazy?

    +

    Pro základní výrazy je to tak, jak to možná znáš ze školy. +U 3 * (5 + 2) nejdřív spočítáš to, co je v závorkách: (5 + 2) je 7. +Výsledek dosadíš do původního výrazu místo závorky: 3 * 7. +Stejně fungují výrazy v Pythonu.

    +

    Možná to zní jednoduše, ale protože budeme ten samý postup používat +i na složitější výrazy, hodí se ho umět „rozepsat“:

    +
    vysledek = 3 * (5 + 2)
    +#              ╰──┬──╯
    +vysledek = 3 *    7
    +#          ╰─┬────╯
    +vysledek =  21
    +

    Když Python potřebuje vyhodnotit proměnnou, dosadí její hodnotu. +Pokud je zrovna v proměnné a číslo 4, za a se dosadí 4:

    +
    a = 4
    +b = 5
    +
    +vysledek = (a + b) / a
    +#           |   |    |
    +vysledek = (4 + 5) / 4
    +#          ╰──┬──╯
    +vysledek =    9    / 4
    +#             ╰────┬─╯
    +vysledek =        2.25
    +

    Funguje to i u složitých výrazů. +Python se složitými výrazy nemá problém. +Jen člověk, který program čte či píše, se v nich může lehce ztratit. +Když opravdu potřebuješ napsat složitý výraz, je dobré jej rozdělit na několik +menších nebo vysvětlit pomocí komentáře.

    +

    Je ale dobré mít povědomí o tom, jak složité výrazy „fungují“, +aby ses jich nemusel/a bát. +Měl/a bys být schopný/á vysvětlit, co se stane, +když se Pythonu zeptáš, kolik je -b + (b² + +4ac)⁰·⁵ / (2a), abys pak věděl/a, co za +tebe Python dělá.

    +
    a = 2
    +b = 5
    +c = 3
    +
    +
    +x = -b + (b ** 2 + 4 * a * c) ** 0.5 / (2 * a)
    +#    |    |            |   |                |
    +x = -5 + (5 ** 2 + 4 * 2 * 3) ** 0.5 / (2 * 2)
    +#         ╰──┬─╯   ╰─┬─╯               ╰──┬──╯
    +x = -5 + (  25   +   8   * 3) ** 0.5 /    4
    +#                   ╰────┬─╯
    +x = -5 + (  25   +      24  ) ** 0.5 /    4
    +#        ╰───────┬──────────╯
    +x = -5 +         49           ** 0.5 /    4
    +#                ╰──────┬──────────╯
    +x = -5 +               7.0           /    4
    +#                      ╰─────────────┬────╯
    +x = -5 +                            1.75
    +#   ╰──────────────┬───────────────────╯
    +x =              -3.25
    +

    Výrazy se používají na více místech Pythonu než jen v přiřazování +do proměnných. +Třeba podmínka u if je taky výraz a vyhodnocuje se stejně jako ostatní +výrazy:

    +
    strana = -5
    +
    +if strana <= 0:
    +    print("Strana musí být kladná!")
    +
    if strana <= 0:
    +#  ╰──────┬──╯
    +if      True  :
    +
    \ No newline at end of file diff --git a/pyladies/files/index.html b/pyladies/files/index.html new file mode 100644 index 00000000..47b6cec5 --- /dev/null +++ b/pyladies/files/index.html @@ -0,0 +1,126 @@ +

    Soubory

    +

    Dnes se podíváme na to, jak v Pythonu číst z +(a pak i zapisovat do) souborů.

    +

    Vytvoř si v editoru soubor basnicka.txt a napiš do něj libovolnou básničku. +Soubor ulož.

    +

    Na uložení souboru s básničkou doporučuji použít +stejný editor, jaký používáš na Pythonní programy.

    +

    Používáš-li jiný editor než Atom, dej si při ukládání pozor na kódování:

    +
      +
    • Nabízí-li ti editor při ukládání výběr kódování, vyber UTF-8.
    • +
    • Je-li k dispozici kódování „UTF-8 bez BOM”, použij to.
    • +
    • Pokud musíš použít Notepad, který výše uvedené možnosti nemá, pak v kódu +níže použij místo 'utf-8' nestandardní 'utf-8-sig'.
    • +
    +

    Ono utf-8 je název standardního kódování. +Zajišťuje, že se případné emoji nebo znaky s diakritikou do souboru uloží +tak, aby se daly přečíst i na jiném počítači či operačním systému. +🎉

    +

    Potom napiš tento program:

    +
    soubor = open('basnicka.txt', encoding='utf-8')
    +obsah = soubor.read()
    +soubor.close()
    +
    +print(obsah)
    +

    a spusť ho z adresáře, ve kterém je +basnicka.txt (jinými slovy, aktuální adresář musí být ten, který +obsahuje soubor s básničkou).

    +

    Obsah souboru se vypíše!

    +

    Co se tu děje? +Tak jako int() vrací čísla a input() řetězce, funkce +open() vrací hodnotu, která představuje otevřený soubor. +Tahle hodnota má vlastní metody. +Tady používáme metodu read(), která +najednou přečte celý obsah souboru a vrátí ho jako řetězec. +Nakonec metoda close() otevřený soubor zase zavře.

    +

    Automatické zavírání souborů

    +

    Soubory se dají přirovnat k ledničce: abys něco +mohl/a z ledničky vzít, nebo dát dovnitř, musíš +ji předtím otevřít a potom zavřít. +Bez zavření to sice na první pohled funguje taky, +ale pravděpodobně potom brzo něco zplesniví.

    +

    Stejně tak je docela důležité soubor zavřít po tom, +co s ním přestaneš pracovat. +Bez zavření to na první pohled funguje, ale složitější programy se můžou dostat +do problémů. +Operační systémy mají limity na počet +současně otevřených souborů, které se nezavíráním +dají snadno překročit. +Na Windows navíc nemůžeš soubor, který je stále +otevřený, otevřít znovu.

    +

    Na korektní zavření souboru ale programátoři často zapomenou. +Proto Python poskytuje příkaz with, který soubory zavírá automaticky. +Používá se takhle:

    +
    with open('basnicka.txt', encoding='utf-8') as soubor:
    +    obsah = soubor.read()
    +
    +print(obsah)
    +

    Příkaz with vezme otevřený soubor (který vrací funkce open) +a přiřadí ho do proměnné soubor. +Pak následuje odsazený blok kódu, kde se souborem můžeš pracovat – v tomhle +případě pomocí metody read přečíst obsah jako řetězec. +Když se Python dostane na konec odsazeného bloku, soubor automaticky zavře.

    +

    V naprosté většině případů je pro otevírání souborů nejlepší použít with.

    +

    Iterace nad soubory

    +

    Otevřené soubory se, jako např. řetězce či range, +dají použít s příkazem for. +Tak jako for i in range poskytuje za sebou jdoucí čísla a for c in 'abcd' +poskytuje jednotlivé znaky řetězce, for radek in soubor bude do proměnné +radek dávat jednotlivé řádky čtené ze souboru.

    +

    Například můžeš básničku odsadit, +aby se vyjímala v textu:

    +
    print('Slyšela jsem tuto básničku:')
    +print()
    +
    +with open('basnicka.txt', encoding='utf-8') as soubor:
    +    for radek in soubor:
    +        print('    ' + radek)
    +
    +print()
    +print('Jak se ti líbí?')
    +

    Když to zkusíš, zjistíš, že trochu nesedí +řádkování. Zkusíš vysvětlit, proč tomu tak je?

    +
    +

    Řešení

    + + +

    Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce +bílé znaky (mezery a nové řádky) pomocí metody rstrip:

    +
    print('Slyšela jsem tuto básničku:')
    +print()
    +
    +with open('basnicka.txt', encoding='utf-8') as soubor:
    +    for radek in soubor:
    +        radek = radek.rstrip()
    +        print('    ' + radek)
    +
    +print()
    +print('Jak se ti líbí?')
    +

    Psaní souborů

    +

    Pozor!

    +

    Pro Python není problém smazat obsah jakéhokoli souboru. +Psaní do souborů si zkoušej v adresáři, ve kterém nemáš uložené +důležité informace!

    +

    Soubory se v Pythonu dají i zapisovat. +Pro zápis soubor otevři s pojmenovaným +argumentem mode='w' (z angl. mode, mód a write, psát).

    +

    Pokud soubor už existuje, otevřením s mode='w' se veškerý jeho obsah smaže. +Po zavření tak v souboru bude jen to, co do něj ve svém programu zapíšeš.

    +

    Informace pak do souboru zapiš známou funkcí print, +a to s pojmenovaným argumentem file:

    +
    with open('druha-basnicka.txt', mode='w', encoding='utf-8') as soubor:
    +    print('Naše staré hodiny', file=soubor)
    +    print('Bijí', 2+2, 'hodiny', file=soubor)
    +
    \ No newline at end of file diff --git a/pyladies/first-steps/index.html b/pyladies/first-steps/index.html new file mode 100644 index 00000000..c6eed3da --- /dev/null +++ b/pyladies/first-steps/index.html @@ -0,0 +1,83 @@ +

    Interaktivní režim Pythonu

    +

    Chceš-li si začít hrát s Pythonem, otevři příkazový řádek a aktivuj virtuální prostředí. +Zkontroluj si, že ti na začátku příkazové řádky svítí (venv).

    +

    Je-li tomu tak, nezbývá než – konečně – pustit Python. K tomu použij příkaz python:

    +
    $ python
    +Python 3.6.6 (...)
    +Type "help", "copyright", "credits" or "license" for more information.
    +>>>
    +

    Příkaz vypíše několik informací. Z prvního řádku se můžeš ujistit, že používáš Python 3. +(Verze by měla být 3.6 nebo vyšší. Vidíš-li číslo jako 2.7.11, něco je špatně – popros o radu kouče.) +Další řádek je informační: Python má k dispozici návody a informace sám o sobě, +ale jsou psané v angličtině a pro trochu pokročilejší publikum.

    +

    Třemi „zobáčky“ >>> pak Python poprosí o instrukce. +Je to jako v příkazové řádce, ale místo příkazů jako cd a mkdir sem budeš psát příkazy Pythonu.

    +

    Příkazy z příkazové řádky v Pythonu nefungují, +ačkoli okýnko vypadá skoro stejně. +Vyzkoušej si to. Za „zobáčky“ napiš whoami a zmáčkni Enter:

    +
    >>> whoami
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +NameError: name 'whoami' is not defined
    +

    Tohle je chybová hláška, která se objeví vždycky, +když Python nebude spokojený. +V průběhu kurzu jich uvidíš ještě spoustu, +takže si ji dobře prohlédni, ať ji příště poznáš.

    +

    První příkaz

    +

    Třemi „zobáčky“ >>> Python prosí o instrukce. +Pojď mu nějakou dát!

    +

    Ze začátku použij Pythonu jako kalkulačku. +Za tři zobáčky napiš třeba 2 + 3 a zmáčkni Enter.

    +
    >>> 2 + 3
    +5
    +

    Zobáčky >>> i odpověď vypisuje sám Python! +sám/sama zadej jen číslo a Enter.

    +

    Zobrazila se ti správná odpověď? +Pokud ano, gratuluji! První příkaz v Pythonu máš za sebou.

    +

    Zkusíš i odečítání?

    +

    A jak je to s násobením? +Na kalkulačce bys zadal/a 4 × 5, což se na klávesnici píše špatně. +Python proto používá symbol *.

    +
    >>> 4 * 5
    +20
    +

    Symboly jako + a * se odborně nazývají operátory.

    +

    Operátor pro dělení je / – jako u násobení, znak ÷ by se psal špatně.

    +

    Při dělení může vzniknout necelé číslo, třeba dva a půl. +Python používá desetinnou tečku, ukáže se tedy 2.5:

    +
    >>> 5 / 2
    +2.5
    +

    Z důvodů, do kterých teď nebudeme zabíhat, se při dělení desetinná tečka +objeví, i když vyjde číslo celé:

    +
    >>> 4 / 2
    +2.0
    +

    Občas se hodí použít dělení se zbytkem, kdy výsledek zůstane jako celé číslo. +Na to má Python operátory // (podíl) a % (zbytek):

    +
    >>> 5 // 2
    +2
    +>>> 5 % 2
    +1
    +

    Mezery mezi čísly a znamínkem nejsou nutné: 4*5 i 4 * 5 dělá +to samé co 4 * 5. +Je ale zvykem psát kolem operátoru jednu mezeru z každé strany – tak jako +v těchto materiálech. +Kód je pak čitelnější.

    +

    Ukončení

    +

    Pokud ses dostal/a až sem, gratuluji! +Python máš nejen nainstalovaný, ale taky ti funguje. +Stačí ho už jen zavřít a pak opustit i samotnou příkazovou řádku. +V Pythonu se to dělá pomocí quit(), s prázdnými závorkami na konci.

    +
    +>>> quit()
    +(venv)$
    +

    Zobáčky >>> se změnily na výzvu +příkazové řádky, která začíná (venv) a končí $ nebo >. +Teď fungují příkazy jako whoami a cd, ale příkazy Pythonu +jako 1 + 2 fungovat nebudou, dokud Python opět nepustíš pomocí +příkazu python.

    +

    Ukončit virtuální prostředí můžeš příkazem deactivate – +tentokrát bez závorek.

    +
    (venv)$ deactivate
    +

    Příkazovou řádku můžeš nakonec zavřít příkazem exit.

    +
    $ exit
    +

    Pro cvik si zkus Python znovu spustit – nejdřív otevři příkazovou řádku, +pak aktivuj virtuální prostředí, potom spusť Python samotný.

    \ No newline at end of file diff --git a/pyladies/fstring/index.html b/pyladies/fstring/index.html new file mode 100644 index 00000000..b786922e --- /dev/null +++ b/pyladies/fstring/index.html @@ -0,0 +1,67 @@ +

    Šablony (formátovací řetězce)

    +

    Řekněme, že chceš uživateli vypsat určitou hodnotu s nějakou „omáčkou“ okolo. +Dá se na to použít print(), kterému můžeš předat „mix“ řetězců a čísel:

    +
    >>> soucet = 3 + 4
    +>>> print('Součet je', soucet)
    +

    Co ale když chceš celý tento výpis uložit do proměnné – jako jeden řetězec? +Čárka tu fungovat nebude, ta odděluje argumenty ve volání funkce. +Je potřeba soucet převést na řetězec a ten pak připojit k „omáčce“:

    +
    >>> hlaska = 'Součet je ' + str(soucet)
    +

    To ale není tak přehledné, jak by mohlo. +Lze to zpřehlednit použitím šablony.

    +

    Takovou šablonu si představ jako formulář s vynechanými místy:

    +
    Součet je __________.

    Složitější šablona by byla třeba tahle:

    +
    Mil[ý/á] _______,
    +Váš výsledek je __________.
    +
    +S pozdravem,
    +_________

    Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba +jednotlivá vynechaná místa ve formuláři nějak jednoznačně označit. +Použijme jména v „kudrnatých“ závorkách:

    +
    Součet je {soucet}.
    Mil{y_a} {osloveni},
    +Váš výsledek je {soucet}.
    +
    +S pozdravem,
    +{podpis}.

    Takovou šablonu můžeš použít jako formátovací řetězec +(angl. formatted string literal, +zkráceně f-string). +Jako jakýkoli jiný řetězec ji vlož do uvozovek. +A aby bylo jasné, že jde o šablonu, před první uvozovky přidej navíc značku f.

    +
    f"Součet je {soucet}."
    +

    Takový formátovací řetězec jde použít v Pythonu – jako jakýkoli jiný řetězec:

    +
    soucet = 3 + 4
    +hlaska = f'Součet je {soucet}'
    +print(hlaska)
    +
    y_a = 'á'
    +osloveni = 'Anežko'
    +soucet = 3 + 4
    +podpis = 'Váš Program'
    +
    +print(f"""
    +Mil{y_a} {osloveni},
    +Váš výsledek je {soucet}.
    +
    +S pozdravem,
    +{podpis}
    +""")
    +

    A nakonec – v šabloně můžeš použít nejen jména proměnných, ale jakékoli výrazy.

    +
    >>> hlaska = f'Součet je {3 + 4}'
    +

    Ale nepřežeň to! +Většinou je program přehlednější, když si každou vypisovanou hodnotu zvlášť +pojmenuješ – tedy uložíš do vhodně pojmenované proměnné.

    +

    Metoda format

    +

    Někdy se stane, že jednu šablonu potřebuješ použít vícekrát. +Pak formátovací řetězec použít nemůžeš, protože se do něj proměnné doplňují +automaticky a hned. +V takovém případě můžeš šablonu napsat do normálního řetězce (bez f na +začátku) a použít metodu format:

    +
    sablona = 'Ahoj {jmeno}! Tvoje číslo je {cislo}.'
    +print(sablona.format(cislo=7, jmeno='Hynku'))
    +print(sablona.format(cislo=42, jmeno='Viléme'))
    +print(sablona.format(cislo=3, jmeno='Jarmilo'))
    +

    Oproti formátovacím řetězcům umí format užitečnou zkratku: nepojmenované +argumenty dosadí postupně do nepojmenovaných míst v šabloně:

    +
    vypis = '{} krát {} je {}'.format(3, 4, 3 * 4)
    +print(vypis)
    +

    Výrazy jako f'Součet je {3 + 4}' ale format dosadit neumí. +Složitější dosazované hodnoty si proto vždycky pojmenuj.

    \ No newline at end of file diff --git a/pyladies/functions/call-anatomy.svg b/pyladies/functions/call-anatomy.svg new file mode 100644 index 00000000..49d71d91 --- /dev/null +++ b/pyladies/functions/call-anatomy.svg @@ -0,0 +1,413 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delka = len('Ahoj') + Argument + Návratová hodnota + + Jméno funkce + + + (Vlevo jsou texty jsou převedené na křivky,aby se dobře zobrazily v prohlížeči.Originál je vpravo.Viz https://github.com/pyvec/naucse/issues/38 ) + + diff --git a/pyladies/functions/index.html b/pyladies/functions/index.html new file mode 100644 index 00000000..4151c719 --- /dev/null +++ b/pyladies/functions/index.html @@ -0,0 +1,206 @@ +

    Funkce

    +

    Známe spoustu matematických operací, které se zapisují pomocí symbolů – třeba +plus a minus. +Python se snaží používat stejné symboly jako matematici:

    +
      +
    • 3 + 4
    • +
    • a - b
    • +
    +

    S násobením a dělením už je to složitější. +Matematický zápis se na běžné klávesnici nedá napsat:

    +
      +
    • 3 · 4
    • +
    • ¾
    • +
    +

    V Pythonu si ale pořád vystačíme se symbolem, byť trochu jiným – *, /.

    +

    Matematici ale píšou na papír, a tak si můžou dovolit vymýšlet stále +zajímavější klikyháky, které se pak na klávesnici píšou stále hůř:

    +
      +
    • x²
    • +
    • xy
    • +
    • sin θ
    • +
    • Γ(x)
    • +
    • x
    • +
    • |s|
    • +
    • x
    • +
    • ab
    • +
    • ab
    • +
    +

    Ne že by neexistovaly programovací jazyky, +na které je potřeba speciální klávesnice. +Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:

    +

    +
    ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

    Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, +aby se dal snadno naučit. +A tak používá symboly jen pro ty nejčastější operace. +Operátorů, které využívají symboly, je tak málo, že už jich zhruba půlku znáš!

    +

    Pro zajímavost, tady jsou všechny – i ty co ještě neznáš:

    +
    + == != + < > + <= >= + := + | ^ + & + << >> + + - + * @ / + // % + ~ + ** + [ ] ( ) + { } + . +

    Všechno ostatní vyjádříme slovně.

    +

    Délka řetězce

    +

    Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce. +Místo symbolu má název. +Jmenuje se len (z angl. length, délka), a používá se takto:

    +
    slovo = 'Ahoj'
    +delka = len(slovo)      # Vypočítání délky
    +print(delka)
    +

    To len je funkce (angl. function). +Jak se takové funkce používají?

    +

    K tomu, abys funkci mohl/a použít, potřebuješ znát její +jméno – tady len. +Za jméno funkce patří závorky, +do nichž uzavřeš argument (neboli vstup) funkce. +To je informace, se kterou bude funkce +pracovat – třeba len ze svého argumentu vypočítá délku.

    +

    Celému výrazu len(slovo) se říká volání funkce (angl. function call). +Jeho výsledek, takzvaná návratová hodnota +(angl. return value) se dá třeba přiřadit do proměnné.

    +

    Diagram volání funkce

    +

    Pro matematiky

    +

    Máš-li rád/a matematiku, dej pozor! +Funkce v Pythonu je něco jiného než funkce v matematice, +i když se stejně jmenují a podobně zapisují. +Pythonní funkce může např. mít pro stejný argument různé hodnoty.

    +

    Volání funkce jako výraz

    +

    Vzpomínáš si, jak Python vyhodnocuje výrazy?

    +
    vysledek = 3 * (5 + 2)
    +#              ╰──┬──╯
    +vysledek = 3 *    7
    +#          ╰─┬────╯
    +vysledek =  21
    +

    Volání funkce je taky výraz. +Stejně jako a + b je výraz, který něco udělá podle hodnot a a b +a výsledek dá k dispozici, len(slovo) je výraz, který něco udělá +podle hodnoty slovo a výsledek dá k dispozici.

    +

    Vždycky, když Python při vyhodnocování narazí na jméno funkce se závorkami, +funkci zavolá, zjistí výsledek a dosadí ho:

    +
    vysledek = len("Ahoj!")
    +#          ╰────┬─────╯
    +vysledek =      5
    +

    Volání funkce můžeš kombinovat s jinými výrazy, třeba se součtem:

    +
    delka = len('Ahoj') + len('!')
    +#        ╰──┬─────╯    ╰─┬───╯
    +delka =     4       +    1
    +#           ╰───────┬────╯
    +delka =             5
    +

    Nebo v podmínce ifu – třeba u:

    +
    if len('Ahoj!') <= 3:
    +    print('pozdrav je krátký')
    +

    … se za len('Ahoj!') <= 3 nakonec dosadí nepravda (False):

    +
       len('Ahoj!') <= 3
    +#  ╰─────┬────╯
    +         5      <= 3
    +#        ╰──────┬──╯
    +              False
    +

    Volání funkce můžeš použít i jako argument pro jinou funkci:

    +
    print(len('Ahoj'))
    +#     ╰────┬────╯
    +print(     4     )   # vypíše 4
    +

    Nebo to zkombinovat dohromady:

    +
    x = 5
    +print(len('Ahoj') + x)
    +#     ╰────┬────╯   |
    +print(     4      + 5)
    +#          ╰───┬────╯
    +print(         9     )
    +

    … a podobně.

    +

    Procedury

    +

    Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") +je taky volání funkce. +Stejně jako len dostává print v závorkách argument – hodnotu, se +kterou pracuje. +Liší se ale návratovou hodnotou.

    +

    Funkce print sice něco udělá – vypíše text +na obrazovku – ale nevrátí žádný smysluplný výsledek, který by zbytek programu +mohl dál zpracovat.

    +

    Funkcím, které nic nevrací (jen něco udělají) se občas říká procedury. +V Pythonu není hranice mezi „normální“ funkcí a procedurou příliš ostrá, +ale přesto se hodí tento koncept znát. +Pár příkladů:

    +
      +
    • Funkce, která vybere náhodné číslo, je „normální“. +Svůj výsledek vrátí; program s ním může dál pracovat.
    • +
    • Funkce, která vykreslí na obrazovku kolečko, je procedura. +Žádnou zajímavou hodnotu programu nevrací.
    • +
    • Funkce, která spočítá průměrný věk obyvatelstva podle informací ze sčítání +lidu je „normální“. Svůj výsledek vrátí a program s ním může dál pracovat.
    • +
    • Funkce, která přehraje písničku reproduktorem, je procedura. +Nic zajímavého programu nevrací.
    • +
    +

    Na rozdíl od ostatních termínů, které se tu učíš, není +„procedura“ v Pythonu zavedený pojem. +Je vypůjčený z jazyka Pascal. +Kdybys o něm diskutoval/a s nějakým zkušeným programátorem, +odkaž ho prosím na tyto materiály.

    +

    Argumenty

    +

    Argument je to, co funkci dáš k dispozici. Hodnota, se kterou funkce pracuje. +Chceš-li délku řetězce Ahoj!, použiješ funkci len která umí vypočítat +délku jakéhokoli řetězce a jako argument, v závorkách, jí dáš tu svoji +konkrétní hodnotu: len('Ahoj!').

    +

    Podobně funkce print umí vypsat jakoukoli hodnotu. +Tu, kterou má vypsat ve tvém konkrétním případě, jí předáš jako argument.

    +

    Některým funkcím můžeš předat i více argumentů. +Třeba zrovna funkci print, která všechny své argumenty vypíše na řádek. +Jednotlivé argumenty se oddělují čárkami:

    +
    print(1, 2, 3)
    +
    print("Jedna plus dva je", 1 + 2)
    +

    Některé funkce nepotřebují žádný argument. +Příkladem je zase print. +Je ale nutné použít závorky – i když jsou prázdné. +Hádej, co tohle volání udělá?

    +
    print()
    +
    +

    Řešení

    + + +

    Pojmenované argumenty

    +

    Některé funkce umí pracovat i s pojmenovanými argumenty. +Píšou se podobně jako přiřazení do proměnné, +s rovnítkem, ale uvnitř závorek.

    +

    Třeba funkce print při výpisu odděluje jednotlivé argumenty mezerou, +ale pomocí argumentu sep se dá použít i něco jiného.

    +
    print(1, 2, 3, 4, sep=', ')     # Místo mezery odděluj čárkou
    +

    Dá se změnit i to, co print udělá na konci výpisu. +Normálně přejde na nový řádek, ale argumentem end můžeš říct, co se má vypsat +místo toho.

    +

    Tenhle příklad je potřeba napsat do souboru; v interaktivní konzoli +nebude výstup vypadat tak, jak má.

    +
    print('1 + 2', end=' ')     # Místo přechodu na nový řádek jen napiš mezeru
    +print('=', end=' ')
    +print(1 + 2, end='!')
    +print()
    +

    Funkce je potřeba volat

    +

    Pozor na to, že když nenapíšeš závorky, funkce se nezavolá! +Výraz len(s) je volání funkce, ale len bez závorek označuje +funkci samotnou.

    +

    Výsledek len(s) je číslo; len je funkce.

    +

    Čísla můžeš sečítat, můžeš tedy napsat len(s) + 1. +Funkce ale sečítat nejde – len + 1 nedává smysl.

    +

    Často se ale stane, že závorky prostě zapomeneš. +Zkus si, co dělají následující příklady, a pozorně si přečti výsledky +a chybové hlášky, abys pak podobné chyby poznal/a:

    +
    print(len('a'))     # Volání funkce (a vypsání výsledku)
    +print(len)          # Vypsání samotné funkce
    +print(len + 1)      # Sečtení funkce a čísla
    +

    Přehled funkcí

    +

    A jaké funkce můžeš, kromě len a print, použít? +Přehled těch základních najdeš v následující lekci.

    \ No newline at end of file diff --git a/pyladies/github-api/index.html b/pyladies/github-api/index.html new file mode 100644 index 00000000..299cba58 --- /dev/null +++ b/pyladies/github-api/index.html @@ -0,0 +1,129 @@ +

    Webové API

    +

    Jak už bylo řečeno v lekci o JSON, +hlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc. +Pojďme toho využít!

    +

    Spousta webových služeb poskytuje takzvané +API (z application programming interface, +programátorské rozhraní), přes které je možné s danou +službou komunikovat programově. +Místo klikání na tlačítka a čtení stránek „očima” +dostaneme data ve formátu, kterým rozumí počítače – +a v dnešní době to bude většinou formát JSON.

    +

    Z minulých lekcí bys měl/a mít založený účet na github.com, +tak se zkusme zeptat Githubu, co o nás ví.

    +

    Autorizace

    +

    První, a mnohdy nejsložitější, krok k použití API +je přihlášení. Počítače se totiž přihlašují jinak +než lidi a problematika bezpečnosti a oprávnění by vydala na samostatný kurz. +My to uděláme co nejjednodušeji, ať se rychle dostaneme k jádru věci:

    +
      +
    • Přihlaš se na github.com.
    • +
    • Jdi na nastavení Personal Accesss Tokens.
    • +
    • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
    • +
    • Zkopíruj si heslo, které takto dostaneš, do souboru token.txt.
    • +
    +

    Pozor!

    +

    Vygenerovaný kód je heslo, které držitele +opravňuje pracovat s Githubem pod tvým jménem! +Drž ho v tajnosti. Kdyby se přece jen dostalo „ven”, na stránce +Personal Accesss Tokens ho deaktivuj.

    +

    Requests

    +

    K práci s internetovými stránkami použijeme knihovnu Requests. +V aktivovaném virtuálním prostředí si ji nainstaluj příkazem:

    +
    (venv)$ python -m pip install requests
    +

    A potom v Pythonu zkus stáhnout nějakou stránku:

    +
    import requests
    +
    +# stažení stránky
    +stranka = requests.get('https://github.com')
    +
    +# ověření, že dotaz proběhl v pořádku
    +stranka.raise_for_status()
    +
    +# vypsání obsahu
    +print(stranka.text)
    +

    Měl by se vypsat obsah stránky +https://github.com – +HTML kód, který se objeví když v prohlížeči dáš +„Ukázat zdroj” (View Page Source, většinou Ctrl+U) +a ze kterého prohlížeč umí vykreslit stránku.

    +

    Ale my nechceme obsah pro lidi. +Podívejme se, co Github zpřístupňuje počítačům.

    +

    Uživatelský účet

    +

    Zkus, co dělá tento kód:

    +
    import requests
    +
    +with open('token.txt') as soubor:
    +    token = soubor.read().strip()
    +
    +headers = {'Authorization': 'token ' + token}
    +
    +stranka = requests.get('https://api.github.com/user', headers=headers)
    +stranka.raise_for_status()
    +print(stranka.text)
    +

    Co se stalo? Tím, že jsi Githubu dal/a svůj token +(načtený ze souboru, předaný přes slovník headers), +poznal, že jde dotaz od tebe a vrátil nějaké informace +ve formátu JSON.

    +

    Zkus řetězec stranka.text převést z JSON na slovník +a vypsat trochu srozumitelněji:

    +
    data = json.loads(stranka.text)
    +
    +print(json.dumps(data, ensure_ascii=True, indent=2))
    +

    Teď už je lépe vidět celý tvůj profil +(možná včetně neveřejných informací – proto musíš svůj token +udržovat v tajnosti).

    +

    S profilem, který máš v proměnné data, +se dá pracovat jako s každým jiným slovníkem. +Třeba adresu svého obrázku můžeš vypsat pomocí:

    +
    print(data['avatar_url'])
    +

    API Githubu

    +

    API Githubu toho umí mnohem víc. Třeba na adrese +https://api.github.com/emojis na tebe čeká +slovník s adresami malých obrázků. +(Tenhle slovník funguje jako vyhledávací tabulka.) +Celé API je zdokumentováno na adrese +developer.github.com.

    +

    Interakce

    +

    Pomocí webových API se dají informace nejen číst, ale i měnit.

    +

    Na stránce +github.com/pyvec/naucse.python.cz/stargazers +je seznam lidí, kteří „ohvězdičkovali” tyto učební materiály. +Je jich zatím málo; pojďme se k nim pomocí webového API přidat.

    +

    Napřed svému tokenu (na Githubu v nastavení +Personal Accesss Tokens) +přidej právo public_repo. +Od teď token střež obzvlášť pečlivě, protože se pomocí +něj dají informace na Githubu i měnit.

    +

    Chceme-li měnit informace, musíme knihovně Requests +říct, aby použila jinou „HTTP metodu” než GET. +Co to přesně jsou HTTP metody je na trochu delší povídání +(viz Wikipedia), +ale stručně řečeno, pomocí GET se většinou stahuje +obsah, pomocí POST se přidává nový, +PUT mění něco, co už na webu existuje +a DELETE něco maže. +Jakou metodu poujeme závisí na tom, co chceme udělat; +většinou to bude POST, PUT nebo DELETE.

    +

    Podle dokumentace Githubu +se přidání hvězdičky dělá pomocí PUT +dotazu na adresu /user/starred/:owner/:repo. +Za :owner a :repo +dosadíš vlastníka a jméno repozitáře +(v našem případě pyvec a naucse.python.cz) +a PUT metodu zvolíš tak, že zavoláš místo get funkci put:

    +
    import requests
    +
    +with open('token.txt') as soubor:
    +    token = soubor.read().strip()
    +
    +headers = {'Authorization': 'token ' + token}
    +
    +stranka = requests.put('https://api.github.com/user/starred/pyvec/naucse.python.cz', headers=headers)
    +stranka.raise_for_status()
    +

    Tenhle dotaz nevrátí žádný text, ale na +github.com/pyvec/naucse.python.cz/stargazers +se můžeš přesvědčit, že to funguje.

    +

    Chceš-li hvězdičku zase odstranit, použij metodu +DELETE na stejnou adresu. +(Ale nezapomeň tam pak ★ zase vrátit! ☺)

    \ No newline at end of file diff --git a/pyladies/hello-world/index.html b/pyladies/hello-world/index.html new file mode 100644 index 00000000..cd31a597 --- /dev/null +++ b/pyladies/hello-world/index.html @@ -0,0 +1,68 @@ +

    První program

    +
    >>> 3 + 4
    +7
    +

    Psaní příkazů přímo v Pythonu, interaktivně, +má jednu velkou nevýhodu: +to, co napíšeš, se ztratí, jakmile zavřeš okno příkazové řádky. +Na jednoduché výpočty to nevadí, ale až budou tvoje programy složitější, +budeš je potřebovat nějak uložit.

    +

    Otevři editor +(Ten bys měl/a mít nainstalovaný, jestli ne, instrukce jsou v předchozí +lekci.)

    +

    V něm vytvoř nový soubor, do kterého napiš následující text:

    +
    print("Ahoj světe!")
    +

    Pak soubor ulož jako ahoj.py:

    +
      +
    • V adresáři, kde máš soubory ke kurzům Pythonu, si založ adresář pojmenovaný +podle čísla lekce (např. 02). +Měl by být vedle tvého virtuálního prostředí.
    • +
    • Do něj pak soubor ulož pod jménem ahoj.py.
    • +
    +

    Pokud máš v ukládacím okýnku možnost zvolit kódování, zvol UTF-8. +Můžeš–li zvolit typ souboru, zvol .py nebo „všechny soubory“.

    +

    Spuštění

    +

    Otevři si příkazovou řádku. +Pomocí cd donaviguj do adresáře, kde máš soubory ke kurzům Pythonu.

    +

    S příkazovou řádkou jsme se seznámili +v minulé lekci, která popisuje i změnu aktuálního +adresáře pomocí příkazu cd.

    +

    Aktivuj si virtuální prostředí.

    +

    Příkaz k tomu jsme si ukázali na konci +návodu na tvorbu virtuálního prostředí; končí activate.

    +

    Pak a zadej tento příkaz:

    +
    (venv)$ python ahoj.py
    +

    Pokud se vypíše hláška Ahoj světe!, gratuluji! +Napsal/a jsi svůj první program v Pythonu!

    +

    Jestli to nefunguje, zkontroluj, že:

    +
      +
    • Máš zapnuté virtuální prostředí. +(Na příkazové řádce se musí ukazovat (venv); +pokud tam není, použij příkaz „activate“ z minula.)
    • +
    • Jsi ve správném adresáři. Zkus pwd (Unix) nebo cd (Windows). +Aktuální adresář musí být ten, do kterého jsi uložil/a +soubor s programem.
    • +
    • Soubor se opravdu jmenuje ahoj.py. +Pomocí ls (Unix) nebo dir (Windows) zkontroluj, že se soubor opravdu +jmenuje ahoj.py a ne třeba ahoj.py.txt. +Jestli ne, ulož ho znovu pod správným jménem.
    • +
    • Soubor ahoj.py obsahuje správný příkaz, včetně všech uvozovek a závorek.
    • +
    • Slovo (venv) ani znak $ nezadáváš – v materiálech jsou proto, aby bylo +poznat že jde o příkaz příkazové řádky. +Na $ (nebo, na Windows, >) končí dotaz, který vypíše sám počítač. +Příkaz, který zadáváš ty, je jen python ahoj.py.
    • +
    +

    A jestli to pořád nefunguje, zeptej se +zkušenějšího programátora.

    +

    Typografická vsuvka

    +

    V Pythonu je většinou jedno, kde napíšeš mezeru. Stejně jako náš příkaz +print("Ahoj světe!") by fungovalo třeba:

    +
    print      (   "Ahoj světe!"     )
    +

    Je ale zvykem dodržovat určitá pravidla. +Jako v češtině se po otvírací závorce a za +ozavírací závorkou nepíše mezera. +Na rozdíl od češtiny ale mezeru nepiš ani mezi print a závorkou. +„Správně“ je tedy:

    +
    print("Ahoj světe!")
    +

    V rámci uvozovek má pak každá mezera význam: když napíšeš +" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

    +
    \ No newline at end of file diff --git a/pyladies/ignoring/index.html b/pyladies/ignoring/index.html new file mode 100644 index 00000000..3ad90efb --- /dev/null +++ b/pyladies/ignoring/index.html @@ -0,0 +1,203 @@ +

    Ignorování souborů

    +

    Často se stává, že některé soubory v repozitáři nechceš. +Takových souborů jsou tři hlavní druhy:

    +
    +
    Pomocné soubory nástrojů

    Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými +soubory, aby zrychlil importování modulů. +Některé počítače vytváří skryté soubory s názvy jako +.Thumbnails, .DS_Store nebo Thumbs.db. +Takové věci v repozitáři nemají co dělat – je +dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

    +
    Výstup programu a nastavení

    Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři +jen samotný program. +Obrázky si může pomocí programu každý vytvořit sám.

    +

    : Podobně fungují soubory s heslem: pokud program potřebuje heslo + např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně + k dispozici, musí si každý vytvořit soubor s heslem sám.

    +
    +
    Osobní soubory

    Občas se stane, že v adresáři s repozitářem máš soubor s osobními +poznámkami. +Zbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat +jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

    +
    Adresář s virtuálním prostředím

    Jistě už sis zvykl/a na virtuální prostředí. +Adresář s ním se může jmenovat různě, v začátečnickém kurzu používáme název venv. +Není dobré tento adresář dávat do Gitu, +protože je jednoduché jej vždy vytvořit znovu +a pokud na projektu spolupracuje více lidí +(nebo ty z více počítačů), mohlo by dělat neplechu, kdyby virtuální +prostředí nebylo vždy na úplně stejném místě. +Virtuální prostředí z adresáře /home/helena/projektABC/venv +nebude fungovat z adresáře C:\Users\Helena\projektABC\venv, +ale ani z /home/mirka/projektABC/venv.

    +

    My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby +git status neukazoval červeně, že ještě nejsou v repozitáři.

    +

    Příprava

    +

    Pojďme si to ukázat na příkladu. +Založ si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:

    +
      +
    • obrazek.py

      +
      from turtle import forward, left, right, getcanvas
      +
      +forward(50)
      +left(60)
      +forward(50)
      +right(60)
      +forward(50)
      +
      +getcanvas().postscript(file='obrazek.ps')
      +
    • +
    • poznamky.txt

      +
      Tohle je tajné!
    • +
    • Autofile.tmp

      +

      Do tohohle souboru napiš cokoliv. +Různé operační systémy a (jiné programy) vytváří různé soubory +podivných jmen; Autofile.tmp pro nás bude představovat takový +automaticky vzniklý soubor.

      +
    • +
    +

    Pythonní program spusť (pomocí python obrazek.py). +Mělo by se na chvíli ukázat okno s želvou a měl by vzniknout nový soubor +obrazek.ps.

    +

    Obrázek ve formátu PostScript (.ps) se dá otevřít ve většině programů, které +zvládají i PDF, případně v Inkscape.

    +

    Jak se na to dívá Git?

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp
    +    obrazek.ps
    +    obrazek.py
    +    poznamky.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    Spousta souborů, ale jen jeden z nich chceš v repozitáři. +Co s těmi ostatními?

    +

    Výstupy programu a pomocné soubory společných nástrojů

    +

    Nejjednodušší je vyrovnat se se souborem obrazek.ps. +V repozitáři ho nechceš (je to repozitář zdrojového kódu; výsledky bývá +lepší schraňovat jinde než v Gitu). +Zároveň víš, že každý, kdo s repozitářem bude pracovat, pravděpodobně +tenhle soubor vytvoří. +Bylo by tedy dobré říct všem lidem, kteří se k repozitáři dostanou, že tento +soubor do Gitu nepatří. +To se dělá záznamem ve speciálním souboru v repozitáři.

    +

    Udělej soubor s názvem .gitignore. +(Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává – +doporučuji soubor vytvořit v programátorském editoru.) +Do něj napiš:

    +
    obrazek.ps

    Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    .gitignore
    +    Autofile.tmp
    +    obrazek.py
    +    poznamky.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

    +
    $ git add .gitignore obrazek.py
    +$ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp
    +    poznamky.txt

    Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou +.gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

    +

    Jak ignorovat zbylé dva soubory?

    +

    Osobní poznámky

    +

    Soubor poznamky.txt se taky dá zařadit do .gitignore, ale moc se tam nehodí. +Existuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří +soubor se stejným jménem.

    +

    Dej ho tedy do souboru, který se nebude šířit s repozitářem. +Tento soubor je .git/info/exclude. +(Může být trochu složité ho najít, protože adresář .git je skrytý. +Nevidíš–li ho, napiš v editoru do okýnka pro otevření souboru .git a dostaneš +se do něj.)

    +

    Soubory v adresáři .git bys neměl/a měnit, protože se tak dá přijít +o historii projektu. +Ale exclude je výjimka. Napiš na konec tohoto souboru:

    +
    poznamky.txt

    A po uložení budou poznámky ignorovány!

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp

    Další haraburdí

    +

    Některé programy automaticky vytvářejí pomocné soubory. +Často to dělají správci souborů (často .Thumbnails na Linuxu, +.DS_Store na Macu nebo Thumbs.db na Windows). +Některé editory si taky nechávají na disku nastavení.

    +

    Podobné soubory se dají dát do .gitignore. +Je ale lepší si je dát do osobního nastavení, protože ostatní lidé, +kteří na projektu můžou spolupracovat, nemusí používat stejný systém +a programy.

    +

    Pokud si můžeš být jistý/á, že ostatní budou používat právě +ten program, který používáš ty, použij .gitignore. +Příklad je adresář __pycache__, který vytváří Python při importu modulu.

    +

    Soubor s osobním nastavením si můžeš pojmenovat, jak chceš, a můžeš ho uložit +kde budeš chtít. +Já doporučuji ho pojmenovat .gitignore_global a dát ho do tvého domovského +adresáře.

    +

    Do souboru zase napiš jméno ignorovaného souboru:

    +
    Autofile.tmp

    Potom řekni Gitu, kde tento soubor najít:

    +
    $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global

    A měl by být ignorován:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py

    Formát ignorovacího souboru

    +

    Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: +každý na zvláštní řádek. +Kromě toho je možné použít několik vychytávek:

    +
      +
    • * ve jméně souboru nahradí část jména souboru. +Takže pokud chceš ignorovat všechny soubory s příponou .tmp, můžeš napsat:

      +
      *.tmp
    • +
    • / na konci jména značí adresář. Chceš-li tedy ignorovat adresáře +__pycache__ (což v Pythonním projektu chceš), napiš do .gitignore:

      +
      __pycache__/
    • +
    +

    Další detaily je možné najít v dokumentaci.

    +

    Automatické přidávání

    +

    Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo

    +
    $ git add soubor1 soubor2
    +$ git commit
    +

    můžeš napsat jen git commit s tečkou na konci:

    +
    $ git commit .
    +

    To automaticky přidá všechny neignorované soubory, které git status ukazuje +červeně. +Tečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá +do revize.

    +

    Doporučuji si před použitím téhle zkratky zkontrolovat git status, aby sis +ověřil/a, že nepřidáváš nic, co nechceš.

    +

    Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize, +ukazovala poznámka s tím, co vlastně v nové revizi bude. +Uvidíš tak něco jako git status vždy, když začneš psát popisek k revizi:

    +
    $ git config --global commit.verbose 1
    +
    \ No newline at end of file diff --git a/pyladies/inheritance/index.html b/pyladies/inheritance/index.html new file mode 100644 index 00000000..28e41827 --- /dev/null +++ b/pyladies/inheritance/index.html @@ -0,0 +1,199 @@ +

    Dědičnost

    +

    Minule jsme probrali třídy. +Jako příklad jsme si ukázali třídu pro koťátka:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +

    Zkus si udělat podobnou třídu pro štěňátka:

    +
    class Stenatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +    def zastekej(self):
    +        print(f"{self.jmeno}: Haf!")
    +

    Většina kódu je stejná! +Kdybys měla napsat i třídu pro kuřátka, kůzlátka, +slůňátka a háďátka, bez Ctrl+C by to bylo docela nudné. +A protože jsou programátoři líní psát stejný kód +několikrát (a hlavně ho potom udržovat), vymysleli +mechanismus, jak se toho vyvarovat.

    +

    Koťátka i štěňátka jsou zvířátka. +Můžeš si vytvořit třídu společnou pro všechna +zvířátka a do ní napsat všechno, co je společné. +Ve třídách pro jednotlivé druhy zvířat pak zbude jen to, co se liší. +V Pythonu se to dělá takto:

    +
    class Zviratko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +
    +class Kotatko(Zviratko):
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +
    +class Stenatko(Zviratko):
    +    def zastekej(self):
    +        print(f"{self.jmeno}: Haf!")
    +
    +
    +micka = Kotatko('Micka')
    +azorek = Stenatko('Azorek')
    +micka.zamnoukej()
    +azorek.zastekej()
    +micka.snez('myš')
    +azorek.snez('kost')
    +

    Jak to funguje? +Příkazem class Kotatko(Zviratko): +říkáš Pythonu, že třída Kotatko +dědí ze třídy Zviratko +(angl. inherits from Zviratko). +Případně se můžeš setkat s jinými termíny: +„je odvozená” ze třídy Zviratko, +(angl. derived from), +nebo ji “rozšiřuje” (angl. extends). +A když už jsme u terminologie, odvozeným třídám se +říká taky podtřídy (angl. subclasses) +a Zviratko je tu nadtřída +(angl. superclass).

    +

    Když potom Python hledá nějakou metodu +(nebo jiný atribut), třeba micka.snez, +a nenajde ji přímo ve třídě daného objektu (u nás +Kotatko), podívá se do nadtřídy. +Takže všechno, co je definované pro +Zviratko, platí i pro koťátka – dokud to výslovně nezměníš.

    +

    Přepisování metod a super()

    +

    Když se ti nebude líbit chování některé metody +v nadtřídě, stačí dát metodu stejného jména do +podtřídy:

    +
    class Kotatko(Zviratko):
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi vůbec nechutná!")
    +
    +
    +micka = Kotatko('Micka')
    +micka.snez('granule')
    +

    Je to podobné jako když jsme minule přepisovali +atribut pomocí micka.zamnoukej = 12345. +Python atributy hledá napřed na samotném objektu, +potom na třídě toho objektu a pak na nadtřídě +(a případně dalších nadtřídách té nadtřídy).

    +

    Občas se může stát, že v takovéto přepsané metodě budeš +potřebovat použít původní funkčnost, jen budeš chtít udělat ještě něco navíc. +To umí zařídit speciální funkce super(), +která umožňuje volat metody z nadtřídy. +Třeba takhle:

    +
    class Kotatko(Zviratko):
    +    def snez(self, jidlo):
    +        print(f"({self.jmeno} na {jidlo} chvíli fascinovaně kouká)")
    +        super().snez(jidlo)
    +
    +
    +micka = Kotatko('Micka')
    +micka.snez('granule')
    +

    Pozor na to, že takhle volané metodě musíš dát všechny +argumenty, které potřebuje (kromě self, +který se jako obvykle doplní automaticky). +Toho se dá i využít – můžeš použít i jiné argumenty +než dostala původní funkce:

    +
    class Hadatko(Zviratko):
    +    def __init__(self, jmeno):
    +        jmeno = jmeno.replace('s', 'sss')
    +        jmeno = jmeno.replace('S', 'Sss')
    +        super().__init__(jmeno)
    +
    +
    +standa = Hadatko('Stanislav')
    +standa.snez('myš')
    +

    Jak je vidět, super() se dá bez problémů +kombinovat se speciálními metodami jako __init__. +Dokonce se to dělá poměrně často!

    +

    Polymorfismus

    +

    Programátoři nezavedli dědičnost jen proto, že jsou +líní a nechtějí psát dvakrát stejný kód. +To je sice dobrý důvod, ale nadtřídy mají jednu +důležitější vlastnost. Když víš, že každé +Kotatko nebo Stenatko +nebo jakákoli jiná podtřída je zvířátko, +můžeš si udělat seznam zvířátek s tím, +že pak bude jedno, jaká přesně zvířátka to jsou:

    +
    zviratka = [Kotatko('Micka'), Stenatko('Azorek')]
    +
    +for zviratko in zviratka:
    +    zviratko.snez('flákota')
    +

    Tohle je docela důležitá vlastnost podtříd: +když máš nějaké Kotatko, můžeš ho použít +kdekoliv kde program očekává Zviratko, +protože každé koťátko je zvířátko.

    +

    Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět +kterou třídu podědit z které. +Každé koťátko nebo štěňátko +je zvířátko, každá chata +nebo panelák je stavení. +V takových případech dává dědičnost smysl.

    +

    Někdy se ale stane, že tuhle pomůcku zkusíš použít a vyjde ti +nesmysl jako „každé auto je volant”. +V takovém případě dědičnost nepoužívej. +I když jak auto tak volant se dají „otočit doprava”, +u každého to znamená něco jiného – a určitě nejde auto +použít kdekoli, kde bys chtěl/a použít volant. +Takže v tomto případě je lepší si říct „každé auto + volant”, stejně jako „každé kotě + jméno”, udělat dvě nezávislé třídy a napsat něco jako:

    +
    class Auto:
    +    def __init__(self):
    +        self.volant = Volant()
    +

    (A až bude někdy nějaký vystudovaný informatik nespokojený +s tím, že porušuješ +Liskovové substituční princip, +jde o právě tento problém.)

    +

    Generalizace

    +

    Když se teď podíváš na funkce zamnoukej +a zastekej, možná tě napadne, že by se +daly pojmenovat lépe, aby se daly použít pro všechna +zvířata, podobně jako snez. +Bude nejlepší je přejmenovat:

    +
    class Zviratko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +
    +class Kotatko(Zviratko):
    +    def udelej_zvuk(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +
    +class Stenatko(Zviratko):
    +    def udelej_zvuk(self):
    +        print(f"{self.jmeno}: Haf!")
    +
    +
    +zviratka = [Kotatko('Micka'), Stenatko('Azorek')]
    +
    +for zviratko in zviratka:
    +    zviratko.udelej_zvuk()
    +    zviratko.snez('flákota')
    +

    Jak tenhle příklad naznačuje, psát nadtřídy ze kterých se dobře dědí +není jednoduché. Zvlášť to platí, kdyby se z nich mělo dědit v jiném +programu, než kde je nadtřída. +I z toho důvodu je dobré dědičnost používat hlavně v rámci svého kódu: +nedoporučuji dědit od tříd, které napsali ostatní (jako bool nebo +pyglet.sprite.Sprite), pokud autor nadtřídy výslovně nezmíní, že (a jak) se +z ní dědit má.

    +

    A to je zatím o třídách vše. Už toho víš dost na to, +aby sis napsal/a vlastní zoo :)

    \ No newline at end of file diff --git a/pyladies/install-editor/atom.html b/pyladies/install-editor/atom.html new file mode 100644 index 00000000..e7a91754 --- /dev/null +++ b/pyladies/install-editor/atom.html @@ -0,0 +1,73 @@ +

    Instalace Atomu

    +

    Editor Atom +si stáhni z jeho domovské stránky +a nainstaluj.

    +

    Nastavení

    +

    V Atomu se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

    +

    Odsazování a obarvování bude fungovat správně jen v souborech s koncovkou .py +(jako Python). +V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    +

    Proto jakmile v tomhle editoru vytvoříš nový soubor, +měl/a bys ho co nejdřív uložit pod správným jménem.

    +

    Kontrola stylu zdrojového kódu

    +

    Jedna věc nám v Atomu přeci jen chybí: plugin pro kontrolu správného +stylu zdrojového kódu.

    +

    Tak jako čeština má Python typografická pravidla. +Například za čárkou se píše mezera, ale před ní ne. +Jsou nepovinná, program bude fungovat i při jejich nedodržení, +ale pomáhají psát přehledný kód, tak je dobré je dodržovat už od začátku. +Pravidla pro Python jsou popsána v dokumentu +PEP8.

    +

    Aby sis je nemusel/a všechny pamatovat, nainstaluj si plugin, +který tě na jejich porušení upozorní.

    +

    Nejprve je potřeba si nainstalovat speciální knihovnu, která se o kontrolu +dokáže postarat. Do příkazové řádky zadej následující:

    +
    $ python -m pip install flake8
    +

    A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber +„Soubor > Nastavení/File > Settings“ a v nabídce +uprostřed okna vyber poslední položku +„Instalovat/Install“. Do vyhledávacího pole zadej +„linter-flake8“ a v seznamu nalezených pluginů klikni u položky stejného jména +na tlačítko „Instalovat/Install“. Bude ještě potřeba +schválit instalaci všech závislostí, na které se Atom postupně zeptá.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install-editor/gedit.html b/pyladies/install-editor/gedit.html new file mode 100644 index 00000000..e92500c9 --- /dev/null +++ b/pyladies/install-editor/gedit.html @@ -0,0 +1,66 @@ +

    Instalace Geditu

    +

    Na Linuxu se Gedit instaluje jako ostatní programy:

    +
    +
    Fedora
    $ sudo dnf install gedit
    +
    Ubuntu
    $ sudo apt-get install gedit
    +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +

    Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

    +

    Nastavení

    +

    Gedit se nastavuje v Předvolbách (Preferences).

    +

    +
    +
    Číslování řádků

    V sekci Zobrazit/View vyber +Zobrazovat čísla řádků/Display Line Numbers.

    +

    +
    Odsazování

    V sekci Editor vyber:

    +
      +
    • Šířka tabulátorů/Tab width: 4
    • +
    • Vkládat mezery místo tabulátorů/Insert spaces instead of tabs
    • +
    • Povolit automatické odsazování/Enable automatic indentation
    • +
    +

    +
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +koncovky souboru – např. .py pro Python.

    +

    Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co +nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install-editor/gedit_indent.png b/pyladies/install-editor/gedit_indent.png new file mode 100644 index 0000000000000000000000000000000000000000..60c857afaf75544bd175d452b67541779391c1c4 GIT binary patch literal 21030 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 literal 0 HcmV?d00001 diff --git a/pyladies/install-editor/gedit_linenums.png b/pyladies/install-editor/gedit_linenums.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6e6c5a54c5e0e6f165f821f8981b82b6c957ad GIT binary patch literal 28001 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 literal 0 HcmV?d00001 diff --git a/pyladies/install-editor/gedit_prefs.png b/pyladies/install-editor/gedit_prefs.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ea8b5c9a5243013b1833219559c7fe19ee5074 GIT binary patch literal 87034 zcmZsD1yEdDmo;%DNN@=df_rd>;KALc3GM`UNP-6o5Zr>hyLJff?(Xic{U6@@re>!8 zsT7sscK7Xb&fT*1+G`UeFDs6Wh>r*d2Zt>2NkkD2?&&!AF@b*xuBexlV1fT$>Pv}> zz`-8>{cg&M0#^{eeA2LogG0i2{CNVGkc0~^zH*R|5q-7%6dw}_gQ_1Z3l8oboP>y= zvdhfgyt50Y3eKP9#q1~|N$#J|KM5UP!);Tkh;ToB>i_lSi|3hnRO<4XKFV*Nzd>rE zk&If1&=r=T{3*mu-LObZA{A391BpE4ALK9PVR1f4qISR77|?!^s|-)#izWn5a?%f{ zH<+S>j_{vf(<~+@McC&l;UzqgRc z_oGq`Kqdb5?w{Wy&Hudwh`}aphMMW~)>$-P%xJzqm z(&PEX+;}EdyOh4#q$kb?SJ(3tymw4NK|$@B0vH$=dwYBKg%DFys*8&YJ2a%nuMT7E z?dpQpbG4TccH^&K1>Ce(U9@3RRbDEZU1-;0-Rh=uVqoBxw{PDLkJ2s( zWYR`U3JD9Z&0$9>Bc&mI|Niv UTdnw2J6@@XV0qTf^0a82#nFYL37)sZ0;?B^Il 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 editoru +

    Editor, program na úpravu textu, je základní pomůcka +každého programátora, +takže je dobré do něj investovat trochu času.

    +

    Je víceméně jedno, který programátorský editor budeš používat. +Pokud už nějaký oblíbený máš, stačí ho jen nastavit; +jestli ne, nějaký ti doporučíme. +Pokud ale používáš Poznámkový blok (Notepad) z Windows, +nebo TextEdit (editor předinstalovaný v macOS), +nebude ti stačit. +Stejně tak nejsou vhodné programy jako Word či Writer.

    +

    Co programátorský editor umí

    +

    Editor pro programátory nám umožňuje upravovat prostý text – písmenka. +Na rozdíl od programů jako Word, Writer či Pages neumožňuje text formátovat, +tedy dělat nadpisy, obarvovat, zvětšovat font, vkládat obrázky a podobně.

    +

    Pomocí editoru budeme zadávat počítači příkazy, takže formátování nepotřebujeme. +Porovnej sám/sama, jaký je rozdíl mezi následujícími příkazy +pro někoho, kdo se jimi má řídit:

    +
      +
    • Nakresli mi beránka!
    • +
    • Nakresli mi beránka!
    • +
    +

    To, že neumí formátování, neznamená že jsou naše editory úplně „hloupé“ +nástroje. +Aby se nám programy upravovaly pohodlněji, mají několik vychytávek:

    +
    +
    Podpora více souborů

    Větší projekty sestávají z více souborů, které můžeš mít v editoru +otevřené všechny najednou.

    +
    Číslování řádků

    Před každým řádkem se ukazuje číslo. +To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.

    +
    Odsazování

    V Pythonu je důležité, kolika mezerami řádek začíná. +Správně nastavený editor nám odsazování značně zjednoduší.

    +
    Obarvování

    Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám +obarvením může napovědět, jak našim instrukcím bude počítač rozumět. +Ale je to jenom nápověda: +programátor s jinak nastaveným editorem může mít stejný soubor obarvený +docela jinak.

    +

    Pro ilustraci, takhle může v editoru vypadat kousek kódu:

    +
        1  @app.route('/courses/<course:course>/')
    +    2  def course_page(course):
    +    3      try:
    +    4          return render_template(
    +    5              'course.html',
    +    6              course=course,
    +    7              plan=course.sessions,
    +    8          )
    +    9      except TemplateNotFound:
    +   10          abort(404)
    +

    Volba a nastavení editoru

    +

    Vybereš-li editor, klikni na jeho jméno a dostaneš se na instrukce ke stažení +a nastavení. +(Na tuhle stránku se pak už nemusíš vracet.)

    +
      +
    • Visual Studio Code – doporučený editor pro +Windows a macOS (a vhodný i pro Linux). +V poslední době je to asi nejpopulárnější editor kódu. +Nabízí mnoho funkcí a má velkou základnu uživatelů a vývojářů, +takže se neustále vylepšuje.
    • +
    +

    Na Linuxu budeš mít pravděpodobně už nainstalovaný Gedit nebo Kate. +Zkus se podívat do systémové nabídky, jestli jeden z nich máš (případně je +spusť z příkazové řádky jako gedit, resp. kate). +Pokud ano, klikni na odkaz níže a editor si nastav. +Nemáš-li ani jeden, vyber Visual Studio Code (viz výše).

    +
      +
    • Gedit – bývá na systémech s prostředím GNOME.
    • +
    • Kate – bývá na systémech s prostředím KDE.
    • +
    +

    Existují i jiné editory, na které máme návody +nebo jsme je doporučovali ve starších verzích těchto materiálů. +Pokud se jeden z nich rozhodneš použít, neuděláš chybu:

    +
      +
    • Atom – kvalitní editor s jednoduchým designem
    • +
    • Notepad++ – nenáročný editor +pro Windows vhodný pro pomalejší počítače
    • +
    +

    Máš-li už svůj oblíbený editor – Vim, Emacs, Geany, apod., použij ten:

    +
      +
    • Ostatní – máš-li jiný editor, zkontroluj +si že je správně nastaven.
    • +
    +

    IDE

    +

    Existují i složitější a mocnější editory, takzvané IDE (angl. Integrated +Development Environment, integrované vývojové prostředí), +třeba PyCharm, Eclipse nebo KDevelop. +Umí spoustu pokročilých funkcí, které programátorům pomáhají: +našeptávání, přejmenovávání, spouštění programů, správu virtuálních prostředí +a podobně. +Na začátek ale nejsou moc vhodné.

    +

    Chceš-li takový editor přesto použít, měl/a bys ho už poměrně dobře znát: +vědět, co za tebe dělá editor a jak to spravit, až něco udělá špatně.

    \ No newline at end of file diff --git a/pyladies/install-editor/kate.html b/pyladies/install-editor/kate.html new file mode 100644 index 00000000..4cef500a --- /dev/null +++ b/pyladies/install-editor/kate.html @@ -0,0 +1,68 @@ +

    Instalace Kate

    +

    Na Linuxu se Kate instaluje jako ostatní programy:

    +
    +
    Fedora
    $ sudo dnf install kate
    +
    Ubuntu
    $ sudo apt-get install kate
    +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +

    Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

    +

    Nastavení

    +
    +
    Číslování řádků

    V menu Pohled/View vyber +Ukazovat čísla řádek/Show Line Numbers.

    +
    Odsazování

    V Menu Nastavení/Settings vyber +Nastavit 'Kate'/Configure Kate.

    +

    Tam v Úpravy/Editing vyber +Odsazování/Indentation.

    +

    Tam nastav:

    +
      +
    • Výchozí režim odsazení/Default indentation mode: Python
    • +
    • Odsazovat pomocí/Indent using: Mezer/Spaces
    • +
    • Šířka tabulátoru/Tab Width: 4 znaky
    • +
    • Odsadit pomocí/Indentation width: 4 znaky
    • +
    • Klávesa Backspace zpětně odsazuje v úvodních mezerách/Backspace key in leading blank space unindents
    • +
    +
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +koncovky souboru – např. .py pro Python.

    +

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co +nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install-editor/notepad-plus-plus.html b/pyladies/install-editor/notepad-plus-plus.html new file mode 100644 index 00000000..2198bbf9 --- /dev/null +++ b/pyladies/install-editor/notepad-plus-plus.html @@ -0,0 +1,55 @@ +

    Instalace Notepadu++

    +

    Notepad++ je k dispozici pouze pro Windows.

    +

    Stáhni jej z jeho domovské stránky +a nainstaluj.

    +

    Nastavení

    +
    +
    Odsazování

    V menu Nastavení zvol Předvolby a pak nastav +„Nastavení tabulátoru/Tab Settings“ na +„Zaměnit za mezery/Replace by Space“.

    +

    Obarvování bude fungovat automaticky v souborech s koncovkou .py +(jako Python). +V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    +

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, +měl/a bys ho co nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install-editor/others.html b/pyladies/install-editor/others.html new file mode 100644 index 00000000..cad7e3fc --- /dev/null +++ b/pyladies/install-editor/others.html @@ -0,0 +1,77 @@ +

    Instalace editoru

    +

    Používáš-li editor, pro který nemáme instrukce, budeš ho muset nastavit +sám/sama. +Tady je pár tipů, na co si dát pozor.

    +

    Nastavení

    +

    Číslování řádků

    +

    Ujisti se, že ti editor čísluje řádky. +Pokud ne, podívej se do nastavení a zjisti, jak se to zapíná.

    +

    Obarvování

    +

    Ulož soubor s koncovkou .py – například zkouska.py – a zkopíruj do něj +následující program:

    +
    def foo():
    +    return "abc" * 2
    +

    Jestli se text automaticky obarví (klidně jinými barvami než tady), +je tvůj editor nastavený správně. +Jinak se podívej do nastavení a zjisti, jak se to zapíná.

    +

    Odsazování

    +

    Stisknutím klávesy Tab na začatku řádku se vloží 4 mezery. +Pro psaní a sdílení kódu v Pythonu je důležité, +aby byly čtyři a aby to byly opravdu mezery.

    +

    Jestli to jsou mezery, se dá zjistit tak, že odsazení na začátku vybereš myší. +Jde-li vybírat po jednotlivých mezerách, je všechno v pořádku.

    +

    Nejde-li vybírat po jednotlivých mezerách, nebo pokud se jich po stisknutí +Tab vloží jiný počet než 4, podívej se do nastavení po možnostech +jako „velikost odsazení“ nebo „nahrazovat tabulátory za mezery”.

    +

    Kontrola stylu zdrojového kódu

    +

    Editory často podporují instalaci pluginů, které mohou psaní kódu usnadnit +a pomoci s jeho kontrolou. +Jeden z neužitečnějších je plugin pro kontrolu správného stylu zdrojového kódu.

    +

    Tak jako čeština má Python typografická providla. +Například za čárkou se píše mezera, ale před ní ne. +Jsou nepovinná, program bude fungovat i při jejich nedodržení, +ale pomáhají psát přehledný kód, tak je dobré je dodržovat už od začátku. +Tato pravidla jsou popsána +v dokumentu PEP8.

    +

    Zkus takový plugin pro svůj editor najít a nainstalovat.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install-editor/vscode.html b/pyladies/install-editor/vscode.html new file mode 100644 index 00000000..5fba1304 --- /dev/null +++ b/pyladies/install-editor/vscode.html @@ -0,0 +1,57 @@ +

    Instalace Visual Studio Code

    +

    Stažení a instalace

    +

    Editor si můžeš stáhnout z jeho domovské stránky. +Vyber na ní zelené tlačítko Download a vyber instalátor pro svůj systém. +Dále se řiď instrukcemi instalátoru jako u každého jiného programu.

    +

    Nastavení

    +

    Ve Visual Studio Code se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

    +

    Odesílání telemetrických dat

    +

    Tento textový editor ale odesílá data o tvém používání (nejspíš včetně např. +obsahu otevřených souborů). +Pokud si nepřeješ aby se data odesílala, můžeš odesílání zrušit:

    +
      +
    • Otevři File > Preferences > Settings (macOS: Code > Preferences > Settings).
    • +
    • Vyhledej telemetry.enableTelemetry a odškrtni tento záznam.
    • +
    +

    Viz též původni postup v angličtině.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/pyladies/install/index.1.html b/pyladies/install/index.1.html new file mode 100644 index 00000000..26e25898 --- /dev/null +++ b/pyladies/install/index.1.html @@ -0,0 +1,80 @@ +

    Git

    +

    Další program, který budeme později potřebovat, +nám později umožní (mimojiné) spolupracovat +na vznikajících programech s ostatními. +Jmenuje se Git. +Pojďme si ho nainstalovat a nastavit.

    +

    Instalace je různá pro různé operační systémy, vyber ten svůj.

    +

    Linux

    +

    Instalaci na Linux zvládneme jedním příkazem:

    +

    Fedora, RHEL:

    +
    $ sudo dnf install git gitk git-gui nano
    +

    Ubuntu, Debian:

    +
    $ sudo apt-get install git gitk git-gui nano
    +

    U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, +gitk, git gui a nano.

    +

    Jestli máš nainstalováno, ještě nastav Gitu editor. +Pokud nemáš rád/a Vim (nebo nevíš co to je), +zadej tento příkaz:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením níže.

    +

    Windows

    +

    Jdi na stránku git-scm.org, stáhni si +Git a nainstaluj si ho.

    +

    Při instalaci se ujisti, že jsou vybrány tyto volby:

    +
      +
    • Adjusting your PATH enviroment: Git from the command line and also from 3rd-party software
    • +
    • Configuring the line ending conversions: Checkout Windows-style, commit Unix-style line endings
    • +
    +

    Ostatní možnosti neměň.

    +

    Potom Gitu nastav editor. +Máš-li otevřenou příkazovou řádku, zavři ji a otevři novou. +(Instalace mění systémové nastavení, které se musí načíst znovu.) +V nové příkazové řádce zadej:

    +
    > git config --global core.editor notepad
    +> git config --global format.commitMessageColumns 80
    +> git config --global gui.encoding utf-8
    +

    A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

    +

    macOS

    +

    Spusť v příkazové řádce git. +Je-li už nainstalovaný, dozvíš se, jak ho používat +(výpis začíná usage). +Jinak ho nainstaluj pomocí Homebrew:

    +
    $ brew install git git-gui
    +

    Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, +i když sis v rámci instalace editoru nainstaloval/a např. Atom). +Dělá se to tímto příkazem:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením:

    +

    +

    Nastavení

    +

    Na projektu, který bude uložen v Gitu, může +spolupracovat více lidí. +Aby šlo dohledat, kdo udělal kterou změnu, je Gitu +potřeba říct jméno a e-mail. +Do příkazové řádky zadej následující příkazy, změň v nich ale +jméno a adresu:

    +
    $ git config --global user.name "Adéla Novotná"
    +$ git config --global user.email adela.novotna@example.cz
    +

    Můžeš samozřejmě použít i přezdívku, nebo dokonce +falešný e-mail, ale v takovém případě bude složitější se +zapojit do týmových projektů. +Každopádně, jméno i e-mail jdou kdykoli změnit +tím, že konfigurační příkazy zadáš znovu.

    +

    Pokud se bojíš spamu, neboj: nezačneš ho dostávat víc +než při normálním používání e-mailu. +Adresa se zobrazí jen lidem, kteří si stáhnou projekt, +do kterého jsi přispíval/a. +Spammeři se většinou zaměřují na méně technicky zdatné +lidi, než jsou uživatelé Gitu. :)

    +

    Dále si můžeš nastavit barevné výpisy – pokud si tedy +(jako někteří autoři Gitu) nemyslíš, že příkazová +řádka má být černobílá:

    +
    $ git config --global color.ui true
    +

    Spuštění git config nevypíše žádnou hlášku, že se operace povedla. +To je normální; stejně se chová spousta dalších příkazů, např. cd.

    +

    Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

    +
    $ git config --global --list
    +user.name=Adéla Novotná
    +user.email=adela.novotna@example.cz
    +

    A to je vše! Git máš nainstalovaný. Gratuluji!

    \ No newline at end of file diff --git a/pyladies/install/index.html b/pyladies/install/index.html new file mode 100644 index 00000000..01ca2f59 --- /dev/null +++ b/pyladies/install/index.html @@ -0,0 +1,12 @@ +

    Instalace Pythonu

    +

    V této sekci nainstalujeme Python.

    +

    To se na každém druhu operačního systému dělá trošku jinak. +Vyber si stránku podle svého systému:

    + +

    Pokud máš jiný systém než Linux, Windows nebo macOS, +nebo pokud ke svému počítači neznáš administrátorské heslo, +napiš nám prosím e-mail.

    \ No newline at end of file diff --git a/pyladies/install/linux.html b/pyladies/install/linux.html new file mode 100644 index 00000000..50ff62ff --- /dev/null +++ b/pyladies/install/linux.html @@ -0,0 +1,63 @@ +

    Instalace Pythonu na Linux

    +

    Nainstalovat Pyhon na Linux je většinou jednoduché. +Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, +tak jsou tyhle instrukce trochu delší. +Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

    +

    Instalace Pythonu 3

    +

    Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť +v příkazové řádce příkaz:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Přejdi na další sekci, kontrolu tkinter.

    +

    Objeví-li se „Python“ a verze 3.5 nebo nižší, +aktualizuj systém (nebo se poraď s někým, kdo to umí) a zkus to znovu.

    +

    Objeví-li se bash: python3: command not found nebo podobná chyba, +doinstaluj Python. +Konkrétní příkaz záleží na distribuci:

    +
      +
    • Fedora:
      $ sudo dnf install python3
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    +

    Kontrola Tkinter

    +

    Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti +Pythonu. +Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) +často musíme nainstalovat zvlášť. +Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

    +
    $ python3 -m tkinter
    +

    Objeví-li se okýnko, je všechno v pořádku. +Zavři ho a přejdi na doinstalování virtualenv.

    +

    Jestli ne, modul tkinter ještě nainstaluj:

    +
      +
    • Fedora:
      $ sudo dnf install python3-tkinter
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      +
    • +
    +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    +

    +

    Doinstalování Virtualenv

    +

    Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. +Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu +vyřadily). +Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

    +

    Spusť v příkazové řádce příkaz:

    +
    $ python3 -m ensurepip --version
    +

    Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. +Zbytek této sekce můžeš přeskočit!

    +

    Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat +alternativu, Virtualenv:

    + + +
      +
    • Ubuntu:
      $ sudo apt-get install python-virtualenv
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později +při vytváření virtuálního prostředí.

    \ No newline at end of file diff --git a/pyladies/install/macos.html b/pyladies/install/macos.html new file mode 100644 index 00000000..75171382 --- /dev/null +++ b/pyladies/install/macos.html @@ -0,0 +1,15 @@ +

    Instalace Pythonu pro macOS

    +

    Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje +instalaci aplikací a knihoven, které budeme potřebovat pro programování. +Jak na to?

    +

    Spusť v příkazové řádce příkaz:

    +
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +

    Pak zadej následující příkaz a Python bude nainstalovaný:

    +
    $ brew install python3
    +

    Zkontroluj si, že máš verzi 3.6 nebo vyšší:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Jinak je něco špatně; +zkus instalaci znovu. +Když to nevyjde, poraď se s někým zkušenějším.

    \ No newline at end of file diff --git a/pyladies/install/windows.html b/pyladies/install/windows.html new file mode 100644 index 00000000..de9dbcff --- /dev/null +++ b/pyladies/install/windows.html @@ -0,0 +1,26 @@ +

    Instalace Pythonu pro Windows

    +

    Běž na stahovací stránku Pythonu +a stáhni si instalátor nejnovější stabilní verze Pythonu. +Ověř si že je to verze 3.6.0 nebo novější – +verze 3.6.0 má jistá vylepšení, která budeme v tomto kurzu používat.

    +

    Jak poznat, který instalátor je ten pravý? +Pokud má tvůj počítač 64bitovou verzi Windows, +stáhni si Windows x86-64 executable installer. +Pokud máš starší počítač s 32bitovými Windows, +stáhni si Windows x86 executable installer. +(Rozdíl je v x86-64 versus x86.)

    +

    Kde zjistíš, zda máš 32bitové nebo 64bitové Windows? Otevři nabídku +Start, vyhledat „Systém“ a otevřít Systémové informace. +Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

    +

    Screenshot zjišťování verze systému

    +

    Stažený instalátor spusť. +Na začátku instalace zaškrtni Install launcher for all users +a také Add Python to PATH. +Tyto volby ti zjednoduší vytvoření virtuálního prostředí.

    +

    (Jestli nemáš administrátorské oprávnění, volbu +Install launcher for all users nezaškrtávej.)

    +

    Screenshot instalace Pythonu

    +

    Pak zmáčkni Install now a dále se drž instrukcí.

    +

    Máš-li otevřenou příkazovou řádku, po instalaci Pythonu ji zavři a otevři +novou. +Instalace mění systémové nastavení, které se musí načíst znovu.

    \ No newline at end of file diff --git a/pyladies/install/windows_32v64-bit.png b/pyladies/install/windows_32v64-bit.png new file mode 100644 index 0000000000000000000000000000000000000000..70550e8422832fcc3cb696ab40b29d5a5b141d5a GIT binary patch literal 36230 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

    x-X)=B8Ao1rrt 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 literal 0 HcmV?d00001 diff --git a/pyladies/json/index.html b/pyladies/json/index.html new file mode 100644 index 00000000..33749afa --- /dev/null +++ b/pyladies/json/index.html @@ -0,0 +1,102 @@ +

    JSON

    +

    Existují i jiné programovací jazyky než Python.

    +

    Ostatní jazyky neumí pracovat s pythonními hodnotami. +Budeš-li se chtít s takovými programy „domluvit” – +předat jim nějaké informace ke zpracování +nebo od nich dostat výsledky – +musíš informace předávat v nějaké zjednodušené podobě.

    +

    Typy

    +

    Většina programovacích jazyků má nějaká čísla, nějaký druh seznamů, +nějakou odrůdu řetězců a nějakou variaci na slovníky +(nebo několik způsobů jak slovníky vytvořit). +Dále má spousta jazyků způsob, jak zapsat +True, False a None.

    +

    Tyhle základní typy většinou stačí na předání +jakékoli informace v rozumně čitelné podobě, +i když ne ve všech jazycích mají přesné ekvivalenty +(třeba Python má dva základní druhy čísel – int a float). +Často se proto v komunikaci omezíme na ně.

    +

    Kódování dat

    +

    Další problém je přenos dat: +abys mohl/a informace zapsat na disk nebo přenést +přes Internet, musíš je převést na sekvenci bytů (čísel od 0 do 255). +Zjednodušeně řečeno, musíš je převést na řetězec.

    +

    Existuje spousta způsobů, jak zakódovat data do textu. +Každý způsob se snaží najít vhodnou rovnováhu mezi +čitelností pro lidi/počítače, délkou zápisu, +bezpečností, možnostmi a rozšiřitelností. +My už známe syntaxi Pythonu:

    +
    {
    +    'jméno': 'Anna',
    +    'město': 'Brno',
    +    'jazyky': ['čeština', 'angličtina', 'Python'],
    +    'věk': 26,
    +}
    +

    Jiný způsob zápisu dat je YAML:

    +
    jméno: Anna
    +město: Brno
    +jazyky:
    +  - čeština
    +  - angličtina
    +  - Python
    +věk: 26
    +

    Nebo třeba Bencode:

    +
    d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

    Existují i netextové formáty, jako +Pickle 3:

    +
    }q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X       ÄeÅ¡tinaqX
    +                                                          angliÄtinaXPythonq       eXvÄq
    +K▒u.

    A nakonec uvedu JSON +(z angl. Javascript Object Notation „zápis Javascriptových objektů”), +který se pro svou jednoduchost rozšířil na Internetu nejvíc:

    +
    {
    +  "jméno": "Anna",
    +  "město": "Brno",
    +  "jazyky": ["čeština", "angličtina", "Python"],
    +  "věk": 26
    +}
    +

    Pozor na to, že ačkoli JSON vypadá podobně jako zápis +v Pythonu, je to jiný formát s vlastními pravidly. +Nezaměňuj je!

    +

    Aspoň ze začátku nedoporučuji JSON psát ručně; +nech na počítači, aby dal na správné místo správné +čárky a uvozovky.

    +

    JSON v Pythonu

    +

    Kódování objektů v JSONu je jednoduché: existuje modul json, +jehož metoda loads načte data z řetězce:

    +
    import json
    +
    +json_retezec = """
    +    {
    +      "jméno": "Anna",
    +      "město": "Brno",
    +      "jazyky": ["čeština", "angličtina", "Python"],
    +      "věk": 26
    +    }
    +"""
    +
    +data = json.loads(json_retezec)
    +print(data)
    +print(data['město'])
    +

    A pak tu je metoda dumps, která naopak daná data zakóduje +a vrátí řetězec:

    +
    >>> print(json.dumps(data))
    +{"v\u011bk": 26, "jm\u00e9no": "Anna", "jazyky": ["\u010de\u0161tina", "angli\u010dtina", "Python"], "m\u011bsto": "Brno"}
    +

    To, co vrátí jednoduché zavolání dumps(data) je vhodné pro počítačové +zpracování; +má-li výsledná data číst člověk, nastav +ensure_ascii=False (aby se písmenka s diakritikou nekódovala pomocí \) +a indent=2 (odsazení dvěma mezerami).

    +
    >>> print(json.dumps(data, ensure_ascii=False, indent=2))
    +{
    +  "věk": 26,
    +  "jméno": "Anna",
    +  "jazyky": [
    +    "čeština",
    +    "angličtina",
    +    "Python"
    +  ],
    +  "město": "Brno"
    +}
    +

    Kompletní popis modulu json – +včetně funkcí na zápis/čtení přímo do/ze souborů – +je v příslušné dokumentaci.

    \ No newline at end of file diff --git a/pyladies/list/index.html b/pyladies/list/index.html new file mode 100644 index 00000000..f571bf52 --- /dev/null +++ b/pyladies/list/index.html @@ -0,0 +1,414 @@ +

    Tahle kapitola je plná nových věcí. +Doufám, že vydržíš až do konce. A kdyby něco +zatím nedávalo úplně smysl, nevěš hlavu: +věci, které si teď vysvětlíme, se opravdu naučíš +až v dalších lekcích, kde je budeme využívat +prakticky.

    +

    Encyklopedické informace z této stránky shrnuje +Tahák na seznamy, +který si doporučuji vytisknout.

    +

    Každý příklad v tomto textu si vyzkoušej; +to, co Python vypíše, je důležitá součást lekce, +i když v materiálech není přímo napsaná.

    +

    Seznamy

    +

    Dnes si ukážeme, jak pracovat se seznamy (angl. lists). +Doufám, že víš, kde máš na klávesnici hranaté +závorky, protože právě těmi se seznamy vytváří:

    +
    cisla = [1, 1, 2, 3, 5, 8, 13]
    +print(cisla)
    +

    Nemůžeš najít hranaté závorky? +Na české klávesnici zkus pravý Alt + F a G.

    +

    Seznam je hodnota, která může obsahovat spoustu dalších hodnot. +Tak jako řetězec obsahuje sekvenci znaků, +seznam obsahuje sekvenci... čehokoliv. Třeba čísel. +A tak jako můžeme pomocí cyklu for +procházet řetězec po znacích, +seznam můžeme procházet po jednotlivých prvcích:

    +
    for cislo in cisla:
    +    print(cislo)
    +

    Seznamy se v programech vyskytují velice často: +soubor se dá načíst jako seznam řetězců +s jednotlivými řádky, +seznam řetězců jako '7♥' +a 'K♣' může posloužit jako balíček karet, +matematika je plná číselných řad, +každá online služba má seznam uživatelů.

    +

    Hodnoty v seznamu můžou být jakéhokoli typu, +dokonce můžeme různé typy míchat v jednom seznamu +(i když s takovými namixovanými seznamy se +příliš často nesetkáme – více se používají v +n-ticích, o kterých si povíme později):

    +
    seznam = [1, 'abc', True, None, range(10), len]
    +print(seznam)
    +

    Vybírání ze seznamů

    +

    Nejzákladnější operaci se seznamy, +cyklus for, už jsme si ukázali. +Druhá nejdůležitější operace je vybírání +jednotlivých prvků. +To funguje jako u řetězců: do hranatých závorek +se dá číslo prvku. Čísluje se, jako u řetězců, +od nuly; záporná čísla označují prvky od konce.

    +
    print(cisla[2])
    +

    Hranatými závorkami můžeme získávat podseznamy. +Diagram z materiálů k řetězcům +ukazuje, jak u takového „sekání” číslovat: +funguje to stejně, jen místo menšího řetězce +dostaneme menší seznam.

    +
    print(cisla[2:-3])
    +

    Měnění seznamů

    +

    Důležitá vlastnost seznamů, kterou nemají ani čísla, ani řetězce +(a True/False/None už vůbec ne), je, +že seznamy se dají měnit.

    +

    Čísla měnit nejdou – máš-li a = 3 a +napíšeš a = a + 1, číslo 3 se nezmění. +Vypočítá se nové číslo 4 a proměnná a +se nastaví na toto nové číslo.

    +

    Oproti tomu seznamy se dají měnit bez nastavování proměnné. +Základní způsob, jak změnit seznam, je přidání +prvku na konec pomocí metody append. +Ta nic nevrací (resp. vrací None), +ale „na místě” (angl. in place) změní +seznam, na kterém pracuje. Vyzkoušej si to:

    +
    prvocisla = [2, 3, 5, 7, 11, 13, 17]
    +print(prvocisla)
    +prvocisla.append(19)
    +print(prvocisla)
    +

    Takové měnění hodnoty může být občas překvapující, +protože stejnou hodnotu může mít více proměnných. +Protože se mění hodnota samotná, může to vypadat, +že se proměnná „mění aniž na ni sáhneme”:

    +
    a = [1, 2, 3]   # vytvoření seznamu
    +b = a           # tady se nový seznam nevytváří
    +
    +# seznam vytvořený v prvním řádku má teď dvě jména: "a" a "b",
    +# ale stále pracujeme jenom s jedním seznamem
    +
    +print(b)
    +a.append(4)
    +print(b)
    +

    Další způsoby, jak měnit seznamy

    +

    Kromě metody append, která přidává +jediný prvek, existuje metoda extend, +která umí přidávat prvků víc. +Prvky k přidání jí předáme ve formě seznamu:

    +
    dalsi_prvocisla = [23, 29, 31]
    +prvocisla.extend(dalsi_prvocisla)
    +print(prvocisla)
    +

    Metoda extend umí pracovat i s jinými +typy než se seznamy – ráda zpracuje cokoli, přes +co umí cyklit for: např. +jednotlivé znaky řetězců, řádky souborů, nebo čísla z range().

    +
    seznam = []
    +seznam.extend('abcdef')
    +seznam.extend(range(10))
    +print(seznam)
    +

    Měnění prvků

    +

    Ale dost přidávání. +Seznamům se dají i měnit jednotlivé prvky +a to jednoduše tak, že do prvku přiřadíme, +jako by to byla proměnná:

    +
    cisla = [1, 0, 3, 4]
    +cisla[1] = 2
    +print(cisla)
    +

    Přiřazovat se dá i do podseznamu – v tomto případě +se podseznam nahradí jednotlivými prvky z toho, +co přiřazujeme. +Jako u extend můžeš do podseznamu opět přiřadit cokoli, co umí +zpracovat for – seznam, řetězec, range() apod.

    +
    cisla = [1, 2, 3, 4]
    +cisla[1:-1] = [6, 5]
    +print(cisla)
    +

    Mazání prvků

    +

    Přiřazením do podseznamu se dá i změnit délka +seznamu, nebo některé prvky úplně odstranit:

    +
    cisla = [1, 2, 3, 4]
    +cisla[1:-1] = [0, 0, 0, 0, 0, 0]
    +print(cisla)
    +cisla[1:-1] = []
    +print(cisla)
    +

    Tenhle zápis pro mazání prvků je ale docela +nepřehledný, a proto na to máme zvláštní příkaz +jménem del. +Jak už jeho název (z angl. delete, smazat) +napovídá, smaže, co mu přijde pod ruku – jednotlivé +prvky seznamů, podseznamy, … a dokonce i proměnné!

    +
    cisla = [1, 2, 3, 4, 5, 6]
    +del cisla[-1]
    +print(cisla)
    +del cisla[3:5]
    +print(cisla)
    +del cisla
    +print(cisla)
    +

    Další mazací metody jsou:

    +
      +
    • pop, která odstraní a vrátí poslední prvek v seznamu – například pokud +mám seznam karet v balíčku, jde takhle jednoduše „líznout” kartu,
    • +
    • remove, která najde v seznamu daný prvek a odstraní ho,
    • +
    • clear, která vyprázdní celý seznam.
    • +
    +
    cisla = [1, 2, 3, 'abc', 4, 5, 6, 12]
    +posledni = cisla.pop()
    +print(posledni)
    +print(cisla)
    +
    +cisla.remove('abc')
    +print(cisla)
    +
    +cisla.clear()
    +print(cisla)
    +

    Řazení

    +

    A taky tu máme metodu sort, která prvky seznamu seřadí.

    +
    seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
    +seznam.sort()
    +print(seznam)
    +

    Aby se daly seřadit, musí být prvky seznamu vzájemně +porovnatelné – konktrétně na ně musí fungovat +operátor <. +Seznam s mixem čísel a řetězců tedy seřadit nepůjde. +Operátor < definuje i +jak přesně se řadí (např. čísla podle velikosti; +řetězce podle speciální „abecedy” která řadí +velká písmena za malá, česká až za anglická, atd.).

    +

    Metoda sort zná pojmenovaný argument +reverse. Pokud ho nastavíš na True, řadí se „naopak”.

    +
    seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
    +seznam.sort(reverse=True)
    +print(seznam)
    +

    Známé operace se seznamy

    +

    Spousta toho, co můžeme dělat s řetězci, má stejný +účinek i u seznamů. +Třeba sečítání a násobení číslem:

    +
    melodie = ['C', 'E', 'G'] * 2 + ['E', 'E', 'D', 'E', 'F', 'D'] * 2 + ['E', 'D', 'C']
    +print(melodie)
    +

    Stejně jako u řetězců, sečítat jde jen seznam +se seznamem – ne třeba seznam s řetězcem.

    +

    Další staří známí jsou funkce len, +metody count a index, a operátor in.

    +
    print(len(melodie))         # Délka seznamu
    +print(melodie.count('D'))   # Počet 'D' v seznamu
    +print(melodie.index('D'))   # Číslo prvního 'D'
    +print('D' in melodie)       # Je 'D' v seznamu?
    +

    Poslední tři se ale přece jen chovají kapku jinak: +u řetězců pracují s podřetězci, +u seznamů jen s jednotlivými prvky. +Takže ačkoliv naše melodie obsahuje prvky +'D' a 'E' vedle sebe, 'DE' v seznamu není:

    +
    print('DE' in melodie)
    +print(melodie.count('DE'))
    +print(melodie.index('DE'))
    +

    Seznam jako podmínka

    +

    Seznam se dá použít v příkazu if (nebo while) jako podmínka, +která platí, když v tom seznamu něco je. +Jinými slovy, seznam je tu „zkratka“ pro len(seznam) > 0.

    +
    if seznam:
    +    print('V seznamu něco je!')
    +else:
    +    print('Seznam je prázdný!')
    +

    Podobně se dají v podmínce použít i řetězce. +A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.

    +

    Tvoření seznamů

    +

    Tak jako funkce int převádí na +celá čísla a str na řetězce, +funkce list (angl. seznam) převádí na seznam. +Jako argument jí předáme jakoukoli hodnotu, +kterou umí zpracovat příkaz for. +Z řetězců udělá seznam znaků, z otevřeného souboru +udělá seznam řádků, z range udělá +seznam čísel.

    +
    abeceda = list('abcdefghijklmnopqrstuvwxyz')
    +cisla = list(range(100))
    +print(abeceda)
    +print(cisla)
    +

    I ze seznamu udělá funkce list seznam. +To může znít zbytečně, ale není – vytvoří se +totiž nový seznam. +Bude mít sice stejné prvky ve stejném pořadí, +ale nebude to ten samý seznam: +měnit se bude nezávisle na tom starém.

    +
    a = [1, 2, 3]
    +b = list(a)
    +
    +print(b)
    +a.append(4)
    +print(b)
    +

    Další způsob, jak tvořit seznamy +(zvláště složitější), je nejdřív udělat prázdný +seznam a pak ho postupně naplnit pomocí funkce append. +Třeba pokud z nějakého důvodu chceš seznam +mocnin dvou, projdi čísla, kterými chceme mocnit, +cyklem for a pro každé z nich +do seznamu přidej příslušnou mocninu:

    +
    mocniny_dvou = []
    +for cislo in range(10):
    +    mocniny_dvou.append(2 ** cislo)
    +print(mocniny_dvou)
    +

    Chceš-li seznam, který reprezentuje balíček karet, +zavolej append pro všechny kombinace barev a hodnot.

    +
    balicek = []
    +for barva in '♠', '♥', '♦', '♣':  # (Na Windows použij textová jména)
    +    for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
    +        balicek.append(str(hodnota) + barva)
    +print(balicek)
    +

    Seznamy a řetězce

    +

    Seznamy a řetězce jsou druhy „sekvencí”, +takže snad nepřekvapí, že se dá různě převádět +z jednoho typu na druhý. +Funkce list vytvoří z řetězce +seznam znaků. +Když chceme dostat seznam slov, použijeme +na řetězci metodu split (angl. rozdělit):

    +
    slova = 'Tato věta je složitá, rozdělme ji na slova!'.split()
    +print(slova)
    +

    Metoda split umí brát i argument. +Pokud ho předáme, místo mezer (a nových řádků) +se řetězec „rozseká” daným oddělovačem. +Takže když máme nějaká data oddělená čárkami, +není nic jednoduššího než použít split s čárkou:

    +
    zaznamy = '3A,8B,2E,9D'.split(',')
    +print(zaznamy)
    +

    Chceme-li spojit seznam řetězců zase dohromady +do jediného řetězce, použijeme metodu +join (angl. spojit). +Pozor, tahle metoda se volá na oddělovači, +tedy řetězci, kterým se jednotlivé kousky „slepí” +dohromady; a jako argument bere seznam jednotlivých +řetězců.

    +
    veta = ' '.join(slova)
    +print(veta)
    +

    Úkol

    +

    Představ si, že ti uživatelé zadávají jména a příjmení a ty si je ukládáš do +seznamu pro další použití např. v evidenci studentů. Ne všichni jsou ale pořádní, +a tak se v seznamu sem tam objeví i jméno s nesprávně zadanými velkými písmeny. +Například:

    +
    zaznamy = ['pepa novák', 'Jiří Sládek', 'Ivo navrátil', 'jan Poledník']
    +

    Úkolem je:

    +
      +
    • Napsat funkci, která vybere jen ty správně zadané záznamy, které mají správně +jméno i příjmení s velkým počátečním písmenem.
    • +
    • Napsat funkci, která vybere naopak jen ty nesprávně zadané záznamy.
    • +
    • (Nepovinný) – Napsat funkci, která vrátí seznam s opravenými záznamy.
    • +
    +

    Výsledné funkce by měly fungovat takto:

    +
    zaznamy = ['pepa novák', 'Jiří Sládek', 'Ivo navrátil', 'jan Poledník']
    +
    +chybne_zaznamy = vyber_chybne(zaznamy)
    +print(chybne_zaznamy) # → ['pepa novák', 'Ivo navrátil', 'jan Poledník']
    +
    +spravne_zaznamy = vyber_spravne(zaznamy)
    +print(spravne_zaznamy) # → ['Jiří Sládek']
    +
    +opravene_zaznamy = oprav_zaznamy(zaznamy)
    +print(opravene_zaznamy) # → ['Pepa Novák', 'Jiří Sládek', 'Ivo Navrátil', 'Jan Poledník']
    +

    Snadný způsob jak zjistit, zda je řetězec složen jen z malých písmen, +je metoda islower(), která vrací True, pokud řetězec obsahuje jen malá +písmena, jinak vrací False. Například 'abc'.islower() == True ale +'aBc'.islower() == False.

    +

    Snadný způsob jak převést první písmenko na velké je metoda capitalize(): +např. 'abc'.capitalize() == 'Abc'

    +
    +

    Řešení

    + + +

    Seznamy a náhoda

    +

    Modul random obsahuje dvě funkce, které se hodí k seznamům. +Jako random.randrange, obě mají něco +společného s náhodou.

    +

    Funkce shuffle seznam „zamíchá” – všechny prvky náhodně popřehází. +Jako metoda sort i funkce shuffle nic nevrací.

    +
    import random
    +
    +balicek = []
    +for barva in '♠', '♥', '♦', '♣':
    +    for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
    +        balicek.append(str(hodnota) + barva)
    +print(balicek)
    +
    +random.shuffle(balicek)
    +print(balicek)
    +

    A funkce choice ze seznamu vybere jeden náhodný prvek. +S použitím seznamu tak můžeme výrazně zjednodušit +úvodní část naší staré hry kámen/nůžky/papír:

    +
    import random
    +mozne_tahy = ['kámen', 'nůžky', 'papír']
    +tah_pocitace = random.choice(mozne_tahy)
    +

    Vnořené seznamy

    +

    A perlička na konec! +Na začátku tohoto textu je napsáno, že seznam +může obsahovat jakýkoli typ hodnot. +Může třeba obsahovat i další seznamy:

    +
    seznam_seznamu = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    +

    Takový seznam se chová docela normálně – jdou +z něj třeba brát jednotlivé prvky +(které jsou ovšem taky seznamy):

    +
    prvni_seznam = seznam_seznamu[0]
    +print(prvni_seznam)
    +

    A protože jsou prvky samy seznamy, +můžeme mluvit o věcech jako „první prvek druhého seznamu”:

    +
    druhy_seznam = seznam_seznamu[1]
    +prvni_prvek_druheho_seznamu = druhy_seznam[0]
    +print(prvni_prvek_druheho_seznamu)
    +

    A protože výraz seznam_seznamu[1] +označuje seznam, můžeme brát prvky přímo z něj:

    +
    prvni_prvek_druheho_seznamu = (seznam_seznamu[1])[0]
    +

    Neboli:

    +
    prvni_prvek_druheho_seznamu = seznam_seznamu[1][0]
    +

    A má tahle věc nějaké použití, ptáš se? +Stejně jako vnořené cykly for +nám umožnily vypsat tabulku, vnořené seznamy +nám umožní si tabulku „zapamatovat”.

    +
    def vytvor_tabulku(velikost=11):
    +    seznam_radku = []
    +    for a in range(velikost):
    +        radek = []
    +        for b in range(velikost):
    +            radek.append(a * b)
    +        seznam_radku.append(radek)
    +    return seznam_radku
    +
    +nasobilka = vytvor_tabulku()
    +
    +print(nasobilka[2][3])  # dva krát tři
    +print(nasobilka[5][2])  # pět krát dva
    +print(nasobilka[8][7])  # osm krát sedm
    +
    +# Vypsání celé tabulky
    +for radek in nasobilka:
    +    for cislo in radek:
    +        print(cislo, end=' ')
    +    print()
    +

    Co s takovou „zapamatovanou” tabulkou? +Můžeš si do ní uložit třeba pozice +figurek na šachovnici nebo křížků a koleček +ve 2D piškvorkách.

    \ No newline at end of file diff --git a/pyladies/local-variables/index.html b/pyladies/local-variables/index.html new file mode 100644 index 00000000..2e9539cd --- /dev/null +++ b/pyladies/local-variables/index.html @@ -0,0 +1,150 @@ +

    Lokální proměnné

    +

    Už umíš definovat vlastní funkce. +Zbývá ale ještě dovysvětlit, jak v nich fungují proměnné.

    +

    Funkce může používat proměnné „zvnějšku“. +Následující program přiřadí do proměnné pi a všechny další funkce +mají k pi přístup:

    +
    pi = 3.1415926
    +
    +def obsah_kruhu(polomer):
    +    return pi * polomer ** 2
    +
    +print(obsah_kruhu(100))
    +

    Jinak je tomu ale v případě, kdy proměnnou nastavíš uvnitř funkce.

    +

    Všechny parametry a všechny proměnné, do kterých funkce přiřazuje, +jsou úplně nové proměnné, které nemají nic +společného s tím, co je „venku“ kolem funkce.

    +

    Těmto proměnným se říká lokální proměnné (angl. local variables), +protože existují jen místně, v rámci volání jedné jediné funkce.

    +

    Proměnné, které nejsou lokální, jsou globální – ty existují v celém programu.

    +

    Pro příklad:

    +
    def nastav_x(hodnota):
    +    x = hodnota  # Přiřazení do lokální proměnné!
    +
    +nastav_x(40)
    +print('x =', x)
    +

    Program skončí s chybou! +Funkce nastav_x si hraje na vlastním písečku; proměnná x je jen +pro ni. +Když funkce nastav_x skončí, proměnná x přestane existovat.

    +

    Skrývání detailů

    +

    Podobně skončí s chybou i složitější program:

    +
    def zamen(slovo, pozice, novy_znak):
    +    """V daném slově zamění znak na dané pozici za daný nový znak"""
    +    zacatek = slovo[:pozice]
    +    konec = slovo[pozice + 1:]
    +    nove_slovo = zacatek + novy_znak + konec
    +    return nove_slovo
    +
    +print(zamen('kočka', 1, 'a'))
    +print(zamen('kačka', 2, 'p'))
    +
    +print(zacatek)  # NameError
    +

    Funkce zamen jsi napsal/a proto, abys nemusel/a pořád opakovat detaily +záměny písmenka. +Jakmile je jednu nadefinovaná, stačí ji zavolat. Důležité jsou jen jméno +funkce, parametry a návratová hodnota; na detaily kódu uvnitř můžeš zapomenout. +A to i díky lokálním proměnným, které detaily ve vnitřku funkce trochu líp +izolují od zbytku programu.

    +

    Ještě lépe je to vidět u funkcí, které jsi nenapsal/a sám/sama. +Jak divné by bylo, kdyby po každém zavolání print byla najednou nastavená +proměnná i, kterou print náhodou používá při procházení svých parametrů!

    +

    Přiřazení

    +

    To, co dělá lokální proměnnou, je přiřazení. +Porovnej nastav_x s příkladem na obsah_kruhu výše: rozdíl mezi pi a x +je v tom, že do x se v rámci funkce přiřazuje.

    +

    Co je to přiřazení? Všechno, co nastavuje nějakou proměnnou. Například:

    +
      +
    • Klasika je přiřazovat pomocí =, např. a = 3.
    • +
    • Parametry funkce: funkce def nastav_x(hodnota) přiřadí do hodnota,
    • +
    • Cyklus for x in ...: přiřazuje do proměnné x.
    • +
    • Pro úplnost, příkazy def x(...):, import x a from ... import x taky +přiřazují do x – ale ve funkcích se moc nepoužívají.
    • +
    +

    A další

    +

    K těmto materiálům se možná budeš vracet, tak pro úplnost přidám další +způsoby, které postupně poznáš. Není jich mnoho:

    +
      +
    • Příkazy with ... as x, del x, except ... as x přiřazují do x.
    • +
    • Přiřazují i speciální přiřazovací operátory jako +=, *=, :=.
    • +
    +

    Zakrývání jména

    +

    Jak to funguje, když ve funkci přiřadíš do proměnné, která existuje i globálně? +Pak tu máme problém.

    +

    Vytvoří se úplně nová lokální proměnná, která má stejné jméno jako +ta globální. +Jméno označuje lokální proměnnou, a ta globální pak „není vidět“.

    +

    Tento příklad tedy nebude fungovat tak, jak se zdá:

    +
    x = 0
    +
    +def nastav_x(hodnota):
    +    x = hodnota  # Přiřazení do lokální proměnné!
    +    print('Ve funkci nastav_x: x =', x)
    +
    +nastav_x(40)
    +print('Venku: x =', x)
    +

    V tomto programu existují dvě proměnné jménem x. +Jedna je globální. Jedna je lokální pro funkci nastav_x. +Jmenují se stejně, ale jsou to dvě různé proměnné.

    +

    Lokální nebo globální?

    +

    Pojďme si to ukázat. +Než spustíš tenhle program, zkus předpovědět co bude dělat. +Pak ho pusť, a pokud dělal něco jiného, zkus vysvětlit proč. +Pozor na chytáky!

    +
    from math import pi
    +obsah = 0
    +a = 30
    +
    +def obsah_elipsy(a, b):
    +    obsah = pi * a * b  # Přiřazení do `obsah`
    +    a = a + 3  # Přiřazení do `a`
    +    return obsah
    +
    +print(obsah_elipsy(a, 20))
    +print(obsah)
    +print(a)
    +

    Zkus odpovědět na tyto otázky:

    +
      +
    • Je proměnná pi lokální, nebo globální?
    • +
    • Je proměnná obsah lokální, nebo globální?
    • +
    • Je proměnná a lokální, nebo globální?
    • +
    • Je proměnná b lokální, nebo globální?
    • +
    • Je proměnná obsah_elipsy lokální, nebo globální?
    • +
    +
    +

    Řešení

    + + +

    Rada na závěr

    +

    Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších +věcí v Pythonu. +Jsou ale přínosná – umožňují některé užitečné techniky, např. rekurzi.

    +

    Jestli ti to celé připadá složité, dá se tomu zatím vyhnout dodržováním jednoho +pravidla: +nepřiřazuj ve funkcích do proměnných, které existují i vně funkce. +(Parametr funkce se počítá jako přiřazení.)

    \ No newline at end of file diff --git a/pyladies/modules/index.html b/pyladies/modules/index.html new file mode 100644 index 00000000..a443ae62 --- /dev/null +++ b/pyladies/modules/index.html @@ -0,0 +1,84 @@ +

    Moduly

    +

    Modul je v Pythonu něco, z čeho můžeme importovat. +Třeba z modulu math můžeš importovat funkci sqrt:

    +
    from math import sqrt
    +
    +print(sqrt(2))
    +

    Kromě importování jednotlivých proměnných z modulu +můžeš importovat i celý modul najednou. +K tomu, co modul nabízí, se pak dostaneš pomocí +tečky – podobně jako se pomocí 'Ahoj'.upper dostaneš k metodě, kterou nabízí +řetězec.

    +

    Například:

    +
    import turtle
    +
    +turtle.left(90)
    +turtle.color('red')
    +turtle.forward(100)
    +turtle.exitonclick()
    +
    import math
    +
    +print(math.cos(math.pi))
    +

    Hvězdičky nechceme

    +

    Možná jsi v dokumentaci nebo na jiném kurzu viděl/a příkaz import +s hvězdičkou (*). +Pokud ano, v rámci tohoto kurzu na hvězdičku prosím +zapomeň a importuj místo toho radši celý modul. +Až začneš psát větší programy, zjednoduší ti +to práci.

    +

    Vlastní moduly

    +

    A teď to hlavní! +Můžeš vytvořit vlastní importovatelný modul +a to jen tak, že uděláš pythonní soubor. +Funkce, které v něm nadefinuješ, a globální proměnné, +které v něm nastavíš, pak budou k dispozici tam, kde modul naimportuješ.

    +

    Zkus si to! +Vytvoř soubor louka.py a do něj napiš:

    +
    barva_travy = 'zelená'
    +pocet_kotatek = 28
    +
    +def popis_stav():
    +    return 'Tráva je {barva}. Prohání se po ní {pocet} koťátek'.format(
    +        barva=barva_travy, pocet=pocet_kotatek)
    +

    A pak v dalším souboru, třeba vypis.py, napiš:

    +
    import louka
    +
    +print(louka.popis_stav())
    +

    a pak spusť:

    +
    $ python vypis.py
    +

    Příkaz import hledá soubory (mimo jiné) v adresáři, +ve kterém je „hlavní modul” programu – tedy soubor, +který spouštíš (u nás vypis.py). +Oba soubory by proto měly být ve stejném adresáři.

    +

    Vedlejší efekty

    +

    Co přesně dělá příkaz import louka?

    +

    Python najde příslušný soubor (louka.py) a provede v něm všechny příkazy, +odshora dolů, jako v normálním Pythonním programu. +Všechny globální proměnné (včetně nadefinovaných funkcí) pak dá k dispozici +kódu, který „louku“ importoval.

    +

    Když pak stejný modul importuješ podruhé, už se neprovádí všechno +znovu – stejná sada proměnných se použije znovu.

    +

    Zkus si to – na konci louka.py dopiš:

    +
    print('Louka je zelená!')
    +

    Spusť python (máš-li ho už spuštěný, ukonči a spusť znovu) +a zadej v něm:

    +
    >>> print('První import:')
    +>>> import louka
    +>>> print('Druhý import:')
    +>>> import louka
    +

    Výpis se objeví jen poprvé.

    +

    Když takhle modul při importu „dělá“ něco víc, než jen nastavuje proměnné +a funkce, říká se, že má vedlejší efekt (angl. side effect). +Vedlejší efekt může být vypsání něčeho na obrazovku nebo do souboru, +vykreslení okýnka na obrazovku, otázka na uživatele pomocí input, atp.

    +

    V modulech připravených na importování se vedlejším efektům vyhýbáme: +úloha takového modulu je dát k dispozici funkce, které něco dělají, +ne to udělat přímo. +Všimni si například, že import turtle neukáže okýnko – to se objeví až po +zavolání turtle.forward().

    +

    Příkaz print proto radši z modulu zase smaž.

    +

    Adresář pro každý projekt

    +

    Od teď budeš občas psát větší projekty, +které budou obsahovat více souvisejících souborů. +Pro každý takový projekt si udělej zvláštní adresář. +Lépe se pak vyznáš v tom, ke kterému projektu který soubor patří.

    \ No newline at end of file diff --git a/pyladies/nested-traceback/index.html b/pyladies/nested-traceback/index.html new file mode 100644 index 00000000..423f6483 --- /dev/null +++ b/pyladies/nested-traceback/index.html @@ -0,0 +1,58 @@ +

    Výpisy chyb ze zanořených funkcí

    +

    Teď si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která +nastane v zanořené funkci.

    +

    Pročti si následující ukázkový příklad.

    +

    Tohle je absurdní ilustrační příklad, ne ukázka jak dobře programovat!

    +
    + +
    def podel(delenec, delitel):
    +    """Podělí čísla mezi sebou a vrátí výsledek."""
    +    return delenec / delitel        # řádek 3
    +
    +
    +def podel_nulou(cislo):
    +    """Vydělí dané číslo nulou a vrátí výsledek."""
    +    return podel(cislo, 0)          # řádek 8
    +
    +
    +def ukaz_priklad():
    +    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
    +    vysledek = podel_nulou(3)       # řádek 13
    +    print(vysledek)
    +
    +ukaz_priklad()                      # řádek 16
    +

    Co se stane, když tohle pustíš?

    +
    Traceback (most recent call last):
    +  File "ukazka.py", line 16, in <module>
    +    ukaz_priklad()
    +  File "ukazka.py", line 13, in ukaz_priklad
    +    vysledek = podel_nulou(3)
    +  File "ukazka.py", line 8, in podel_nulou
    +    return podel(cislo, 0)
    +  File "ukazka.py", line 3, in podel
    +    return delenec / delitel
    +ZeroDivisionError: division by zero
    +

    Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu. +Skutečná chyba (tedy místo, které musíš opravit) je asi někde poblíž těchto +míst:

    +
      +
    • Na řádku 3, ve funkci podel, vzniklo dělení nulou. +Měla by funkce podel zjistit, jestli dostane nulu, a nějak na to +zareagovat?
    • +
    • Na řádku 8, ve funkci podel_nulou, kde voláš podel s dělitelem 0. +Má to tak opravdu být?
    • +
    • Na řádku 13, ve funkci ukaz_priklad, kde voláš funkci podel_nulou. +Kdybys to nedělal/a, chyba by taky nevznikla!
    • +
    • Na řádku 16, ne ve funkci, když voláš funkci ukaz_priklad. +Možná by to chtělo použít jiný příklad?
    • +
    +

    Python (a asi ani ty) nemůže vědět, co tím programem programátor myslel, +a kdy by tedy bylo nejlepší chybu opravit. +Ukáže tedy v programu všechna místa, která k chybě vedla. +Je na tobě abys z nich vybral/a to nejvhodnější a zaměřil/a se na něj.

    +

    Tahle ukázka je samozřejmě jen teoretická, ale v reálných programech vypadá +hlášení chyb stejně. +Až takovou složitou hlášku uvidíš, nepanikař! +Python se snaží co nejvíc napovědět a usnadnit ti chybu najít a opravit. +Sice stroze a anglicky, ale snaží. +Vyjdi mu vstříc a nauč se tyhle hlášky číst.

    \ No newline at end of file diff --git a/pyladies/pong/index.html b/pyladies/pong/index.html new file mode 100644 index 00000000..3bd6132f --- /dev/null +++ b/pyladies/pong/index.html @@ -0,0 +1,499 @@ +

    Pong

    +
    + +

    Dnes si prohloubíme znalosti programování grafických aplikací, +které jsme získali na lekci o Pygletu, +na reálném problému.

    +

    Naprogramujeme si s pomocí knihovny Pyglet +jednu z prvních videoher, Pong. +Pong vydala společnost Atari +jako svůj první titul v roce 1972 a odstartovala tak boom herního průmyslu.

    +

    Na Youtube se můžeš podívat na +video, které ukazuje jak se Pong hraje.

    +

    Konstanty a stav hry

    +

    Hra Pong má jednoduchá pravidla. Musíme je ale umět +vyjádřit v Pythonu a to není úplně jednoduché. +Pojdmě si srovnat v hlavě, co ve hře máme.

    +
      +
    • Hrací pole ve tvaru obdélníku s půlící čárou.
    • +
    • Míček létající určitou rychlostí po hracím poli.
    • +
    • Dvě pálky pohybující se vertikálně na krajích pole.
    • +
    • Dvě počítadla skóre.
    • +
    +

    Hra bude pro 2 hráče, nebudeme programovat chování počítače. +Každý z hráčů může ovládat svou pálku stiskem kláves. +Jeden hráč šipkou nahoru a šipkou dolů a druhý hráč klávesami W +a S.

    +

    Stav hry dokážeme v Pythonu vyjádřit pomocí proměnných +a konstant. To dává smysl, protože některé +věci se ve hře mění (poloha pálek, poloha míčku, rychlost míčku, skóre) +a některé ne (velikost hrací plochy, velikost pálek a +míčku, poloha a velikost počítadel skóre). +Ze složitějších datových struktur použijeme seznam +(list, ten už známe) a množinu (set), která je velmi podobná +matematické množině. Zjednodušeně je to seznam, který se +nestará o pořadí a stejné prvky v něm mohou být právě jednou.

    +

    Možná přemýšlíš nad tím, v jakých jednotkách můžeme měřit +vzdálenost a rychlost v takovéto hře na počítači. +Na obrazovce je nešikovné měřit vzdálenost např. +v centimetrech. Nicméně každá obrazovka se skládá +z jednotlivých svítících bodů tzn. pixelů. +V grafické aplikaci jako je Pong můžeme tedy měřit +vzdálenost dvou míst na obrazovce jako počet pixelů +mezi těmito dvěma místy. Souřadný systém Pygletu +je založený právě na pixelech, přičemž pixel se +souřadnicemi [0, 0] je na obrazovce vlevo dole. +Rychlost můžeme jednoduše měřit v pixelech za sekundu.

    +

    Založte si nový skript. Společně nadefinujeme konstanty, které +budeme v tvorbě hry potřebovat. Normálně bychom +definovali konstanty postupně, až bychom je potřebovali, +ale pro jednoduchost to udělejme společně a najednou. +Ukážeme si na tom, jak začít převádět problém z reálného +světa do Pythonu.

    +
    # Velikost okna (v pixelech)
    +SIRKA = 900
    +VYSKA = 600
    +
    +VELIKOST_MICE = 20
    +TLOUSTKA_PALKY = 10
    +DELKA_PALKY = 100
    +RYCHLOST = 200  # v pixelech za sekundu
    +RYCHLOST_PALKY = RYCHLOST * 1.5  # taky v pixelech za sekundu
    +
    +DELKA_PULICI_CARKY = 20
    +VELIKOST_FONTU = 42
    +ODSAZENI_TEXTU = 30
    +

    Nyní nadefinujeme proměnné potřebné v naší hře: poloha míčku, poloha pálek, +rychlost míče, stisknuté klávesy a skóre obou hráčů. +Budou to globální proměnné, za což by nás profesionální +programátor pokáral, ale nám to v tuhle chvíli ulehčí +práci.

    +
    pozice_palek = [VYSKA // 2, VYSKA // 2]  # vertikalni pozice dvou palek
    +pozice_mice = [0, 0]  # x, y souradnice micku -- nastavene v reset()
    +rychlost_mice = [0, 0]  # x, y slozky rychlosti micku -- nastavene v reset()
    +stisknute_klavesy = set()  # sada stisknutych klaves
    +skore = [0, 0]  # skore dvou hracu
    +

    Vykreslení hrací plochy

    +

    Nejprve si v Pygletu otevřeme okno velikosti hrací plochy.

    +
    import pyglet
    +...
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +pyglet.app.run()  # vse je nastaveno, at zacne hra
    +

    Než začneme dělat interaktivní část hry reagující na vstupy +od uživatele, je třeba umět vůbec vykreslit prvky na hrací +ploše. Podobně jako jsme v lekci o Pygletu měli funkci +vykresli(), která vykreslila hada, budeme mít +v Pongu funkci stejného jména, která vykreslí prvky na hrací +ploše.

    +

    Většina z tvarů jsou obdélníky, takže nejprve +navrhněme funkci nakresli_obdelnik, která +dostane čtveřici souřadnic a pomocí modulu gl +z Pygletu vykreslí čtverec pomocí 2 trojúhelníků.

    +
    from pyglet import gl
    +...
    +def nakresli_obdelnik(x1, y1, x2, y2):
    +    """Nakresli obdelnik na dane souradnice
    +
    +    Nazorny diagram::
    +
    +         y2 - +-----+
    +              |/////|
    +         y1 - +-----+
    +              :     :
    +             x1    x2
    +    """
    +    # Tady pouzijeme volani OpenGL, ktere je pro nas zatim asi nejjednodussi
    +    # na pouziti
    +    gl.glBegin(gl.GL_TRIANGLE_FAN)   # zacni kreslit spojene trojuhelniky
    +    gl.glVertex2f(int(x1), int(y1))  # vrchol A
    +    gl.glVertex2f(int(x1), int(y2))  # vrchol B
    +    gl.glVertex2f(int(x2), int(y2))  # vrchol C, nakresli trojuhelnik ABC
    +    gl.glVertex2f(int(x2), int(y1))  # vrchol D, nakresli trojuhelnik BCD
    +    # dalsi souradnice E by nakreslila trojuhelnik CDE, atd.
    +    gl.glEnd()  # ukonci kresleni trojuhelniku
    +

    Teď začneme pracovat na funkci vykresli() +Nejprve ji vytvoř prázdnou a zaregistruj ji +v Pygletu na událost on_draw, jak jsme to +dělali v lekci o Pygletu. To znamená, že se tato funkce +zavolá pokaždé, když Pyglet překreslí okno. Pokud se +mezitím např. změnila poloha míčku, funkce ho vykreslí +o kousek jinde. Tím vlastně vytváříme dynamiku hry. +Analogicky jsme to dělali s hadem, tady máme jen víc +grafických prvků.

    +
    ...
    +def vykresli():
    +    """Vykresli stav hry"""
    +    gl.glClear(gl.GL_COLOR_BUFFER_BIT)  # smaz obsah okna (vybarvi na cerno)
    +    gl.glColor3f(1, 1, 1)  # nastav barvu kresleni na bilou
    +
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +window.push_handlers(
    +    on_draw=vykresli,  # na vykresleni okna pouzij funkci `vykresli`
    +)
    +pyglet.app.run()  # vse je nastaveno, at zacne hra
    +

    Zatím máme v těle funkce jen volání, která vyčistí +plochu, do které kreslíme a nastaví barvu kreslení na bílou.

    +

    Teď zkus sám/sama do funkce vykresli() přidat +vykreslení míčku na správné pozici, +kterou získáš z příslušné globální proměnné. Míček je +v našem případě jen malý čtvereček jehož velikost +máme uloženou v konstantě.

    +
    +

    Řešení

    + + +

    Po míčku zkus vykreslit obě pálky. +V proměnné pozice_palek máme vertikální +polohu první a druhé pálky, ale horizontální poloha je +konstantní. Jaké souřadnice musíš předat funkci +nakresli_obdelnik, aby se pálka vykreslila +správně a na správném místě? Princip určení souřadnic +je podobný jako u vykreslení míčku.

    +
    +

    Řešení

    + + +

    Přehlednosti hry pomůže půlící čára +uprostřed. Jak ji ale namalovat? +Nebudeme vymýšlet zbytečné složitosti. +Namalujme ji jako sérii obdélníčků táhnoucích se odshora +dolů. Chce to jen vygenerovat seznam souřadnic, +které budou mít dostatečné rozestupy, a na každé +z nich vykreslit obdélníček. Kterou funkci z Pythonu +bys použila na získání tohoto seznamu souřadnic?

    +
    +

    Řešení

    + + +

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. +K tomu se musíme naučit vykreslovat v Pygletu text. +V Pygletu je modul text, který obsahuje +objekt Label (Nápis). Ten se hodí k vykreslení hodnoty +skóre. Objekt musíme nejdřív vytvořit. To uděláme +kulatými závorkami za jménem objektu, jako bychom +volali funkci, a uložíme si ho do proměnné: +napis = Label(). Normálně bychom objekt +vytvořili jen jednou a pak měnili jeho hodnotu, ale +pro jednoduchost vytvoříme vždy nový a celé to zabalíme +do funkce. V jejím závěru musíme na nadpisu zavolat +metodu draw(), jinak se nápis nevykreslí.

    +
    def nakresli_text(text, x, y, pozice_x):
    +    """Nakresli dany text na danou pozici
    +
    +    Argument ``pozice_x`` muze byt "left" nebo "right", udava na kterou stranu
    +    bude text zarovnany
    +    """
    +    napis = pyglet.text.Label(
    +        text,
    +        font_size=VELIKOST_FONTU,
    +        x=x, y=y, anchor_x=pozice_x
    +    )
    +    napis.draw()
    +

    Teď zkus tuto funkci použít ve funkci vykresli() +k nakreslení skóre. K určení pozice textu použij +konstanty SIRKA, VYSKA, ODSAZENI_TEXTU a VELIKOST_FONTU.

    +
    +

    Řešení

    + + +

    Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

    +

    Dynamika hry

    +

    Teď to začne být zajímavé. Nejdřív rozhýbeme pálky, +protože je to jednodušší, pak míček.

    +

    Vstup od uživatele

    +

    Potřebujeme pohybovat s pálkami podle vstupu od uživatele. +Dokud bude uživatel držet např. klávesu S, levá pálka +pojede dolů. +V Pygletu jsme se naučili pracovat s událostí +on_text, ta nám ale v tomto případě nebude stačit. +K realizaci pohybu pálek budeme potřebovat 2 typy událostí, +které ještě neznáme - on_key_press a on_key_release.

    +

    Pyglet zavolá funkci registrovanou na událost on_key_press +stejně jako při vykreslování okna zavolal funkci vykresli(), +zaregistrovanou na události on_draw. +Přidáme právě stisknutou klávesu do množiny stisknutých +kláves v globální proměnné stisknute_klavesy +jako n-tici (směr, číslo pálky), např. tedy +('nahoru', 0), což bude vyjadřovat, že levá pálka má jet nahoru. +Při události on_key_release odebereme právě +stisknutou klávesu z množiny stisknute_klavesy. +Tím zajistíme, že v daný okamžik bude množina stisknute_klavesy +obsahovat všechny klávesy, které uživatel drží, a budeme +podle toho moct pohnout s pálkami.

    +

    Troufneš si napsat funkce stisk_klavesy(symbol, modifikatory) +a pusteni_klavesy(symbol, modifikatory)? +Poznamenejme, že do množiny stisknute_klavesy +můžeš přidat prvek metodou add(prvek) a pak +odebrat metodou discard(prvek). Obě berou jako +argument prvek, který se má přidat nebo odstranit, +v našem případě konkrétní n-tici.

    +

    Budeš potřebovat zjistit, kterou klávesu uživatel stisknul. +Kód stisknuté klávesy předá Pyglet našim funkcím +v argumentu symbol. Je to ale nic neříkající +číslo. Z pyglet.window můžeš naimportovat +modul key, který obsahuje konstanty jednotlivých +kláves. Můžeš pak porovnat, zda symbol odpovídá např. +klávese jako symbol == key.UP.

    +
    +

    Řešení

    + + +

    Proč vlastně používáme k odebrání n-tice metodu +discard() místo metody remove(), +kterou známe ze seznamů a množiny ji také mají? +Nezpůsobí totiž chybu, když se pokusíme odebrat +prvek, který v množině není. To by se mohlo stát, +kdyby uživatel stiskl jednu z funkčních kláves +a teprve pak se přepnul do našeho okna a pak jí +pustil.

    +

    Zaregistruj si obě funkce na příslušné události:

    +
    ...
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +window.push_handlers(
    +    on_draw=vykresli,  # na vykresleni okna pouzij funkci `vykresli`
    +    on_key_press=stisk_klavesy,
    +    on_key_release=pusteni_klavesy,
    +)
    +pyglet.app.run()
    +

    Pohyb pálek

    +

    Když už jsme dokázali zpracovat vstup od uživatele, +můžeme podle něj pohnout s pálkami. +Pohyb předmětů budeme provádět ve funkci obnov_stav(dt), +která bude registrována na tik hodin v Pygletu. +Argument dt je čas od posledního zavolání funkce Pygletem.

    +
    def obnov_stav(dt):
    +    for cislo_palky in (0, 1):
    +        # pohyb podle klaves (viz funkce `stisk_klavesy`)
    +        if ('nahoru', cislo_palky) in stisknute_klavesy:
    +            pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt
    +        if ('dolu', cislo_palky) in stisknute_klavesy:
    +            pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt
    +
    +        # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum
    +        if pozice_palek[cislo_palky] < DELKA_PALKY / 2:
    +            pozice_palek[cislo_palky] = DELKA_PALKY / 2
    +        # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum
    +        if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2:
    +            pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2
    +

    Podívejme se na tento kus kódu. Procházíme +v cyklu obě pálky a ptáme se, zda je v množině +stisknutých kláves n-tice reprezentující +pohyb dané pálky nahoru nebo dolů. +Když ano, pohneme pálkou v daném směru +(přičteme nebo odečteme od vertikální polohy pálky +změnu polohy, což je čas od posledního zavolání, +který známe, vynásobený rychlostí pálky nastavené +v konstantě).

    +

    V druhé části musíme zajistit, aby pálka nevyjela +z hracího pole. Z minulých hrátek s hadem víme, +že to se může stát velmi snadno. Pálku malujeme kolem +jejího středu, což znamená, že když se pálka přiblíží na +na y-ovou pozici DELKA_PALKY / 2, začíná +překračovat dolní hranici hracího pole. V tom případě +její pozici zafixujeme na nejnižší možné souřadnici. +Analogicky to provedeme, když se blíží hornímu okraji.

    +

    Zaregistruj vytvořenou funkci na tik hodin jako

    +
    ...
    +pyglet.clock.schedule(obnov_stav)
    +pyglet.app.run()
    +

    a podívej se na výsledek.

    +

    Rozehrání

    +

    Než začneme míček odrážet od stěn, musíme ho nejprve +uvést do pohybu. Vystřelíme ho ze středu hrací plochy +do náhodného směru. Toto se také stane v momentě, kdy +jeden z hráčů skóruje a hra se rozehrává znovu. +Proto tohle rozehrání zabalíme do funkce reset(). +Zavolejte ji, než se spustí hra.

    +

    Jak bude tato funkce vypadat? +Nejprve přesuň míček do středu hrací plochy nastavením +proměnné pozice_mice. Potom je třeba +simulovat hod mincí pomocí volání funkce +random.randint(0, 1). Tím rozhodneme, zda +se míček rozletí doprava nebo doleva. +Míček rozpohybujeme horizontálním směrem přičtením +požadované rychlosti k rychlost_mice[0]. +Ve vertikálním směru rychlost_mice[1] +se bude míček pohybovat zcela náhodně přičtením +náhodné rychlosti.

    +
    +

    Řešení

    + + +

    Nic se zatím ale nestane, protože funkce +obnov_stav(dt) zatím nepracuje +se změnou rychlosti. Musíme v ní tedy nastavit proměnnou +poloha_micku podle současné rychlosti míčku +a času uplynulého od posledního zavolání funkce podle +fyzikálního vztahu s = v t, tedy že dráha +je rovna rychlosti vynásobené časem. Přidej tedy do +funkce obnov_stav(dt) následující kód:

    +
    def obnov_stav(dt):
    +    ...
    +    # POHYB MICKU
    +    pozice_mice[0] += rychlost_mice[0] * dt
    +    pozice_mice[1] += rychlost_mice[1] * dt
    +

    Zkus, co se teď stane při spuštění hry. +Míček by měl vyletět pokaždé do jiného směru.

    +

    Odrážení míčku

    +

    Míček nám teď nekontrolovaně vyletí z hřiště. +Musíme tedy zařídit, aby se odrážel od stěn. +Jelikož úhel dopadu se rovná úhlu odrazu, +stačí otočit znaménko y-ové složky rychlosti. +Do funkce obnov_stav(dt) musíme +přidat kontroly na polohu míčku a případně +změnit jeho směr, pokud je moc nízko nebo moc vysoko.

    +
    def obnov_stav(dt):
    +    ...
    +    # Odraz micku od sten
    +    if pozice_mice[1] < VELIKOST_MICE // 2:
    +        rychlost_mice[1] = abs(rychlost_mice[1])
    +    if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2:
    +        rychlost_mice[1] = -abs(rychlost_mice[1])
    +

    Teď nám zbývá odraz od pálky, případně resetování +hry, pokud míček padne mimo pálku jednoho hráče a +ten druhý tak získá bod. Opět tedy budeme přidávat +kód do funkce obnov_stav(dt).

    +

    Prvním krokem je poznamenání mezí na y-ové ose, +kde se musí míček nacházet, aby byl úspěšně odražen – +to je mezi horním a dolním koncem pálky:

    +
    def obnov_stav(dt):
    +    ...
    +    palka_min = pozice_mice[1] - VELIKOST_MICE / 2 - DELKA_PALKY / 2
    +    palka_max = pozice_mice[1] + VELIKOST_MICE / 2 + DELKA_PALKY / 2
    +

    Nyní když míček narazí do pravé nebo levé stěny +se umíme zeptat, zda je pálka na správné pozici +a my máme odrazit míček nebo zda hráč +prohrál kolo a my máme přičíst jeho soupeři bod a +restartovat hru.

    +
    def obnov_stav(dt):
    +    ...
    +    # odrazeni vlevo
    +    if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2:
    +        if palka_min < pozice_palek[0] < palka_max:
    +            # palka je na spravnem miste, odrazime micek
    +            rychlost_mice[0] = abs(rychlost_mice[0])
    +        else:
    +            # palka je jinde nez ma byt, hrac prohral
    +            skore[1] += 1
    +            reset()
    +
    +    # odrazeni vpravo
    +    if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2):
    +        if palka_min < pozice_palek[1] < palka_max:
    +            rychlost_mice[0] = -abs(rychlost_mice[0])
    +        else:
    +            skore[0] += 1
    +            reset()
    +

    Závěr

    +

    Hurá, prokousali jsme se k zdárnému konci Pongu! +Máš teď plně funkční interaktivní grafickou +hru zakládající se na reálné předloze. :)

    \ No newline at end of file diff --git a/pyladies/pong/pong.png b/pyladies/pong/pong.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa25809fb06d8c9b07eb033afcf53d87665bc6b GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!k8>~qNuAd}uLCL00*}aI1_r((Aj~*bn@^g7 zfjQpO#WAGf*4w)qy=DhWG$c+2SA7tZ%ejYG3WMp9Y;P1u!jNzh+ zXVBWPvy3hrN-SXP;q~mBgSE&&$}Cm;e^B&Z0qPf_rOaF>9fl9S*r3m^%S1e%g)R;dyKv=7%9RgryKIpd*;+l9<8017H7NAQR1)aD^*0m5*-J+n1F_|1C_f1Q;i^#5(`lL-l7N{HRolFf-T>E0V$;?|My+30J_Iz zpLewr!jT{!039Ql0(6-JIM6@=r{MJH&Qe>joCru77=J*|D;?tbkcGKg4B4r`njxgN@xNAV#s8F literal 0 HcmV?d00001 diff --git a/pyladies/print/index.html b/pyladies/print/index.html new file mode 100644 index 00000000..8283d5c8 --- /dev/null +++ b/pyladies/print/index.html @@ -0,0 +1,112 @@ +

    Print a chybové hlášky

    +

    Vytvoř v editoru nový soubor, ulož ho do adresáře pro dnešní lekci +pod jménem printing.py a napiš do něj teď už známý příkaz:

    +
    print("Ahoj světe!")
    +

    Program spusť:

    +
      +
    • pokud ti už na začátku příkazové řádky nesvítí (venv), +aktivuj si virtuální prostředí,
    • +
    • pomocí cd donaviguj do adresáře s programem,
    • +
    • zadej python printing.py.
    • +
    +

    Funguje? Doufám, že ano; za chvíli ho vylepšíme.

    +

    Další příkazy

    +

    Zkus do programu postupně, po jednom, přidávat další řádky. +Po přidání každého dalšího print program znovu spusť a vyzkoušej, jestli +funguje.

    +

    Abys nemusel/a v příkazové řádce stále dokola psát python printing.py, +zkus zmáčknout na klávesnici šipku nahoru, . +Vrátíš se tak k předchozímu příkazu, který stačí „odklepnout“ pomocí +Enter.

    +

    Úplně každý příkaz ti asi nebude fungovat hned napoprvé – kdyby program +dělal něco divného, přeskoč na další sekci, jak číst chyby.

    +
    print(1)
    +print(1, 2, 3)
    +print(1 + 1)
    +print(3 * 8)
    +print(10 - 2.2)
    +print(3 + (4 + 6) * 8 / 2 - 1)
    +print('*' * 80)
    +print("Ahoj" + " " + "PyLadies!")
    +print("Součet čísel 3 a 8 je", 3 + 8)
    +print('Máma má mísu')
    +print(V míse je maso.)
    +

    Řetězce

    +

    Proč jsou některé hodnoty v uvozovkách a některé ne? +Pokud chceš v Pythonu pracovat s textem, musíš ho obalit do uvozovek, aby Python +věděl, že se k němu má chovat jinak než například k číslům. +Více se dozvíš později, zatím si zapamatuj, že se takovýto text označuje označuje v programovací +hantýrce jako řetězec.

    +

    Jak číst chyby

    +

    Často zjistíš, že program, který napíšeš, nebude fungovat hned napoprvé. +Počítač je hloupý stroj; pokud instrukce nenapíšeš přesně podle pravidel jazyka +Python, neumí si domyslet, co po něm chceš. +Ale nevěš hlavu, stává se to všem programátorům. +Důležité je vědět, jak chybu najít. +A k tomu ti pomůžou chybové výpisy.

    +

    Pokud program výše opíšeš přesně, vypíše po spuštění následující hlášku:

    +
    +  File "~/pyladies/02/printing.py", line 11
    +    print(V míse je maso.)
    +               ^
    +SyntaxError: invalid syntax
    +

    Při chybě Python napřed zmíní jméno souboru a +číslo řádku, na kterém si chyby všimnul. +Potom vypíše celý řádek s chybou +a nakonec oznámí druh chyby +(v tomto případě je to „syntaktická chyba“) +a případně nějaké bližší upřesnění.

    +

    Pro zvídavé

    +

    Jak se od téhle chyby liší ta, která nastane, když zkusíš sečíst číslo a řetězec? +Nebo když zkusíš dělit nulou?

    +

    Chybové hlášky můžou být ze začátku těžko pochopitelné, +zvyknout se na ně dá asi jenom praxí. +Pro tebe bude ze začátku důležité hlavně ono číslo řádku. +Když víš, že chyba je na řádku 11, +můžeš se podívat na tento řádek a zkusit chybu najít.

    +

    Když chyba není na daném řádku, může být ještě +o pár řádků výš nebo níž: +Python občas nesdílí lidské představy o tom, kde přesně chyba je. +Ukáže jen, kde si jí sám všimnul.

    +

    V našem případě je chyba v tom, že kolem řetězce V míse je maso nejsou uvozovky. +Přidej je a program znovu spusť. +Jestli funguje, gratuluji! +Jinak chybu opět oprav a opakuj, dokud to nebude fungovat :)

    +

    Jak funguje program

    +

    Teď, když program běží, se můžeme podívat, co se při +jeho spuštění vlastně děje. +Je to zatím docela jednoduché: příkazy se provádějí jeden po druhém, +odshora dolů. +Program je jako recept na vaření: seznam instrukcí, které říkají co je potřeba +udělat.

    +

    Zanedlouho budou tvoje programy připomínat spíš recepty na +čarodějné lektvary (počkej do úplňku a pokud je Mars +v konjunkci s Jupiterem, třikrát zamíchej), +ale základní myšlenka je stále stejná: +počítač „čte“ odshora dolů a provádí příkazy jeden po druhém.

    +

    Print a výrazy

    +

    A z jakých že instrukcí se náš „recept“ skládá?

    +

    Ten print, který tu celou dobu používáš, je funkce. +O funkcích se ještě budeme bavit později, +teď stačí vědět, že když napíšeš print +a za to do závorky několik výrazů (angl. expressions) +oddělených čárkou, hodnoty těchto výrazů se vypíšou.

    +

    A co že je ten výraz? +V našem programu máš několik příkladů: +výraz je číslo, řetězec nebo nějaká (třeba matematická) operace +složená z více výrazů. +Třeba výraz 3 + 8 sčítá výrazy 3 a 8.

    +

    V sekci o proměnných se +na výrazy a jejich hodnoty podíváme podrobněji.

    +

    Typografická vsuvka

    +

    Všimni si stylu zápisu: jako v češtině se po otevírací závorce a před +uzavírací závorkou nepíše mezera; na rozdíl od češtiny ale mezera není +mezi print a závorkou.

    +
    print("Ahoj!")
    +

    S čárkou je to jako v češtině: mezeru píšeme po čárce, ale ne před ní:

    +
    print(1, 2, 3)
    +

    Kolem operátorů jako + a / se obyčejně píše jedna mezera zleva a +jedna zprava. Někdy je ale přehlednější obě vynechat:

    +
    print(2 + 8)
    +print("Jedna a půl je", 1 + 1/2)
    +
    \ No newline at end of file diff --git a/pyladies/pyglet/had.gif b/pyladies/pyglet/had.gif new file mode 100644 index 0000000000000000000000000000000000000000..b06e29c4cacb74ab075a38b72be763b4af2563d4 GIT binary patch literal 10907 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 literal 0 HcmV?d00001 diff --git a/pyladies/pyglet/had.png b/pyladies/pyglet/had.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3900f71e94be4506eaf5fdc59da5198108e4de GIT binary patch literal 12723 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 z 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 XI*WvsLZ?o500000NkvXXu0mjflJM`; literal 0 HcmV?d00001 diff --git a/pyladies/pyglet/index.html b/pyladies/pyglet/index.html new file mode 100644 index 00000000..4a7ed63f --- /dev/null +++ b/pyladies/pyglet/index.html @@ -0,0 +1,413 @@ +

    Grafika

    +

    Dnes si ukážeme, jak s Pythonem napsat grafickou aplikaci.

    +

    Použijeme knihovnu, která není zabudovaná přímo +v Pythonu (podobně jako pytest, který používáme na testování). +Musíme si ji nejdřív nainstalovat a na to použijeme +v zapnutém virtualenvu modul pip – +konkrétně příkaz python -m pip install pyglet. +U mě vypadá instalace nějak takto:

    +
    (venv)$ python -m pip install pyglet
    +Collecting pyglet
    +  Downloading pyglet-1.2.4-py3-none-any.whl (964kB)
    +Installing collected packages: pyglet
    +Successfully installed pyglet-1.2.4
    +

    Máš-li nainstalováno, zkus napsat a spustit +následující program. Mělo by se objevit černé +okýnko:

    +
    import pyglet
    +window = pyglet.window.Window()
    +pyglet.app.run()
    +print('Hotovo!')
    +

    Jestli okýnko není černé ale je v něm nějaký +„nepořádek“, představuj si zatím, že černé je. +Stává se to hlavně na počítačích s Mac OS a některými +druhy Linuxu. +Než do okýnka začneme kreslit obrázky, nepořádek +uklidíme.

    +

    Hotovo? Pojďme si vysvětlit, co se tu vlastně děje.

    +

    Interaktivní programy

    +

    Podívejme se ještě jednou, jak zhruba vypadá hlavní +program pro Piškvorky, který jsme napsali +na projektech. +V komentářích je napsané, co která část kódu dělá:

    +
    def piskvorky1d():
    +    pole = '-' * 20                 # Příprava hry
    +    while True:                     # Pořád dokola:
    +        pole = tah_hrace(pole)      # 1. Zeptej se na tah
    +        if vyhodnot(pole) != '-':   # 2. Zpracuj tah
    +            break
    +        print(pole)                 # 3. Vypiš stav hry
    +
    +                                    # A znova:
    +        pole = tah_pocitace(pole)   # 1. Zeptej se na tah
    +        if vyhodnot(pole) != '-':   # 2. Zpracuj tah
    +            break
    +        print(pole)                 # 3. Vypiš stav hry
    +

    V tomhle programu máme dva druhy akcí, které se pravidelně střídají. +Jakmile taková akce nastane, ať vstup od člověka nebo +od počítače, tak se zpracuje a výsledný stav se oznámí.

    +

    Podobnou strukturu „reakcí“ jsme použily už dřív, +třeba u hry kámen-nůžky-papír:

    +
      +
    • Nějaká příprava
    • +
    • Dokud program nemá skončit:
        +
      • Načti vstup
      • +
      • Nějak ten vstup vyhodnoť
      • +
      • Vypiš výstup
      • +
      +
    • +
    +

    A podobně funguje většina programů, které nějakým +způsobem reagují na vstup od uživatele nebo i na jiné +události.

    +

    Webový server čeká na požadavek (angl. request) +o webovou stránku. Když nějaký přijme, zpracuje ho +(např. přečte příslušnou stránku z disku) +a jako výstup pošle odpověď.

    +

    Složitější programy reagují na spoustu druhů událostí, +ne jen na „požadavek“ nebo „tah hráče“/„tah počítače“. +Co se stane ve „vyhodnocení vstupu“ pak závisí +na druhu události.

    +

    Webový prohlížeč čeká na kliknutí myši nebo stisk klávesy +a zachová se podle něj – třeba pošle přes Internet +požadavek vzdálenému serveru. +A potom čeká na další akci. Může přijít odpověď od +serveru, a až ta přijde, vykreslí příslušnou stránku +na obrazovku. Nebo může uživatel zmáčknout „STOP“ +a požadavek se zruší.

    +

    Textový editor čeká na různé druhy vstupu z klávesnice +či myši a každý musí nějak zpracovat.

    +

    Prostě, podobná struktura programu – smyčka která +načte vstup, zpracuje ho a vyprodukuje výstup – je velice užitečná. +Říká se jí smyčka událostí (angl. event loop) +a programy na ní postavené jsou +řízené událostmi (angl. event-driven).

    +

    Programátoři jsou líní. +Když je něco užitečné pro více programů, nebývá +zvykem, že to každý programátor v každém programu opakuje. +Napíše se to jednou a dobře, zabalí se to jako tzv. +knihovna (angl. library) +a ostatní to pak můžou používat.

    +

    Pyglet 🐷

    +

    Jedna z takových knihoven je Pyglet. +Obsahuje kromě smyčky událostí taky funkce na +vykreslování 2D grafiky (pomocí jiné knihovny zvané +OpenGL) nebo třeba načítání událostí z klávesnice a myši.

    +

    Pojďme se vrátit k prográmku, který ukazuje okno:

    +
    import pyglet
    +window = pyglet.window.Window()
    +pyglet.app.run()
    +print('Hotovo!')
    +

    Celá smyčka událostí se skrývá ve funkci pyglet.app.run(). +Načtení vstupu (např. z klávesnice) dělá Pyglet sám, +ale jejich zpracování a vykreslení výsledků +už je pro každý program jiné, takže si je budeš muset +naprogramovat sám/sama.

    +

    Zatím pro nás Pyglet zpracovává jen dvě události: +zavření okna (tlačítkem „✕“, které k okýnkům přidává +operační systém) a stisk klávesy Esc, +který taky zavře okno. +Po zavření okna skončí smyčka událostí +(funkce pyglet.app.run()) +a program může pokračovat.

    +

    Text

    +

    Klávesa Esc není příliš zajímavá. +Zkusme reagovat i na jiné klávesy.

    +

    V Pygletu se na události reaguje tak, že napíšeš +funkci a pak ji zaregistruješ (angl. register) – řekneš +Pygletu, aby ji vždy v pravý čas zavolal. +Události, která nastane, když uživatel píše na klávesnici, +se v Pygletu říká on_text a zpracovává se takto:

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +window.push_handlers(on_text=zpracuj_text)
    +
    +pyglet.app.run()
    +

    Co to dělá? window.push_handlers(on_text=zpracuj_text) +řekne Pygletu, že když uživatel něco napíše do našeho okna, +má Pyglet zavolat funkci zpracuj_text. +Tahle funkce pak dostane jako argument text, který uživatel napsal.

    +

    Všimni si, že při registraci nepíšeme +zpracuj_text se závorkami, ačkoli jsme si +kdysi +říkali, že funkce se mají volat. +Vzpomínáš na tenhle příklad? Možná ti tehdy připadal zvláštní.

    +
    from math import sin
    +print(sin(1))
    +print(sin)
    +print(sin + 1)
    +

    Teď, když známe kromě čísel, řetězců a +True/False i soubory, seznamy, +n-tice a kdo ví jaké jiné typy, si můžeme říct, +že funkce je v Pythonu hodnota jako každá jiná. +Čísla se dají násobit, řetězce zapisovat do souboru, +ze souborů se dá číst – a funkce jsou zvláštní jen tím, +že se dají zavolat. +Než ale takovou funkci zavoláme, můžeme ji, tu samotnou +funkci, třeba přiřadit do proměnné:

    +
    vypis = print
    +vypis("Ahoj světe!")
    +

    nebo předat jako argument jiné funkci:

    +
    print(print)
    +

    No a funkce window.push_handlers je přímo +dělaná na to, že jí předáš funkci. +Proč? +Pyglet nepotřebuje jeden výsledek funkce +zpracuj_text – ten moc k ničemu není. +A navíc tu funkci teď ani nemůžeme zavolat; nemáme +vhodný argument text. +Proto Pygletu dáme samotnou funkci, kterou bude sám +volat, kdykoli uživatel stiskne klávesu.

    +

    Čas ⏲

    +

    Ještě jednu událost zpracujme, než se přesuneme ke grafice.

    +

    Bude to takzvaný tik hodin +(angl. clock tick). +To je událost, která nastává pravidelně po nějakém čase.

    +

    Funkce pro tiky se registruje trochu jinak než on_text:

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    print(t)
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +window.push_handlers(on_text=zpracuj_text)
    +
    +pyglet.app.run()
    +

    Co to dělá? pyglet.clock.schedule_interval(tik, 1/30) +řekne Pygletu, že má zavolat funkci tik každou +třicetinu (1/30) vteřiny.

    +

    A funkce tik dostane jeden argument – kolik času +uplynulo od posledního zavolání. +Většinou to není přesně 1/30 vteřiny, ale něco víc. +Počítač má i jiné věci na práci, takže se k naší aplikaci +nemusí dostat hned; a taky Pythonu trvá nějakou tu +tisícinu vteřiny než zařídí samotné zavolání naší funkce.

    +

    A proč vlastně třicetina vteřiny? +Je to kvůli tomu, že potom budeme stavět animace. +Když se nám před očima vystřídá 30 obrázků za vteřinu, +mozek si je spojí a vznikne iluze plynulého pohybu. +
    +Většina filmů používá jen 24 obrázků za vteřinu; +realistické 3D hry až 60.

    +

    Vykreslování 🖌

    +

    +

    Program, který vypisuje na terminál spoustu čísel, +není asi zas tak zajímavý. +Téma téhle stránky je ale grafika, tak se začněme od +terminálu odpoutávat. Pojďme kreslit.

    +

    Najdi si na Internetu nějaký obrázek. Ne moc velký, +tak 3cm, ať je kolem něj v našem černém okýnku dost +místa, a nejlépe ve formátu PNG. Začni třeba na +téhle stránce. +Ale nevybírej obrázek, který je celý černý, protože by v našem černém okně +nebyl vidět. +Ulož si ho do adresáře, odkud spouštíš svůj pythonní +program. Já mám třeba obrázek hada v souboru had.png.

    +

    Pak obrázek vykresli (použij jméno souboru se svým obrázkem):

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    print(t)
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +obrazek = pyglet.image.load('had.png')
    +had = pyglet.sprite.Sprite(obrazek)
    +
    +def vykresli():
    +    window.clear()
    +    had.draw()
    +
    +window.push_handlers(
    +    on_text=zpracuj_text,
    +    on_draw=vykresli,
    +)
    +
    +pyglet.app.run()
    +

    Povedlo se?

    +

    Vysvětleme si, co se tady děje:

    +
      +
    • obrazek = pyglet.image.load('had.png') načte ze souboru obrázek
    • +
    • had = pyglet.sprite.Sprite(obrazek) +vytvoří speciální objekt Sprite, +který určuje, že tento obrázek chceme „posadit“ +na určité místo v černém okýnku. +Když neuděláme nic dalšího, bude obrázek čekat v levém rohu.
    • +
    • Funkce vykresli() se stará o vykreslení okna – výstup našeho programu. +Volá se vždycky, když je potřeba okno překreslit – +například když okno minimalizuješ a pak vrátíš +nebo přesuneš částečně ven z obrazovky a pak dáš zase zpět. +A nebo když budeme něco animovat.
    • +
    +

    Některé operační systémy si pamatují i obsah oken, +které nejsou vidět, ale není radno na to spoléhat.

    +
      +
    • window.clear() vyčistí okno – natře ho černou barvou a smaže +všechno, co v něm bylo předtím.
    • +
    +

    Na spoustě počítačů tohle není potřeba. +Ale je lepší psát programy tak, aby +běžely správně kdekoli.

    +
      +
    • had.draw() nakreslí obrázek pomocí předpřipraveného spritu had.
    • +
    • window.push_handlers(on_draw=vykresli) zaregistruje funkci vykresli – +řekne Pygletu, aby ji volal vždy, když je třeba. +
      +Když potřebuješ zaregistrovat pro jedno okno +víc funkcí na obsluhu událostí, +dají se dát funkci push_handlers +takhle najednou.
    • +
    +

    Jakékoli kreslení se musí dělat v rámci kreslící funkce, +kterou Pyglet volá z on_draw. +Jinde funkce jako clear a draw nebudou fungovat správně.

    +

    Animace

    +

    Pojď si teď se Spritem trochu pohrát.

    +

    Do funkce zpracuj_text dej místo printu tento příkaz:

    +
    def zpracuj_text(text):
    +    had.x = 150
    +

    Náš Sprite má atribut (angl. attribute) +x, který určuje jeho x-ovou souřadnici – +jak moc je vpravo od okraje okna. +Tenhle atribut se dá nastavit, jak budeš chtít – nejčastěji +v reakci na nějakou událost, ale často se nastavuje +i na začátku programu.

    +

    Zajímavé je zkusit k x něco přičíst při každém tiknutí hodin. +Dokážeš předpovědět, co udělá tenhle kód?

    +
    def tik(t):
    +    had.x = had.x + t * 20
    +

    Nebojíš-li se matematiky, naimportuj math +a nech obrázek, ať se pohybuje podle nějaké funkce:

    +
    def tik(t):
    +    had.x = had.x + t * 20
    +    had.y = 20 + 20 * math.sin(had.x / 5)
    +

    Co se stane, když začneš měnit ta čísla?

    +

    Co se stane, když zkusíš podobně nastavovat atribut rotation?

    +

    Zavolej později

    +

    +

    Pyglet umí kromě opakovaného „tikání“ zavolat funkci +jednorázově, za určitou dobu.

    +

    Stáhni si (nebo vytvoř) druhý obrázek. Já mám druhého +hada, tentokrát s trochu natočenou hlavou a ocasem.

    +

    Až budeš mít obrázek v adresáři s programem, +přidej těsně před pyglet.app.run() tenhle kus kódu:

    +
    obrazek2 = pyglet.image.load('had2.png')
    +
    +def zmen(t):
    +    had.image = obrazek2
    +
    +pyglet.clock.schedule_once(zmen, 1)
    +

    Volání schedule_once(zmen, 1) říká Pygletu, +že za jednu vteřinu má zavolat funkci zmen. +A funkce změní obrázek – stejně jako se předtím měnily +souřadnice.

    +

    schedule_once se dá volat i v rámci obsluhy jiné události. Zkus funkci zmen +nahradit tímhle:

    +
    def zmen(t):
    +    had.image = obrazek2
    +    pyglet.clock.schedule_once(zmen_zpatky, 0.2)
    +
    +def zmen_zpatky(t):
    +    had.image = obrazek
    +    pyglet.clock.schedule_once(zmen, 0.2)
    +

    Klik 🐭

    +

    Poslední věc, na kterou se tady naučíme reagovat, je klikání. +Těsně před window.push_handlers napiš funkci:

    +
    def klik(x, y, tlacitko, mod):
    +    had.x = x
    +    had.y = y
    +

    … a pak v push_handlers ji zaregistruj +pomocí řádku on_mouse_press=klik,.

    +

    Co znamená který argument, to zkus zjistit sama.

    +

    Nápověda

    +
      +
    • Dokud příkazovou řádku neopustíš úplně, bude fungovat print! +Kdykoliv budeš chtít zjistit nějakou hodnotu, prostě si ji vypiš.
    • +
    • Kolik má myš tlačítek?
    • +
    • Jak se projeví Shift+klik?
    • +
    +

    Pokračování příště

    +

    Koukám že kódu už je dnes tak akorát na ukončení lekce:

    +
    import math
    +
    +import pyglet
    +
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    had.x = had.x + t * 20
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    had.x = 150
    +    had.rotation = had.rotation + 10
    +
    +obrazek = pyglet.image.load('had.png')
    +had = pyglet.sprite.Sprite(obrazek, x=10, y=10)
    +
    +def vykresli():
    +    window.clear()
    +    had.draw()
    +
    +def klik(x, y, tlacitko, mod):
    +    print(tlacitko, mod)
    +    had.x = x
    +    had.y = y
    +
    +window.push_handlers(
    +    on_text=zpracuj_text,
    +    on_draw=vykresli,
    +    on_mouse_press=klik,
    +)
    +
    +obrazek2 = pyglet.image.load('had2.png')
    +
    +def zmen(t):
    +    had.image = obrazek2
    +    pyglet.clock.schedule_once(zmen_zpatky, 0.2)
    +
    +def zmen_zpatky(t):
    +    had.image = obrazek
    +    pyglet.clock.schedule_once(zmen, 0.2)
    +
    +pyglet.clock.schedule_once(zmen, 0.2)
    +
    +pyglet.app.run()
    +

    Se vstupem z klávesnice a myši, časováním a vykreslováním +Spritu si vystačíš u leckteré hry nebo grafické aplikace.

    +

    Až budeš nějakou hru dělat, zkus udržovat +stav aplikace v seznamech a n-ticích (případně +slovnících a třídách, které se naučíme později). +Jedna funkce by měla umět takový stav vykreslit a +jiné s ním pak budou manipulovat. +Tyhle dvě sady funkcí můžeš mít i v jiných souborech, +aby se nezapletly dohromady.

    +

    Zajímá-li tě toto téma, zkus si zahrát přiloženou hru +Pong, +která ukazuje některé další +možnosti Pygletu: psaní textu, kreslení obdélníků +a obsluhu jednotlivých kláves (např. šipek). +Na první pohled může její kód vypadat složitě, +ale zkus si k němu sednout a s pomocí komentářů ho pochopit. +Kdyby komentáře nestačily, jsou k Pongu připravené +i podrobné materiály.

    +

    To, co jsme tu probrali a pár věcí navíc, +je shrnuto v taháku na Pyglet, +který si můžeš stáhnout a vytisknout.

    +

    A chceš-li se do Pygletu ponořit hlouběji, +existuje pro něj dokumentace. +Nebude-li ti v ní něco jasné, zeptej se!

    \ No newline at end of file diff --git a/pyladies/pyglet/pong.py b/pyladies/pyglet/pong.py new file mode 100644 index 00000000..e11e760f --- /dev/null +++ b/pyladies/pyglet/pong.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python3 +"""Hra typu Pong + +Graficka hra pro dva hrace. Kazdy hrac ovlada "palku" na sve strane hriste, +a snazi se odpalit micek na protivnikovu stranu. + +Ovladani: +Hrac 1: klavesy W a S +Hrac 2: sipky Nahoru a Dolu +Konec: Esc + + +Hra pouziva gravickou knihovnu Pyglet, coz je Pythonova nadstavba nad OpenGL. + +Souradny system okynka je nasledujici:: + + y ^ + | + VYSKA +---------------------------------------+ + | : | + | : | + | : | + | ; [] | + |] ; [| + |] ; [| + |] ; [| + |] ; [| + | ; | + | : | + | ; | + | ; | + 0 +---------------------------------------+------> x + : : : + 0 SIRKA/2 SIRKA + +Pozor pokud mate zkusenosti s nekterymi grafickymi programy, nebo 2D +knihovnami. OpenGL pouziva matematicky souradny system, nula je vlevo *dole*. + +""" + +# Prvni radek (#!/usr/bin/env python3) je takzvany "shebang": na systemech +# zalozenych na Unixu (Linux, OS X) umoznuje spustit tenhle soubor jednoduse +# pomoci prikazu: ./pong.py + +# A ted uz k samotne hre: napred naimportujeme potrebne veci z knihovny pyglet + +import random + +import pyglet +from pyglet import gl +from pyglet.window import key + + +# Nejake konstanty: + +# Velikost okna (v pixelech) +SIRKA = 900 +VYSKA = 600 + +VELIKOST_MICE = 20 +TLOUSTKA_PALKY = 10 +DELKA_PALKY = 100 +RYCHLOST = 200 # v pixelech za sekundu +RYCHLOST_PALKY = RYCHLOST * 1.5 # taky v pixelech za sekundu + +DELKA_PULICI_CARKY = 20 +VELIKOST_FONTU = 42 +ODSAZENI_TEXTU = 30 + + +# Stav hry si budeme pamatovat v globalnich promennych. +# Profesionalni programator se nad tim zhrozi, ale pro nas je to tak zatim +# jednodussi. +# Jen nezapomente ze prikaz jako: +# pozice_mice = [0, 0] +# ve funkci by vytvoril novou lokalni promennou, ktera by s globalni +# `pozice_mice` nemela nic spolecneho. Oproti tomu prikaz jako: +# pozice_mice[0] = 0 +# nastavi prvni prvek globalni `pozice_mice`. + +pozice_palek = [VYSKA // 2, VYSKA // 2] # vertikalni pozice dvou palek +pozice_mice = [0, 0] # x, y souradnice micku -- nastavene v reset() +rychlost_mice = [0, 0] # x, y slozky rychlosti micku -- nastavene v reset() +stisknute_klavesy = set() # sada stisknutych klaves +skore = [0, 0] # skore dvou hracu + +# Pozice palek a micku vzdy bude urcovat stred daneho obdelnicku. + + +def reset(): + """Nastav pocatecni stav + + Tahle funkce se bude volat na zacatku programu, a taky potom co nektery + z hracu prohraje. + Funkce da micek doprostred obrazovky a da mu nahodnou rychlost. + + N.B. Neresetujeme tady skore ani pozici palek; ty zustavaji do dalsiho kola + """ + pozice_mice[0] = SIRKA // 2 + pozice_mice[1] = VYSKA // 2 + + # x-ova rychlost - bud vpravo, nebo vlevo + if random.randint(0, 1): + rychlost_mice[0] = RYCHLOST + else: + rychlost_mice[0] = -RYCHLOST + # y-ova rychlost - uplne nahodna + rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST + + +def obnov_stav(dt): + """Spocitej novy stav hry + + Tahle funkce se vola mockrat za sekundu. V parametru ``dt`` dostane cas + v sekundach od posledniho zavolani. Pocitac je rychly, proto to + vetsinou bude velice male cislo - kolem sedesatiny sekundy (0.0167). + """ + # Jak zname z fyziky, micek s rychlosti `v` se za cas `t` pohne o `v*t`. + # Tenhle vyraz muzeme rozlozit pro slozky x, y. + pozice_mice[0] += rychlost_mice[0] * dt + pozice_mice[1] += rychlost_mice[1] * dt + + # odraz od spodni hrany + # Kdyz je micek prilis "nizko", odrazi se, a zacne se pohybovat nahoru. + # To znamena ze bude mit kladnou y-ovou slozku rychlosti. + # x-ova slozka (vpravo/vlevo) se nezmeni. + if pozice_mice[1] < VELIKOST_MICE // 2: + rychlost_mice[1] = abs(rychlost_mice[1]) + + # odraz od vrchni hrany + # To same, ale micek je moc vysoko a musi se zacit pohybovat dolu. + if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2: + rychlost_mice[1] = -abs(rychlost_mice[1]) + + # pohyb palek - cyklus se projde dvkrat; jednou pro kazdou palku + for cislo_palky in (0, 1): + # pohyb podle klaves (viz funkce `stisk_klavesy`) + if ('nahoru', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt + if ('dolu', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt + + # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum + if pozice_palek[cislo_palky] < DELKA_PALKY / 2: + pozice_palek[cislo_palky] = DELKA_PALKY / 2 + # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum + if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2: + pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2 + + # odrazeni micku + # Pokud je micek prilis vlevo, muze se budto odrazit od leve palky, anebo + # tam palka neni a levy hrac prohral. Podobne pro pravou stranu. + # Doporucuju si to nakreslit na papir :) + + # nejdriv si poznamename minimalni a maximalni pozici, kde musi byt palka + # (t.j. stred palky), aby odrazila micek. + palka_min = pozice_mice[1] - VELIKOST_MICE/2 - DELKA_PALKY/2 + palka_max = pozice_mice[1] + VELIKOST_MICE/2 + DELKA_PALKY/2 + + # odrazeni vlevo + if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2: + if palka_min < pozice_palek[0] < palka_max: + # palka je na spravnem miste, odrazime micek + rychlost_mice[0] = abs(rychlost_mice[0]) + else: + # palka je jinde nez ma byt, hrac prohral + skore[1] += 1 + reset() + + # odrazeni vpravo + if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2): + if palka_min < pozice_palek[1] < palka_max: + rychlost_mice[0] = -abs(rychlost_mice[0]) + else: + skore[0] += 1 + reset() + + +def nakresli_obdelnik(x1, y1, x2, y2): + """Nakresli obdelnik na dane souradnice + + Nazorny diagram:: + + y2 - +-----+ + |/////| + y1 - +-----+ + : : + x1 x2 + """ + # Tady pouzivam volani OpenGL, ktere je pro nas zatim asi nejjednodussi + # na pouziti + gl.glBegin(gl.GL_TRIANGLE_FAN) # zacni kreslit spojene trojuhelniky + gl.glVertex2f(int(x1), int(y1)) # souradnice A + gl.glVertex2f(int(x1), int(y2)) # souradnice B + gl.glVertex2f(int(x2), int(y2)) # souradnice C, nakresli trojuhelnik ABC + gl.glVertex2f(int(x2), int(y1)) # souradnice D, nakresli trojuhelnik BCD + # dalsi souradnice E by nakreslila trojuhelnik CDE, atd. + gl.glEnd() # ukonci kresleni trojuhelniku + + +def nakresli_text(text, x, y, pozice_x): + """Nakresli dany text na danou pozici + + Argument ``pozice_x`` muse byt "left" nebo "right", udava na kterou stranu + bude text zarovnany + """ + # Texty umi vypisovat Pyglet, a to tak, ze vytvorime objekt "napis" + # a pak ho nakreslime. + # (Normalne bychom tenhle objekt udelali jednou, a pak v nem jen menili + # text a vykreslovali ho, ale pro jednoduchost si ho vytvorime tady:) + napis = pyglet.text.Label( + text, + font_name='League Gothic', + font_size=VELIKOST_FONTU, + x=x, y=y, anchor_x=pozice_x) + napis.draw() + + +def vykresli(): + """Vykresli stav hry""" + gl.glClear(gl.GL_COLOR_BUFFER_BIT) # smaz obsah okna (vybarvi na cerno) + gl.glColor3f(1, 1, 1) # nastav barvu kresleni na bilou + + # micek + nakresli_obdelnik( + pozice_mice[0] - VELIKOST_MICE // 2, + pozice_mice[1] - VELIKOST_MICE // 2, + pozice_mice[0] + VELIKOST_MICE // 2, + pozice_mice[1] + VELIKOST_MICE // 2) + + # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic + # v tom seznamu palku vykreslime + for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] : + nakresli_obdelnik( + x - TLOUSTKA_PALKY, + y - DELKA_PALKY // 2, + x + TLOUSTKA_PALKY, + y + DELKA_PALKY // 2) + + # prerusovana pulici cara - slozena ze spousty malych obdelnicku + for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2): + nakresli_obdelnik( + SIRKA // 2 - 1, + y, + SIRKA // 2 + 1, + y + DELKA_PULICI_CARKY) + + # A nakonec vypiseme skore obou hracu + nakresli_text(str(skore[0]), + x=ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='left') + + nakresli_text(str(skore[1]), + x=SIRKA - ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='right') + + +def stisk_klavesy(symbol, modifikatory): + """Osetri stisknuti klavesy + + Kdyz hrac stiskne spravnou klavesu, do mnoziny ``stisknute_klavesy`` se + prida dvojice (n-tice) tvaru (smer, cislo palky). + Program pak muze pohybovat palkou podle toho, co je v mnozine. + """ + if symbol == key.W: + stisknute_klavesy.add(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.add(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.add(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.add(('dolu', 1)) + # N.B. klavesu ESC Pyglet osetri sam: zavre okno a ukonci funkci run() + + +def pusteni_klavesy(symbol, modifikatory): + """Osetri pusteni klavesy + + Opak funkce ``stisk_klavesy`` -- podle argumentu vynda prislusnou + dvojici z mnoziny. + """ + # Vsimnete si pouziti funkce ``discard``: na rozdil od ``remove`` + # nezpusobi chybu, kdyz prvek v mnozine neni. Takze program nespadne, + # kdyz napr. uzivatel zmackne klavesu, pak se prepne do naseho okna, + # a pak teprve klavesu pusti. + if symbol == key.W: + stisknute_klavesy.discard(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.discard(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.discard(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.discard(('dolu', 1)) + # Mimochodem, funkce pusteni_klavesy a stisk_klavesy by se daly hodne + # zjednodusit pomoci slovniku. Zkusite to? + +# Nastavime prvotni stav +reset() + +# Vytvorime okno, do ktereho budeme kreslit +window = pyglet.window.Window(width=SIRKA, height=VYSKA) + +# Oknu priradime par funkci, ktere budou reagovat na udalosti. +# Kdyz napr. uzivatel zmackne klavesu na klavesnici, +# Pyglet zavola funkci, kterou tady zaregistrujeme pod `on_key_press`, +# a preda ji prislusne argumenty. +# Jake vsechny udalosti muzou nastat, a jake argumenty se predaji prislusne +# funkci, se doctete v dokumentaci Pygletu, +# nebo pomoci `help(pyglet.window.event)`. +window.push_handlers( + on_draw=vykresli, # na vykresleni okna pouzij funkci `vykresli` + on_key_press=stisk_klavesy, # po stisknuti klavesy zavolej `stisk_klavesy` + on_key_release=pusteni_klavesy, # a mame i funkci na pusteni klavesy + ) + +# Jeste mame jednu podobnou funkci, kterou ale neprirazujeme primo +# oknu. Misto toho chceme aby ji Pyglet zavolal vzdycky kdyz "tiknou hodiny" +pyglet.clock.schedule(obnov_stav) + +pyglet.app.run() # vse je nastaveno, at zacne hra +# (funkce run() bude porad dokola volat obnov_stav, vykresli, a kdyz se mezitim +# neco stane, zavola navic funkci kterou jsme nastavili jako reakci na +# danou udalost) diff --git a/pyladies/reassignment/index.html b/pyladies/reassignment/index.html new file mode 100644 index 00000000..46d7bf2b --- /dev/null +++ b/pyladies/reassignment/index.html @@ -0,0 +1,92 @@ +

    Přepisování proměnných

    +

    Už víš, že hodnota proměnné se může v čase měnit: +když přiřadíš do už existující proměnné, stará hodnota se zahodí +a použije se nová.

    +
    oblibena_barva = 'modrá'
    +print(oblibena_barva)
    +
    +oblibena_barva = 'žlutá'
    +print(oblibena_barva)
    +
    +# Na tomhle místě programu už se k řetězci 'modrá' nedostaneš...
    +

    Trošku zajímavější (nebo složitější?) je situace, kdy hodnotu proměnné +přepíšeš výrazem, který používá tu stejnou proměnnou. +Zkus si to:

    +
    oblibene_cislo = 7
    +print(oblibene_cislo)
    +
    +oblibene_cislo = oblibene_cislo * 6
    +print(oblibene_cislo)
    +

    Co se tady děje? +Python vyhodnotí výraz za = se starou hodnotou proměnné, a teprve když +zná výsledek, přiřadí ho (a na starou hodnotu zapomene). +V našem příkladu postupuje takhle:

    +
    oblibene_cislo = oblibene_cislo * 6
    +#                ╰──────────┬─╯
    +oblibene_cislo =            7   * 6
    +#                           ╰─┬───╯
    +oblibene_cislo =             42
    +#         ▲                  |
    +#         ╰──────────────────╯
    +

    Přepisování v cyklu

    +

    Ještě „zajímavější“ je použít podobné přepisování v cyklu.

    +

    Zopakuj si, že for cyklus jako:

    +
    print("Tady je pár čísel:")
    +
    +for cislo in 8, 45, 9, 21:
    +    print(cislo)
    +

    opakuje přiřazení do proměnné a tělo cyklu; můžeš si ho rozepsat jako:

    +
    print("Tady je pár čísel:")
    +
    +cislo = 8
    +print(cislo)
    +
    +cislo = 45
    +print(cislo)
    +
    +cislo = 9
    +print(cislo)
    +
    +cislo = 21
    +print(cislo)
    +

    Zkus podobně rozepsat cyklus v následujícím programu +a popsat, co se děje:

    +
    celkem = 0
    +
    +for delka_trasy in 8, 45, 9, 21:
    +    print('Jdu', delka_trasy, 'km do další vesnice.')
    +    celkem = celkem + delka_trasy
    +
    +print('Celkem jsem ušla', celkem, 'km')
    +
    +

    Řešení

    + + +
    \ No newline at end of file diff --git a/pyladies/str-index-slice/index.html b/pyladies/str-index-slice/index.html new file mode 100644 index 00000000..b175eebb --- /dev/null +++ b/pyladies/str-index-slice/index.html @@ -0,0 +1,165 @@ +

    Výběr z řetězců

    +

    Už umíš spojovat dohromady kratší řetězce:

    +
    spojeny_retezec = 'a' + 'b'
    +dlouhy_retezec = 'ó' * 100
    +

    Teď se podíváme na opačný proces: jak z dlouhého +řetězce dostat kratší součásti. +Začneme jednotlivými znaky.

    +

    Výběr znaku

    +

    Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku +(angl. subscripting), +která se píše podobně jako volání funkce, jen s hranatými závorkami. +Třeba takhle se dá vybrat znak na páté pozici:

    +
    pate_pismeno = 'čokoláda'[5]
    +
    +print(pate_pismeno)
    +

    Funguje to? Dostal/a jsi opravdu páté písmeno?

    +
    +

    Řešení

    + + +

    Jak sis možná už všiml/a, programátoři počítají od nuly. +„První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.

    +

    Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, +druhé jedna, ... a osmé písmeno má číslo sedm.

    +

    Proč je tomu tak? +K úplnému pochopení důvodů by ses potřeboval/a +naučit něco o ukazatelích a polích, +což nebude hned, takže pro teď nám bude +stačit vědět, +že programátoři jsou prostě divní.

    +

    Nebo aspoň že mají rádi divná čísla – jako nulu.

    +
       [0] [1] [2] [3] [4] [5] [6] [7]
    +
    +  ╭───┬───┬───┬───┬───┬───┬───┬───╮
    +  │ Č │ o │ k │ o │ l │ á │ d │ a │
    +  ╰───┴───┴───┴───┴───┴───┴───┴───╯

    A když už jsme u divných čísel, +co se asi stane, když budu vybírat písmena pomocí záporných čísel?

    +
    +

    Řešení

    + + +

    Sekání řetězců

    +

    Kromě jednotlivých znaků můžeme vybírat i delší části – odborně +podřetězce (angl. substrings).

    +

    Zkus, co dělá tenhle program:

    +
    retezec = 'čokoláda'
    +kousek = retezec[5:]
    +print(kousek)
    +
    +

    Řešení

    + + +

    Dá se použít i retezec[:5], +který vybere všechno až po znak číslo 5. +Ne však znak 5 samotný, což je možná trochu zarážející, +ale je potřeba s tím počítat. +Poslední prvek není ve výběru obsažen, podobně jako range(5) neobsahuje +číslo 5.

    +

    Ačkoli je tohle chování divné, má hezké důsledky. +Všimni si třeba, že retezec[:5] + retezec[5:] ti dá zpět původní retezec.

    +

    Podobnému vybírání podřetězců se říká „sekání“ řetězců +(angl. string slicing).

    +

    Sekání „od“ a „do“ se dá kombinovat. +Zkus si to: co asi udělají následující příkazy?

    +
    retezec = 'čokoláda'
    +print(retezec[:4])
    +print(retezec[2:6])
    +print(retezec[-3:])
    +print(retezec[:])
    +
    +

    Řešení

    + + +

    Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

    +

    U sekání (s :) pomáhá očíslovat si „hranice“ mezi znaky, +abys v tom měl/a lepší přehled:

    +

    +
      ╭───┬───┬───┬───┬───┬───┬───┬───╮
    +  │ Č │ o │ k │ o │ l │ á │ d │ a │
    +  ├───┼───┼───┼───┼───┼───┼───┼───┤
    +  │   │   │   │   │   │   │   │   │
    +  0   1   2   3   4   5   6   7   8
    + -8  -7  -6  -5  -4  -3  -2  -1
    +
    +  ╰───────────────╯
    +  'čokoláda'[:4] == 'čoko'
    +
    +          ╰───────────────╯
    +        'čokoláda'[2:6] == 'kolá'
    +
    +                      ╰───────────╯
    +                      'čokoláda'[-3:] == 'áda'

    Cvičení

    +

    Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za +jiné. Například:

    +
    slovo = input('Slovo: ')
    +pozice = int(input('Které písmeno zaměnit (od nuly)? '))
    +novy_znak = input('Nové písmeno: ')
    +
    +... # sem doplň kód
    +
    +print(nove_slovo)
    +

    Příklad použití:

    +
    +Slovo: čokoláda
    +Které písmeno zaměnit (od nuly)? 3
    +Nové písmeno: u
    +čokuláda
    +
    +Slovo: kočka
    +Které písmeno zaměnit (od nuly)? 1
    +Nové písmeno: a
    +kačka
    +

    Pozor na to, že řetězce v Pythonu nelze měnit. +Nemůžeš v existujícím řetězci zaměnit jeden znak za jiný; +musíš vytvořit nový řetězec poskládaný z částí toho starého.

    +
    +

    Řešení

    + + +
    \ No newline at end of file diff --git a/pyladies/str-methods/index.html b/pyladies/str-methods/index.html new file mode 100644 index 00000000..298d7d86 --- /dev/null +++ b/pyladies/str-methods/index.html @@ -0,0 +1,83 @@ +

    Řetězcové funkce a metody

    +

    Řetězce umí všelijaké triky. +Funkcí len() můžeš zjistit, jak je řetězec dlouhý; +operátorem in pak jestli v sobě obsahuje daný podřetězec.

    + + + + + + + + + + + + + + + + + + + + + +
    ZápisPopisPříklad
    len(r)Délka řetězcelen('čokoláda')
    x in rTrue pokud je řetězec x obsažen v r'oko' in 'čokoláda'
    x not in rOpak x in r'dub' not in 'čokoláda

    Řetězce vždy berou v potaz velikost písmen, +takže např. 'ČOKO' in 'čokoláda' je False. +Kdybys chtěl/a porovnávat bez ohledu na velikost písmen, +musel/a bys oba řetězce převést třeba na malá písmena +a pak je porovnat.

    +

    A jak se převádí na malá písmena? +K tomu budeme potřebovat další novou vlastnost Pythonu: metody.

    +

    Metody

    +

    Metoda (angl. method) je jako funkce – něco, co se dá zavolat. +Na rozdíl od funkce je svázaná s nějakým objektem (hodnotou). +Volá se tak, že se za objekt napíše tečka, +za ní jméno metody a za to celé se, jako u funkcí, připojí závorky +s případnými argumenty.

    +

    Řetězcové metody upper() a lower() +převádí text na velká, respektive malá písmena. +Zkus si to!

    +
    retezec = 'Ahoj'
    +print(retezec.upper())
    +print(retezec.lower())
    +print(retezec)
    +

    Všimni si, že původní řetězec se nemění; metoda vrátí nový řetězec, ten +starý zůstává.

    +

    To je obecná vlastnost řetězců v Pythonu: jednou existující řetězec se už +nedá změnit, dá se jen vytvořit nějaký odvozený. +S touto vlastností už ses mohl/a setkat při psaní funkce zamen.

    +

    Iniciály

    +

    Pro procvičení metod a vybírání znaků si zkus napsat program, +který se zeptá na jméno, pak na příjmení +a pak vypíše iniciály – první písmena zadaných jmen.

    +

    Iniciály jsou vždycky velkými písmeny +(i kdyby byl uživatel líný mačkat Shift).

    +
    +

    Řešení

    + + +

    A další

    +

    Řetězcových metod je celá řada. +Nejužitečnější z nich najdeš v taháku, který si můžeš stáhnout či vytisknout. +Podívej se na ně a zjisti, co dělají.

    +

    A úplně všechny řetězcové metody jsou popsány v dokumentaci Pythonu (anglicky; plné věcí, které ještě neznáš).

    +

    Všimni si, že len není metoda, ale funkce; píše se len(r), ne r.len(). +Proč tomu tak je, to za nějakou dobu poznáš.

    \ No newline at end of file diff --git a/pyladies/str/index.html b/pyladies/str/index.html new file mode 100644 index 00000000..abdc43d2 --- /dev/null +++ b/pyladies/str/index.html @@ -0,0 +1,209 @@ +

    Zápis řetězců

    +

    Teď se podíváme na zoubek řetězcům. +Už s nimi trochu umíš, tak začneme rekapitulací.

    +

    Textový řetězec (angl. string) je datový typ (druh hodnot), +který obsahuje text – třeba slovo nebo větu.

    +

    Když řetězec zadáváš do programu, musíš ho označit – uzavřít do +uvozovek, buď jednoduchých nebo dvojitých:

    +
    'tohle je řetězec'
    +"tohle taky"
    +

    Je velký rozdíl mezi print('cislo') – vypiš slovo „cislo“ – +a print(cislo) – vypiš hodnotu výrazu cislo. +Jednou je cislo pět konkrétních písmen; podruhé instrukce k použití +proměnné. +Počítač, na rozdíl od lidí, rozdíl mezi textem a instrukcí nepozná z kontextu, +a tak je uvozovky potřeba používat důsledně.

    +

    (Ilustrační komiks. Člověk říká robotovi: "Řekni Pavlovi, ať mi zavolá!". Robot odpoví: "PAVLOVI AŤ MI ZAVOLÁ!")

    +

    Znaky

    +

    Texty sestávají z jednotlivých písmenek. +Řetězce víceméně taky, ale aby bylo jasné, co přesně tím písmenkem +myslíme, říkáme, že řetězce sestávají ze znaků (angl. characters).

    +

    Takový znak může být písmenko (např. A) nebo číslice (3), +ale i jiný symbol (!).

    +

    Každý řetězec má určitý počet znaků. +Kolik, to zjistíš pomocí funkce len(). +Třeba řetězec Ahoj! má znaků pět:

    +
    >>> len('Ahoj!')
    +5
    +

    Jeden ze zajímavějších znaků je mezera. +Je to taky znak. V řetězci se tedy chová stejně jako písmenko:

    +
    >>> len(' ')
    +1
    +>>> len('K ní')
    +4
    +>>> len('3 + 2')
    +5
    +

    Mimochodem, řetězec může být i prázdný – pak má nula znaků:

    +
    >>> len('')
    +0
    +>>> len("")
    +0
    +

    Uvozovky

    +

    K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. +Není mezi nimi rozdíl. +Podobně 4.0 a 4.000 jsou dva zápisy téhož čísla, +tak 'slovo' a "slovo" pro Python označuje stejnou +hodnotu, skládající se ze stejných pěti písmen.

    +

    Použité uvozovky nejsou součástí hodnoty – python si „nepamatuje“, jakým +způsobem byl řetězec uvozen. +Když má nějaký řetězec vypsat s uvozovkami, jedny si k tomu vybere – většinou +ty jednoduché:

    +
    >>> "python"
    +'python'
    +>>> 'slovo'
    +'slovo'
    +

    Předchozí příklad je z interaktivního režimu Pythonu, který ukazuje hodnoty +výrazů „programátorsky“ – pokud možno tak, jak se zapisují v Pythonu. +Funkce print() vypisuje hodnoty „hezky“, „pro uživatele“ – v případě +řetězců tedy bez uvozovek.

    +

    Uvozovky v uvozovkách

    +

    Proč si při zadávání textu můžeš vybrat mezi dvěma druhy uvozovek?

    +

    Občas se stane, že v rámci textu potřebuješ použít samotnou uvozovku (nebo +apostrof). +Pak musíš „kolem“ řetězce použít tu druhou:

    +
    print('Zpívala si: "Tralala!"')
    +print("Byl to Goa'uld, parazit z planety P3X-888")
    +

    Když v rámci textu použiješ stejnou uvozovku jako „kolem něj“, tak bude Python +naprosto zmatený.

    +
    >>> len("Zpívala si: "Tralala"")
    +Traceback (most recent call last)
    +  File "<>", line 1
    +    len("Zpívala si: "Tralala"")
    +                      ^
    +SyntaxError: invalid syntax
    +

    Pokud používáš chytrý editor, doporučuju si zvyknout na to, jakou barvou +máš řetězce zvýrazněné. +Často to pomáhá odhalit chybky.

    +

    Sekvence se zpětným lomítkem

    +

    Co dělat, když v řetězci potřebuješ oba druhy uvozovek, +jako ve větě Vtom vnuk křik': "Hleď!"?

    +

    Můžeš si pomoci tím, že spojíš dva řetězce:

    +
    >>> print("Vtom vnuk křik': " + '"Hleď!"')
    +Vtom vnuk křik': "Hleď!"
    +

    Ale lepší způsob je použít speciální zápis se zpětným lomítkem. +Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou +uvozovku.

    +
    >>> print("Vtom vnuk křik': \"Hleď!\"")
    +Vtom vnuk křik': "Hleď!"
    +>>> print('"Jen ho nech," řek\' děd. "Kdo zná líp kraj?"')
    +"Jen ho nech," řek' děd. "Kdo zná líp kraj?"
    +

    Ve výsledném řetězci pak ovšem žádné zpětné lomítko není. +Sekvence \' je jen způsob, jak v Pythonu zadat ' – jediný znak. +Tomu je celkem důležité porozumět. +Zkus si, jestli zvládneš předpovědět výsledek těchto výrazů:

    +
    >>> print(".\".")
    +>>> len(".\".")
    +>>> ".\"."
    +
    +

    Řešení

    + + +

    Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. +Jedna ze zajímavějších je \t, představující tabulátor – jediný znak, který +se, když ho vypíšeš, „roztáhne“ na víc mezer.

    +
    >>> print("a\tb")   # Výpis "pro lidi"
    +a       b
    +>>> "a\tb"          # Výpis "pro programátory"
    +'a\tb'
    +>>> len("a\tb")     # Počet znaků v řetězci
    +3
    +

    Se zpětným lomítkem se dá zadat jakýkoli znak – včetně emoji – podle jména +(\N{…}) nebo identifikačního čísla (\x.., \u...., \U........) +standardu Unicode. +Stačí přesné jméno nebo číslo znát (nebo třeba dohledat na internetu). +V následujících řetězcích jsou takové znaky pro přehlednost mezi dvěma +pomlčkami -. Délka každého řetězce je tedy celkem 3:

    +
    >>> print('-\N{GREEK CAPITAL LETTER DELTA}-')
    +-Δ-
    +>>> print('-\N{SECTION SIGN}-')
    +-§-
    +>>> print('-\N{GRINNING CAT FACE WITH SMILING EYES}-')
    +-😸-
    +>>> print('-\x60-')
    +-`-
    +>>> print('-\u30C4-')
    +-ツ-
    +>>> print('-\U0001F0BD-')
    +-🂽-
    +

    Zpětné lomítko

    +

    Zpětné lomítko tedy začíná speciální sekvenci (známou pod anglickým +termínem escape sequence), kterou zadáš jediný znak.

    +

    Tahle vychytávka má jeden, někdy nepříjemný, důsledek: pokud chceš mít jako +součást řetězce zpětné lomítko (třeba ve jménech souborů na Windows), +nemůžeš použít přímo \. +Musíš použít speciální sekvenci \\ – tedy lomítko zdvojit:

    +
    print('C:\\PyLadies\\Nový adresář')
    +

    Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ +je zápis pro jedno zpětné lomítko.

    +

    Nový řádek

    +

    Někdy potřebuješ řetězce, které obsahují více řádků. +Pythonní řetězce ale můžeš normálně napsat jen na jeden řádek. +(Python se tak snaží ulehčit hledání chyby, kdybys koncovou uvozovku +zapoměl/a.)

    +

    Můžeš ale do řetězce znak pro nový řádek vložit pomocí sekvence \n:

    +
    >>> print('Haló haló!\nCo se stalo?')
    +Haló haló!
    +Co se stalo?
    +

    Ono \n do řetězce vloží znak nového řádku. +Ten při výpisu ukončí stávající řádek a přejde na nový – ale jinak se chová +jako jakýkoli jiný znak:

    +
    >>> print('-\n-')
    +-
    +-
    +>>> len('-\n-')
    +3
    +

    Trojité uvozovky

    +

    Kromě \n je i druhý způsob, jak zadat řetězec se znakem nového řádku: +ohraničit ho třemi uvozovkami (jednoduchými nebo dvojitými) +na každé straně. +Dají se tak zadávat delší víceřádkové řetězce:

    +
    basen = '''Haló haló!
    +Co se stalo?
    +Prase kozu potrkalo!'''
    +

    Pozor na to, že pokud je tenhle řetězec +v odsazeném kódu, každý jeho řádek bude začínat +několika mezerami. +(V dokumentačních řetězcích tohle nevadí, tam se s odsazením počítá.)

    +
    cislo = 4
    +
    +if cislo > 0:
    +    print("""
    +        Výsledek porovnání:
    +
    +        Číslo je kladné.
    +    """)
    +

    Cvičení

    +

    Jaká je délka těchto řetězců?

    +

    Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

    +
    print(len('ahoj'))
    +print(len("""Ahoj!"""))
    +print(len('a b'))
    +print(len( ' a b ' ))
    +print(len('\N{SNOWMAN}ové'))
    +print(len('a\nb'))
    +print(len('a\tb'))
    +print(len('"\'"'))
    +
    +
    +print(len("""
    +abc"""))
    +
    +
    +if True:
    +    print(len("""a
    +    b"""))
    +
    +
    +print(len('C:\new_dir'))
    +
    +print(len(f'{print}'))
    \ No newline at end of file diff --git a/pyladies/str/quote-comic.svg b/pyladies/str/quote-comic.svg new file mode 100644 index 00000000..cd80509d --- /dev/null +++ b/pyladies/str/quote-comic.svg @@ -0,0 +1,466 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pyladies/testing/index.html b/pyladies/testing/index.html new file mode 100644 index 00000000..371afde3 --- /dev/null +++ b/pyladies/testing/index.html @@ -0,0 +1,226 @@ +

    Testování

    +

    Programátorská práce nespočívá jen v tom, program napsat. +Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. +Ověřování, že program funguje, se říká testování (angl. testing).

    +

    Zatím jsi asi svoje programy testoval/a tak, že jsi +je zkusil/a spustit, něco zadal/a a podíval/a se, +jestli jsou výsledky v pořádku. +U větších programů, které budou mít více a více +možností, ale bude těžší a těžší takhle zkontrolovat, +jestli všechny ty možnosti fungují, jak mají.

    +

    Proto si programátoři často nezkouší programy „ručně“. +Píšou jiné programy, které jejich výtvory testují za ně.

    +

    Automatické testy jsou funkce, které +zkontrolují, že program funguje správně. +Spuštěním testů můžeš kdykoli ověřit, že kód funguje. +Když v otestovaném kódu v budoucnu uděláš nějakou změnu, +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

    +

    Instalace knihovny pytest

    +

    Zatím jsme v kurzu pracovali/y s tím, co se instaluje +se samotným Pythonem – s moduly jako math a turtle. +Kromě takových modulů ale existuje ale velká spousta +dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat +a používat.

    +

    Na testy je v samotném Pythonu zabudovaná knihovna unittest. +Ta je ale celkem složitá na použití, proto ji my používat nebudeme. +Nainstalujeme si knihovnu pytest, která se používá +mnohem jednodušeji a je velice populární.

    +

    Knihovny se instalují do aktivního virtuálního prostředí. +Jak se dělá a spouští virtuální prostředí +ses naučil/a při instalaci Pythonu, +ale teprve teď to začíná být opravdu důležité. +Ujisti se, že máš virtuální prostředí aktivované.

    +

    Potom zadej následující příkaz. +(Je to příkaz příkazové řádky, podobně jako +cd nebo mkdir; nezadávej ho do Pythonu.)

    +

    Opisuj opatrně!

    +

    Příkaz níže instaluje software z Internetu. +Za knihovnu pytest autoři tohoto kurzu ručí. +Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“. +Dej si proto pozor a ve jménu pytest neudělej překlep!

    +
    (venv)$ python -m pip install pytest
    +

    Co ten příkaz znamená?

    +

    python -m pip zavolá Python s tím, že má pustit modul +pip. Tento modul umí instalovat nebo +odinstalovávat knihovny. +(Jestli si pamatuješ vytváření virtuálního prostředí, použil/a jsi tam +příkaz python -m venv – modul venv umí vytvářet virtuální prostředí.) +No a slova install pytest říkají Pipu, že má nainstalovat pytest.

    +

    Nápověda k použití Pipu se dá vypsat pomocí příkazu +python -m pip --help.

    +

    Pro Windows

    +

    Jsi-li na Windows, od této lekce začne být důležité +spouštět pythonní programy pomocí python program.py, ne jen +program.py. +Ačkoli se v těchto materiálech všude používá python na začátku, zatím +mohlo všechno fungovat i bez toho. +Program se ale bez příkazu python může spustit v jiném Pythonu, +než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

    +

    Psaní testů

    +

    Nejdříve si testování ukážeme na jednoduchém příkladu. +Tady je funkce secti, která umí sečíst +dvě čísla, a další funkce, která testuje, jestli se +secti pro určité hodnoty +chová správně.

    +

    Kód si opiš do souboru test_secteni.py, +v novém prázdném adresáři. +Pro pytest je (ve výchozím nastavení) +důležité, aby jména jak souborů s testy, tak +samotných testovacích funkcí, začínala na +test_.

    +
    def secti(a, b):
    +    return a + b
    +
    +def test_secti():
    +    assert secti(1, 2) == 3
    +

    Co se v té testovací funkci děje?

    +

    Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, +vyvolá výjimku, která způsobí, že test selže. +Můžeš si představit, že assert a == b dělá následující:

    +
    if not (a == b):
    +    raise AssertionError('Test selhal!')
    +

    Zatím assert nepoužívej jinde než v testovacích funkcích. +V „normálním” kódu se assert může chovat trochu jinak než výše, +ale do toho teď nebudeme zabředávat.

    +

    Spouštění testů

    +

    Testy se spouští zadáním příkazu +python -m pytest -v následovaným názvem souboru s testy. +Tedy v překladu: Pythone, pusť +modul pytest, +v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

    +
    $ python -m pytest -v test_secteni.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
    +cachedir: .pytest_cache
    +rootdir: naucse, inifile:
    +collecting ... collected 1 item
    +
    +test_secteni.py::test_secti PASSED                                       [100%]
    +
    +=========================== 1 passed in 0.00 seconds ===========================
    +

    Tento příkaz projde zadaný soubor, zavolá v něm všechny funkce, +jejichž jméno začíná na test_, a ověří, že nevyvolají žádnou +výjimku – typicky výjimku z příkazu assert. +Pokud výjimka nastane, dá to pytest velice červeně +najevo a přidá několik informací, které můžou +usnadnit nalezení a opravu chyby.

    +

    Argument s názvem souboru můžeš vynechat: python -m pytest -v. +V takovém případě pytest projde aktuální adresář a spustí testy +ze všech souborů, jejichž jméno začíná na test_. Místo souboru +lze též uvést adresář: pytest vyhledá testy v něm.

    +

    Zkus si změnit funkci secti (nebo její test) a podívat se, +jak to vypadá když test „neprojde“.

    +

    Testovací moduly

    +

    Testy se většinou nepíšou přímo ke kódu, +ale do souboru vedle. +Je to tak přehlednější a taky to pak zjednodušuje +distribuci – předání kódu někomu, kdo ho chce +jen spustit a testy nepotřebuje.

    +

    Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +a v test_secteni.py nech jenom test. +Do test_secteni.py pak na začátek přidej from secteni import secti, +aby byla funkce testu k dispozici.

    +

    Test by měl opět projít.

    +

    Spouštěcí moduly

    +

    Automatické testy musí projít „bez dozoru“. +V praxi se často automaticky spouští, případné chyby se automaticky +oznamují (např. e-mailem) a fungující otestovaný kód se automaticky +začne používat dál (nebo se rovnou vydá zákazníkům).

    +

    Co to znamená pro nás? +Funkce input v testech nefunguje. Nemá koho by se zeptala; „za klávesnicí“ +nemusí nikdo sedět.

    +

    To může někdy „ztěžovat práci“. Ukážeme si to na složitějším projektu: +na 1D piškvorkách.

    +

    Učíš-li se z domu, dodělej si Piškvorky než budeš pokračovat dál! +Zadání najdeš (prozatím) +v projektech pro PyLadies +na straně 2.

    +

    Kód pro 1D Piškvorky může rámcově vypadat zhruba takto:

    +
    import random  # (příp. import jiných věcí, které budou potřeba)
    +
    +def tah(pole, cislo_policka, symbol):
    +    """Vrátí pole s daným symbolem umístěným na danou pozici"""
    +    ...
    +
    +def tah_hrace(pole):
    +    """Zeptá se hráče kam chce hrát a vrátí pole se zaznamenaným tahem"""
    +    ...
    +    input('Kam chceš hrát? ')
    +    ...
    +
    +def piskvorky1d():
    +    """Spustí hru
    +
    +    Vytvoří hrací pole a střídavě volá tah_hrace a tah_pocitace
    +    dokud někdo nevyhraje"""
    +    while ...:
    +        ...
    +        tah_hrace(...)
    +        ...
    +
    +# Puštění hry!
    +piskvorky1d()
    +

    Když tenhle modul naimportuješ, Python v něm postupně, odshora dolů, +provede všechny příkazy.

    +

    První příkaz, import, jen zpřístupní nějaké proměnné a funkce; +je-li importovaný modul správně napsaný, nemá vedlejší účinek. +Definice funkcí (příkazy def a všechno v nich) podobně jen definují funkce. +Ale zavoláním funkce piskvorky1d se spustí hra: +funkce piskvorky1d zavolá funkci tah_hrace() a ta zavolá input().

    +

    Importuješ-li tenhle modul z testů, input selže a import se nepovede.

    +

    A kdybys modul importoval/a odjinud – například bys chtěl/a funkci +tah použít v nějaké jiné hře – uživatel si bude muset v rámci importu +zahrát Piškvorky!

    +

    Volání funkce piskvorky1d je vedlejší efekt, a je potřeba ho odstranit. +No jo, ale po takovém odstranění +už nejde jednoduše spustit hra! Co s tím?

    +

    Můžeš na to vytvořit nový modul. +Pojmenuj ho hra.py a dej do něj jenom to odstraněné volání:

    +
    import piskvorky
    +
    +piskvorky.piskvorky1d()
    +

    Tenhle modul nebudeš moci testovat (protože nepřímo volá funkci input), +ale můžeš ho spustit, když si budeš chtít zahrát. +Protože k němu nemáš napsané testy, nepoznáš +z nich, když se takový spouštěcí modul rozbije. +Měl by být proto nejjednodušší – jeden import a jedno volání.

    +

    Původní modul teď můžeš importovat bez obav – ať už z testů nebo z jiných +modulů. +Test může vypadat třeba takhle:

    +
    import piskvorky
    +
    +def test_tah_na_prazdne_pole():
    +    pole = piskvorky.tah_pocitace('--------------------')
    +    assert len(pole) == 20
    +    assert pole.count('x') == 1
    +    assert pole.count('-') == 19
    +

    Pozitivní a negativní testy

    +

    Testům, které kontrolují, že se program za správných podmínek chová správně, +se říká pozitivní testy. +Můžeš ale testovat i reakci programu na špatné nebo neočekávané podmínky.

    +

    Testy, které kontrolují reakci na „špatný“ vstup, +se jmenují negativní testy. +Můžou kontrolovat nějaký negativní výsledek (např. +že volání jako cislo_je_sude(7) vrátí False), +a nebo to, že nastane „rozumná“ výjimka.

    +

    Například funkce tah_pocitace by měla způsobit +chybu (třeba ValueError), když je herní pole už plné.

    +

    Vyvolat výjimku je mnohem lepší než alternativy, např. kdyby takové volání +„tiše“ – bez oznámení – zablokovalo celý program. +Když kód pak použiješ ve větším programu, +můžeš si být jistá, že při špatném volání +dostaneš srozumitelnou chybu – tedy takovou, +která se co nejsnadněji opravuje.

    +

    Na otestování výjimky použij příkaz with a funkci raises naimportovanou +z modulu pytest. +Jak příkaz with přesně funguje, se dozvíme později; +teď stačí říct, že ověří, že odsazený blok kódu +pod ním vyvolá danou výjimku:

    +
    import pytest
    +
    +import piskvorky
    +
    +def test_tah_chyba():
    +    with pytest.raises(ValueError):
    +        piskvorky.tah_pocitace('oxoxoxoxoxoxoxoxoxox')
    +
    \ No newline at end of file diff --git a/pyladies/tuple/index.html b/pyladies/tuple/index.html new file mode 100644 index 00000000..9b573845 --- /dev/null +++ b/pyladies/tuple/index.html @@ -0,0 +1,125 @@ +

    N-tice

    +

    Když už známe seznam, podívejme se na jeho sestřičku: takzvanou +n-tici (angl. tuple).

    +

    N-tice, podobně jako seznam, +může obsahovat n prvků. +N-tice se dvěma prvky je dvojice +neboli pár (angl. pair); se třemi +prvky trojice (angl. 3-tuple), +se čtyřmi čtveřice (angl. 4-tuple), atd.

    +

    Existují i n-tice s jedním prvkem (hmm… „jednice”?) +a s nula prvky (prázdné n-tice, angl. empty tuple), +ale těmi se ze začátku nebudeme zabývat.

    +

    N-tice se tvoří jako seznamy, jen kolem sebe nemají hranaté závorky. +Stačí čárky mezi prvky.

    +

    Chovají se skoro stejně jako seznamy, jen nejdou měnit. +Nemají tedy metody jako append +a pop a nedá se jim přiřazovat do prvků. +Dají se ale použít v cyklu for +a dají se z nich číst jednotlivé prvky.

    +
    osoby = 'máma', 'teta', 'babička'
    +for osoba in osoby:
    +    print(osoba)
    +print('První je {}'.format(osoby[0]))
    +

    Vypadá to povědomě? Aby ne! +N-tice jsme už použili dříve: +for jmeno in 'Hynek', 'Vilém', 'Jarmila': +ve skutečnosti používá n-tici!

    +

    Když chceš n-tici předat do funkce, +narazíš na problém, že čárka odděluje jednotlivé +argumenty funkce. +V podobných případech musíš n-tici +uzavřít do závorek, aby bylo jasné, že jde o jednu +hodnotu (byť složenou).

    +
    seznam_dvojic = []
    +for i in range(10):
    +    # `append` bere jen jeden argument; dáme mu jednu dvojici
    +    seznam_dvojic.append((i, i**2))
    +print(seznam_dvojic)
    +

    N-tice se hodí, pokud chceš z funkce vrátit +víc než jednu hodnotu. +Prostě v příkazu return oddělíš vracené hodnoty čárkou. +Vypadá to, že vracíš několik hodnot, ale +ve skutečnosti se vrací jen jedna n-tice.

    +
    def podil_a_zbytek(a, b):
    +    return a // b, a % b
    +

    Tahle funkce už mimochodem v Pythonu je: jmenuje se +divmod a je vždy k dispozici +(nemusí se importovat).

    +

    Python umí ještě jeden trik: pokud chceš přiřadit +do několika proměnných najednou, stačí je na levé +straně rovnítka oddělit čárkou a na pravou stranu +dát nějakou „složenou” hodnotu – třeba právě +n-tici.

    +
    podil, zbytek = podil_a_zbytek(12, 5)
    +

    N-tice se k tomuto účelu hodí nejvíc, ale +jde to se všemi hodnotami, které jdou použít ve for:

    +
    x, o = 'xo'
    +jedna, dva, tri = [1, 2, 3]
    +

    Funkce, které vracejí n-tice

    +

    zip je zajímavá funkce. +Používá se ve for cyklech, podobně jako funkce range, která „dává” čísla.

    +

    Když funkce zip dostane dva seznamy +(či jiné věci použitelné ve for), +„dává” dvojice, a to tak, že nejdřív spáruje +první prvek jednoho seznamu s prvním prvkem +druhého seznamu, +pak druhý s druhým, třetí s třetím a tak dál.

    +

    Hodí se to, když máš dva seznamy se stejnou +strukturou – příslušné prvky k sobě „patří” +a chceš je zpracovávat společně:

    +
    osoby = 'máma', 'teta', 'babička', 'vrah'
    +vlastnosti = 'hodná', 'milá', 'laskavá', 'zákeřný'
    +for osoba, vlastnost in zip(osoby, vlastnosti):
    +    print('{} je {}'.format(osoba, vlastnost))
    +

    Když zip dostane tři seznamy, +bude tvořit trojice, ze čtyř seznamů nadělá čtveřice a tak dále.

    +

    Další funkce, která vrací dvojice, je enumerate. +Jako argument bere seznam (či jinou věc použitelnou +ve for) a vždy spáruje index (pořadí v seznamu) s příslušným prvkem. +Jako první tedy dá +(0, první prvek seznamu), potom +(1, druhý prvek seznamu), +(2, třetí prvek seznamu) +a tak dále.

    +
    prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    +
    +for i, prvocislo in enumerate(prvocisla):
    +    print('Prvočíslo č.{} je {}'.format(i, prvocislo))
    +

    Malé n-tice

    +

    Jak vytvořit n-tici s žádným nebo jedním prvkem? Takhle:

    +
    prazdna_ntice = ()
    +jednoprvkova_ntice = ('a', )
    +

    Druhý příklad jde i bez závorek – +jednoprvkova_ntice = 'a', – +ale to vypadá jako zapomenutá čárka. +Když budeš opravdu potřebovat jednoprvkovou +n-tici, radši ji pro přehlednost ozávorkuj.

    +

    Kdy použít seznam a kdy n-tici?

    +

    Seznamy se používají, když předem nevíš, +kolik v nich přesně bude hodnot, +nebo když je hodnot mnoho. +Například seznam slov ve větě, +seznam účastníků soutěže, seznam tahů ve hře +nebo seznam karet v balíčku. +Oproti tomu for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN': +používá n-tici.

    +

    N-tice se často používají na hodnoty +různých typů, kdy má každá „pozice” +v n-tici úplně jiný význam. +Například seznam můžeš použít na písmena abecedy, +ale dvojice index–hodnota z enumerate +je n-tice.

    +

    Prázdné n-tice a n-tice s jedním +prvkem se zapisují trochu divně a má to své důvody: +může-li nastat situace, kdy takovou sekvenci budeš +potřebovat, většinou je lepší sáhnout po seznamu. +Například seznam hracích karet v ruce nebo +seznam lidí aktuálně přihlášených do soutěže +může být občas prázdný.

    +

    Seznamy i n-tice mají i technické limity: +n-tice nejdou měnit a až se naučíme pracovat se slovníky, +zjistíme že seznamy tam nepůjdou použít jako klíče.

    +

    Často není úplně jasné, který typ použít +– v takovém případě je to pravděpodobně jedno. +Řiď se instinktem. :)

    \ No newline at end of file diff --git a/pyladies/turtle/index.html b/pyladies/turtle/index.html new file mode 100644 index 00000000..849f05b8 --- /dev/null +++ b/pyladies/turtle/index.html @@ -0,0 +1,412 @@ +

    🐍 🐢

    +

    V této lekci si vyzkoušíš želví kreslení.

    +

    Pusť Python v interaktivním módu (bez souboru .py).

    +
    $ python
    +
    +>>>
    +

    (Znaky > a $ píše počítač, ne ty. +Na Windows bude místo $ znak +> a před $ nebo +> může být ještě něco dalšího.)

    +

    Pak napiš:

    +
    from turtle import forward
    +
    +forward(50)
    +

    Ukáže se okýnko se šipkou, které nezavírej. +Dej ho tak, abys viděla i příkazovou řádku +i nové okýnko.

    +

    A kde je ta želva?

    +

    Želva je zrovna převlečená za šipku. +Ale funkce shape ji umí odmaskovat:

    +
    from turtle import shape
    +
    +shape('turtle')
    +

    Modul turtle obsahuje spoustu dalších funkcí, kterými můžeš želvu ovládat. +Pojďme se na ně kouknout zblízka.

    +

    Otáčení

    +

    Želva se umí otáčet (doleva – left a doprava – right) a lézt po papíře +(dopředu – forward). +Na ocase má připevněný štětec, kterým při pohybu kreslí čáru.

    +
    from turtle import forward, left, right
    +
    +forward(50)
    +left(60)
    +forward(50)
    +right(60)
    +forward(50)
    +

    Zkus chvíli dávat želvě příkazy. +Když se ti výsledek nelíbí, můžeš zavřít kreslící okno a zkusit to znovu. +(Nebo místo zavření okna můžeš naimportovat a použít funkci clear().)

    +

    Želví program

    +

    Interaktivní mód je skvělý na hraní, +ale teď přejdeme zase na soubory.

    +

    Vytvoř si v editoru nový soubor. +Ulož ho do adresáře pro dnešní lekci pod jménem zelva.py.

    +

    Jestli adresář pro dnešní lekci ještě nemáš, vytvoř si ho! +Pojmenuj ho třeba 02.

    +

    Soubor nepojmenovávej turtle.py – z modulu turtle budeš importovat.

    +

    Jestli chceš pro soubor použít jiné jméno, můžeš, ale +nepojmenovávej ho turtle.py.

    +

    Do souboru napiš příkazy na nakreslení obrázku +a – pozor! – na konci programu zavolej funkci exitonclick +(naimportovanou z modulu turtle).

    +

    Otázka

    +

    Co dělá funkce exitonclick, kterou voláš na konci programu?

    +

    Přerušovaná čára

    +

    Funkce penup řekne želvě, aby zvedla ocásek se štětcem: bude se tak hýbat +aniž by za sebou nechávala stopu. +Funkcí pendown můžeš želvě říct, aby kreslit zase začala. +Zkus si to:

    +
    from turtle import forward, penup, pendown, exitonclick
    +
    +forward(30)
    +penup()         # od teď želva nekreslí
    +forward(5)
    +pendown()       # od teď želva zase kreslí
    +forward(30)
    +
    +exitonclick()
    +

    Až to budeš mít hotové, zkus začít kreslit trochu složitější obrázky:

    +

    Čtverec

    +

    Nakresli čtverec.

    +

    Želví čtverec

    +

    Čtverec má čtyři rovné strany +a čtyři rohy po 90°.

    +
    +

    Řešení

    + + +

    Obdélník

    +

    Nakresli obdélník.

    +

    Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

    +

    Želví obdélník

    +
    +

    Řešení

    + + +

    Tři čtverce

    +

    Nakresli tři čtverce, každý otočený třeba o 20°.

    +

    Tři želví čtverce

    +
    +

    Řešení

    + + +

    Tolik kódu! Tohle musí jít nějak zjednodušit!

    +

    Jde. +Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

    +

    Jak opakovat – a neopakovat se

    +

    Udělej v editoru nový soubor a ulož ho jako cykly.py. +Budeš v něm zkoušet cykly.

    +

    První opakovací program, který napíšeš, bude dělat tohle:

    +
      +
    • Stokrát po sobě:
        +
      • Napiš "Nikdy nebudu odsazovat o tři mezery!"
      • +
      +
    • +
    +

    Přeložené do jazyka Python to vypadá následovně:

    +
    for i in range(100):
    +    print('Nikdy nebudu odsazovat o tři mezery!')
    +

    Na ono for i in range(100) se detailněji podíváme za chvíli, +teď to pro nás bude “hlavička”, která říká “opakuj stokrát”.

    +

    Podobnou “hlavičku” už jsi viděl/a u příkazu if. +Stejně jako u if tu je na konci dvojtečka a za ní následuje +odsazený blok – tělo příkazu; to na co se hlavička vztahuje. +Tělo příkazu if se provede jen někdy; +tělo příkazu for se opakuje několikrát dokola.

    +

    Výčet

    +

    Zkus napsat ještě jeden vzorový program, který v češtině zní:

    +
      +
    • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
        +
      • Vypiš pozdrav a za ním vykřičník.
      • +
      +
    • +
    +

    A v Pythonu:

    +
    for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN':
    +    print(pozdrav + '!')
    +

    Opět je tu hlavička a tělo příkazu. +Tentokrát se na hlavičku podívej pozorněji. +Pythonní for promenna in sekvence +znamená „Pro každé promenna ze sekvence“.

    +

    Jméno proměnné si volíš sám/sama. +Příkaz for danou proměnnou vždy nastaví na aktuální +hodnotu a pak provede všechno, co je v odsazeném těle cyklu. +Program výše tedy funguje úplně stejně, jako kdybys napsal/a:

    +
    pozdrav = 'Ahoj'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hello'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hola'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hei'
    +print(pozdrav + '!')
    +
    +pozdrav = 'SYN'
    +print(pozdrav + '!')
    +

    Range

    +

    Vraťme se k for i in range(100). +Už víš, že to znamená „Pro každé i ze sekvence range(100)“. +Co je ale to range? Když si ho vypíšeš, nevypadne nic vysvětlujícího:

    +
    >>> range(100)
    +range(0, 100)
    +

    Je ale použité jako „sekvence“ +v for promenna in sekvence. +Je to nějaký výčet, nějaká posloupnost hodnot. +A teď už umíš vypsat, jaké to jsou!

    +
    for i in range(5):   # Doporučuju použít jen 5 místo 100
    +    print(i)
    +

    neboli česky:

    +
      +
    • Pro každé irange(5):
        +
      • Vypiš i
      • +
      +
    • +
    +

    Program spusť. Jaká čísla se vypíšou? (Neboli: co je v sekvenci range(5)?)

    +
    +

    Řešení

    + + +

    Funkce range(n) vrací sekvenci čísel. +Začíná od 0 a čísel v ní je přesně n. +(Na samotné n se tedy už nedostane.)

    +

    Často budeš potřebovat Pythonu říct, ať něco „n-krát zopakuje“. +Na to můžeš použít for i in range(n) („pro každé i od 0 do +n-1“) s tím, že proměnná i – „počitadlo“ – tě nezajímá. +V programu ji jednoduše nepoužiješ.

    +

    Teď by už mělo být jasné, jak funguje původní program:

    +
    for i in range(100):
    +    print('Nikdy nebudu odsazovat o tři mezery!')
    +
      +
    • Zopakuj 100krát:
        +
      • Vypiš 'Nikdy nebudu odsazovat o tři mezery!'
      • +
      +
    • +
    +

    Python píše hlášky, jednu za druhou, a u toho si v promněnné i +počítá, jak už je daleko.

    +

    Proměnná i se v matematice typicky používá pro celá čísla; +je to zkratka z termínu index (číslo prvku). +V programování se tradičně používá pro číslo průchodu cyklem, +jako v příkladu výše. +Pro lepší pochopení bývá dobré použít popisnější jméno proměnné, tady +například cislo_vypisu; v krátkých a přehledných cyklech – a zvlášť v těch +které proměnnou nepoužívají – se ale často setkáš s krátkým i, j, k

    +

    Někteří programátoři pojmenovávají ignorovanou proměnnou _ (podtržítko). +To je pro Python jméno jako jakékoli jiné, ničím se neliší od i nebo x:

    +
    for _ in range(100):
    +   print('Nikdy nebudu odsazovat o tři mezery!')
    +

    Dlouhá přerušovaná čára

    +

    Už víš, že pomocí penup a pendown lze nakreslit přerušenou čáru:

    +
    from turtle import forward, penup, pendown, exitonclick
    +
    +forward(30)
    +penup()         # od teď želva nekreslí
    +forward(5)
    +pendown()       # od teď želva zase kreslí
    +forward(30)
    +
    +exitonclick()
    +

    Zkus nakreslit dlouhou přerušovanou čáru.

    +

    Želva a přerušovaná čára

    +
    +

    Řešení

    + + +

    Pak zkus zařídit, aby jednotlivé čárky byly postupně +větší a větší.

    +

    Želva a přerušovaná čára

    +

    Nápověda

    +

    První čárka je dlouhá 1 jednotku, druhá 2 jednotky, třetí 3, atd.

    +

    Dokonce můžeš na začátek dát prázdnou čárku (0 jednotek) +a mít tak délky 0, 1, 2, 3, 4, …

    +

    V jaké proměnné máš při prvním průchodu cyklem 0, ve druhém 1, atd.?

    +
    +

    Řešení

    + + +

    Čtverec II

    +

    A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

    +

    Čtverec se kreslí následovně:

    +
      +
    • Čtyřikrát:
        +
      • Popojdi dopředu (a kresli přitom čáru)
      • +
      • Otoč se o 90°
      • +
      +
    • +
    +

    Želví čtverec

    +
    +

    Řešení

    + + +

    Tři čtverce

    +

    Nakonec nakresli 3 čtverce, každý otočený o 20°. +Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu +for, ne kopírováním kódu.

    +

    Tři želví čtverce

    +
      +
    • Třikrát:
        +
      • Nakresli čtverec (viz jedna z předchozích úloh)
      • +
      • Otoč se o 20°
      • +
      +
    • +
    +
    +

    Řešení

    + + +

    Úkol navíc

    +

    Máš-li hotovo, zkus nakreslit schody:

    +

    Želví schody

    +

    A máš-li i schody, zkus nakreslit těchto šest (nebo sedm?) šestiúhelníků:

    +

    Želví plástev

    \ No newline at end of file diff --git a/pyladies/turtle/turtle-dashed.png b/pyladies/turtle/turtle-dashed.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4610f46da179370dee6ede27dfe388c0e24ed8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^hk#g*g9%7}WeuDUq?n7HJVQ7*IBq}me*oli7I;J! zGcfQAfiR=u>`%r(!9|`fjv*Dd-rg|eYf#{E2(0?=eEndk_(qpE)xylooc1goXJic2 zQ(Af^2pTa-Dk=k64sItnfGnVZ6Ofg1q$6U>exqNNZqFA~O;5eDbjhU|DOWTW?*ft= zmt0S-nsM>zsdr(SpWM~1PkmxiBz2ObTzSux8!Hw6yZNL(5uaUKH5Fij(iRV0uC2<{$Cmyu_(hjbGt=U`s zA+R?6xAfjW%$C(XhlHoi|6k-#_~_iM->2o)*6iAmRC{;Yt5{uW>F?X}-xsyUiF>ZS z8!lUOmGS>8hwoQ}{S7lD7JmNHd`4=Y@86|BYFWi{2}X!3kX(Rp8dUIjn6+P$$AK$X RG=QFD@O1TaS?83{1OP@}c@Y2r literal 0 HcmV?d00001 diff --git a/pyladies/turtle/turtle-hexagons.png b/pyladies/turtle/turtle-hexagons.png new file mode 100644 index 0000000000000000000000000000000000000000..04e329742b6d048f5531a3b8eb9d10b7c9b82af8 GIT binary patch literal 1735 zcmai#c~DbV7{y;8O^GeqreFmNo$b%s>!?q!I-etfUGe38o2K+^9mqbipzK zSq({`(7^_m24$^LK+z&h1Qecw29QO96_Mh?B2uLHCg{*{I{o9#&3*aq`R+UKchCDN zcw?aH5{o4Wf|#hr}ftxuMJHe zo->N~kxG$ZH-;9mCzS|OD>485yCkhl8X;*ON_gPY8a}#~!$C9WWZpCV42||(H78`AB;27Gy8NGR?!EU!K)D8;eh+>guHIT&FlT_KHJT^Mz$~?nb z&2niFCS2Zp#~trU#zaST*ykv)GSi6Kiy;(u{O6=A!ULtuSc1fX(`NVZ&J$0@We2k2P#@E6#;8YhMnQQZ=FTR|;P?ux=6Ybh3L!WWAx)7^x{z&C1du zydKZ=d{HjkNbM1`8#>!YNu}d_w^ZD~dXkAP%4R$!j`Xy44%;>=2vKg9s4(EOow0;E zXVA^4jc0~}KR6%N=}yKG3SkfbqHKM^N@kWeb!8Q?X}_8k54WZa7)#6LnO&X?TjkZ$ zNqoUi@!K}xIJYflp!KXyg8ebkPn$FrbJ3GRhkNnhQ8V5dKSrTvfk_CMbcE#&1c{~9 zG`5%uoH<%e?W8FMZ1Ewx79m5a4cb%PMM)GaD!5A(&Ct4%#Jivw3jS}i*Ie}WT`H@1 zHeO^?5LIi#H}~1W&>N_Zvl#uPfD9dsL1|9kEG@+5wuZ{O&e%D9p*OClEMf4w?`_~q zn%p?l{pZjIXq}+&`f&KHbt9!}ecAAPCnygk*uw1fC{qBOO4X(-v%4rOgtaAb)4RFP zPwk|W181jdL?42R5s{Zwz<8?yr`JJjVow__>5|nPp>_YoEvdoi$tG%&Cw*}=>4^v#z0f)^a4k&={FWQN-(># zz|pw9Q=XoqzoU-YBa&NooP8Hp=FE!zU~1)viNT33Y9CqPY%GVfD{&w<`1mG@9ONN0Xgu7b8fcO zpkGdyJp~3oKw`7zCwK&5-45VQ?6n#DZTl`w++v?}H zL3xI`ZOm57=Jf5J8XTRB`QP+^>kART`ZDH-nMwXlHO&!xiV)WNjsE59BEF!Z|^vAH7E$QT~yoie`@aYW4_Xk_4msgI^-s^7+$Te z7rFad&_FEN5QdH=>A=vLh@MiH+`CIxpZfgw{x12~w-$bvy>_Yc!@4rL?u`;qWQfpe zmEW?y7oJO;KkQ{*+4qu7s$X&0Y@6dH=Ic3r+QA$NbS=!0Kr4angj=TnlKE4G;-kMe S!j1!jfWgz%&t;ucLK6Uwvx~0) literal 0 HcmV?d00001 diff --git a/pyladies/turtle/turtle-square.png b/pyladies/turtle/turtle-square.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e3e29e38b6e79efc67e4094230b132d942dee0 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^IY6As!2~4LxhH}In2Vh}LpV4%Za?&Y0OWEOctjR6 zFz^e3Fr(t^PsTvOXPz#OAr-gY-f`q}Fc5GER4)Fn9iDWtS5|jw<$s1l#yTF-Yq$EI zza{9^=LvWD-x&aUcRf2^#LnqkJK4Q^av43CR7Ne&R%9DIgF?L*cJ$qH-xt^51lcnIs zbI&eYCf`~0_U_ze@2ij4wM{MW^S^BVptbD)J4Xi=n_v#UU&iq2n&PACom;$sK4$QA L^>bP0l+XkK7}jnw literal 0 HcmV?d00001 diff --git a/pyladies/turtle/turtle-squares.png b/pyladies/turtle/turtle-squares.png new file mode 100644 index 0000000000000000000000000000000000000000..e76e8b804a72c66a2791042877f0954a1d0eab19 GIT binary patch literal 890 zcmeAS@N?(olHy`uVBq!ia0vp^%|Kkv!2~4N|4Fd}Qq09po*^6@9Je3(KLBz$3p^r= z85sD5K$uZ+_9tVY5?N0d$B>F!Z|9!OV^QRBIr!**{m$YJqpoG?Rmp{taj}bCmdUq9 z&fSw6?Zjkc$EYHpqR^%$&367 zfu-_(-L4;R?-wzLJN7=D?@u`*G+Ng^xABPLozmS?SxfXK0q zj{e^j%L8BR`tLHMwEuB*a6jXTcQd~Ij!Cs?>&{$o_22QA6DqP(<&6CIm|jW^eqoaS zLS?EEgY(B1G2w%>8jIv#%U@qA)&ttuk1|KRqOihcXmTC&}=?6=^FW<0FP!|G?o z*6cAoq|9w)`hh(s?h6CG6%f6nJ$~D{von+vc+B@9%_~!<$dq$Zh8| zn|WM(uC*`2dtJHXA96P7O9O@C&DZBNg%{`4Y!^~lZlJjxsIWXYWv-1J)9vl;Zh8-= zZdr9@8>iIyq{Tgf-h1Zn;5a<-rYO(j!>>1O3NCAVb1!wh>9%Jfp_SY_ALq4S`8qAS zJxXtGW~W!QqF?Z@NdXdzvkZEA_U~5jlfJxrW#c(9_Z~mJa~JflJe;h~cDQ1~{JYBX z(>J!q=4WQNCdy{K*mt?%I9H)}gU1_&ZAw>O^{ezp_o}{d&+j|9m(Q>Bb%Wa8h~)wk z&%fBx{!zleUr2#_V#d=R_Ik%}MZ43Ft!w%ChH?FyDE}8j zPmf1tYR^3Wut#~+Y(2W^-vQwX3W*Om(>8MWW29hc;sz)07q8e`_Z)w|o7)MPYZw?j MUHx3vIVCg!0Qz5kZvX%Q literal 0 HcmV?d00001 diff --git a/pyladies/turtle/turtle-stairs.png b/pyladies/turtle/turtle-stairs.png new file mode 100644 index 0000000000000000000000000000000000000000..e6afc1f7cebc907b8541b7ad6c07a7304cc45aae GIT binary patch literal 1055 zcmeAS@N?(olHy`uVBq!ia0y~yV2lUiG!7=9i0dN0%|ME|*vT`5gM;JtL;nXrE@y#9 zWHAE+zYqvBD$f373{-N+)5S5Q;?~={j$DTfL|iZ0o&2}`kBo(hl2i1os&h;%^&dY? z=JUDD`{3+h4u(>OD~ti`4zlPBbUw0*D~w`OU1S^j8!eU#e)O;0@a|W^i}%;xF?{3L z&3vb@)*`QegY|*AlNa(G_;-bI+I_)Wa)qu2XQZx`zSz6a>cFJ#!<_GhuQ0yhE`BHL zAcfs}pmjJUN*S;@80tV|cS8J@PQ@ zqin*uwTc#z46hhgFfZV1umUrn6r7L5KvhVL1kf-fqZjZUSjwaPK($kG0pFRerYv)G za7HIi2?yC8+~JHj0vgu03C_{SW;Z!eiq|T1*Czx%z8A0Gna=ad;QF;>Hg#^yČtverec +

    Teď se vrátíme do základní školy a zkusíme si napsat program, +který vypočítá obsah a obvod čtverce, u kterého známe délku strany.

    +

    Vytvoř si v editoru nový soubor a ulož ho do adresáře pro dnešní lekci +pod jménem ctverec.py. +Zkus do něj napsat program, který spočítá a vypíše obvod a obsah čtverce +se stranou 356 cm.

    +

    Po spuštění by se mělo vypsat něco jako:

    +
    Obvod čtverce se stranou 356 cm je 1424 cm
    +Obsah čtverce se stranou 356 cm je 126736 cm2

    Pro připomenutí, obvod čtverce se stranou a +se dá vypočítat jako O = 4a +a obsah jako S = a².

    +

    Matematika!

    +

    Doufám, že tenhle příklad nikoho neodradí, +ale „počítač“ je holt od slova počítat. +Není třeba se děsit; +na základy programování si vystačíme s matematickými +znalostmi ze základní školy.

    +

    Výsledky by měl spočítat Python; číslo 1424 nebo 126736 přímo do programu nepiš.
    +Jestli si nevíš rady, podívej se na program printing.py +z lekce o print, kde jeden řádek dělá něco podobného.

    +

    Až budeš mít program hotový, nebo až budeš chtít vyzkoušet rozepsaný kousek, +spusť ho:

    +
      +
    • pokud ti už na začátku příkazové řádky nesvítí (venv), +aktivuj si virtuální prostředí,
    • +
    • pomocí cd donaviguj do adresáře s programem,
    • +
    • zadej python ctverec.py.
    • +
    +

    Funguje? Jestli ne, oprav ho a zkus to znovu! +Když už jsi v příkazové řádce ve správném adresáři, spuštění znamená zadat +znovu příkaz python ctverec.py. +Abys to nemusel/a celé psát, můžeš se k předchozímu příkazu vrátit +pomocí šipky nahoru, .

    +
    +

    Řešení

    + + +

    Menší čtverec

    +

    Jestli všechno funguje, zkus změnit program tak, +aby počítal obsah a obvod čtverce o straně 123 cm.

    +
    +

    Řešení

    + + +

    Proměnné

    +

    Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? +Baví tě přepisování čísel? +Kdyby byl program delší (několikastránkový), +jak bys zajistil/a, že jedno z těch čísel nepřehlédneš?

    +

    Existuje způsob, jak program napsat, +aniž bys musela pokaždé přepisovat všechna čísla: +stranu čtverce si „pojmenuješ“ a potom používáš jenom její jméno. +V Pythonu na pojmenovávání hodnot slouží proměnné (angl. variables). +Používají se takto:

    +
    strana = 123
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Neboli: napíšeš jméno, pak rovnítko a za rovnítkem výraz, +jehož hodnota se do proměnné přiřadí. +Když potom napíšeš jméno proměnné ve výrazu, +použije se zapamatovaná hodnota.

    +

    Je zvykem dát před i za rovnítko po jedné mezeře.

    +

    To nás vede k jedné ze základních programátorských +zásad: „neopakuj se“ (anglicky Don't repeat yourself, DRY). +Když se někde opakuje stejná hodnota, stejný výraz +nebo stejný kus kódu, +dobrý programátor +ten kus programu pojmenuje +a dál pak používá jen jméno. +Často se totiž stává, že je program potřeba změnit – +buď je v něm chyba nebo se změní zadání. +A potom je mnohem jednodušší změnu udělat jen na jednom místě.

    +

    Kromě toho dobrá jména usnadňují čtení programu: +u 4 * 183 není moc jasné, co ta čísla znamenají. +Výraz 4 * strana je na tom mnohem líp.

    +

    Kruhy

    +

    Tohle je příklad navíc! Klidně ho přeskoč.

    +

    Změna zadání! +Zkus program doplnit tak, aby kromě čtverce počítal +i obvod a obsah kruhu se stejným poloměrem, +jakou má čtverec stranu.

    +

    Pro připomenutí, obvod kruhu s poloměrem r +je o = 2πr, obsah S = πr² +a π je zhruba 3,1415926.

    +

    Všechna čísla, která matematici označují jen jedním +písmenkem (klidně řeckým), vhodně pojmenuj.

    +

    Komentáře

    +

    Program si teď zpřehledníme komentářem. +V Pythonu komentář začíná dvojkřížkem (#), +za který můžeš napsat úplně cokoliv – až do konce +řádku bude Python všechno ignorovat.

    +

    Komentáře jsou důležité: programy nečte jen počítač, ale i lidé. +Do komentářů si můžeš poznamenat, co dělá celý program, +vysvětlit, jak funguje nějaká složitější část, +nebo vyjasnit něco, co není jasné přímo z programu.

    +

    Vždycky, když píšeš program, snaž se vžít do role někoho, +kdo potom ten program bude číst, +a všechno, co by mohlo být nejasné, upřesnit v komentářích. +(Nejčastěji to budeš číst sám/sama, třeba po několika měsících, +takže tím pomáháš sám/sama sobě!)

    +
    # Tento program počítá obvod a obsah čtverce.
    +
    +strana = 123  # v centimetrech
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Píšeš-li komentáš na stejný řádek jako kód, je zvykem před # dát dvě +mezery (nebo i víc). +Za # pak patří právě jedna.

    +

    Načítání vstupu

    +

    Nakonec se podíváme, jak zařídit, aby číslo nemuselo být +zapsáno v programu, ale aby ho mohl uživatel zadat sám.

    +

    Stejně jako když ses naučil/a používat print +i tady jen řeknu, že na to použijeme funkce. +Detaily si vysvětlíme později; +pro teď to budou kouzelná zaříkadla.

    +

    Pozor, záleží na typu hodnoty který chceš získat: text nebo číslo. +Vybírej pečlivě!

    +
      +
    • Chceš-li načíst text, použij:

      +
      promenna = input('Zadej text: ')
      +
    • +
    • Chceš-li načíst celé číslo, použij:

      +
      promenna = int(input('Zadej číslo: '))
      +
    • +
    • Chceš-li načíst desetinné číslo, použij:

      +
      promenna = float(input('Zadej číslo: '))
      +
    • +
    +

    Místo textu 'Zadej …' se dá napsat i jiná výzva. +A výsledek se samozřejmě dá uložit i do jiné proměnné než promenna.

    +

    Hotový program může vypadat takto:

    +
    # Tento program počítá obvod a obsah čtverce.
    +
    +strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +
    \ No newline at end of file diff --git a/pyladies/venv-setup/dirs.png b/pyladies/venv-setup/dirs.png new file mode 100644 index 0000000000000000000000000000000000000000..5126a1ec959266b389419bb4812e0a96dde02713 GIT binary patch literal 3429 zcmai1X*3&JyN*vwYiK^yRLY@62ScftTj#4dsJUuZw9%kM)I3Cj9Mp+fQ4}3g+Cxn# zH795dMbhHXQjIZYLI{!Rrgze0;rD8 zj>$D`L`OxrcCl=~ zUawVh^YbC3>OcQ%Tz*wmH9fXGTzvJJWZ30qjd6JtmwjMmWAmX=J!<=ht-U?a-QE4R ztLyZTi>qsXK>^6mQ&?DdbJEMrEx`UD#)N;ua5T`2yOfugM`g0KP-1VGkc@CsM zOY{Wt#*O4_T1rYuRTapR;;a6nU%vb&A%QJZ%AP~Rg<#O0E zkWd48uP#LFS2U?Day=j*fFNV$?k>wKl%u0K3b8Dx$UG#ZHc$5Q9EnJzBnc|Wh_ku{ z6ZiHa!otG(zODhC79cARjLp7dFGjHUN9wCF7z|{j1Y}dJbG(AopDv-6s-B;hcLM@> z$*!cubz-sDukdk2SRy}S<}z<*#c>Dk$88XB3r?0ggK#`%-x512blwpV*pW=&0v5~;4Xwy#mW(zX;T z$QpfRZL;^-jK0g0!+8}I(b%n5)FO6RUPSDDvEcU*5kEIq zVG^rT?eg}F-k}nYj7171Z1PTY=5vZ#Fjc$Lt358ohv@O4sg`=Jf3nVJnL5|&)fp#Q zHD(2cQbh5!8ymqaBt9YZN?%So_y7u<={mZn>z}9XlE$?C8RmkI; zCt{wgm1`Mr=(M78VkEJY12qKaQ(=(vY!; zgH7uJyix3Zxj1iY>!BR@KBKgppsimT>dI(JprM9Y`*=YGMK(BoTY$kvD#R{|ol-C{ zm|xyXNlB^k?(`@NS@0UpSd?Habv|2X!q4(9%Yw_UshcbLJO0Duwe~M(OurkVm}Jui z)O-Ah@nKMx%oJxL5fu0*-Rt!J-d;{==}?gm(#p)NHz(`5;~~5_P!=>LValJ@+wJO; z0P>4NAXraoNjb))eN+j@Lv!#5$I}KK^M?(A8bq}d12N6PbJAidKH$?xv7he09sIZ7 z;$itrN?k+a9_z{&x$*^Ub{yjj2jXfTeSZ$(iXanq_@ngG+-o+kp4u_aYN1p=Ht(~> zalf!6-?&_B76sOO%_c|ufPQ@K1GLO5&YKn6OLa5a5N4MekL$Das;?1*|9eF#Z;gOB}RAc zUSsKIRcx(a4lvrh8`zbs6~+ug0w_4fM_di-(4_hf8VXYMTT;lLv2eKZ%$ds9(SrU6 zfSG>&bRdt~2W@!jYcfO^*{QGMiKB}pq3w5DOm~S&3&*2`^ z{--yS-Yyxt*%(Wr4rz(#o+!OgKSyo>wxJ1eXV&*KX^K42fcvw|Z!I8UC3<+GOFTUj ziXud~aQlTk4iJQ$&)6X{&GwT>9^Vw_20CGKmA3K2tiDxIm!?3Ozl(Ba=730c_GqVl zc_R>df6d@@dP9k#FJ+;FxRU9@9PFr+EO1W0kBV80Ou~-ISsHeBF9H#J?-d-a zFd3y#)ay2&1dD)>d^gZ?67>ry_ZZ&wo3v~+2z9I*7zN1asx8TMD@?iX?pJu2TKqou z%;x1>nKz7cqSrg`Hv07Tsm;FDmI;4+yj1AKBH6;KGR661n@^gh`d_T)KOYXglSc)Q z+ja-}en~6B%sDgxLvKa&_|hpsTInCWai)2**+>Aj>FL58;|-l#Mw6m`jIE<*SO)7e zdj-jR90>@4wQf<+JkSzIPpjV1j%X@V3K>1!#yP6I>FI|UXZgnPqbCZB_WrWOAD}!* zF7hcPJ{{;Y7)5+Lvgzv7o*cbj(TT=jpz?+}z&HE;|@|7Rurz2N>y sgMUBs|2)0*<#BY$m-qf%9K%sG+Q92P(!@h~UnGE)xgEInhHvtJ0dght%>V!Z literal 0 HcmV?d00001 diff --git a/pyladies/venv-setup/index.html b/pyladies/venv-setup/index.html new file mode 100644 index 00000000..5cbdb5d7 --- /dev/null +++ b/pyladies/venv-setup/index.html @@ -0,0 +1,110 @@ +

    Nastavení prostředí

    +

    V této sekci si připravíš adresář, do kterého budeš ukládat soubory +k začátečnickým kurzům Pythonu, a aktivuješ si virtuální prostředí.

    +

    Příprava adresáře

    +

    Programátoři vytváří spoustu souborů, a víc než u mnoha jiných uživatelů +počítače záleží na tom, kde jsou ty soubory uložené.

    +

    Níže uvedený postup zdaleka není jediná možnost, jak si organizovat soubory. +Když ale použiješ tenhle ozkoušený způsob, +může to hodně zjednodušit život těm, kteří ti budou pomáhat +s případnými problémy.

    +

    Nejdřív vytvoř adresář (složku), ve kterém budeš mít soubory ke kurzu Pythonu. +Může to být třeba naucse-python ve tvém domovském adresáři. +(Můžeš ho pojmenovat i jinak, ale naucse-python používají příklady níže.)

    +

    Zvolený adresář po vytvoření nesmíš přesouvat jinam. +Proto ho nedoporučuji vytvářet na Ploše.

    +

    Kdybys někdy adresář přece jen přesunul/a jinam, +přestane fungovat virtuální prostředí, které za chvíli vytvoříme. +Musel/a bys ho smazat a vytvořit nové.

    +

    Po vytvoření adresáře si poznamenej, kde přesně je. +Budeš ho potřebovat na celý zbytek kurzu i na případné navazující kurzy.

    +

    Adresář pro každou lekci

    +

    Nový adresář je zatím prázdný. +To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější +mít obsah zorganizovaný.

    +

    Pro začátek si budeme tvořit nový podadresář pro každou lekci tohoto kurzu. +Aby byly tyhle adresáře hezky seřazené, budeme je číslovat: +tahle první lekce bude mít číslo 01, +příště si vytvoříš adresář 02 a tak dále.

    +

    Všechny budou v tvém novém adresáři, který jsi vytvořil/a před chvilkou.

    +

    Adresář 01 si vytvoř už teď. +(Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

    +

    Přepnutí

    +

    Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, +ve kterém jsi právě vytvořila 01 (t.j. ne přímo do 01). +Například:

    +
    $ cd naucse-python
    +

    Pak zkontroluj, že jsi na správném místě:

    +
      +
    • Pomocí příkazu pwd (na Windows cd) zkontroluj, +že opravdu jsi v nově vytvořeném adresáři.
    • +
    • Pomocí příkazu ls (na Windows dir) zkontroluj, +že v něm je podadresář 01.
    • +
    +

    Například:

    +
    +

    Unix (Linux, macOS)

    $ pwd
    +/home/helena/naucse-python
    +
    +$ ls
    +01
    +
    +

    Windows

    > cd
    +C:\Users\Helena\naucse-python
    +
    +> dir
    + Directory of C:\Users\Helena\naucse-python
    +05/08/2014 07:28 PM <DIR>  01
    +

    Virtuální prostředí

    +

    Teď nainstalujeme virtuální prostředí pro Python.

    +

    Virtuální prostředí je něco, co nám zajistí, že se všechny počítače budou +chovat zhruba stejně. +Až ho zprovozníme, nebudeme potřebovat instrukce zvlášť pro Linux, +zvlášť pro Windows a zvlášť pro macOS.

    +

    V budoucnu využijeme druhou výhodu: každé virtuální prostředí je oddělené od +ostatních, takže když doinstalujeme nějakou knihovnu (rozšíření pro Python), +projeví se to jen v jednom virtuálním prostředí. +Pokud by se při práci na projektu něco pokazilo, neohrozí to další projekty +ve tvém počítači.

    +

    Jak na to? +Na každém systému jinak!

    +
      +
    • normální Linux (pokud jsi přeskočil/a instalaci Virtualenv):

      +
       $ python3 -m venv venv
      +
    • +
    • starší Linux (pokud jsi musel/a instalovat Virtualenv):

      +
       $ virtualenv -p python3 venv
      +
    • +
    • macOS:

      +
       $ python3 -m venv venv
      +
    • +
    • Windows:

      +
       > py -3 -m venv venv
      +
    • +
    +

    Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. +Můžeš se podívat dovnitř, ale neukládej tam své soubory a nikdy tam nic neměň!

    +

    Zkontroluj si, že 01 a venv jsou pěkně vedle sebe:

    +
    +

    Unix

    $ ls
    +01
    +venv
    +
    +

    Windows

    > dir
    + Directory of C:\Users\Helena\naucse-python
    +05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:38 PM <DIR>  venv
    +

    V grafickém prohlížeči souborů to vypadá např. takto:

    +

    (adresáře '01' a 'venv' vedle sebe)

    +

    Aktivace virtuálního prostředí

    +

    Nakonec virtuální prostředí aktivuj:

    +
    +

    Unix

    $ source venv/bin/activate
    +
    +

    Windows

    > venv\Scripts\activate
    +

    Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky +(před $ nebo >) objevit slovo (venv). +Tak poznáš, že je virtuální prostředí aktivní.

    +

    Aktivační příkaz si zapiš. +Bude potřeba ho zadat vždycky, když pustíš příkazovou řádku, +ve které budeš zkoušet své programy.

    \ No newline at end of file diff --git a/pyladies/while/index.html b/pyladies/while/index.html new file mode 100644 index 00000000..754c2688 --- /dev/null +++ b/pyladies/while/index.html @@ -0,0 +1,98 @@ +

    While

    +

    Kromě cyklu for máme ještě druhý typ cyklu: while (angl. dokud). +Na rozdíl od for, kde předem známe počet opakování, +se while používá, když cyklus závisí na nějaké podmínce. +Tělo cyklu se opakuje, dokud je podmínka splněna. +Zkus si naprogramovat následující postup pro zubaře:

    +
      +
    • Řekni, aby pacient řekl „Ááá“, a počkej na odpověď
    • +
    • Dokud pacient neřekl „Ááá“:
        +
      • Vynadej pacientovi
      • +
      • Znovu počkej na odpověď
      • +
      +
    • +
    +
    odpoved = input('Řekni Ááá! ')
    +while odpoved != 'Ááá':
    +    print('Špatně, zkus to znovu')
    +    odpoved = input('Řekni Ááá! ')
    +

    Ale pozor! Je velice jednoduché napsat cyklus, +jehož podmínka bude splněna vždycky. +Takový cyklus se bude opakovat donekonečna.

    +
      +
    • Dokud je pravda pravdivá:
        +
      • Napiš náhodné číslo
      • +
      • Napiš hlášku
      • +
      +
    • +
    +
    from random import randrange
    +
    +while True:
    +    print('Číslo je', randrange(10000))
    +    print('(Počkej, než se počítač unaví...)')
    +

    Program se dá přerušit zmáčknutím +Ctrl+C.

    +

    Tahle klávesová zkratka vyvolá v programu chybu +a program se – jako po každé chybě – ukončí.

    +

    A nakonec, existuje příkaz break, který z cyklu „vyskočí“: +začnou se hned vykonávat příkazy za cyklem.

    +
    while True:
    +    odpoved = input('Řekni Ááá! ')
    +    if odpoved == 'Ááá':
    +        print('Bééé')
    +        break
    +    print('Špatně, zkus to znovu')
    +
    +print('Hotovo, ani to nebolelo.')
    +

    Příkaz break se dá použít jenom v cyklu (while nebo for) +a pokud máš víc cyklů zanořených v sobě, vyskočí jen z toho vnitřního.

    +
    for i in range(10):  # Vnější cyklus
    +    for j in range(10):  # Vnitřní cyklus
    +        print(j * i, end=' ')
    +        if i <= j:
    +            break
    +    print()
    +

    Ale zpátky k while! +Dokážeš napsat tenhle program?

    +

    Oko bere

    +
      +
    • Začínáš s 0 body.
    • +
    • Počítač v každém kole vypíše, kolik máš bodů, +a zeptá se tě, jestli chceš pokračovat.
    • +
    • Pokud odpovíš „ne“, hra končí.
    • +
    • Pokud odpovíš „ano“, počítač „otočí kartu“ +(náhodně vybere číslo od 2 do 10), vypíše její hodnotu a přičte ji k bodům.
    • +
    • Pokud máš víc než 21 bodů, prohráváš.
    • +
    • Cílem hry je získat co nejvíc bodů, ideálně 21.
    • +
    +
    +

    Řešení

    + + +
    \ No newline at end of file From cc4d91d35242a9e4508ae7df0d3de701ffb2567e Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 4 Jan 2022 13:29:14 +0000 Subject: [PATCH 02/31] Compiled From 4a53c8ffdd9640da394861f1a76a977debb6397e Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 4 Jan 2022 13:40:51 +0000 Subject: [PATCH 03/31] Compiled From fb3df685ef05cd8844d77eea5a07dfd8d54bc757 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 4 Jan 2022 13:42:01 +0000 Subject: [PATCH 04/31] Compiled From b7ccfe85b5b2890dfba4bc214ee56172fa875249 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 11 Jan 2022 08:17:03 +0000 Subject: [PATCH 05/31] Compiled --- meta/branching/branch1.png | Bin 0 -> 5370 bytes meta/branching/branches.png | Bin 0 -> 6496 bytes meta/branching/index.html | 166 ++++ meta/branching/merge.png | Bin 0 -> 7185 bytes meta/cmdline/index.html | 276 +++++++ meta/cmdline/windows-cmd-properties.png | Bin 0 -> 23872 bytes meta/course.json | 218 ++++- meta/git-collaboration-2in1/diagram.png | Bin 0 -> 40629 bytes .../gh-workflow-diagram.svg | 346 ++++++++ meta/git-collaboration-2in1/index.html | 227 ++++++ meta/install/index.1.html | 80 ++ meta/install/index.html | 12 + meta/install/linux.html | 63 ++ meta/install/macos.html | 15 + meta/install/windows.html | 26 + meta/install/windows_32v64-bit.png | Bin 0 -> 36230 bytes meta/install/windows_add_python_to_path.png | Bin 0 -> 70057 bytes meta/notebook/index.html | 116 +++ mi-pyt/cmdline/index.html | 276 +++++++ mi-pyt/cmdline/windows-cmd-properties.png | Bin 0 -> 23872 bytes mi-pyt/course.json | 215 ++++- mi-pyt/git-collaboration-2in1/diagram.png | Bin 0 -> 40629 bytes .../gh-workflow-diagram.svg | 346 ++++++++ mi-pyt/git-collaboration-2in1/index.html | 227 ++++++ mi-pyt/http/index.html | 132 +++ mi-pyt/http/url-anatomy.svg | 461 +++++++++++ mi-pyt/install/index.1.html | 62 ++ mi-pyt/install/index.html | 70 +- mi-pyt/install/linux.html | 63 ++ mi-pyt/install/macos.html | 15 + mi-pyt/install/windows.html | 26 + mi-pyt/install/windows_32v64-bit.png | Bin 0 -> 36230 bytes mi-pyt/install/windows_add_python_to_path.png | Bin 0 -> 70057 bytes mi-pyt/testing/index.1.html | 564 +++++++++++++ mi-pyt/testing/index.html | 764 +++++------------- pyladies/course.json | 2 +- 36 files changed, 4152 insertions(+), 616 deletions(-) create mode 100644 meta/branching/branch1.png create mode 100644 meta/branching/branches.png create mode 100644 meta/branching/index.html create mode 100644 meta/branching/merge.png create mode 100644 meta/cmdline/index.html create mode 100644 meta/cmdline/windows-cmd-properties.png create mode 100644 meta/git-collaboration-2in1/diagram.png create mode 100644 meta/git-collaboration-2in1/gh-workflow-diagram.svg create mode 100644 meta/git-collaboration-2in1/index.html create mode 100644 meta/install/index.1.html create mode 100644 meta/install/index.html create mode 100644 meta/install/linux.html create mode 100644 meta/install/macos.html create mode 100644 meta/install/windows.html create mode 100644 meta/install/windows_32v64-bit.png create mode 100644 meta/install/windows_add_python_to_path.png create mode 100644 meta/notebook/index.html create mode 100644 mi-pyt/cmdline/index.html create mode 100644 mi-pyt/cmdline/windows-cmd-properties.png create mode 100644 mi-pyt/git-collaboration-2in1/diagram.png create mode 100644 mi-pyt/git-collaboration-2in1/gh-workflow-diagram.svg create mode 100644 mi-pyt/git-collaboration-2in1/index.html create mode 100644 mi-pyt/http/index.html create mode 100644 mi-pyt/http/url-anatomy.svg create mode 100644 mi-pyt/install/index.1.html create mode 100644 mi-pyt/install/linux.html create mode 100644 mi-pyt/install/macos.html create mode 100644 mi-pyt/install/windows.html create mode 100644 mi-pyt/install/windows_32v64-bit.png create mode 100644 mi-pyt/install/windows_add_python_to_path.png create mode 100644 mi-pyt/testing/index.1.html diff --git a/meta/branching/branch1.png b/meta/branching/branch1.png new file mode 100644 index 0000000000000000000000000000000000000000..837c74e32fa065a767604897277ab7a5dbe0bee1 GIT binary patch literal 5370 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 LEyZ$qi;({T4D~@Z literal 0 HcmV?d00001 diff --git a/meta/branching/branches.png b/meta/branching/branches.png new file mode 100644 index 0000000000000000000000000000000000000000..05b37b3c34105fb6d23e80e0e1f2c63764bebd24 GIT binary patch literal 6496 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 wuHwI68Ir;Q literal 0 HcmV?d00001 diff --git a/meta/branching/index.html b/meta/branching/index.html new file mode 100644 index 00000000..cdf5fd32 --- /dev/null +++ b/meta/branching/index.html @@ -0,0 +1,166 @@ +

    Větvení v Gitu

    +

    Takže, Git už znáš! +Teď to začne být trošičku složitější :)

    +

    Programátoři občas potřebují pracovat na dvou +věcech zároveň. +V projektu do práce se objeví se chyba, +která musí být opravená +ještě dnes, tak programátor/ka opustí, co zrovna dělá, +vrátí se k nějaké „stabilní” verzi, opraví chybu +a odešle ji zákazníkům. +A pak se vrátí k tomu, co dělal/a předtím – jen ještě +musí zakomponovat opravu chyby i do verze, na které +pracuje dlouhodobě.

    +

    Git na to má takzvané větve (angl. branches). +Na jedné „větvi” se pracuje, ale je možné se přepnout do +jiné (třeba starší) větve, udělat pár změn +a pak se zase přepnout do nové větve a +pokračovat dál nebo sloučit změny.

    +

    Větvení využijeme i při spolupráci více lidí – každý +dělá na vlastní větvi a když přijde čas, +tak se různé změny sloučí dohromady.

    +

    Podívej se, jaké máš větve ve svém repozitáři. +K tomu slouží příkaz git branch:

    +
    $ git branch
    +* master

    Je tam jenom jedna a jmenuje se master +– to je tradičně jméno „hlavní” větve.

    +

    K vytvoření nové větve znovu použiješ +git branch, jen tomu příkazu dáš navíc +jméno nové větve. +Třeba budeš chtít k básničce doplnit jméno autora, +tak větev pojmenuješ doplneni-autora.

    +
    $ git branch doplneni-autora
    +$ git branch
    +  doplneni-autora
    +* master

    Tenhle příkaz sice udělal novou větev, +ale nepřepnul do ní. +Hvězdička ve výstupu z git branch ukazuje, +že stále pracuješ v master. +Na přepnutí budeš potřebovat další příkaz:

    +
    $ git checkout doplneni-autora
    +Switched to branch 'doplneni-autora'
    +$ git branch
    +* doplneni-autora
    +  master

    Tak. Teď jsi „ve” větvi doplneni-autora. +Doplň nějaké jméno na začátek souboru basnicka.txt, +a pomocí git add a git commit udělej novou revizi. +Pak koukni na gitk --all, jak to vypadá:

    +

    Výstup programu `gitk` s větví doplneni-autora

    +

    Aktuální větev – doplneni-autora – je +zvýrazněná tučně a starší master je stále +na původní revizi.

    +

    Opusťme teď na chvíli práci na doplňování autora. +Vrať se do větve master a vytvoř z ní +větev doplneni-jmena. +Pak se na tuhle novou větev přepni.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git branch doplneni-jmena
    +$ git checkout doplneni-jmena
    +Switched to branch 'doplneni-jmena'
    +$ git branch
    +  doplneni-autora
    +* doplneni-jmena
    +  master

    Doplň jméno básně na začátek souboru (tedy na stejné místo, +jako je v druhé větvi název) a pomocí +git add, git commit ulož revizi. +Všechno zkontroluj přes gitk --all.

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu

    +

    Takhle nějak se dá postupovat v situaci popsané v úvodu: +opuštění rozpracované verze, přechod na „stabilní” +verzi master a začátek práce v jiné +části projektu.

    +

    Mezi jednotlivými větvemi se dá podle libosti přepínat, +jen je vždycky dobré před přepnutím udělat novou revizi +(git commit) a pomocí git status zkontrolovat, jestli je všechno +uložené v Gitu.

    +

    Na stejném principu funguje i spolupráce několika lidí +na jednom projektu: je nějaký společný základ +(master) a každý dělá na vlastní větvi, dokud není se svými změnami spokojený.

    +

    A až je některá větev hotová, může se začlenit +zpátky do master. Podívejme se jak na to.

    +

    Sloučení

    +

    Nedávalo by smysl historii projektu rozdvojovat, +kdyby pak jednotlivé větve nešly zase sloučit dohromady. +V Gitu je většinou slučování poměrně jednoduché, ale tento příklad schválně +ukazuje nejsložitější variantu, která může nastat.

    +

    Přepni se zpátky na master +a použij příkaz git merge, který +sloučí jinou větev s tou aktuální. +Příkazu musíš dát jméno větve, kterou chceš sloučit.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git merge doplneni-jmena
    +Updating 1fcd654..5c9bf93
    +Fast-forward
    + basnicka.txt | 3 +++
    + 1 file changed, 3 insertions(+)

    Sloučeno! Ono „Fast-forward” znamená, že +vlastně nebylo co slučovat – jen se do větve +master přidaly nové změny. +Zkontroluj v gitk --all, jak to vypadá.

    +

    A pak zkus sloučit i druhou větev: git merge doplneni-autora. +Tady to bude složitější: pravděpodobně se stane, že změny nepůjdou +automaticky sloučit a ve výstupu se objeví hláška +merge conflict (slučovací konflikt):

    +
    $ git merge doplneni-autora
    +Auto-merging basnicka.txt
    +CONFLICT (content): Merge conflict in basnicka.txt
    +Automatic merge failed; fix conflicts and then commit the result.

    A když ne?

    +

    Jestli se konflikt neobjevil, Git změny sloučil sám. +Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti +někdy „podaří“ konflikt udělat.

    +

    Když nastane konflikt, git status ukáže „both modified“ – tedy že byl soubor +změněný v obou slučovaných větvích:

    +
    $ git status
    +On branch master
    +You have unmerged paths.
    +  (fix conflicts and run "git commit")
    +  (use "git merge --abort" to abort the merge)
    +
    +Unmerged paths:
    +  (use "git add <file>..." to mark resolution)
    +    both modified:   basnicka.txt
    +
    +no changes added to commit (use "git add" and/or "git commit -a")

    V tom případě se na soubor podívej v editoru: objeví +se v něm obsah z obou konfliktních verzí, +společně se značkami <<<<<<<, ======= a >>>>>>>, které upozorňují na +místo kde konflikt nastal.

    +

    Značky ukáže i příkaz git diff, jehož výstup je teď trošku složitější:

    +
    $ git diff
    +diff --cc basnicka.txt
    +index bc7a2de,88e7ea5..0000000
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@@ -1,4 -1,4 +1,8 @@@
    +++<<<<<<< HEAD
    + +Holka Modrooká
    +++=======
    ++ (Lidová)
    +++>>>>>>> doplneni-autora
    +  
    +  Holka modrooká
    +  Nesedávej u potoka

    Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu +jako Python chybové hlášky: tedy aby ti co nejvíce pomohl. +Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se +ti řešení konfliktu co nejvíc usnadnit.

    +

    Proto hlavně nepanikař! +Soubor otevři v editoru a uprav tak, jak by měl vypadat. +Značky jako <<<<<<< smaž; řádky poskládej tak, jak by měly jít za sebou. +(A pracuješ-li na kódu, spusť testy a ověř, jestli všechno stále funguje.)

    +

    Pak soubor ulož a zadej git commit.

    +

    Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“ +(angl. merge commit), které – jako každé revizi – můžeš dát popisek. +Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.

    +
    $ git add basnicka.txt
    +$ git commit
    +[master 884b30a] Merge branch 'doplneni-autora'

    Povedlo se?

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master

    +

    Pokud ano, můžeš staré větve vymazat – všechny jejich +změny jsou v master a nemá na nich cenu +pracovat dál.

    +
    $ git branch --delete doplneni-autora
    +Deleted branch doplneni-autora (was f1cd9be).
    +$ git branch --delete doplneni-jmena
    +Deleted branch doplneni-jmena (was 5c9bf93).
    +$ git branch
    +* master

    Gratuluji, už umíš větvení a slučování!

    \ No newline at end of file diff --git a/meta/branching/merge.png b/meta/branching/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..7f74005ba258ffae89f67f3d376966a9418dbfef GIT binary patch literal 7185 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 Z&KM>ammu_^65P&%Xx-OWd#i$c@_$~mno0lw literal 0 HcmV?d00001 diff --git a/meta/cmdline/index.html b/meta/cmdline/index.html new file mode 100644 index 00000000..6ef6982b --- /dev/null +++ b/meta/cmdline/index.html @@ -0,0 +1,276 @@ +

    Příkazová řádka

    +

    V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, +které programátoři používají na zadávání příkazů. +Na první pohled může vypadat nepřirozeně, ale dá se na ni zvyknout :)

    +

    Příkazová řádka +(respektive program, kterému se říká i konzole či terminál; +anglicky command line, console, terminal) +se na různých systémech otevírá různě:

    +
      +
    • Windows (české): Start → napsat na klávesnici „cmd“ → Příkazový řádek
    • +
    • Windows (anglické): Start → napsat na klávesnici „cmd“ → Command Prompt
    • +
    • macOS (anglický): Applications → Utilities → Terminal
    • +
    • Linux (KDE): Hlavní Menu → hledat Konsole
    • +
    • Linux (GNOME): Super → hledat Terminál
    • +
    +

    Nevíš-li si rady, zkus buď googlit, +nebo se zeptat e-mailem.

    +

    Po otevření konzole tě uvítá řádek, +kterým počítač vybízí k zadání příkazu. +Podle systému bude končit buď znakem $ nebo >, +před nímž můžou být ještě další informace:

    +
    +

    Unix (Linux, macOS)

    $
    +
    +

    Windows

    >
    +

    Podle systému se potom liší i samotné příkazy, které budeš zadávat.

    +

    Velikost písma

    +

    Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. +V záložce Písmo si pak můžeš vybrat větší font. +

    +

    Screenshot menu příkazové řádky

    +

    Na ostatních systémech hledej v nastavení, nebo zkus +Ctrl++ a +Ctrl+- (příp. se Shift).

    +

    První příkaz

    +

    Začneme jednoduchým příkazem. +Napiš whoami (z angl. who am I? – kdo jsem?) +a stiskni Enter. +Objeví se přihlašovací jméno. Třeba u Heleny by to vypadalo takhle:

    +
    +

    Unix

    $ whoami
    +helena
    +
    +

    Windows

    > whoami
    +pocitac\Helena
    +

    Znak $ nebo > je v ukázce jen proto, aby bylo jasné, že zadáváme +příkaz do příkazové řádky. +Vypíše ho počítač, většinou ještě s něčím před ním, +takže ho nepiš sama! Zadej jen whoami a Enter.

    +

    Stejně tak počítač sám vypíše přihlašovací jméno.

    +

    Aktuální adresář

    +

    Příkazová řádka pracuje vždy v nějakém adresáři (neboli složce, +angl. directory, folder). +Ve kterém adresáři zrovna je, to nám poví příkaz, který se podle systému +jmenuje pwd nebo cd (z angl. print working directory – vypiš pracovní +adresář, resp. current directory – aktuální adresář).

    +
    +

    Unix

    $ pwd
    +/home/helena/
    +
    +

    Windows

    > cd
    +C:\Users\helena
    +

    Aktuální adresář se většinou ukazuje i před znakem $ nebo >, +ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a +(nebo musel/a pracovat na počítači který před $ ukazuje něco jiného).

    +

    Co v tom adresáři je?

    +

    Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) +nám vypíše, co aktuální adresář obsahuje: všechny soubory, +včetně podadresářů, které se v aktuálním adresáři nacházejí.

    +
    +

    Unix

    $ ls
    +Applications
    +Desktop
    +Downloads
    +Music
    +
    +
    +

    Windows

    > dir
    + Directory of C:\Users\helena
    +05/08/2014 07:28 PM <DIR>  Applications
    +05/08/2014 07:28 PM <DIR>  Desktop
    +05/08/2014 07:28 PM <DIR>  Downloads
    +05/08/2014 07:28 PM <DIR>  Music
    +
    +

    Změna aktuálního adresáře

    +

    Aktuální adresář se dá změnit pomocí příkazu cd +(z angl. change directory – změnit adresář). +Za cd se píše jméno adresáře, kam chceme přejít. +Pokud máš adresář Desktop nebo Plocha, přejdi tam. Pak nezapomeň ověřit, +že jsi na správném místě.

    +

    Jsi-li na Linuxu nebo macOS, dej si pozor na velikost písmen: na těchto +systémech jsou Desktop a desktop dvě různá jména.

    +

    Jsi-li na Windows, cd už jsi používal/a – tento příkaz se chová různě +podle toho, jestli něco napíšeš za něj nebo ne.

    +
    +

    Unix

    $ cd Desktop
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd Desktop
    +> cd
    +C:\Users\helena\Desktop
    +

    Poznámka pro Windows

    +

    Pokud přecházíš do adresáře na jiném disku, +například D: místo C:, je potřeba kromě cd +zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    +

    Vytvoření adresáře

    +

    Co takhle si vytvořit adresář na Python? To se dělá příkazem mkdir +(z angl. make directory – vytvořit adresář). +Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě +naucse-python:

    +
    +

    Unix

    $ mkdir naucse-python
    +
    +

    Windows

    > mkdir naucse-python
    +

    Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na +prohlížení adresářů: zjistíš, že adresář se opravdu vytvořil!

    +

    Úkol

    +

    Zkus v nově vytvořeném adresáři naucse-python +vytvořit adresář test +a zkontrolovat, že se opravdu vytvořil.

    +

    Budou se hodit příkazy cd, mkdir a ls či dir.

    +
    +

    Řešení

    + + +

    Úklid

    +

    Teď vytvořené adresáře zase smažeme.

    +

    Nemůžeš ale smazat adresář, ve kterém jsi. +Proto se vrátíme na Desktop. +Ale nemůžeme použít cd Desktop – v aktuálním adresáři žádný Desktop není. +Potřebuješ se dostat do nadřazeného adresáře: toho, který obsahuje +adresář ve kterém právě jsi. +Nadřazený adresář se značí dvěma tečkami:

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop/naucse-python
    +$ cd ..
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop\naucse-python
    +> cd ..
    +> cd
    +C:\Users\helena\Desktop
    +

    Teď můžeš smazat vytvořený adresář naucse-python. +K tomu použij příkaz rm nebo rmdir +(z remove – odstraň, resp. remove directory – odstraň adresář).

    +

    Pozor!

    +

    Příkazová řádka nepoužívá odpadkový koš! +Všechno se nadobro smaže. Takže si dobře překontroluj, že mažeš +správný adresář.

    +

    Na Unixu za tento příkaz musíš napsat ještě jedno slovo: -rv (minus, +r, v). +To je takzvaný přepínač, který příkazu říká, že má smazat celý adresář +včetně všeho, co obsahuje (r), +a že má informovat o tom co dělá (v).

    +

    Obdobně i na Windows je potřeba zadat přepínač, který říká, že má smazat +adresář a veškerý jeho obsah. Tentokrát je to /S (lomítko, S). +Příkaz rmdir se automaticky ujistí, jestli to co mažeš opravdu chceš smazat.

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop
    +$ rm -rv naucse-python
    +removed directory: ‘naucse-python’
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop
    +> rmdir /S naucse-python
    +naucse-python, Are you sure <Y/N>? Y
    +

    Shrnutí

    +

    Tady je tabulka základních příkazů, se kterými si zatím vystačíme:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    UnixWindowsPopisPříklad
    cdcdzměna adresářecd test
    pwdcdvýpis aktuálního adresářepwd
    cd
    lsdirvýpis adresářels
    dir
    cpcopyzkopírování souboru + cp puvodni.txt kopie.txt +
    + copy puvodni.txt kopie.txt +
    mvmovepřesun/přejmenování souboru + mv puvodni.txt novy.txt +
    + move puvodni.txt novy.txt +
    mkdirmkdirvytvoření adresářemkdir test
    rmdelsmazání souborurm test.txt
    del test.txt
    rm -rrmdir /Ssmazání adresářerm -r test
    rmdir /S test
    exitexitukončeníexit

    Příkazů existuje samozřejmě daleko víc. +Dokonce každý program, který máš na počítači nainstalovaný, jde spustit +z příkazové řádky – a to většinou jen zadáním jeho jména. +Zkus, jestli na tvém počítači bude fungovat firefox, notepad, safari +nebo gedit.

    +

    Při učení Pythonu použiješ programy/příkazy jako python a git, které +zanedlouho nainstalujeme. +

    +

    Konec

    +

    Nakonec vyzkoušej ještě jeden příkaz. +Ten, který příkazovou řádku zavírá: exit.

    +

    Jako většina příkazů (kromě pár z těch základních) funguje exit +stejně na všech systémech. +Proto už nebudu používat ukázku rozdělenou pro Unix a Windows.

    +
    $ exit
    +

    Ve zbytku těchto materiálů budeme pro kód, který je potřeba zadat do +příkazové řádky, používat unixovské $. +S touto konvencí se setkáš i ve většině návodů na internetu. +Používáš-li Windows, je dobré si na $ zvyknout, i když ve své +řádce máš místo něj >.

    \ No newline at end of file diff --git a/meta/cmdline/windows-cmd-properties.png b/meta/cmdline/windows-cmd-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb2040b0a9a3ddd60c7965f13b38f64608fc0a6 GIT binary patch literal 23872 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 VS> literal 0 HcmV?d00001 diff --git a/meta/course.json b/meta/course.json index c8822d30..a03fd0ef 100644 --- a/meta/course.json +++ b/meta/course.json @@ -7,9 +7,225 @@ "description": "Návod na přidání kurzu na Nauč se Python", "edit_info": { "branch": "main", - "url": "https://github.com/encukou/naucse-python" + "url": "https://github.com/pyvec/naucse-python" }, + "extra_lessons": [ + "git/install", + "git/branching", + "git/git-collaboration-2in1", + "beginners/install", + "beginners/cmdline", + "intro/notebook" + ], "lessons": { + "beginners/cmdline": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", + "Založeno na tutoriálu Django Girls." + ], + "content": { + "path": "cmdline/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    \n

    Unix

    $ cd naucse-python\n$ mkdir test\n$ ls\ntest\n
    \n

    Windows

    > cd naucse-python\n> mkdir test\n> dir\n05/08/2014 07:28 PM <DIR>  test\n
    " + } + ], + "source_file": "lessons/beginners/cmdline/index.md", + "title": "Úvod do příkazové řádky", + "vars": {} + } + }, + "source_file": "lessons/beginners/cmdline/info.yml", + "static_files": { + "windows-cmd-properties.png": { + "path": "cmdline/windows-cmd-properties.png" + } + }, + "title": "Úvod do příkazové řádky" + }, + "beginners/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install/index.md", + "title": "Instalace Pythonu", + "vars": {} + }, + "linux": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/linux.html" + }, + "license": "cc-by-sa-40", + "slug": "linux", + "solutions": [], + "source_file": "lessons/beginners/install/linux.md", + "subtitle": "Linux", + "title": "Instalace Pythonu – Linux", + "vars": {} + }, + "macos": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/macos.html" + }, + "license": "cc-by-sa-40", + "slug": "macos", + "solutions": [], + "source_file": "lessons/beginners/install/macos.md", + "subtitle": "macOS", + "title": "Instalace Pythonu – macOS", + "vars": {} + }, + "windows": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/windows.html" + }, + "license": "cc-by-sa-40", + "slug": "windows", + "solutions": [], + "source_file": "lessons/beginners/install/windows.md", + "subtitle": "Windows", + "title": "Instalace Pythonu – Windows", + "vars": {} + } + }, + "source_file": "lessons/beginners/install/info.yml", + "static_files": { + "windows_32v64-bit.png": { + "path": "install/windows_32v64-bit.png" + }, + "windows_add_python_to_path.png": { + "path": "install/windows_add_python_to_path.png" + } + }, + "title": "Instalace Pythonu" + }, + "git/branching": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "branching/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/branching/index.md", + "title": "Větvení v Gitu", + "vars": {} + } + }, + "source_file": "lessons/git/branching/info.yml", + "static_files": { + "branch1.png": { + "path": "branching/branch1.png" + }, + "branches.png": { + "path": "branching/branches.png" + }, + "merge.png": { + "path": "branching/merge.png" + } + }, + "title": "Větvení v Gitu" + }, + "git/git-collaboration-2in1": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsali Petr Viktorin a Oskar Hollman, 2015-2017." + ], + "content": { + "path": "git-collaboration-2in1/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/git-collaboration-2in1/index.md", + "title": "Spolupráce a Git", + "vars": {} + } + }, + "source_file": "lessons/git/git-collaboration-2in1/info.yml", + "static_files": { + "diagram.png": { + "path": "git-collaboration-2in1/diagram.png" + }, + "gh-workflow-diagram.svg": { + "path": "git-collaboration-2in1/gh-workflow-diagram.svg" + } + }, + "title": "Spolupráce a Git" + }, + "git/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017" + ], + "content": { + "path": "install/index.1.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/install/index.md", + "title": "Instalace Gitu", + "vars": {} + } + }, + "source_file": "lessons/git/install/info.yml", + "static_files": {}, + "title": "Instalace Gitu" + }, + "intro/notebook": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "notebook/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "modules": { + "katex": "0.7.1" + }, + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/notebook/index.ipynb", + "title": "Notebook", + "vars": {} + } + }, + "source_file": "lessons/intro/notebook/info.yml", + "static_files": {}, + "title": "Notebook" + }, "meta/installing-naucse": { "pages": { "index": { diff --git a/meta/git-collaboration-2in1/diagram.png b/meta/git-collaboration-2in1/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b04ef99767fd294644772ea1c5ee732c072c2d90 GIT binary patch literal 40629 zcmeFZRaDhm*f+XB5d{%JLJ3hCDJ7*57a`pp(hbrb22vu@-6;r2Hz?hWG>CL}*Y~jB z@t*s0amF|o-x_6HC_LW5h}y6uVKkfvAhz7E=D!)v7xu;%&ta&8`u96ECF8LGF9W(tAUr`oNpiIe_we!-LC!b z3xxCkee3`3#Q&?9IQ=i2u6B26Uxa)TGVA}qZQti;3LlY7C$x-)kowgfx8KQ(MC!Ma z?_Xy_-Y@Uh**dm%cEO}Pk)fff8y|+4o12?sVq#V`pK@|?3JB;ZETDLc&~bC0o}cXL z6{=34p$yL&<0bRIUPe0*6BifHl1`wOjP6T$?Yq6bt)6gpyfeqBQFhx$D6u1xk<)6@ zWV)vE`}dW9&4EhQ4Tl>O-CbQ478ZwFGX-NsD1!R`*48G*GzgLNzNZ>d$2mJ<8={HUxb2qy8pp-VRblHO-&7{sI2U`IawK-^wM#C z6h7MPaLkyBimE0;ngEJ8Fjl0*H8e2TRvV+k>5i+;ZQXm>Hr8aJf4c(25C zute+nrww-gHH(OdR8>{!xbOJnGd;#8qCEeCI%L=O?)HISM8t3ey^6eo0vhW3I{wR- z#7_#N72Wj0#IjrR*3CjL@Yn^adc^PjDz3C!l8$BjUQ<)!vbQ+SgqeL?APsRqa;YYC zk(!n^x4fLaAuniYV5}f^ySYW)>{&!aNIsLAs%) z^i*=QKVK{?+PZ^o-Ag~*SRhG?5=FVmc!otFV z1dNJqA8;^yzJLF2WMqW;Ua%BJfQyR@BGl2*v8=4@S-iG64$l5sfui!ES+J_4i%WQv zsMBWOY~%iKbT-@ceKp)W7Z;qQ0@C>S1&)!C^6Eqx8U16$Z10|Q$BA~w);dPYilw9= zk(T4Mn6-)g9xl;ALGgVODp9s}bWgnX^mR6VWG6Qv#U;}RvsMOWzKde}5US+OBf}#P zixlTtLJD6b@Vz7uosHbFKZ5;RQc_Z6q>--f?BBnA;jI{vk&*mvhmw@IcW$E6 z)8~#SYRk*-o}bwHBme#V`&Lg+KG$w=V8Gtqo`i&Cl#e`wmW!)Wt=K3}y)@@=AA&VJ z9FK-3%P4-Ff|;3_f+Edf?N5uO8y14i{dTRO7VMO#r{~rAp3JLPC^#$2%g!z?9#o1-^m)%eK{rmU(_wUy`VcU)7=7I&R zsP~4dA+lImi`6~zVxQ5{zVtkIe)sO3qT^CK4G*i6<|F%I7JG zdq=AZ851+VCLtn1#AK)TC{IK5`}g!*iTwQee?l!S;R#ZlRE>Cq4aI zCv!bzs^`V2$8I}~txUb+#&{&7hQU!iR40W@Nx9w1y`^5`!S*7xuR=mXMm_O#4)bjx z6vo}LN}UB60gb-c)-!c{&z|L^=BTA>lv~*?cJ1u!e19`(yVw?Yu)CH@?%& zIdlH^Blco{fGJeC3@T<$SV82`UNSwF-zCuU$y*NAax;$Bu z+zfd2@z%yneZ664C_X? z)f!AjLvClcw^e^N-P$TDH>-5^=whdp%zC<}-J+OtW31S?=;}d2eEgpRoq}aJXiyO*HHlU6s&CzShE}VPtqX?a8D%qisY)M02Bx7aa?We7h*| zqerBCu8Jr4O?o@=Tz2z`o2#p?`^$1hZXMxt0r}q&5~gxhm@8GBw`!06MSY##$(=Z44TKg-U&Q9Zfj%3QD^n% z@@n6|l6kp|ro1k2ygZueOi;)YrJUiM-qABP2CdSLl>u2)&1Dby8 z*M&qDI5LSSrZ;F7H_-2ebMsZ?Tr4d2r%k?5th=`t``*37qoX7)J0mEI zIkj!!bPCWc#-d;)#;(2LYXcdbqGTRTb-eD!&x?t1w%?o_ z8yp<$?#_c6f{%}n{h0S{)lYE=3FDr4m!nNB8X6j5mE*$+Ysd`=BorX^TGs>U>_K0? zJmz<=fFOWCEP%Q+&LWw}%SBE7+3)mV?dV`c=LmjRQPFNo5HT^Q)%n?0JsGcaa%Dkh zNSuTuPi`@*i%UD#ukl!3z6>WLL!7gca)Ubu>vSH1tzS#@&^!+CBf@1(Xt5qk=I6&U zl&MNaMwXc2tEtzO&HVD_KmUe-xiZfFj1C}%$)&rt_+xzGs;d1lmwlt7$D32tkbry+tBO*}d*&ngq~+uu5RtU349avVvTc0y zbaeh|{kia+M3$?0^m`<#jRk43si~>Dji0ru9fSP1?U#RAj1@s{#m2?aP*ITzc=A4f z{%)ZoqNCua*>Db=3QkC1U?;>69D%io$wN}ojjb&*LPA1(e0IpBY-utv$N$^Q>%0u*7rRC&Aj%# zHw8U@t~D57mb#`UFJvu^OrrbQMmZFtJ6KqTn}_hsP&Js!@8(>5admMySQ`l*V`65W zDK^H&QPa?nN#s>qZHv7debYO3z;PWNYxM8$k1_SB2`rZ9aL%lpoW@sO;rp&{Oks!Y z0(KX<>G*O)N_WP8E79u}MoX<%yPwz!`(|Whya-A8`0+J#=%MOdl>(!!l+;Y~G7XF4 z?OBMW$?}fQ&f1r+LO#3Ij`GtA)T_rIEF~3idxgI}i{h{h-Sc1FccoiR(@)Qm$dn9` zOk{}RQjk~9EDV*ve|zO=sDj9T58L(pDxb$`Gd?bk{$SHxy77IeHZ$GX;fB7n-1HjN z!i?9IVNcG-drWHU&uc;`LesQ4z0r51?#UA}NpKI~ilQT0oeaKw z#_i9R>$peEy>A$Lx;FB?MstCsL-(!Vja#(t<-(YHpEtv!1`~J+YBRova+-?-po^jm z-RJpsyp-e>*-cYuI!J9br=ssL*AnFIjUb1Z9G-3THAH`@7^ih{b-8tgB*($A9R2y~ zSw>w*NI$gWXq%65oYu;=A+S41W7pt3H<$i8PKrszJx=#^IX0(j>5ulErd@n51lk;l zUG3x(SybA(x(sePAp}2u?!#1UDjW6K{*7*nEz5Q%Wo3CF19Ok|m-OqX=0mmGv(4(F zt<|-)`h!0j;{2(}$=?2Juu%*5jF6&AkW4C7(t2<8#$ZD{zgf}y}Bnh*IVpY;IeDAqz!HCN3MAuI579~J+FmUg-` ztydJ2)=%W!J+@z&sA1%|{(AcQ{@Kuo0h4aNcs%*&6$`u*Lp{Mc?fkm`MMpt$B$u6b zPjp9T+En#QTCmBIbd^V3lio?IfY+sMWBd10L%%T^>>iR^SlNyPsBVZOI?<0*<>dwW zeu&|>d&hJ!Z`|k#?iclzzFf6PSQ|S?cH$JctCzEH=i0bIfjE$*nqQECfOG`VYi&(Nd z0=@<)4Szywf|s7~tJ^p@8R_Za5fL~cpsVI*XIruS&2Y`{VAssH_oXl zVWgtG5Ft~a52k^oRO9FV<$lWHds>S7wrSKGgBFWjLl_udg*7JoQNGKRthZb<02w0@O($w^_B3u*S&uQSEP#R~R!-F(M7 z2oQp#fWR5W|1pt=D&{dy`WYG^*B04CT805WLs@a>__%thjOqQ7 zV`7ZHp}%Cr*?wwV=|x4MZ}6VxW@ppBcu{DD(I~>>z>9YYEfKmNc`B1u72r|R^W&X> zRM|=rQqmYQUMjl#VWFYnn(q@@Gj{QvXXlZ1bxjP}7yr--4b7)wW7#RlJKCNsq&YpK z_h;mYyA1SrDLZ}MRY&iX@GnaymyS0s@*9tmNO$NB6TIqogMgUvNFNXqs&M-BD<7=Q z&o`CuP1U+Zz2TPEShs&kbzp33%TnB5W~qVCpPJJ5=L+dfeLICP+oUV{MOO=i9^;WW z@Pgb!yKK}lKKVCuRAhi7qJyvn&Sib*lv-L^x)@HNapMsXbnq<#XcEu=ySUh5F{y{E zHFSyL{({9d#x?QfchrOZY`3GR2^^db>0p1Cn6!p=|IrpBNB+1EZd4cflRKVVT>JC> z4R)O!ezjprN6I&-(EDhyv9YOVolQ)#Q~8rvjeCZqbW4;j06g9$=J?_V?XV}2FSh~T z^>FMduJG1Rq281^o{Dbc7vBoAQ<{KPyBeJpK$lCh*ZQ4Vrkcz6R z%NrZrT2?Fq0zf!sf&&9t^K#j4tYdIM*UpWTF(`T4GK4c_Om@TtDpO3mG>QCMfZ|;( zRSs*PSg`kJJkKmk=^n(;`!(z7=;(YeN0RqP>3DuWw=ezV6O#JR&{)Bq4M(ons7Y#a zeNlwZ4HpL=udgM@wn$k~d7z*k_W=_(_rTxZ1+|?VyjKTN=eoZA{Y~@UWo61Qr?*ZW zLeHFRulPw{Zri$@+OIebGjMr}Zj>##3t^;%~kw=<=lCr6_HLE8_M?*tn@%shP zNpX?Q9o@+a8_5N)lidaDx)Tu}`s3r{=fpamCm9wZ zXrxW584y8_1}wZ+m4B$(T%Mo6QO;D_WdW5*OiZ*KFLBxVC+zI(3`9RyIgeU8z5+Bd zDitvqnJ5hPQ7Q^%t*WL3PIl+*x1`Pf7$8i=vYRU_D<1-zUS3%VBIWth(GlP=GBu_3 z2364E3klc2uV2Zjsd{UF^0w;Ete}8LUqmtM0KHL})@@!M&K-esKLU&*03SJ&Eyv@y z{?@gSg_RW)#bd9lBQKA$!&=*gfKYk{)t_%cfoN}U2QecvGZWO1F1&N#DvWAHl)St( z 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�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 lkY$%&>geeKH=Y0Ed^US4|0aXaxWO literal 0 HcmV?d00001 diff --git a/meta/git-collaboration-2in1/gh-workflow-diagram.svg b/meta/git-collaboration-2in1/gh-workflow-diagram.svg new file mode 100644 index 00000000..5a33a8d8 --- /dev/null +++ b/meta/git-collaboration-2in1/gh-workflow-diagram.svg @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + „Hlavní” projektna Githubu + origin + ty + Tvůj projektna Githubu + + > + Lokální repozitář + + + + git pull + git push ty + pull request + + diff --git a/meta/git-collaboration-2in1/index.html b/meta/git-collaboration-2in1/index.html new file mode 100644 index 00000000..b2d4b933 --- /dev/null +++ b/meta/git-collaboration-2in1/index.html @@ -0,0 +1,227 @@ +

    Spolupráce a Git

    +

    „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. +Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat +stejné části (soubory) programu?

    +

    Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. +Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

    +

    Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

    +

    Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. +Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

    +

    Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

    +

    Git a GitHub

    +

    Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. +Takové složce s kódem říkáme repozitář. +Git je program, který se stará o to, abyste ve složce mohli dělat různé experimenty a vrátit se třeba ke starým verzím. +Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

    +

    A co víc – Git vám dovoluje sdílet kód s ostatními programátory. +Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

    +

    Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. +Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). +Zkuste se po nich podívat, ušetříte práci sobě i autorům.

    +

    Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +(místo posílání mailů stačí zmáčknout tlačítko).

    +

    Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

    +

    Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +kam správce projektu dává aktuální „oficiální verzi”. +Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv +(nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). +A třetí kopii repozitáře máte u sebe na počítači.

    +

    Git workflow

    +

    Práce s lokálním repozitářem

    +

    Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

    +
      +
    1. Git bude sledovat změny, které ve složce uděláme.
    2. +
    3. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
    4. +
    5. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
    6. +
    +

    Pozor

    +

    Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. +Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

    +

    Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

    +
    $ git clone https://github.com/asgeirrr/prezencka
    +

    V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

    +

    Stav repozitáře (git status)

    +

    Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +nothing to commit, working tree clean
    +

    Git nám v tuto chvíli poskytl 3 informace:

    +
      +
    1. Že jsme na větvi master. Git umožňuje pracovat na více věcích současně pomocí tzv. větví mezi kterými můžeme přepínat. Pak se na na disku „objeví” verze souborů v dané větvi. My si dnes vystačíme s jednou hlavní větví, která se tradičně jmenuje master.
    2. +
    3. Že naše větev master je aktuální vůči větvi na vzdáleném repozitáři (origin) na GitHubu.
    4. +
    5. Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
    6. +
    +

    První revize (git commit)

    +

    Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. +Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

    +

    Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt +a do něj napište svoje současné povolání nebo cokoliv jiného. +Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +
    +      magdalena_rettigova.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)
    +

    U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

    +
    $ git add magdalena_rettigova.txt
    +

    a znovu zkontrolujte stav repozitáře:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Changes to be committed:
    +  (use "git reset HEAD <file>..." to unstage)
    +
    +        new file:   magdalena_rettigova.txt
    +

    To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

    +
    $ git commit
    +

    Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. +Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být +(nebo vymazat, podle chuti – Git je ignoruje). +Pak soubor uložíme a zavřeme editor.

    +
    $ git status
    +On branch master
    +Your branch is ahead of 'origin/master' by 1 commit.
    +  (use "git push" to publish your local commits)
    +nothing to commit, working tree clean
    +

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

    +

    Git workflow

    +

    Log (git log)

    +

    Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. +K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, +na které navazujeme.

    +
    $ git log
    +commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
    +Author: Magdalena Dobromila <magdalena@rettigova.cz>
    +Date:   Tue Mar 28 19:27:08 2017 +0200
    +
    +    Přidáno mé jméno a povolání
    +
    +commit 0f305972803131cb6c8637359fee8ede3005bba6
    +Merge: effa89b 175f4cc
    +Author: Oskar Hollmann <oskar@hollmann.me>
    +Date:   Tue Nov 8 20:17:00 2016 +0100
    +
    +    Merge pull request #1 from muzikovam/master
    +
    +    Tady mas jmeno
    +

    V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. +Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

    +

    Open-source a Free software

    +

    Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. +Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. +První kód vznikal v akademické sféře, kde byl zcela přirozeně sdílen, jako je to s poznatky mezi vědci běžné. +50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. +Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. +Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

    +

    Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +Richard Stallman GNU Manifesto, +kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. +To prosazuje 4 následujících svobody (převzato z Wikipedie):

    +
      +
    1. svoboda používat program za jakýmkoliv účelem,
    2. +
    3. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
    4. +
    5. svoboda redistribuovat kopie programu,
    6. +
    7. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    8. +
    +

    Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

    +

    Pozor

    +

    Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

    +

    Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +A bohužel, ne všechny projekty mají přátelské autory.

    +

    Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +ale každý může i zkontrolovat, jestli dělají to, co dělat mají. +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +a lidé časem začnou používat opravenou verzi.

    +

    Některé příklady populárních open-source projektů:

    +
      +
    • Mozilla Firefox, Chromium (prohlížeče)
    • +
    • Atom, gedit (textové editory)
    • +
    • CPython (jazyk Python)
    • +
    • Linux, Android (jádra operačních systémů)
    • +
    • Pytest (pythonní knihovna na testování)
    • +
    • Django, Flask, Requests (webové knihovny pro Python)
    • +
    • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
    • +
    • Materiály k tomuto kurzu
    • +
    +

    A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +všechno know-how je sdílené a budeme rádi, když se zapojíte.

    +

    Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

    +

    Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, +stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. +Licence projektu většinou najdete v souboru LICENCE. +Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

    +

    Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

    +

    Spolupráce na projektu

    +

    Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

    +

    Posílání změn (git push)

    +

    Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. +Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, +vizte obrázek na začátku.

    +

    Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, +kterou jste použili pro git clone. +Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: +adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

    +

    A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. +Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +

    Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

    +

    Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje +nebo svým uživatelským jménem na GitHubu, +aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

    +
    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    +

    Zkontrolujme, že se nám to povedlo:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
    +

    Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

    +
    $ git push tvojejmeno master
    +

    což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

    +

    Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

    +

    Žádost o začlenění (pull request)

    +

    Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

    +

    Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

    +

    Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. +(Diskutovat se dá na stránce pull requestu nebo přes mail.)

    +

    Poznámka

    +

    Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. +To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

    +

    Aktualizace (git pull)

    +

    Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

    +
    $ git pull origin master
    +

    stáhne změny z větve „master” z adresy pod zkratkou „origin”. +Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

    +

    Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

    +

    Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, +ale nechme si to na pokračovací srazy nebo workshop.

    \ No newline at end of file diff --git a/meta/install/index.1.html b/meta/install/index.1.html new file mode 100644 index 00000000..26e25898 --- /dev/null +++ b/meta/install/index.1.html @@ -0,0 +1,80 @@ +

    Git

    +

    Další program, který budeme později potřebovat, +nám později umožní (mimojiné) spolupracovat +na vznikajících programech s ostatními. +Jmenuje se Git. +Pojďme si ho nainstalovat a nastavit.

    +

    Instalace je různá pro různé operační systémy, vyber ten svůj.

    +

    Linux

    +

    Instalaci na Linux zvládneme jedním příkazem:

    +

    Fedora, RHEL:

    +
    $ sudo dnf install git gitk git-gui nano
    +

    Ubuntu, Debian:

    +
    $ sudo apt-get install git gitk git-gui nano
    +

    U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, +gitk, git gui a nano.

    +

    Jestli máš nainstalováno, ještě nastav Gitu editor. +Pokud nemáš rád/a Vim (nebo nevíš co to je), +zadej tento příkaz:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením níže.

    +

    Windows

    +

    Jdi na stránku git-scm.org, stáhni si +Git a nainstaluj si ho.

    +

    Při instalaci se ujisti, že jsou vybrány tyto volby:

    +
      +
    • Adjusting your PATH enviroment: Git from the command line and also from 3rd-party software
    • +
    • Configuring the line ending conversions: Checkout Windows-style, commit Unix-style line endings
    • +
    +

    Ostatní možnosti neměň.

    +

    Potom Gitu nastav editor. +Máš-li otevřenou příkazovou řádku, zavři ji a otevři novou. +(Instalace mění systémové nastavení, které se musí načíst znovu.) +V nové příkazové řádce zadej:

    +
    > git config --global core.editor notepad
    +> git config --global format.commitMessageColumns 80
    +> git config --global gui.encoding utf-8
    +

    A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

    +

    macOS

    +

    Spusť v příkazové řádce git. +Je-li už nainstalovaný, dozvíš se, jak ho používat +(výpis začíná usage). +Jinak ho nainstaluj pomocí Homebrew:

    +
    $ brew install git git-gui
    +

    Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, +i když sis v rámci instalace editoru nainstaloval/a např. Atom). +Dělá se to tímto příkazem:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením:

    +

    +

    Nastavení

    +

    Na projektu, který bude uložen v Gitu, může +spolupracovat více lidí. +Aby šlo dohledat, kdo udělal kterou změnu, je Gitu +potřeba říct jméno a e-mail. +Do příkazové řádky zadej následující příkazy, změň v nich ale +jméno a adresu:

    +
    $ git config --global user.name "Adéla Novotná"
    +$ git config --global user.email adela.novotna@example.cz
    +

    Můžeš samozřejmě použít i přezdívku, nebo dokonce +falešný e-mail, ale v takovém případě bude složitější se +zapojit do týmových projektů. +Každopádně, jméno i e-mail jdou kdykoli změnit +tím, že konfigurační příkazy zadáš znovu.

    +

    Pokud se bojíš spamu, neboj: nezačneš ho dostávat víc +než při normálním používání e-mailu. +Adresa se zobrazí jen lidem, kteří si stáhnou projekt, +do kterého jsi přispíval/a. +Spammeři se většinou zaměřují na méně technicky zdatné +lidi, než jsou uživatelé Gitu. :)

    +

    Dále si můžeš nastavit barevné výpisy – pokud si tedy +(jako někteří autoři Gitu) nemyslíš, že příkazová +řádka má být černobílá:

    +
    $ git config --global color.ui true
    +

    Spuštění git config nevypíše žádnou hlášku, že se operace povedla. +To je normální; stejně se chová spousta dalších příkazů, např. cd.

    +

    Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

    +
    $ git config --global --list
    +user.name=Adéla Novotná
    +user.email=adela.novotna@example.cz
    +

    A to je vše! Git máš nainstalovaný. Gratuluji!

    \ No newline at end of file diff --git a/meta/install/index.html b/meta/install/index.html new file mode 100644 index 00000000..01ca2f59 --- /dev/null +++ b/meta/install/index.html @@ -0,0 +1,12 @@ +

    Instalace Pythonu

    +

    V této sekci nainstalujeme Python.

    +

    To se na každém druhu operačního systému dělá trošku jinak. +Vyber si stránku podle svého systému:

    + +

    Pokud máš jiný systém než Linux, Windows nebo macOS, +nebo pokud ke svému počítači neznáš administrátorské heslo, +napiš nám prosím e-mail.

    \ No newline at end of file diff --git a/meta/install/linux.html b/meta/install/linux.html new file mode 100644 index 00000000..50ff62ff --- /dev/null +++ b/meta/install/linux.html @@ -0,0 +1,63 @@ +

    Instalace Pythonu na Linux

    +

    Nainstalovat Pyhon na Linux je většinou jednoduché. +Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, +tak jsou tyhle instrukce trochu delší. +Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

    +

    Instalace Pythonu 3

    +

    Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť +v příkazové řádce příkaz:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Přejdi na další sekci, kontrolu tkinter.

    +

    Objeví-li se „Python“ a verze 3.5 nebo nižší, +aktualizuj systém (nebo se poraď s někým, kdo to umí) a zkus to znovu.

    +

    Objeví-li se bash: python3: command not found nebo podobná chyba, +doinstaluj Python. +Konkrétní příkaz záleží na distribuci:

    +
      +
    • Fedora:
      $ sudo dnf install python3
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    +

    Kontrola Tkinter

    +

    Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti +Pythonu. +Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) +často musíme nainstalovat zvlášť. +Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

    +
    $ python3 -m tkinter
    +

    Objeví-li se okýnko, je všechno v pořádku. +Zavři ho a přejdi na doinstalování virtualenv.

    +

    Jestli ne, modul tkinter ještě nainstaluj:

    +
      +
    • Fedora:
      $ sudo dnf install python3-tkinter
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      +
    • +
    +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    +

    +

    Doinstalování Virtualenv

    +

    Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. +Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu +vyřadily). +Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

    +

    Spusť v příkazové řádce příkaz:

    +
    $ python3 -m ensurepip --version
    +

    Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. +Zbytek této sekce můžeš přeskočit!

    +

    Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat +alternativu, Virtualenv:

    + + +
      +
    • Ubuntu:
      $ sudo apt-get install python-virtualenv
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později +při vytváření virtuálního prostředí.

    \ No newline at end of file diff --git a/meta/install/macos.html b/meta/install/macos.html new file mode 100644 index 00000000..75171382 --- /dev/null +++ b/meta/install/macos.html @@ -0,0 +1,15 @@ +

    Instalace Pythonu pro macOS

    +

    Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje +instalaci aplikací a knihoven, které budeme potřebovat pro programování. +Jak na to?

    +

    Spusť v příkazové řádce příkaz:

    +
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +

    Pak zadej následující příkaz a Python bude nainstalovaný:

    +
    $ brew install python3
    +

    Zkontroluj si, že máš verzi 3.6 nebo vyšší:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Jinak je něco špatně; +zkus instalaci znovu. +Když to nevyjde, poraď se s někým zkušenějším.

    \ No newline at end of file diff --git a/meta/install/windows.html b/meta/install/windows.html new file mode 100644 index 00000000..de9dbcff --- /dev/null +++ b/meta/install/windows.html @@ -0,0 +1,26 @@ +

    Instalace Pythonu pro Windows

    +

    Běž na stahovací stránku Pythonu +a stáhni si instalátor nejnovější stabilní verze Pythonu. +Ověř si že je to verze 3.6.0 nebo novější – +verze 3.6.0 má jistá vylepšení, která budeme v tomto kurzu používat.

    +

    Jak poznat, který instalátor je ten pravý? +Pokud má tvůj počítač 64bitovou verzi Windows, +stáhni si Windows x86-64 executable installer. +Pokud máš starší počítač s 32bitovými Windows, +stáhni si Windows x86 executable installer. +(Rozdíl je v x86-64 versus x86.)

    +

    Kde zjistíš, zda máš 32bitové nebo 64bitové Windows? Otevři nabídku +Start, vyhledat „Systém“ a otevřít Systémové informace. +Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

    +

    Screenshot zjišťování verze systému

    +

    Stažený instalátor spusť. +Na začátku instalace zaškrtni Install launcher for all users +a také Add Python to PATH. +Tyto volby ti zjednoduší vytvoření virtuálního prostředí.

    +

    (Jestli nemáš administrátorské oprávnění, volbu +Install launcher for all users nezaškrtávej.)

    +

    Screenshot instalace Pythonu

    +

    Pak zmáčkni Install now a dále se drž instrukcí.

    +

    Máš-li otevřenou příkazovou řádku, po instalaci Pythonu ji zavři a otevři +novou. +Instalace mění systémové nastavení, které se musí načíst znovu.

    \ No newline at end of file diff --git a/meta/install/windows_32v64-bit.png b/meta/install/windows_32v64-bit.png new file mode 100644 index 0000000000000000000000000000000000000000..70550e8422832fcc3cb696ab40b29d5a5b141d5a GIT binary patch literal 36230 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

    x-X)=B8Ao1rrt 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 literal 0 HcmV?d00001 diff --git a/meta/notebook/index.html b/meta/notebook/index.html new file mode 100644 index 00000000..5f9c9842 --- /dev/null +++ b/meta/notebook/index.html @@ -0,0 +1,116 @@ +

    +
    +

    Jupyter Notebook

    +

    Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

    +

    Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). +V Jupyter Notebooku jsou psány i tyto materiály.

    +

    Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. +Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

    +

    Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

    +
    $ python -m pip install --upgrade pip wheel
    +$ python -m pip install notebook
    +

    Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

    +

    Nainstalovaný Notebook pusťte pomocí:

    +
    $ python -m notebook
    +

    V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

    +

    Jak na Notebook

    +

    Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

    +

    Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

    +

    Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

    +
    str.l<TAB>
    +! ls -a<SHIFT+ENTER>
    +str.lower?<SHIFT+ENTER>

    Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

    +
    +
    +
    +
    +
    +
    In [2]:
    +
    +
    +
    1+1  # Nevypíše se (není poslední příkaz)
    +2+2  # Vypíše se
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[2]:
    + + + + +
    +
    4
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [3]:
    +
    +
    +
    seznam = [5, 6, 3, 2]
    +print(seznam)  # print() funguje
    +seznam.sort()
    +seznam         # Poslední výraz se vypíše
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    [5, 6, 3, 2]
    +
    +
    +
    + +
    + +
    Out[3]:
    + + + + +
    +
    [2, 3, 5, 6]
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další možnosti, jako např. změna typu buňky na Markdown, jsou dostupné z menu nebo klávesovými zkratkami.

    +
    +
    +
    + + diff --git a/mi-pyt/cmdline/index.html b/mi-pyt/cmdline/index.html new file mode 100644 index 00000000..6ef6982b --- /dev/null +++ b/mi-pyt/cmdline/index.html @@ -0,0 +1,276 @@ +

    Příkazová řádka

    +

    V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, +které programátoři používají na zadávání příkazů. +Na první pohled může vypadat nepřirozeně, ale dá se na ni zvyknout :)

    +

    Příkazová řádka +(respektive program, kterému se říká i konzole či terminál; +anglicky command line, console, terminal) +se na různých systémech otevírá různě:

    +
      +
    • Windows (české): Start → napsat na klávesnici „cmd“ → Příkazový řádek
    • +
    • Windows (anglické): Start → napsat na klávesnici „cmd“ → Command Prompt
    • +
    • macOS (anglický): Applications → Utilities → Terminal
    • +
    • Linux (KDE): Hlavní Menu → hledat Konsole
    • +
    • Linux (GNOME): Super → hledat Terminál
    • +
    +

    Nevíš-li si rady, zkus buď googlit, +nebo se zeptat e-mailem.

    +

    Po otevření konzole tě uvítá řádek, +kterým počítač vybízí k zadání příkazu. +Podle systému bude končit buď znakem $ nebo >, +před nímž můžou být ještě další informace:

    +
    +

    Unix (Linux, macOS)

    $
    +
    +

    Windows

    >
    +

    Podle systému se potom liší i samotné příkazy, které budeš zadávat.

    +

    Velikost písma

    +

    Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. +V záložce Písmo si pak můžeš vybrat větší font. +

    +

    Screenshot menu příkazové řádky

    +

    Na ostatních systémech hledej v nastavení, nebo zkus +Ctrl++ a +Ctrl+- (příp. se Shift).

    +

    První příkaz

    +

    Začneme jednoduchým příkazem. +Napiš whoami (z angl. who am I? – kdo jsem?) +a stiskni Enter. +Objeví se přihlašovací jméno. Třeba u Heleny by to vypadalo takhle:

    +
    +

    Unix

    $ whoami
    +helena
    +
    +

    Windows

    > whoami
    +pocitac\Helena
    +

    Znak $ nebo > je v ukázce jen proto, aby bylo jasné, že zadáváme +příkaz do příkazové řádky. +Vypíše ho počítač, většinou ještě s něčím před ním, +takže ho nepiš sama! Zadej jen whoami a Enter.

    +

    Stejně tak počítač sám vypíše přihlašovací jméno.

    +

    Aktuální adresář

    +

    Příkazová řádka pracuje vždy v nějakém adresáři (neboli složce, +angl. directory, folder). +Ve kterém adresáři zrovna je, to nám poví příkaz, který se podle systému +jmenuje pwd nebo cd (z angl. print working directory – vypiš pracovní +adresář, resp. current directory – aktuální adresář).

    +
    +

    Unix

    $ pwd
    +/home/helena/
    +
    +

    Windows

    > cd
    +C:\Users\helena
    +

    Aktuální adresář se většinou ukazuje i před znakem $ nebo >, +ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a +(nebo musel/a pracovat na počítači který před $ ukazuje něco jiného).

    +

    Co v tom adresáři je?

    +

    Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) +nám vypíše, co aktuální adresář obsahuje: všechny soubory, +včetně podadresářů, které se v aktuálním adresáři nacházejí.

    +
    +

    Unix

    $ ls
    +Applications
    +Desktop
    +Downloads
    +Music
    +
    +
    +

    Windows

    > dir
    + Directory of C:\Users\helena
    +05/08/2014 07:28 PM <DIR>  Applications
    +05/08/2014 07:28 PM <DIR>  Desktop
    +05/08/2014 07:28 PM <DIR>  Downloads
    +05/08/2014 07:28 PM <DIR>  Music
    +
    +

    Změna aktuálního adresáře

    +

    Aktuální adresář se dá změnit pomocí příkazu cd +(z angl. change directory – změnit adresář). +Za cd se píše jméno adresáře, kam chceme přejít. +Pokud máš adresář Desktop nebo Plocha, přejdi tam. Pak nezapomeň ověřit, +že jsi na správném místě.

    +

    Jsi-li na Linuxu nebo macOS, dej si pozor na velikost písmen: na těchto +systémech jsou Desktop a desktop dvě různá jména.

    +

    Jsi-li na Windows, cd už jsi používal/a – tento příkaz se chová různě +podle toho, jestli něco napíšeš za něj nebo ne.

    +
    +

    Unix

    $ cd Desktop
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd Desktop
    +> cd
    +C:\Users\helena\Desktop
    +

    Poznámka pro Windows

    +

    Pokud přecházíš do adresáře na jiném disku, +například D: místo C:, je potřeba kromě cd +zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    +

    Vytvoření adresáře

    +

    Co takhle si vytvořit adresář na Python? To se dělá příkazem mkdir +(z angl. make directory – vytvořit adresář). +Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě +naucse-python:

    +
    +

    Unix

    $ mkdir naucse-python
    +
    +

    Windows

    > mkdir naucse-python
    +

    Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na +prohlížení adresářů: zjistíš, že adresář se opravdu vytvořil!

    +

    Úkol

    +

    Zkus v nově vytvořeném adresáři naucse-python +vytvořit adresář test +a zkontrolovat, že se opravdu vytvořil.

    +

    Budou se hodit příkazy cd, mkdir a ls či dir.

    +
    +

    Řešení

    + + +

    Úklid

    +

    Teď vytvořené adresáře zase smažeme.

    +

    Nemůžeš ale smazat adresář, ve kterém jsi. +Proto se vrátíme na Desktop. +Ale nemůžeme použít cd Desktop – v aktuálním adresáři žádný Desktop není. +Potřebuješ se dostat do nadřazeného adresáře: toho, který obsahuje +adresář ve kterém právě jsi. +Nadřazený adresář se značí dvěma tečkami:

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop/naucse-python
    +$ cd ..
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop\naucse-python
    +> cd ..
    +> cd
    +C:\Users\helena\Desktop
    +

    Teď můžeš smazat vytvořený adresář naucse-python. +K tomu použij příkaz rm nebo rmdir +(z remove – odstraň, resp. remove directory – odstraň adresář).

    +

    Pozor!

    +

    Příkazová řádka nepoužívá odpadkový koš! +Všechno se nadobro smaže. Takže si dobře překontroluj, že mažeš +správný adresář.

    +

    Na Unixu za tento příkaz musíš napsat ještě jedno slovo: -rv (minus, +r, v). +To je takzvaný přepínač, který příkazu říká, že má smazat celý adresář +včetně všeho, co obsahuje (r), +a že má informovat o tom co dělá (v).

    +

    Obdobně i na Windows je potřeba zadat přepínač, který říká, že má smazat +adresář a veškerý jeho obsah. Tentokrát je to /S (lomítko, S). +Příkaz rmdir se automaticky ujistí, jestli to co mažeš opravdu chceš smazat.

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop
    +$ rm -rv naucse-python
    +removed directory: ‘naucse-python’
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop
    +> rmdir /S naucse-python
    +naucse-python, Are you sure <Y/N>? Y
    +

    Shrnutí

    +

    Tady je tabulka základních příkazů, se kterými si zatím vystačíme:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    UnixWindowsPopisPříklad
    cdcdzměna adresářecd test
    pwdcdvýpis aktuálního adresářepwd
    cd
    lsdirvýpis adresářels
    dir
    cpcopyzkopírování souboru + cp puvodni.txt kopie.txt +
    + copy puvodni.txt kopie.txt +
    mvmovepřesun/přejmenování souboru + mv puvodni.txt novy.txt +
    + move puvodni.txt novy.txt +
    mkdirmkdirvytvoření adresářemkdir test
    rmdelsmazání souborurm test.txt
    del test.txt
    rm -rrmdir /Ssmazání adresářerm -r test
    rmdir /S test
    exitexitukončeníexit

    Příkazů existuje samozřejmě daleko víc. +Dokonce každý program, který máš na počítači nainstalovaný, jde spustit +z příkazové řádky – a to většinou jen zadáním jeho jména. +Zkus, jestli na tvém počítači bude fungovat firefox, notepad, safari +nebo gedit.

    +

    Při učení Pythonu použiješ programy/příkazy jako python a git, které +zanedlouho nainstalujeme. +

    +

    Konec

    +

    Nakonec vyzkoušej ještě jeden příkaz. +Ten, který příkazovou řádku zavírá: exit.

    +

    Jako většina příkazů (kromě pár z těch základních) funguje exit +stejně na všech systémech. +Proto už nebudu používat ukázku rozdělenou pro Unix a Windows.

    +
    $ exit
    +

    Ve zbytku těchto materiálů budeme pro kód, který je potřeba zadat do +příkazové řádky, používat unixovské $. +S touto konvencí se setkáš i ve většině návodů na internetu. +Používáš-li Windows, je dobré si na $ zvyknout, i když ve své +řádce máš místo něj >.

    \ No newline at end of file diff --git a/mi-pyt/cmdline/windows-cmd-properties.png b/mi-pyt/cmdline/windows-cmd-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb2040b0a9a3ddd60c7965f13b38f64608fc0a6 GIT binary patch literal 23872 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 VS> literal 0 HcmV?d00001 diff --git a/mi-pyt/course.json b/mi-pyt/course.json index 6af4ae30..9a0f5cab 100644 --- a/mi-pyt/course.json +++ b/mi-pyt/course.json @@ -7,8 +7,15 @@ "description": "Základy již znáte a chcete se dozvědět o dalších možnostech využití Pythonu.", "edit_info": { "branch": "main", - "url": "https://github.com/encukou/naucse-python" + "url": "https://github.com/pyvec/naucse-python" }, + "extra_lessons": [ + "beginners/install", + "beginners/cmdline", + "beginners/testing", + "fast-track/http", + "git/git-collaboration-2in1" + ], "lessons": { "advanced/generators": { "pages": { @@ -34,6 +41,177 @@ "static_files": {}, "title": "Generátory" }, + "beginners/cmdline": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", + "Založeno na tutoriálu Django Girls." + ], + "content": { + "path": "cmdline/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    \n

    Unix

    $ cd naucse-python\n$ mkdir test\n$ ls\ntest\n
    \n

    Windows

    > cd naucse-python\n> mkdir test\n> dir\n05/08/2014 07:28 PM <DIR>  test\n
    " + } + ], + "source_file": "lessons/beginners/cmdline/index.md", + "title": "Úvod do příkazové řádky", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/beginners/cmdline/info.yml", + "static_files": { + "windows-cmd-properties.png": { + "path": "cmdline/windows-cmd-properties.png" + } + }, + "title": "Úvod do příkazové řádky" + }, + "beginners/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install/index.md", + "title": "Instalace Pythonu", + "vars": { + "coach-present": false, + "mi-pyt": true + } + }, + "linux": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/linux.html" + }, + "license": "cc-by-sa-40", + "slug": "linux", + "solutions": [], + "source_file": "lessons/beginners/install/linux.md", + "subtitle": "Linux", + "title": "Instalace Pythonu – Linux", + "vars": { + "coach-present": false, + "mi-pyt": true + } + }, + "macos": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/macos.html" + }, + "license": "cc-by-sa-40", + "slug": "macos", + "solutions": [], + "source_file": "lessons/beginners/install/macos.md", + "subtitle": "macOS", + "title": "Instalace Pythonu – macOS", + "vars": { + "coach-present": false, + "mi-pyt": true + } + }, + "windows": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/windows.html" + }, + "license": "cc-by-sa-40", + "slug": "windows", + "solutions": [], + "source_file": "lessons/beginners/install/windows.md", + "subtitle": "Windows", + "title": "Instalace Pythonu – Windows", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/beginners/install/info.yml", + "static_files": { + "windows_32v64-bit.png": { + "path": "install/windows_32v64-bit.png" + }, + "windows_add_python_to_path.png": { + "path": "install/windows_add_python_to_path.png" + } + }, + "title": "Instalace Pythonu" + }, + "beginners/testing": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "testing/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/testing/index.md", + "title": "Testování", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/beginners/testing/info.yml", + "static_files": {}, + "title": "Testování" + }, + "fast-track/http": { + "pages": { + "index": { + "attribution": [ + "Pro naucse.python.cz napsal Petr Viktorin, 2018.", + "Inspirováno tutoriálem Django Girls" + ], + "content": { + "path": "http/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/fast-track/http/index.md", + "title": "HTTP – Jak funguje Internet", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/fast-track/http/info.yml", + "static_files": { + "url-anatomy.svg": { + "path": "http/url-anatomy.svg" + } + }, + "title": "HTTP – Jak funguje Internet" + }, "fast-track/install": { "pages": { "index": { @@ -41,7 +219,7 @@ "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok a Petr Viktorin, 2016-2017." ], "content": { - "path": "install/index.html" + "path": "install/index.1.html" }, "license": "cc-by-sa-40", "slug": "index", @@ -58,6 +236,37 @@ "static_files": {}, "title": "Vytvoření virtuáního prostředí" }, + "git/git-collaboration-2in1": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsali Petr Viktorin a Oskar Hollman, 2015-2017." + ], + "content": { + "path": "git-collaboration-2in1/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/git-collaboration-2in1/index.md", + "title": "Spolupráce a Git", + "vars": { + "coach-present": false, + "mi-pyt": true + } + } + }, + "source_file": "lessons/git/git-collaboration-2in1/info.yml", + "static_files": { + "diagram.png": { + "path": "git-collaboration-2in1/diagram.png" + }, + "gh-workflow-diagram.svg": { + "path": "git-collaboration-2in1/gh-workflow-diagram.svg" + } + }, + "title": "Spolupráce a Git" + }, "intro/async": { "pages": { "index": { @@ -555,7 +764,7 @@ "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." ], "content": { - "path": "testing/index.html" + "path": "testing/index.1.html" }, "license": "cc-by-sa-40", "slug": "index", diff --git a/mi-pyt/git-collaboration-2in1/diagram.png b/mi-pyt/git-collaboration-2in1/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b04ef99767fd294644772ea1c5ee732c072c2d90 GIT binary patch literal 40629 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 z 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�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 lkY$%&>geeKH=Y0Ed^US4|0aXaxWO literal 0 HcmV?d00001 diff --git a/mi-pyt/git-collaboration-2in1/gh-workflow-diagram.svg b/mi-pyt/git-collaboration-2in1/gh-workflow-diagram.svg new file mode 100644 index 00000000..5a33a8d8 --- /dev/null +++ b/mi-pyt/git-collaboration-2in1/gh-workflow-diagram.svg @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + „Hlavní” projektna Githubu + origin + ty + Tvůj projektna Githubu + + > + Lokální repozitář + + + + git pull + git push ty + pull request + + diff --git a/mi-pyt/git-collaboration-2in1/index.html b/mi-pyt/git-collaboration-2in1/index.html new file mode 100644 index 00000000..b2d4b933 --- /dev/null +++ b/mi-pyt/git-collaboration-2in1/index.html @@ -0,0 +1,227 @@ +

    Spolupráce a Git

    +

    „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. +Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat +stejné části (soubory) programu?

    +

    Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. +Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

    +

    Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

    +

    Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. +Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

    +

    Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

    +

    Git a GitHub

    +

    Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. +Takové složce s kódem říkáme repozitář. +Git je program, který se stará o to, abyste ve složce mohli dělat různé experimenty a vrátit se třeba ke starým verzím. +Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

    +

    A co víc – Git vám dovoluje sdílet kód s ostatními programátory. +Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

    +

    Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. +Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). +Zkuste se po nich podívat, ušetříte práci sobě i autorům.

    +

    Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +(místo posílání mailů stačí zmáčknout tlačítko).

    +

    Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

    +

    Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +kam správce projektu dává aktuální „oficiální verzi”. +Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv +(nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). +A třetí kopii repozitáře máte u sebe na počítači.

    +

    Git workflow

    +

    Práce s lokálním repozitářem

    +

    Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

    +
      +
    1. Git bude sledovat změny, které ve složce uděláme.
    2. +
    3. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
    4. +
    5. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
    6. +
    +

    Pozor

    +

    Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. +Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

    +

    Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

    +
    $ git clone https://github.com/asgeirrr/prezencka
    +

    V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

    +

    Stav repozitáře (git status)

    +

    Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +nothing to commit, working tree clean
    +

    Git nám v tuto chvíli poskytl 3 informace:

    +
      +
    1. Že jsme na větvi master. Git umožňuje pracovat na více věcích současně pomocí tzv. větví mezi kterými můžeme přepínat. Pak se na na disku „objeví” verze souborů v dané větvi. My si dnes vystačíme s jednou hlavní větví, která se tradičně jmenuje master.
    2. +
    3. Že naše větev master je aktuální vůči větvi na vzdáleném repozitáři (origin) na GitHubu.
    4. +
    5. Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
    6. +
    +

    První revize (git commit)

    +

    Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. +Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

    +

    Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt +a do něj napište svoje současné povolání nebo cokoliv jiného. +Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +
    +      magdalena_rettigova.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)
    +

    U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

    +
    $ git add magdalena_rettigova.txt
    +

    a znovu zkontrolujte stav repozitáře:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Changes to be committed:
    +  (use "git reset HEAD <file>..." to unstage)
    +
    +        new file:   magdalena_rettigova.txt
    +

    To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

    +
    $ git commit
    +

    Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. +Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být +(nebo vymazat, podle chuti – Git je ignoruje). +Pak soubor uložíme a zavřeme editor.

    +
    $ git status
    +On branch master
    +Your branch is ahead of 'origin/master' by 1 commit.
    +  (use "git push" to publish your local commits)
    +nothing to commit, working tree clean
    +

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

    +

    Git workflow

    +

    Log (git log)

    +

    Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. +K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, +na které navazujeme.

    +
    $ git log
    +commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
    +Author: Magdalena Dobromila <magdalena@rettigova.cz>
    +Date:   Tue Mar 28 19:27:08 2017 +0200
    +
    +    Přidáno mé jméno a povolání
    +
    +commit 0f305972803131cb6c8637359fee8ede3005bba6
    +Merge: effa89b 175f4cc
    +Author: Oskar Hollmann <oskar@hollmann.me>
    +Date:   Tue Nov 8 20:17:00 2016 +0100
    +
    +    Merge pull request #1 from muzikovam/master
    +
    +    Tady mas jmeno
    +

    V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. +Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

    +

    Open-source a Free software

    +

    Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. +Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. +První kód vznikal v akademické sféře, kde byl zcela přirozeně sdílen, jako je to s poznatky mezi vědci běžné. +50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. +Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. +Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

    +

    Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +Richard Stallman GNU Manifesto, +kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. +To prosazuje 4 následujících svobody (převzato z Wikipedie):

    +
      +
    1. svoboda používat program za jakýmkoliv účelem,
    2. +
    3. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
    4. +
    5. svoboda redistribuovat kopie programu,
    6. +
    7. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    8. +
    +

    Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

    +

    Pozor

    +

    Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

    +

    Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +A bohužel, ne všechny projekty mají přátelské autory.

    +

    Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +ale každý může i zkontrolovat, jestli dělají to, co dělat mají. +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +a lidé časem začnou používat opravenou verzi.

    +

    Některé příklady populárních open-source projektů:

    +
      +
    • Mozilla Firefox, Chromium (prohlížeče)
    • +
    • Atom, gedit (textové editory)
    • +
    • CPython (jazyk Python)
    • +
    • Linux, Android (jádra operačních systémů)
    • +
    • Pytest (pythonní knihovna na testování)
    • +
    • Django, Flask, Requests (webové knihovny pro Python)
    • +
    • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
    • +
    • Materiály k tomuto kurzu
    • +
    +

    A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +všechno know-how je sdílené a budeme rádi, když se zapojíte.

    +

    Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

    +

    Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, +stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. +Licence projektu většinou najdete v souboru LICENCE. +Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

    +

    Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

    +

    Spolupráce na projektu

    +

    Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

    +

    Posílání změn (git push)

    +

    Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. +Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, +vizte obrázek na začátku.

    +

    Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, +kterou jste použili pro git clone. +Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: +adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

    +

    A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. +Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +

    Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

    +

    Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje +nebo svým uživatelským jménem na GitHubu, +aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

    +
    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    +

    Zkontrolujme, že se nám to povedlo:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
    +

    Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

    +
    $ git push tvojejmeno master
    +

    což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

    +

    Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

    +

    Žádost o začlenění (pull request)

    +

    Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

    +

    Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

    +

    Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. +(Diskutovat se dá na stránce pull requestu nebo přes mail.)

    +

    Poznámka

    +

    Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. +To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

    +

    Aktualizace (git pull)

    +

    Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

    +
    $ git pull origin master
    +

    stáhne změny z větve „master” z adresy pod zkratkou „origin”. +Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

    +

    Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

    +

    Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, +ale nechme si to na pokračovací srazy nebo workshop.

    \ No newline at end of file diff --git a/mi-pyt/http/index.html b/mi-pyt/http/index.html new file mode 100644 index 00000000..d8833769 --- /dev/null +++ b/mi-pyt/http/index.html @@ -0,0 +1,132 @@ +

    HTTP – Jak funguje Internet

    +

    Než začneme pracovat s internetem – ať už tvorbou vlastních stránek, nebo +komunikací s existujícími službami, pojďme si přiblížit, co vlastně ten +internet je a jak funguje.

    +

    Internet je celosvětová síť počítačů. +Je to spousta laptopů, stolních počítačů, malých blikajících krabiček +i obrovských blikajících skříní, které jsou navzájem propojeny pomocí +kabelů (nebo i bezdrátově).

    +

    Samozřejmě není každé zařízení propojené s každým jiným zařízením – tolik +kabelů by se na Zemi těžko vešlo. +Spousta zařízení – hlavně tzv. routery a switche – ale umí přeposílat +zprávy mezi sebou tak, že každý počítač může komunikovat s každým +jiným počítačem. +(Aspoň teoreticky – reálně je komunikace omezená např. kvůli bezpečnosti.)

    +

    Funguje to podobně jako pošta: když pošlu balíček z Brna do Melbourne, +nedostane se tam přímo. +Balíček poputuje třeba vlakem do Prahy, pak letadlem do hlavní pošty +v Austrálii a odtud náklaďákem do Melbourne, kde ho doručovatel donese až +k domu příjemce. +A k naplánování celé téhle cesty stačí napsat na obálku krátkou adresu.

    +

    Podobně cestují informace v internetu: z laptopu přes Wi-Fi do routeru, +odtud kabelem k poskytovateli připojení, tlustším kabelem do české +„páteřní sítě“, podmořským kabelem třeba do Ameriky… a nakonec k počítači, +se kterým jsem chtěl komunikovat.

    +

    Většinou můj laptop takhle komunikuje se serverem, počítačem, který +se stará o sdělování informací. +Každou webovou stránku spravuje takový server.

    +

    +

    Webové adresy

    +

    Jak taková komunikace vypadá si ukážeme na příkladu – +co se stane, když do prohlížeče zadám tuhle adresu:

    +
    http://naucse.python.cz/lessons/fast-track/http/

    Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, +„jednotná adresa zdroje“) přesně určuje, jak se má prohlížeč dostat +k informacím, které má zobrazit.

    +

    http://naucse.python.cz/lessons/fast-track/http/

    +

    Začátek adresy, http://, je jméno protokolu (angl. protocol name). +Protokol určuje způsob, jak se k daným informacím dostat. +Protokolů existuje spousta, každý funguje trochu jinak a každý se používá +na něco jiného: +SMTP a POP pro e-mail, FTP pro přenos souborů, SSH pro ovládání počítačů. +My se teď ale zaměříme na HTTP, který se typicky používá pro webové stránky.

    +

    Další část adresy, naucse.python.cz, je jméno serveru (angl. server name). +Říká, kde prohlížeč najde dané informace.

    +

    Jméno serveru je jako poštovní adresa – existuje počítač, který se jmenuje +naucse.python.cz, a každý internetový „pošťák“ ví, komu přeposlat zprávu, +aby se k tomuto počítači nakonec dostala.

    +

    „Skutečná“ adresa počítače, tzv. IP adresa, je číselná – například +151.101.37.147 nebo 2a04:4e42:9::403. +Existuje ale systém, jak jméno serveru na takovou IP adresu přeložit. +Tenhle systém se jmenuje DNS a – abychom zůstali u přirovnání k poště – +funguje podobně jako seznamy poštovních směrovacích čísel.

    +

    Poslední část URL, /lessons/fast-track/http/, je cesta (angl. path). +Říká, co chceme od serveru dostat: jméno konkrétní webové stránky.

    +

    U jednodušších stránek to může být přímo jméno souboru, který má server +uložený na disku – proto spousta adres na Webu končí příponou .html.

    +

    Požadavek a odpověď

    +

    K získání požadované stránky prohlížeč vytvoří požadavek (angl. request) +– zprávu „Pošli mi prosím stránku /lessons/fast-track/http/“ – a pošle ho +serveru naucse.python.cz.

    +

    Server požadavek dostane a vrátí odpověď (angl. response) – zprávu +s obsahem dané stránky. +Obsah je často webová stránka v jazyce HTML, který popisuje co na stránce je, +kde jsou nadpisy a kde odstavce, jak má stránka vypadat, a tak dále. +Ale v odpovědi může být místo stránky i cokoli jiného – obrázek, video, nebo +jiná data.

    +

    Veškerá komunikace přes HTTP funguje právě takto: pošle se požadavek +a přijde na něj odpověď.

    +

    A jak tyhle zprávy vypadají? +Požadavek nějak takhle:

    +
    GET /lessons/fast-track/install/ HTTP/1.1
    +Accept: */*
    +Accept-Encoding: gzip, deflate
    +Connection: keep-alive
    +Host: naucse.python.cz
    +User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
    +

    První řádek říká serveru: prosím, pošli mi (GET) stránku +/lessons/fast-track/install/ s použitím protokolu HTTP verze 1.1. +Další řádky jsou hlavičky (angl. headers). +Říkají například kdo se ptá (User-Agent) a jaký obsah očekává (Accept). +Většina hlaviček je nepovinná.

    +

    Odpověď pak může vypadat takto:

    +
    HTTP/1.1 200 OK
    +Cache-Control: max-age=600
    +Connection: keep-alive
    +Content-Encoding: gzip
    +Content-Length: 3127
    +Content-Type: text/html; charset=utf-8
    +Date: Tue, 20 Feb 2018 15:51:24 GMT
    +Last-Modified: Tue, 20 Feb 2018 15:20:08 GMT
    +Server: GitHub.com
    +
    +<!doctype html>
    +  <html lang="cs">
    +    <head>
    +        <meta charset="utf-8">
    +        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    +        <title>
    +                Python a jeho knihovny: HTTP – Jak funguje Internet
    +…
    +

    První řádek říká: používáme protokol HTTP verze 1.1, +a všechno je v pořádku (200 OK). +Kromě 200 existují i další stavové kódy (angl. status codes). +Známý je např. 404 „nenalezeno“.

    +

    Následují opět hlavičky – např. kdo odpovídá (Server), kdy byla stránka +naposledy změněna (Last-Modified) a jak je odpověď zakódovaná: +Content-Type: text/html říká, že je to stránka v jazyce HTML.

    +

    Hlavičky jsou ukončené volným řádkem, po kterém následuje samotný obsah +odpovědi ve zmíněném jazyce HTML.

    +

    HTTP Metody

    +

    Komunikace ukázaná výše používala metodu GET, která slouží ke čtení +informací. +Když se takto prohlížeč na nějakou stránku zeptá, nic se na serveru nezmění. +Prohlížeč si takovou stránku – nebo třeba obrázek či video – může dočasně +uložit, a když bude potřeba znovu, použít uloženou verzi.

    +

    Některými požadavky ale stav serveru mění: například se přihlásí uživatel, +nakoupí zboží v e-shopu nebo odešle zpráva do diskuse. +Tyto požadavky používají místo GET jinou metodu (angl. method). +Co přesně která metoda na jaké adrese dělá, to záleží na autorovi stránek. +Často se používají tyto metody:

    +
      +
    • GET načte informace,
    • +
    • POST pošle na server informace, např. z formuláře, s cílem něco +změnit nebo nastavit,
    • +
    • PUT přidá novou stránku (nebo jiný objekt),
    • +
    • DELETE něco smaže.
    • +
    +

    Seznam všech metod je ve +specifikaci.

    +

    U složitějších požadavků se dají na server poslat i informace: +webové formuláře se odesílají požadavkem, který používá metodu POST +a vyplněné informace k dotazu „přilepí“ za hlavičky – stejným způsobem, jako se +v odpovědi posílá HTML stránka.

    \ No newline at end of file diff --git a/mi-pyt/http/url-anatomy.svg b/mi-pyt/http/url-anatomy.svg new file mode 100644 index 00000000..8682a706 --- /dev/null +++ b/mi-pyt/http/url-anatomy.svg @@ -0,0 +1,461 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://naucse.python.cz/lessons/fast-track/http/ + + protokol + + server + cesta + + diff --git a/mi-pyt/install/index.1.html b/mi-pyt/install/index.1.html new file mode 100644 index 00000000..29fc86e6 --- /dev/null +++ b/mi-pyt/install/index.1.html @@ -0,0 +1,62 @@ +

    V tomto kurzu budeme používat virtuální prostředí. +Jedná se o oddělené prostředí pro Python, kam se dají instalovat jednotlivé +knihovny, které jsou potom aktivní jen uvnitř. +Použití prostředí má dvě hlavní výhody:

    +
      +
    • Je-li prostředí aktivované, +příkaz python spustí verzi Pythonu, se kterou bylo prostředí nainstalováno. +Takže pak např. v materiálech nemusíme mít speciální instrukce pro +Linux (python3) a Windows (py -3).

      +
    • +
    • Instalace knihoven nezasahuje do systémového nastavení, ani do jiných +virtuálních prostředí. +Můžeš tak oddělit jednotlivé projekty; v každém prostředí můžou být +nainstalované jiné verze knihoven. +A když se něco pokazí, adresář s virtuálním prostředím můžeš prostě smazat +a vytvořit znovu.

      +
    • +
    +

    Následují zrychlené instrukce; předpokládám, že Python (3.6 a vyšší) +už máš nainstalovaný a že znáš základy práce +s příkazovou řádkou.

    +

    Podrobný postup instalace Pythonu a vytvoření prostředí je je popsán +v příslušné lekci pro začátečníky. +Modul venv je součást standardní knihovny.

    +

    Unix (Linux, macOS)

    +

    Zkontroluj, že máš modul ensurepip:

    +
    $ python3.7 -m ensurepip --version
    +pip 18.0 (nebo i jiná verze)
    +

    Jestli ne, postupuj podle lekce pro začátečníky – +jsou tam podrobnější instrukce. +Jinak použij:

    +
    $ mkdir project
    +$ cd project
    +$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
    +$ . __venv__/bin/activate  # aktivace
    +(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    +(__venv__)$ ...  # práce "uvnitř"
    +(__venv__)$ deactivate  # vypnutí virtualenvu
    +

    V tomto kurzu lze případně využít i Python 3.6. Pokud máš 3.5 nebo ještě nižší, +doporučujeme aktualizovat.

    +

    Windows

    +
    > mkdir project
    +> cd project
    +> py -3 -m venv __venv__
    +> __venv__\Scripts\activate
    +(__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    +(__venv__)> ...  # práce "uvnitř"
    +(__venv__)> deactivate  # vypnutí virtualenvu
    +

    Poznámky

    +

    Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu +pracovat.

    +

    Ono __venv__ je jen jméno adresáře. Můžeš si ho pojmenovat jak chceš; dokonce +nemusí být v rámci adresáře s projektem. +Někteří lidé mají všechny virtuální prostředí na jednom místě; dokonce existuje +nástroj virtualenvwrapper na správu takového řešení, případně pipenv, +který Python Packaging Authority doporučuje pro vývoj aplikací (my ale +budeme vyvíjet i knihovny).

    +

    Autoři tohoto textu tedy doporučují __venv__ v adresáři s projektem. +Při použití v kombinaci s Gitem nezapomeň tento adresář přidat do souboru +.gitignore.

    +

    Příkaz python -m pip install nainstaluje danou knihovnu – může to být i jiná +než requests jako výše.

    \ No newline at end of file diff --git a/mi-pyt/install/index.html b/mi-pyt/install/index.html index 29fc86e6..01ca2f59 100644 --- a/mi-pyt/install/index.html +++ b/mi-pyt/install/index.html @@ -1,62 +1,12 @@ -

    V tomto kurzu budeme používat virtuální prostředí. -Jedná se o oddělené prostředí pro Python, kam se dají instalovat jednotlivé -knihovny, které jsou potom aktivní jen uvnitř. -Použití prostředí má dvě hlavní výhody:

    +

    Instalace Pythonu

    +

    V této sekci nainstalujeme Python.

    +

    To se na každém druhu operačního systému dělá trošku jinak. +Vyber si stránku podle svého systému:

      -
    • Je-li prostředí aktivované, -příkaz python spustí verzi Pythonu, se kterou bylo prostředí nainstalováno. -Takže pak např. v materiálech nemusíme mít speciální instrukce pro -Linux (python3) a Windows (py -3).

      -
    • -
    • Instalace knihoven nezasahuje do systémového nastavení, ani do jiných -virtuálních prostředí. -Můžeš tak oddělit jednotlivé projekty; v každém prostředí můžou být -nainstalované jiné verze knihoven. -A když se něco pokazí, adresář s virtuálním prostředím můžeš prostě smazat -a vytvořit znovu.

      -
    • +
    • Linux
    • +
    • Windows
    • +
    • macOS
    -

    Následují zrychlené instrukce; předpokládám, že Python (3.6 a vyšší) -už máš nainstalovaný a že znáš základy práce -s příkazovou řádkou.

    -

    Podrobný postup instalace Pythonu a vytvoření prostředí je je popsán -v příslušné lekci pro začátečníky. -Modul venv je součást standardní knihovny.

    -

    Unix (Linux, macOS)

    -

    Zkontroluj, že máš modul ensurepip:

    -
    $ python3.7 -m ensurepip --version
    -pip 18.0 (nebo i jiná verze)
    -

    Jestli ne, postupuj podle lekce pro začátečníky – -jsou tam podrobnější instrukce. -Jinak použij:

    -
    $ mkdir project
    -$ cd project
    -$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
    -$ . __venv__/bin/activate  # aktivace
    -(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    -(__venv__)$ ...  # práce "uvnitř"
    -(__venv__)$ deactivate  # vypnutí virtualenvu
    -

    V tomto kurzu lze případně využít i Python 3.6. Pokud máš 3.5 nebo ještě nižší, -doporučujeme aktualizovat.

    -

    Windows

    -
    > mkdir project
    -> cd project
    -> py -3 -m venv __venv__
    -> __venv__\Scripts\activate
    -(__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    -(__venv__)> ...  # práce "uvnitř"
    -(__venv__)> deactivate  # vypnutí virtualenvu
    -

    Poznámky

    -

    Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu -pracovat.

    -

    Ono __venv__ je jen jméno adresáře. Můžeš si ho pojmenovat jak chceš; dokonce -nemusí být v rámci adresáře s projektem. -Někteří lidé mají všechny virtuální prostředí na jednom místě; dokonce existuje -nástroj virtualenvwrapper na správu takového řešení, případně pipenv, -který Python Packaging Authority doporučuje pro vývoj aplikací (my ale -budeme vyvíjet i knihovny).

    -

    Autoři tohoto textu tedy doporučují __venv__ v adresáři s projektem. -Při použití v kombinaci s Gitem nezapomeň tento adresář přidat do souboru -.gitignore.

    -

    Příkaz python -m pip install nainstaluje danou knihovnu – může to být i jiná -než requests jako výše.

    \ No newline at end of file +

    Pokud máš jiný systém než Linux, Windows nebo macOS, +nebo pokud ke svému počítači neznáš administrátorské heslo, +napiš nám prosím e-mail.

    \ No newline at end of file diff --git a/mi-pyt/install/linux.html b/mi-pyt/install/linux.html new file mode 100644 index 00000000..50ff62ff --- /dev/null +++ b/mi-pyt/install/linux.html @@ -0,0 +1,63 @@ +

    Instalace Pythonu na Linux

    +

    Nainstalovat Pyhon na Linux je většinou jednoduché. +Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, +tak jsou tyhle instrukce trochu delší. +Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

    +

    Instalace Pythonu 3

    +

    Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť +v příkazové řádce příkaz:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Přejdi na další sekci, kontrolu tkinter.

    +

    Objeví-li se „Python“ a verze 3.5 nebo nižší, +aktualizuj systém (nebo se poraď s někým, kdo to umí) a zkus to znovu.

    +

    Objeví-li se bash: python3: command not found nebo podobná chyba, +doinstaluj Python. +Konkrétní příkaz záleží na distribuci:

    +
      +
    • Fedora:
      $ sudo dnf install python3
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    +

    Kontrola Tkinter

    +

    Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti +Pythonu. +Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) +často musíme nainstalovat zvlášť. +Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

    +
    $ python3 -m tkinter
    +

    Objeví-li se okýnko, je všechno v pořádku. +Zavři ho a přejdi na doinstalování virtualenv.

    +

    Jestli ne, modul tkinter ještě nainstaluj:

    +
      +
    • Fedora:
      $ sudo dnf install python3-tkinter
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      +
    • +
    +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    +

    +

    Doinstalování Virtualenv

    +

    Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. +Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu +vyřadily). +Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

    +

    Spusť v příkazové řádce příkaz:

    +
    $ python3 -m ensurepip --version
    +

    Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. +Zbytek této sekce můžeš přeskočit!

    +

    Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat +alternativu, Virtualenv:

    + + +
      +
    • Ubuntu:
      $ sudo apt-get install python-virtualenv
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později +při vytváření virtuálního prostředí.

    \ No newline at end of file diff --git a/mi-pyt/install/macos.html b/mi-pyt/install/macos.html new file mode 100644 index 00000000..75171382 --- /dev/null +++ b/mi-pyt/install/macos.html @@ -0,0 +1,15 @@ +

    Instalace Pythonu pro macOS

    +

    Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje +instalaci aplikací a knihoven, které budeme potřebovat pro programování. +Jak na to?

    +

    Spusť v příkazové řádce příkaz:

    +
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +

    Pak zadej následující příkaz a Python bude nainstalovaný:

    +
    $ brew install python3
    +

    Zkontroluj si, že máš verzi 3.6 nebo vyšší:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Jinak je něco špatně; +zkus instalaci znovu. +Když to nevyjde, poraď se s někým zkušenějším.

    \ No newline at end of file diff --git a/mi-pyt/install/windows.html b/mi-pyt/install/windows.html new file mode 100644 index 00000000..de9dbcff --- /dev/null +++ b/mi-pyt/install/windows.html @@ -0,0 +1,26 @@ +

    Instalace Pythonu pro Windows

    +

    Běž na stahovací stránku Pythonu +a stáhni si instalátor nejnovější stabilní verze Pythonu. +Ověř si že je to verze 3.6.0 nebo novější – +verze 3.6.0 má jistá vylepšení, která budeme v tomto kurzu používat.

    +

    Jak poznat, který instalátor je ten pravý? +Pokud má tvůj počítač 64bitovou verzi Windows, +stáhni si Windows x86-64 executable installer. +Pokud máš starší počítač s 32bitovými Windows, +stáhni si Windows x86 executable installer. +(Rozdíl je v x86-64 versus x86.)

    +

    Kde zjistíš, zda máš 32bitové nebo 64bitové Windows? Otevři nabídku +Start, vyhledat „Systém“ a otevřít Systémové informace. +Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

    +

    Screenshot zjišťování verze systému

    +

    Stažený instalátor spusť. +Na začátku instalace zaškrtni Install launcher for all users +a také Add Python to PATH. +Tyto volby ti zjednoduší vytvoření virtuálního prostředí.

    +

    (Jestli nemáš administrátorské oprávnění, volbu +Install launcher for all users nezaškrtávej.)

    +

    Screenshot instalace Pythonu

    +

    Pak zmáčkni Install now a dále se drž instrukcí.

    +

    Máš-li otevřenou příkazovou řádku, po instalaci Pythonu ji zavři a otevři +novou. +Instalace mění systémové nastavení, které se musí načíst znovu.

    \ No newline at end of file diff --git a/mi-pyt/install/windows_32v64-bit.png b/mi-pyt/install/windows_32v64-bit.png new file mode 100644 index 0000000000000000000000000000000000000000..70550e8422832fcc3cb696ab40b29d5a5b141d5a GIT binary patch literal 36230 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

    x-X)=B8Ao1rrt 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 literal 0 HcmV?d00001 diff --git a/mi-pyt/testing/index.1.html b/mi-pyt/testing/index.1.html new file mode 100644 index 00000000..2291b0a2 --- /dev/null +++ b/mi-pyt/testing/index.1.html @@ -0,0 +1,564 @@ +

    Testování

    +

    V tomto cvičení se budeme zabývat automatickým testováním kódu. +Modul unittest ze standardní knihovny už byste měli znát, +co to jsou jednotkové testy a k čemu slouží tedy rovnou přeskočím.

    +

    Pokud základy testování neznáte, projděte si +začátečnickou lekci o testování. +Obsah se zčásti překrývá, ale základní principy jsou tam vysvětleny trošku +podrobněji.

    +

    Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový +zápisek Michala Hořejška.

    +

    pytest

    +

    Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu +unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday +z cvičení o modulech.

    +
    import isholiday
    +
    +def test_xmas_2016():
    +    """Test whether there is Christmas in 2016"""
    +    holidays = isholiday.getholidays(2016)
    +    assert (24, 12) in holidays
    +

    Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a +nainstalujeme a spustíme pytest:

    +
    (__venv__) $ python -m pip install pytest
    +(__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py .                                                 [100%]
    +
    +=========================== 1 passed in 0.01 seconds ===========================
    +

    Všimněte si několika věcí:

    +
      +
    • V testovacím souboru stačí mít funkci pojmenovanou test_* a pytest pozná, +že se jedná o test.
    • +
    • V ukázce je použit obyčejný assert, nikoliv metoda z unittest.
    • +
    +

    Co se má testovat, se pytestu dá zadat pomocí argumentů příkazové řádky. +Můžou to být jednotlivé soubory nebo adresáře, ve kterých pytest +rekurzivně hledá všechny soubory začínající na test_. +Vynecháme-li argumenty úplně, hledá rekurzivně v aktuálním adresáři. +(To se často hodí, ale obsahuje-li aktuální adresář i vaše virtuální prostředí, +pytest prohledá i to a často v něm najde neprocházející testy.)

    +

    Pokud pytest nemůže naimportovat váš modul, můžete udělat několik věcí:

    +
      +
    • Nainstalovat svůj balíček (například v režimu develop).
    • +
    • Nastavit proměnnou prostředí PYTHONPATH na ..
    • +
    +

    Testovat nainstalovaný balíček je výhodnější – ověříte zároveň, že +nainstalovaný modul se chová dle očekávání. Je dobré testy psát tak, aby +šly spouštět z jakéhokoliv adresáře, a pro jistotu je spouštět odjinud, +než z adresáře s kódem. Odhalíte tím často balíčkovací chyby.

    +

    Pytest upravuje chování assertu, což oceníte především, pokud test selže:

    +
        ...
    +    assert (23, 12) in holidays
    +
    (__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py F                                                 [100%]
    +
    +=================================== FAILURES ===================================
    +________________________________ test_xmas_2016 ________________________________
    +
    +    def test_xmas_2016():
    +        """Test whether there is Christmas in 2016"""
    +        holidays = isholiday.getholidays(2016)
    +>       assert (23, 12) in holidays
    +E       assert (23, 12) in {(1, 1), (1, 5), (5, 7), (6, 7), (8, 5), (17, 11), ...}
    +
    +tests/test_holidays.py:6: AssertionError
    +=========================== 1 failed in 0.02 seconds ===========================
    +

    S obyčejným assertem si vystačíte pro většinu testovaných případů kromě +ověření vyhození výjimky. To se dělá takto:

    +
    import pytest
    +
    +def f():
    +    raise SystemExit(1)
    +
    +def test_mytest():
    +    with pytest.raises(SystemExit):
    +        f()
    +

    Více o základním použití pytestu najdete v dokumentaci.

    +

    Parametrické testy

    +

    Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. +Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen +v roce 2016, ale v jiných letech, nemusíme psát testů více, ani použít cyklus.

    +

    Nevýhoda více téměř stejných testů je patrná sama o sobě, nevýhoda cyklu je +v tom, že celý test selže, i pokud selže jen jeden průběh cyklem. Zároveň se +průběh testu při selhání ukončí.

    +

    Místo toho tedy použijeme parametrický test:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +def test_xmas(year):
    +    """Test whether there is Christmas"""
    +    holidays = isholiday.getholidays(year)
    +    assert (24, 12) in holidays
    +

    Zápis je určitým způsobem podobný knihovně click: funkce +s testem přijímá parametr vytvořený v dekorátoru. +Test se spustí pro každou uvedenou hodnotu, k jejich definici lze použít +jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité +n-tice např. seznam, množinu, range, vlastní generátor...

    +

    Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

    +
    (__venv__) $ python -m pytest -v
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] PASSED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] PASSED                           [100%]
    +
    +=========================== 5 passed in 0.02 seconds ===========================
    +

    Jednoduchým způsobem tak lze vyrobit z jednoho testu testů více. +Výhodou je, že každý se testuje zvlášť, což má vliv na čitelnost +výstupu, pokud nějaký test selže, a umožňuje to například testy pouštět +paralelně nebo distribuovaně. (Což s jedním testem, který více podmínek ověřuje +v cyklu, nejde, tedy alespoň ne jednoduše.)

    +

    Potřebujeme-li parametrizovat více argumentů, můžeme předat seznam jmen +argumentů a seznam jejich hodnot:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize(
    +    ['year', 'month', 'day'],
    +    [(2015, 12, 24),
    +     (2016, 12, 24),
    +     (2017, 1, 1),
    +     (2033, 7, 5),
    +     (2048, 7, 6)],
    +)
    +def test_some_holidays(year, month, day):
    +    """Test a few sample holidays"""
    +    holidays = isholiday.getholidays(year)
    +    assert (day, month) in holidays
    +

    Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, +abychom se ujistili, že testujeme správně. +Přidáme tedy dočasně na konec funkce getholidays() tento pesimistický kus kódu:

    +
        if year > 2020:
    +        # After the Zygon war, the puppet government canceled all holidays
    +        holidays = set()
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] FAILED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] FAILED                           [100%]
    +
    +=================================== FAILURES ===================================
    +_______________________________ test_xmas[2033] ________________________________
    +
    +year = 2033
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +_______________________________ test_xmas[2048] ________________________________
    +
    +year = 2048
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +====================== 2 failed, 3 passed in 0.03 seconds ======================
    +

    Fixtures

    +

    Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, +abyste získali to, co teprve chcete testovat. Příkladem může být například +inicializace objektu pro komunikaci s nějakým API.

    +

    V pytestu k tomuto účelu nejlépe slouží tz. fixtures, které se v samotných +testech používají jako argumenty funkcí.

    +
    import pytest
    +
    +@pytest.fixture
    +def client():
    +    import twitter
    +    return twitter.Client(...)
    +
    +def test_search_python(client):
    +    tweets = client.search('python', size=1)
    +    assert len(tweets) == 1
    +    assert 'python' in tweets[0].text.lower()
    +

    Fixtures se hledají pomocí jména: když má testovací funkce (nebo i jiná +fixture) parametr, podle jména tohoto parametru se najde odpovídající fixture. +Fixtures můžou být definovány v aktuálním souboru, +v pluginu, +konfiguračním souboru +a některé jsou zabudované přímo v pytestu.

    +

    Pokud potřebujete po použití s fixturou ještě něco udělat, můžete místo return +použít yield. +Často se to používá u zdrojů, které je po použití potřeba nějak finalizovat či +zavřít, například u databázových spojení. +Zde je ilustrační příklad, který si můžete rovnou vyzkoušet:

    +
    import pytest
    +
    +
    +class DBConnection:
    +    def __init__(self, name):
    +        print('Creating connection for ' + name)
    +        ...
    +
    +    def select(self, arg):
    +        return arg
    +
    +    def cleanup(self):
    +        print('Cleaning up connection')
    +        ...
    +
    +
    +@pytest.fixture
    +def connection():
    +    d = DBConnection('sqlite')
    +    yield d
    +    d.cleanup()
    +
    +
    +@pytest.mark.parametrize('arg', (1, float, None))
    +def test_with_fixture(connection, arg):
    +    assert arg == connection.select(arg)
    +

    Standardní výstup (stderr a stdout) z testů se normálně zobrazuje, +jen když test selže. +Chceme-li výstup vidět u všech testů, je třeba použít přepínač -s.

    +

    I fixtury jdou parametrizovat, jen trochu jiným způsobem než testovací funkce: +parametry předané dekorátoru pytest.fixture získáme ze speciálního parametru +request, který obsahuje informace o probíhajícím testu:

    +
    @pytest.fixture(params=('sqlite', 'postgres'))
    +def connection(request):
    +    d = DBConnection(request.param)
    +    yield d
    +    d.cleanup()
    +

    Hromadu dalších příkladů použití pytestu najdete dokumentaci v +sekci s příklady. +Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference +PyCon PL.

    +

    „Podvádění“

    +

    Při psaní testů se občas hodí trochu podvádět. Například když nechceme, +aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na +náhodě a podobně. Obecně se tomuto říká mocking * či test doubles a existuje více různých +knihoven, které to umožňují. Jednou z nich je flexmock.

    +

    * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít +pro funkcionalitu knihoven, které mají v názvu mock :)

    +

    Falešné objekty (fakes)

    +

    Při testování často potřebujeme nějaký objekt, který má určité atributy a +metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

    +
    class FakePlane:
    +    operational = True
    +    model = 'MIG-21'
    +    def fly(self): pass
    +
    +plane = FakePlane()  # this is tedious!
    +

    Flexmock umožňuje vytvoření objektu rychle a jednoduše:

    +
    plane = flexmock(operational=True,
    +                 model='MIG-21',
    +                 fly=lambda: None)
    +

    Částečně upravené objekty, třídy, moduly (stubs)

    +

    Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část +atributů nebo metod:

    +
    >>> import flexmock
    +>>> class Train:
    +...     def get_speed(self):
    +...         return 0
    +... 
    +>>> flexmock(Train, get_speed=200)
    +<flexmock.Mock object at 0x7f88501d8908>
    +>>> train = Train()
    +>>> train.get_speed()
    +200
    +

    Můžete tak zfalšovat i volání builtin funkcí, jako je například open():

    +
    >>> import sys
    +>>> import flexmock
    +>>> import builtins
    +>>> from io import StringIO
    +>>> flexmock(builtins, open=StringIO('fake content'))
    +<module 'builtins' (built-in)>
    +>>> with open('/etc/passwd') as f:
    +...     f.readlines()
    +... 
    +['fake content']
    +

    Očekávání (mocks, spies)

    +

    Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco +zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), +nebo jen sledujete, jestli se zavolala (spies). +(Příklady na odkazu.)

    +

    Integrace s pytestem

    +

    Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená +kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double +ale není nic těžkého a můžete to udělat sami (bez knihovny). +Pro přepsání nějaké metody, funkce apod. na omezenou dobu +můžete využít zabudovanou pytest fixturu +monkeypatch.

    +

    Varování

    +

    Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce +čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud +bude obsahovat daný obsah, musíte si trochu zapodvádět, protože nemůžete vědět, +co v tom souboru je doopravdy na daném systému, v daný čas.

    +

    Je ale jednoduché sklouznout do fáze, kdy jsou vaše testy natolik přemockované, +že už ani neplní svůj účel. Buďto proto, že příliš podvádíte a testy vždy +projdou, i když je implementace rozbitá; nebo proto, že při sebemenší úpravě +vnitřní implementace musíte vždy upravit i testy.

    +

    Mějte toto na paměti a k mockování se uchylujte až po vyčerpání „slušnějších” +možností. +Často jde trochu změnit kód, aby byl testovatelnější – například napsat funkci, +která čte soubor formátu /etc/passwd, ale jméno souboru jí předat argumentem.

    +

    Mohl by vás zajímat záznam z přednášky Should I mock or should I not? +z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění +při psaní testů.

    +

    Testování HTTP komunikace: betamax

    +

    Vaše programy často používají webová API. Při testování funkcionality API klientů +se vynoří řada problémů:

    +
      +
    • výsledky volání API mohou být pokaždé různé,
    • +
    • k některým volání API je potřeba mít přístupové údaje,
    • +
    • API může být zrovna nedostupné.
    • +
    +

    V zásadě můžete omockovat knihovnu requests tak, aby +jednotlivá volání jako get() apod. vracela předem definovanou odpověď. +Při ponoření do hloubky ale zjistíte, že komplexita takového mockování může +velmi přesáhnout komplexitu samotného kódu, který testujete. +Jednodušší je tak použít již hotové řešení. Jedno z nich je betamax.

    +

    Betamax umožňuje nahrát HTTP komunikaci do kazet (souborů), které se potom +použijí při testech. V zásadě to funguje takto:

    +
      +
    • Pokud daný HTTP požadavek ještě neproběhl, provede se a nahraje na kazetu.
    • +
    • Pokud již proběhl, použije se daná kazeta pro simulaci.
    • +
    +

    Betamax funguje pouze s knihovnou requests při použití session.

    +

    V kombinaci s pytestem můžete použít předpřipravenou fixture:

    +
    import betamax
    +
    +with betamax.Betamax.configure() as config:
    +    # tell Betamax where to find the cassettes
    +    # make sure to create the directory
    +    config.cassette_library_dir = 'tests/fixtures/cassettes'
    +
    +def test_get(betamax_session):
    +    betamax_session.get('https://httpbin.org/get')
    +

    Před spuštěním testu vytvořte složku tests/fixtures/cassettes. +Po spuštění testu ji prozkoumejte. +Měla by obsahovat soubor test_filename.test_get.json. +To je nahraná kazeta. Každý další průběh testu nevykoná GET požadavek, +ale pouze přehraje danou kazetu. Pokud chcete kazetu opět nahrát, prostě ji +smažte a pusťte test znovu.

    +

    Celé to ale funguje pouze, pokud kód vykonávaný uvnitř testu použije speciální +session, kterou máme od betamaxu. Jak to udělat?

    +

    Je třeba, aby implementační část kódu uměla session přejmout, například takto:

    +
    class Client:
    +    def __init__(self, session=None):
    +        self.session = session or requests.Session()
    +        ...
    +
    +def test_clent_foo(betamax_session):
    +    client = Client(session=betamax_session)
    +    assert client.foo() == 42
    +

    Pokud budete používat parametrizované testy, použijte +betamax_parametrized_session, aby kazety měly odlišné jméno při odlišných +parametrech.

    +

    Pro tip: Abyste nevytvářeli novou instanci třídy ve všech testech, můžete si +vytvořit vlastní fixture, která použije fixture betamax_session:

    +
    @pytest.fixture
    +def client(betamax_session):
    +    return Client(session=betamax_session)
    +

    Citlivé údaje

    +

    Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

    +

    Vyvstávají dvě otázky:

    +
      +
    1. Jak umožnit spuštění testů bez vlastního tokenu?
    2. +
    3. Jak citlivé údaje skrýt v kazetách a nedávat je do gitu?
    4. +
    +

    Na obě otázky se pokusím odpovědět jedním okomentovaným kódem:

    +
    with betamax.Betamax.configure() as config:
    +    if 'AUTH_FILE' in os.environ:
    +        # If the tests are invoked with an AUTH_FILE environ variable
    +        TOKEN = my_auth_parsing_func(os.environ['AUTH_FILE'])
    +        # Always re-record the cassetes
    +        # https://betamax.readthedocs.io/en/latest/record_modes.html
    +        config.default_cassette_options['record_mode'] = 'all'
    +    else:
    +        TOKEN = 'false_token'
    +        # Do not attempt to record sessions with bad fake token
    +        config.default_cassette_options['record_mode'] = 'none'
    +
    +    # Hide the token in the cassettes
    +    config.define_cassette_placeholder('<TOKEN>', TOKEN)
    +    ...
    +
    +@pytest.fixture
    +def client(betamax_session):
    +    return Client(token=TOKEN, session=betamax_session)
    +

    Co když ale nevíme, jak bude vypadat citlivá část požadavku, protože se teprve +někde spočítá a získá, jako například v případě Twitter API? +Na tuto otázku podrobněji odpovídá +dokumentace.

    +

    V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách +nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

    +

    Komprimované citlivé údaje

    +

    Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle +odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní +chování, viz dokumentace). +V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit +hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, +compress ani deflate:

    +
    betamax_session.headers.update({'Accept-Encoding': 'identity'})

    Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou +nijak transformována, více viz Wikipedia +a specifikace HTTP)

    +

    Které HTTP požadavky jsou stejné?

    +

    Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se +pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. +Pokud tedy na jedno URL provedete dva POST požadavky s jiným tělem, betamax +je bude považovat za stejné. Toto chování lze měnit zapnutím (nebo vypnutím) +různých matcherů. Těch je v betamaxu celá řada a je jednoduché napsat si +vlastní. Více informací najdete +v dokumentaci.

    +

    Mohl by vás zajímat záznam z přednášky If it Moves, Test it Anyway +z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak +testovat webové API klienty v Pythonu.

    +

    Testování aplikací ve Flasku

    +

    Pro testování aplikací ve Flasku se +používá app.test_client():

    +
    import pytest
    +
    +@pytest.fixture
    +def testapp():
    +    from hello import app
    +    app.config['TESTING'] = True
    +    return app.test_client()
    +
    +def test_hello(testapp):
    +    assert 'Hello' in testapp.get('/').get_data(as_text=True)
    +

    Pozor, metody na testovacím klientu vrací Response, ale trochu jinou, než tu +z requests. +Proto nelze použít přímo response.text; text dostaneme pomocí +response.get_data(as_text=True).

    +

    Testování aplikací v clicku

    +

    Podobně funguje testování aplikací v clicku. +Click obsahuje třídu CliRunner, která pomáhá s testováním:

    +
    from click.testing import CliRunner
    +
    +def test_push_force():
    +    runner = CliRunner()
    +    result = runner.invoke(git_cli_made_in_click, ['push', '--force'])
    +    assert result.exit_code == 0
    +    assert 'forced update' in result.output
    +

    Kam dát testy?

    +

    Dokumentace pytestu +uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +tests/
    +    test_app.py
    +    ...

    nebo do něj:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +    ...
    +    test/
    +        test_app.py
    +        ...

    První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. +Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný +Pythonní modul, ale jen sada souborů s testy.

    +

    Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné +moduly, ne jako součást vašeho balíčku. +Relativní importy (from ..appmodule import xyz) v testech nebudou fungovat.

    +

    Pozor na to, aby testy byly součástí archivu s balíčkem (setup.py sdist), ale +pokud zvolíte první variantu umístění, aby se neinstalovaly (setup.py install), +protože by tam kolidovaly s ostatními testy z jiných balíčků.

    +

    Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve +složce s testy.

    +

    Spouštění testů pomocí setup.py test

    +

    Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale +python setup.py test, což funguje i s jinými nástroji než je pytest. +Pokud pytest používáme, je proto dobré setup.py naučit spouštět pytest.

    +

    K tomu potřebujeme nakonfigurovat závislosti: v setup_requires musí být +pytest-runner a v tests_require pak pytest a další testovací závislosti +(flexmock, betamax...).

    +
    from setuptools import setup
    +
    +setup(
    +    ...,
    +    setup_requires=['pytest-runner', ...],
    +    tests_require=['pytest', ...],
    +    ...,
    +)
    +

    a přidat následující sekci do setup.cfg:

    +
    [aliases]
    +test=pytest

    Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude +podporovat další argumenty pytestu (jako -v). +Na to uživatel spustí pytest samotný.

    +

    Další informace jsou v dokumentaci pytestu.

    +

    Travis CI

    +

    Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky +na službě Travis CI při každém pushnutí na GitHub.

    +

    Travis CI je zadarmo pro veřejné repozitáře na travis-ci.org, pro soukromé +repozitáře je placená verze na travis-ci.com. V rámci studentského balíčku +můžete i tuto verzi využít zdarma.

    +

    Přihlaste se na travis-ci.com pomocí GitHubu (vpravo nahoře). +Pak opět vpravo nahoře zvolte Accounts +a povolte Travis pro váš repozitář.

    +

    Do repozitáře přidejte soubor .travis.yml:

    +
    language: python
    +python:
    +- '3.6'
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Uvedený příklad je pro Python 3.6. +Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

    +
    language: python
    +python:
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Verze Pythonu lze kombinovat:

    +
    language: python
    +python:
    +- '3.6'
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Po pushnutí by se na Travisu měl automaticky spustit test. +Více informací o použití pro Python najdete +v dokumentaci.

    +

    Kvíz

    +

    Co je špatně na této testovací sadě k funkci is_even()?

    +
    def is_even(n):
    +    return n % 2 == 0
    +
    +
    +@pytest.mark.parametrize('n', range(0, 1000, 2))
    +def test_is_even(n):
    +    assert is_even(n)
    +
    \ No newline at end of file diff --git a/mi-pyt/testing/index.html b/mi-pyt/testing/index.html index 2291b0a2..371afde3 100644 --- a/mi-pyt/testing/index.html +++ b/mi-pyt/testing/index.html @@ -1,564 +1,226 @@

    Testování

    -

    V tomto cvičení se budeme zabývat automatickým testováním kódu. -Modul unittest ze standardní knihovny už byste měli znát, -co to jsou jednotkové testy a k čemu slouží tedy rovnou přeskočím.

    -

    Pokud základy testování neznáte, projděte si -začátečnickou lekci o testování. -Obsah se zčásti překrývá, ale základní principy jsou tam vysvětleny trošku -podrobněji.

    -

    Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový -zápisek Michala Hořejška.

    -

    pytest

    -

    Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu -unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday -z cvičení o modulech.

    -
    import isholiday
    -
    -def test_xmas_2016():
    -    """Test whether there is Christmas in 2016"""
    -    holidays = isholiday.getholidays(2016)
    -    assert (24, 12) in holidays
    -

    Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a -nainstalujeme a spustíme pytest:

    -
    (__venv__) $ python -m pip install pytest
    -(__venv__) $ python -m pytest tests/test_holidays.py
    -
    ============================= test session starts ==============================
    -platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    -rootdir: /tmp/tmp.etepchwQWh, inifile:
    -collected 1 item
    -
    -tests/test_holidays.py .                                                 [100%]
    -
    -=========================== 1 passed in 0.01 seconds ===========================
    -

    Všimněte si několika věcí:

    -
      -
    • V testovacím souboru stačí mít funkci pojmenovanou test_* a pytest pozná, -že se jedná o test.
    • -
    • V ukázce je použit obyčejný assert, nikoliv metoda z unittest.
    • -
    -

    Co se má testovat, se pytestu dá zadat pomocí argumentů příkazové řádky. -Můžou to být jednotlivé soubory nebo adresáře, ve kterých pytest -rekurzivně hledá všechny soubory začínající na test_. -Vynecháme-li argumenty úplně, hledá rekurzivně v aktuálním adresáři. -(To se často hodí, ale obsahuje-li aktuální adresář i vaše virtuální prostředí, -pytest prohledá i to a často v něm najde neprocházející testy.)

    -

    Pokud pytest nemůže naimportovat váš modul, můžete udělat několik věcí:

    -
      -
    • Nainstalovat svůj balíček (například v režimu develop).
    • -
    • Nastavit proměnnou prostředí PYTHONPATH na ..
    • -
    -

    Testovat nainstalovaný balíček je výhodnější – ověříte zároveň, že -nainstalovaný modul se chová dle očekávání. Je dobré testy psát tak, aby -šly spouštět z jakéhokoliv adresáře, a pro jistotu je spouštět odjinud, -než z adresáře s kódem. Odhalíte tím často balíčkovací chyby.

    -

    Pytest upravuje chování assertu, což oceníte především, pokud test selže:

    -
        ...
    -    assert (23, 12) in holidays
    -
    (__venv__) $ python -m pytest tests/test_holidays.py
    -
    ============================= test session starts ==============================
    -platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    -rootdir: /tmp/tmp.etepchwQWh, inifile:
    -collected 1 item
    -
    -tests/test_holidays.py F                                                 [100%]
    -
    -=================================== FAILURES ===================================
    -________________________________ test_xmas_2016 ________________________________
    -
    -    def test_xmas_2016():
    -        """Test whether there is Christmas in 2016"""
    -        holidays = isholiday.getholidays(2016)
    ->       assert (23, 12) in holidays
    -E       assert (23, 12) in {(1, 1), (1, 5), (5, 7), (6, 7), (8, 5), (17, 11), ...}
    -
    -tests/test_holidays.py:6: AssertionError
    -=========================== 1 failed in 0.02 seconds ===========================
    -

    S obyčejným assertem si vystačíte pro většinu testovaných případů kromě -ověření vyhození výjimky. To se dělá takto:

    -
    import pytest
    -
    -def f():
    -    raise SystemExit(1)
    -
    -def test_mytest():
    -    with pytest.raises(SystemExit):
    -        f()
    -

    Více o základním použití pytestu najdete v dokumentaci.

    -

    Parametrické testy

    -

    Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. -Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen -v roce 2016, ale v jiných letech, nemusíme psát testů více, ani použít cyklus.

    -

    Nevýhoda více téměř stejných testů je patrná sama o sobě, nevýhoda cyklu je -v tom, že celý test selže, i pokud selže jen jeden průběh cyklem. Zároveň se -průběh testu při selhání ukončí.

    -

    Místo toho tedy použijeme parametrický test:

    -
    import pytest
    -import isholiday
    -
    -@pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    -def test_xmas(year):
    -    """Test whether there is Christmas"""
    -    holidays = isholiday.getholidays(year)
    -    assert (24, 12) in holidays
    -

    Zápis je určitým způsobem podobný knihovně click: funkce -s testem přijímá parametr vytvořený v dekorátoru. -Test se spustí pro každou uvedenou hodnotu, k jejich definici lze použít -jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité -n-tice např. seznam, množinu, range, vlastní generátor...

    -

    Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

    -
    (__venv__) $ python -m pytest -v
    -
    ============================= test session starts ==============================
    -platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    -cachedir: .pytest_cache
    -rootdir: /tmp/tmp.etepchwQWh, inifile:
    -collecting ... collected 5 items
    -
    -tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    -tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    -tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    -tests/test_holidays.py::test_xmas[2033] PASSED                           [ 80%]
    -tests/test_holidays.py::test_xmas[2048] PASSED                           [100%]
    -
    -=========================== 5 passed in 0.02 seconds ===========================
    -

    Jednoduchým způsobem tak lze vyrobit z jednoho testu testů více. -Výhodou je, že každý se testuje zvlášť, což má vliv na čitelnost -výstupu, pokud nějaký test selže, a umožňuje to například testy pouštět -paralelně nebo distribuovaně. (Což s jedním testem, který více podmínek ověřuje -v cyklu, nejde, tedy alespoň ne jednoduše.)

    -

    Potřebujeme-li parametrizovat více argumentů, můžeme předat seznam jmen -argumentů a seznam jejich hodnot:

    -
    import pytest
    -import isholiday
    -
    -@pytest.mark.parametrize(
    -    ['year', 'month', 'day'],
    -    [(2015, 12, 24),
    -     (2016, 12, 24),
    -     (2017, 1, 1),
    -     (2033, 7, 5),
    -     (2048, 7, 6)],
    -)
    -def test_some_holidays(year, month, day):
    -    """Test a few sample holidays"""
    -    holidays = isholiday.getholidays(year)
    -    assert (day, month) in holidays
    -

    Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, -abychom se ujistili, že testujeme správně. -Přidáme tedy dočasně na konec funkce getholidays() tento pesimistický kus kódu:

    -
        if year > 2020:
    -        # After the Zygon war, the puppet government canceled all holidays
    -        holidays = set()
    +

    Programátorská práce nespočívá jen v tom, program napsat. +Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. +Ověřování, že program funguje, se říká testování (angl. testing).

    +

    Zatím jsi asi svoje programy testoval/a tak, že jsi +je zkusil/a spustit, něco zadal/a a podíval/a se, +jestli jsou výsledky v pořádku. +U větších programů, které budou mít více a více +možností, ale bude těžší a těžší takhle zkontrolovat, +jestli všechny ty možnosti fungují, jak mají.

    +

    Proto si programátoři často nezkouší programy „ručně“. +Píšou jiné programy, které jejich výtvory testují za ně.

    +

    Automatické testy jsou funkce, které +zkontrolují, že program funguje správně. +Spuštěním testů můžeš kdykoli ověřit, že kód funguje. +Když v otestovaném kódu v budoucnu uděláš nějakou změnu, +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

    +

    Instalace knihovny pytest

    +

    Zatím jsme v kurzu pracovali/y s tím, co se instaluje +se samotným Pythonem – s moduly jako math a turtle. +Kromě takových modulů ale existuje ale velká spousta +dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat +a používat.

    +

    Na testy je v samotném Pythonu zabudovaná knihovna unittest. +Ta je ale celkem složitá na použití, proto ji my používat nebudeme. +Nainstalujeme si knihovnu pytest, která se používá +mnohem jednodušeji a je velice populární.

    +

    Knihovny se instalují do aktivního virtuálního prostředí. +Jak se dělá a spouští virtuální prostředí +ses naučil/a při instalaci Pythonu, +ale teprve teď to začíná být opravdu důležité. +Ujisti se, že máš virtuální prostředí aktivované.

    +

    Potom zadej následující příkaz. +(Je to příkaz příkazové řádky, podobně jako +cd nebo mkdir; nezadávej ho do Pythonu.)

    +

    Opisuj opatrně!

    +

    Příkaz níže instaluje software z Internetu. +Za knihovnu pytest autoři tohoto kurzu ručí. +Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“. +Dej si proto pozor a ve jménu pytest neudělej překlep!

    +
    (venv)$ python -m pip install pytest
    +

    Co ten příkaz znamená?

    +

    python -m pip zavolá Python s tím, že má pustit modul +pip. Tento modul umí instalovat nebo +odinstalovávat knihovny. +(Jestli si pamatuješ vytváření virtuálního prostředí, použil/a jsi tam +příkaz python -m venv – modul venv umí vytvářet virtuální prostředí.) +No a slova install pytest říkají Pipu, že má nainstalovat pytest.

    +

    Nápověda k použití Pipu se dá vypsat pomocí příkazu +python -m pip --help.

    +

    Pro Windows

    +

    Jsi-li na Windows, od této lekce začne být důležité +spouštět pythonní programy pomocí python program.py, ne jen +program.py. +Ačkoli se v těchto materiálech všude používá python na začátku, zatím +mohlo všechno fungovat i bez toho. +Program se ale bez příkazu python může spustit v jiném Pythonu, +než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

    +

    Psaní testů

    +

    Nejdříve si testování ukážeme na jednoduchém příkladu. +Tady je funkce secti, která umí sečíst +dvě čísla, a další funkce, která testuje, jestli se +secti pro určité hodnoty +chová správně.

    +

    Kód si opiš do souboru test_secteni.py, +v novém prázdném adresáři. +Pro pytest je (ve výchozím nastavení) +důležité, aby jména jak souborů s testy, tak +samotných testovacích funkcí, začínala na +test_.

    +
    def secti(a, b):
    +    return a + b
    +
    +def test_secti():
    +    assert secti(1, 2) == 3
    +

    Co se v té testovací funkci děje?

    +

    Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, +vyvolá výjimku, která způsobí, že test selže. +Můžeš si představit, že assert a == b dělá následující:

    +
    if not (a == b):
    +    raise AssertionError('Test selhal!')
    +

    Zatím assert nepoužívej jinde než v testovacích funkcích. +V „normálním” kódu se assert může chovat trochu jinak než výše, +ale do toho teď nebudeme zabředávat.

    +

    Spouštění testů

    +

    Testy se spouští zadáním příkazu +python -m pytest -v následovaným názvem souboru s testy. +Tedy v překladu: Pythone, pusť +modul pytest, +v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

    +
    $ python -m pytest -v test_secteni.py
     
    ============================= test session starts ==============================
    -platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
     cachedir: .pytest_cache
    -rootdir: /tmp/tmp.etepchwQWh, inifile:
    -collecting ... collected 5 items
    -
    -tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    -tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    -tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    -tests/test_holidays.py::test_xmas[2033] FAILED                           [ 80%]
    -tests/test_holidays.py::test_xmas[2048] FAILED                           [100%]
    -
    -=================================== FAILURES ===================================
    -_______________________________ test_xmas[2033] ________________________________
    -
    -year = 2033
    -
    -    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    -    def test_xmas(year):
    -        """Test whether there is Christmas"""
    -        holidays = isholiday.getholidays(year)
    ->       assert (24, 12) in holidays
    -E       assert (24, 12) in set()
    -
    -tests/test_holidays.py:8: AssertionError
    -_______________________________ test_xmas[2048] ________________________________
    -
    -year = 2048
    -
    -    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    -    def test_xmas(year):
    -        """Test whether there is Christmas"""
    -        holidays = isholiday.getholidays(year)
    ->       assert (24, 12) in holidays
    -E       assert (24, 12) in set()
    -
    -tests/test_holidays.py:8: AssertionError
    -====================== 2 failed, 3 passed in 0.03 seconds ======================
    -

    Fixtures

    -

    Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, -abyste získali to, co teprve chcete testovat. Příkladem může být například -inicializace objektu pro komunikaci s nějakým API.

    -

    V pytestu k tomuto účelu nejlépe slouží tz. fixtures, které se v samotných -testech používají jako argumenty funkcí.

    -
    import pytest
    -
    -@pytest.fixture
    -def client():
    -    import twitter
    -    return twitter.Client(...)
    +rootdir: naucse, inifile:
    +collecting ... collected 1 item
    +
    +test_secteni.py::test_secti PASSED                                       [100%]
    +
    +=========================== 1 passed in 0.00 seconds ===========================
    +

    Tento příkaz projde zadaný soubor, zavolá v něm všechny funkce, +jejichž jméno začíná na test_, a ověří, že nevyvolají žádnou +výjimku – typicky výjimku z příkazu assert. +Pokud výjimka nastane, dá to pytest velice červeně +najevo a přidá několik informací, které můžou +usnadnit nalezení a opravu chyby.

    +

    Argument s názvem souboru můžeš vynechat: python -m pytest -v. +V takovém případě pytest projde aktuální adresář a spustí testy +ze všech souborů, jejichž jméno začíná na test_. Místo souboru +lze též uvést adresář: pytest vyhledá testy v něm.

    +

    Zkus si změnit funkci secti (nebo její test) a podívat se, +jak to vypadá když test „neprojde“.

    +

    Testovací moduly

    +

    Testy se většinou nepíšou přímo ke kódu, +ale do souboru vedle. +Je to tak přehlednější a taky to pak zjednodušuje +distribuci – předání kódu někomu, kdo ho chce +jen spustit a testy nepotřebuje.

    +

    Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +a v test_secteni.py nech jenom test. +Do test_secteni.py pak na začátek přidej from secteni import secti, +aby byla funkce testu k dispozici.

    +

    Test by měl opět projít.

    +

    Spouštěcí moduly

    +

    Automatické testy musí projít „bez dozoru“. +V praxi se často automaticky spouští, případné chyby se automaticky +oznamují (např. e-mailem) a fungující otestovaný kód se automaticky +začne používat dál (nebo se rovnou vydá zákazníkům).

    +

    Co to znamená pro nás? +Funkce input v testech nefunguje. Nemá koho by se zeptala; „za klávesnicí“ +nemusí nikdo sedět.

    +

    To může někdy „ztěžovat práci“. Ukážeme si to na složitějším projektu: +na 1D piškvorkách.

    +

    Učíš-li se z domu, dodělej si Piškvorky než budeš pokračovat dál! +Zadání najdeš (prozatím) +v projektech pro PyLadies +na straně 2.

    +

    Kód pro 1D Piškvorky může rámcově vypadat zhruba takto:

    +
    import random  # (příp. import jiných věcí, které budou potřeba)
    +
    +def tah(pole, cislo_policka, symbol):
    +    """Vrátí pole s daným symbolem umístěným na danou pozici"""
    +    ...
     
    -def test_search_python(client):
    -    tweets = client.search('python', size=1)
    -    assert len(tweets) == 1
    -    assert 'python' in tweets[0].text.lower()
    -

    Fixtures se hledají pomocí jména: když má testovací funkce (nebo i jiná -fixture) parametr, podle jména tohoto parametru se najde odpovídající fixture. -Fixtures můžou být definovány v aktuálním souboru, -v pluginu, -konfiguračním souboru -a některé jsou zabudované přímo v pytestu.

    -

    Pokud potřebujete po použití s fixturou ještě něco udělat, můžete místo return -použít yield. -Často se to používá u zdrojů, které je po použití potřeba nějak finalizovat či -zavřít, například u databázových spojení. -Zde je ilustrační příklad, který si můžete rovnou vyzkoušet:

    -
    import pytest
    +def tah_hrace(pole):
    +    """Zeptá se hráče kam chce hrát a vrátí pole se zaznamenaným tahem"""
    +    ...
    +    input('Kam chceš hrát? ')
    +    ...
     
    +def piskvorky1d():
    +    """Spustí hru
     
    -class DBConnection:
    -    def __init__(self, name):
    -        print('Creating connection for ' + name)
    +    Vytvoří hrací pole a střídavě volá tah_hrace a tah_pocitace
    +    dokud někdo nevyhraje"""
    +    while ...:
             ...
    -
    -    def select(self, arg):
    -        return arg
    -
    -    def cleanup(self):
    -        print('Cleaning up connection')
    +        tah_hrace(...)
             ...
     
    -
    -@pytest.fixture
    -def connection():
    -    d = DBConnection('sqlite')
    -    yield d
    -    d.cleanup()
    -
    -
    -@pytest.mark.parametrize('arg', (1, float, None))
    -def test_with_fixture(connection, arg):
    -    assert arg == connection.select(arg)
    -

    Standardní výstup (stderr a stdout) z testů se normálně zobrazuje, -jen když test selže. -Chceme-li výstup vidět u všech testů, je třeba použít přepínač -s.

    -

    I fixtury jdou parametrizovat, jen trochu jiným způsobem než testovací funkce: -parametry předané dekorátoru pytest.fixture získáme ze speciálního parametru -request, který obsahuje informace o probíhajícím testu:

    -
    @pytest.fixture(params=('sqlite', 'postgres'))
    -def connection(request):
    -    d = DBConnection(request.param)
    -    yield d
    -    d.cleanup()
    -

    Hromadu dalších příkladů použití pytestu najdete dokumentaci v -sekci s příklady. -Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference -PyCon PL.

    -

    „Podvádění“

    -

    Při psaní testů se občas hodí trochu podvádět. Například když nechceme, -aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na -náhodě a podobně. Obecně se tomuto říká mocking * či test doubles a existuje více různých -knihoven, které to umožňují. Jednou z nich je flexmock.

    -

    * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít -pro funkcionalitu knihoven, které mají v názvu mock :)

    -

    Falešné objekty (fakes)

    -

    Při testování často potřebujeme nějaký objekt, který má určité atributy a -metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

    -
    class FakePlane:
    -    operational = True
    -    model = 'MIG-21'
    -    def fly(self): pass
    -
    -plane = FakePlane()  # this is tedious!
    -

    Flexmock umožňuje vytvoření objektu rychle a jednoduše:

    -
    plane = flexmock(operational=True,
    -                 model='MIG-21',
    -                 fly=lambda: None)
    -

    Částečně upravené objekty, třídy, moduly (stubs)

    -

    Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část -atributů nebo metod:

    -
    >>> import flexmock
    ->>> class Train:
    -...     def get_speed(self):
    -...         return 0
    -... 
    ->>> flexmock(Train, get_speed=200)
    -<flexmock.Mock object at 0x7f88501d8908>
    ->>> train = Train()
    ->>> train.get_speed()
    -200
    -

    Můžete tak zfalšovat i volání builtin funkcí, jako je například open():

    -
    >>> import sys
    ->>> import flexmock
    ->>> import builtins
    ->>> from io import StringIO
    ->>> flexmock(builtins, open=StringIO('fake content'))
    -<module 'builtins' (built-in)>
    ->>> with open('/etc/passwd') as f:
    -...     f.readlines()
    -... 
    -['fake content']
    -

    Očekávání (mocks, spies)

    -

    Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco -zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), -nebo jen sledujete, jestli se zavolala (spies). -(Příklady na odkazu.)

    -

    Integrace s pytestem

    -

    Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená -kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double -ale není nic těžkého a můžete to udělat sami (bez knihovny). -Pro přepsání nějaké metody, funkce apod. na omezenou dobu -můžete využít zabudovanou pytest fixturu -monkeypatch.

    -

    Varování

    -

    Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce -čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud -bude obsahovat daný obsah, musíte si trochu zapodvádět, protože nemůžete vědět, -co v tom souboru je doopravdy na daném systému, v daný čas.

    -

    Je ale jednoduché sklouznout do fáze, kdy jsou vaše testy natolik přemockované, -že už ani neplní svůj účel. Buďto proto, že příliš podvádíte a testy vždy -projdou, i když je implementace rozbitá; nebo proto, že při sebemenší úpravě -vnitřní implementace musíte vždy upravit i testy.

    -

    Mějte toto na paměti a k mockování se uchylujte až po vyčerpání „slušnějších” -možností. -Často jde trochu změnit kód, aby byl testovatelnější – například napsat funkci, -která čte soubor formátu /etc/passwd, ale jméno souboru jí předat argumentem.

    -

    Mohl by vás zajímat záznam z přednášky Should I mock or should I not? -z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění -při psaní testů.

    -

    Testování HTTP komunikace: betamax

    -

    Vaše programy často používají webová API. Při testování funkcionality API klientů -se vynoří řada problémů:

    -
      -
    • výsledky volání API mohou být pokaždé různé,
    • -
    • k některým volání API je potřeba mít přístupové údaje,
    • -
    • API může být zrovna nedostupné.
    • -
    -

    V zásadě můžete omockovat knihovnu requests tak, aby -jednotlivá volání jako get() apod. vracela předem definovanou odpověď. -Při ponoření do hloubky ale zjistíte, že komplexita takového mockování může -velmi přesáhnout komplexitu samotného kódu, který testujete. -Jednodušší je tak použít již hotové řešení. Jedno z nich je betamax.

    -

    Betamax umožňuje nahrát HTTP komunikaci do kazet (souborů), které se potom -použijí při testech. V zásadě to funguje takto:

    -
      -
    • Pokud daný HTTP požadavek ještě neproběhl, provede se a nahraje na kazetu.
    • -
    • Pokud již proběhl, použije se daná kazeta pro simulaci.
    • -
    -

    Betamax funguje pouze s knihovnou requests při použití session.

    -

    V kombinaci s pytestem můžete použít předpřipravenou fixture:

    -
    import betamax
    -
    -with betamax.Betamax.configure() as config:
    -    # tell Betamax where to find the cassettes
    -    # make sure to create the directory
    -    config.cassette_library_dir = 'tests/fixtures/cassettes'
    -
    -def test_get(betamax_session):
    -    betamax_session.get('https://httpbin.org/get')
    -

    Před spuštěním testu vytvořte složku tests/fixtures/cassettes. -Po spuštění testu ji prozkoumejte. -Měla by obsahovat soubor test_filename.test_get.json. -To je nahraná kazeta. Každý další průběh testu nevykoná GET požadavek, -ale pouze přehraje danou kazetu. Pokud chcete kazetu opět nahrát, prostě ji -smažte a pusťte test znovu.

    -

    Celé to ale funguje pouze, pokud kód vykonávaný uvnitř testu použije speciální -session, kterou máme od betamaxu. Jak to udělat?

    -

    Je třeba, aby implementační část kódu uměla session přejmout, například takto:

    -
    class Client:
    -    def __init__(self, session=None):
    -        self.session = session or requests.Session()
    -        ...
    -
    -def test_clent_foo(betamax_session):
    -    client = Client(session=betamax_session)
    -    assert client.foo() == 42
    -

    Pokud budete používat parametrizované testy, použijte -betamax_parametrized_session, aby kazety měly odlišné jméno při odlišných -parametrech.

    -

    Pro tip: Abyste nevytvářeli novou instanci třídy ve všech testech, můžete si -vytvořit vlastní fixture, která použije fixture betamax_session:

    -
    @pytest.fixture
    -def client(betamax_session):
    -    return Client(session=betamax_session)
    -

    Citlivé údaje

    -

    Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

    -

    Vyvstávají dvě otázky:

    -
      -
    1. Jak umožnit spuštění testů bez vlastního tokenu?
    2. -
    3. Jak citlivé údaje skrýt v kazetách a nedávat je do gitu?
    4. -
    -

    Na obě otázky se pokusím odpovědět jedním okomentovaným kódem:

    -
    with betamax.Betamax.configure() as config:
    -    if 'AUTH_FILE' in os.environ:
    -        # If the tests are invoked with an AUTH_FILE environ variable
    -        TOKEN = my_auth_parsing_func(os.environ['AUTH_FILE'])
    -        # Always re-record the cassetes
    -        # https://betamax.readthedocs.io/en/latest/record_modes.html
    -        config.default_cassette_options['record_mode'] = 'all'
    -    else:
    -        TOKEN = 'false_token'
    -        # Do not attempt to record sessions with bad fake token
    -        config.default_cassette_options['record_mode'] = 'none'
    -
    -    # Hide the token in the cassettes
    -    config.define_cassette_placeholder('<TOKEN>', TOKEN)
    -    ...
    -
    -@pytest.fixture
    -def client(betamax_session):
    -    return Client(token=TOKEN, session=betamax_session)
    -

    Co když ale nevíme, jak bude vypadat citlivá část požadavku, protože se teprve -někde spočítá a získá, jako například v případě Twitter API? -Na tuto otázku podrobněji odpovídá -dokumentace.

    -

    V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách -nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

    -

    Komprimované citlivé údaje

    -

    Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle -odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní -chování, viz dokumentace). -V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit -hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, -compress ani deflate:

    -
    betamax_session.headers.update({'Accept-Encoding': 'identity'})

    Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou -nijak transformována, více viz Wikipedia -a specifikace HTTP)

    -

    Které HTTP požadavky jsou stejné?

    -

    Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se -pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. -Pokud tedy na jedno URL provedete dva POST požadavky s jiným tělem, betamax -je bude považovat za stejné. Toto chování lze měnit zapnutím (nebo vypnutím) -různých matcherů. Těch je v betamaxu celá řada a je jednoduché napsat si -vlastní. Více informací najdete -v dokumentaci.

    -

    Mohl by vás zajímat záznam z přednášky If it Moves, Test it Anyway -z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak -testovat webové API klienty v Pythonu.

    -

    Testování aplikací ve Flasku

    -

    Pro testování aplikací ve Flasku se -používá app.test_client():

    +# Puštění hry! +piskvorky1d() +

    Když tenhle modul naimportuješ, Python v něm postupně, odshora dolů, +provede všechny příkazy.

    +

    První příkaz, import, jen zpřístupní nějaké proměnné a funkce; +je-li importovaný modul správně napsaný, nemá vedlejší účinek. +Definice funkcí (příkazy def a všechno v nich) podobně jen definují funkce. +Ale zavoláním funkce piskvorky1d se spustí hra: +funkce piskvorky1d zavolá funkci tah_hrace() a ta zavolá input().

    +

    Importuješ-li tenhle modul z testů, input selže a import se nepovede.

    +

    A kdybys modul importoval/a odjinud – například bys chtěl/a funkci +tah použít v nějaké jiné hře – uživatel si bude muset v rámci importu +zahrát Piškvorky!

    +

    Volání funkce piskvorky1d je vedlejší efekt, a je potřeba ho odstranit. +No jo, ale po takovém odstranění +už nejde jednoduše spustit hra! Co s tím?

    +

    Můžeš na to vytvořit nový modul. +Pojmenuj ho hra.py a dej do něj jenom to odstraněné volání:

    +
    import piskvorky
    +
    +piskvorky.piskvorky1d()
    +

    Tenhle modul nebudeš moci testovat (protože nepřímo volá funkci input), +ale můžeš ho spustit, když si budeš chtít zahrát. +Protože k němu nemáš napsané testy, nepoznáš +z nich, když se takový spouštěcí modul rozbije. +Měl by být proto nejjednodušší – jeden import a jedno volání.

    +

    Původní modul teď můžeš importovat bez obav – ať už z testů nebo z jiných +modulů. +Test může vypadat třeba takhle:

    +
    import piskvorky
    +
    +def test_tah_na_prazdne_pole():
    +    pole = piskvorky.tah_pocitace('--------------------')
    +    assert len(pole) == 20
    +    assert pole.count('x') == 1
    +    assert pole.count('-') == 19
    +

    Pozitivní a negativní testy

    +

    Testům, které kontrolují, že se program za správných podmínek chová správně, +se říká pozitivní testy. +Můžeš ale testovat i reakci programu na špatné nebo neočekávané podmínky.

    +

    Testy, které kontrolují reakci na „špatný“ vstup, +se jmenují negativní testy. +Můžou kontrolovat nějaký negativní výsledek (např. +že volání jako cislo_je_sude(7) vrátí False), +a nebo to, že nastane „rozumná“ výjimka.

    +

    Například funkce tah_pocitace by měla způsobit +chybu (třeba ValueError), když je herní pole už plné.

    +

    Vyvolat výjimku je mnohem lepší než alternativy, např. kdyby takové volání +„tiše“ – bez oznámení – zablokovalo celý program. +Když kód pak použiješ ve větším programu, +můžeš si být jistá, že při špatném volání +dostaneš srozumitelnou chybu – tedy takovou, +která se co nejsnadněji opravuje.

    +

    Na otestování výjimky použij příkaz with a funkci raises naimportovanou +z modulu pytest. +Jak příkaz with přesně funguje, se dozvíme později; +teď stačí říct, že ověří, že odsazený blok kódu +pod ním vyvolá danou výjimku:

    import pytest
     
    -@pytest.fixture
    -def testapp():
    -    from hello import app
    -    app.config['TESTING'] = True
    -    return app.test_client()
    -
    -def test_hello(testapp):
    -    assert 'Hello' in testapp.get('/').get_data(as_text=True)
    -

    Pozor, metody na testovacím klientu vrací Response, ale trochu jinou, než tu -z requests. -Proto nelze použít přímo response.text; text dostaneme pomocí -response.get_data(as_text=True).

    -

    Testování aplikací v clicku

    -

    Podobně funguje testování aplikací v clicku. -Click obsahuje třídu CliRunner, která pomáhá s testováním:

    -
    from click.testing import CliRunner
    -
    -def test_push_force():
    -    runner = CliRunner()
    -    result = runner.invoke(git_cli_made_in_click, ['push', '--force'])
    -    assert result.exit_code == 0
    -    assert 'forced update' in result.output
    -

    Kam dát testy?

    -

    Dokumentace pytestu -uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

    -
    setup.py
    -mypkg/
    -    __init__.py
    -    appmodule.py
    -tests/
    -    test_app.py
    -    ...

    nebo do něj:

    -
    setup.py
    -mypkg/
    -    __init__.py
    -    appmodule.py
    -    ...
    -    test/
    -        test_app.py
    -        ...

    První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. -Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný -Pythonní modul, ale jen sada souborů s testy.

    -

    Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné -moduly, ne jako součást vašeho balíčku. -Relativní importy (from ..appmodule import xyz) v testech nebudou fungovat.

    -

    Pozor na to, aby testy byly součástí archivu s balíčkem (setup.py sdist), ale -pokud zvolíte první variantu umístění, aby se neinstalovaly (setup.py install), -protože by tam kolidovaly s ostatními testy z jiných balíčků.

    -

    Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve -složce s testy.

    -

    Spouštění testů pomocí setup.py test

    -

    Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale -python setup.py test, což funguje i s jinými nástroji než je pytest. -Pokud pytest používáme, je proto dobré setup.py naučit spouštět pytest.

    -

    K tomu potřebujeme nakonfigurovat závislosti: v setup_requires musí být -pytest-runner a v tests_require pak pytest a další testovací závislosti -(flexmock, betamax...).

    -
    from setuptools import setup
    -
    -setup(
    -    ...,
    -    setup_requires=['pytest-runner', ...],
    -    tests_require=['pytest', ...],
    -    ...,
    -)
    -

    a přidat následující sekci do setup.cfg:

    -
    [aliases]
    -test=pytest

    Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude -podporovat další argumenty pytestu (jako -v). -Na to uživatel spustí pytest samotný.

    -

    Další informace jsou v dokumentaci pytestu.

    -

    Travis CI

    -

    Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky -na službě Travis CI při každém pushnutí na GitHub.

    -

    Travis CI je zadarmo pro veřejné repozitáře na travis-ci.org, pro soukromé -repozitáře je placená verze na travis-ci.com. V rámci studentského balíčku -můžete i tuto verzi využít zdarma.

    -

    Přihlaste se na travis-ci.com pomocí GitHubu (vpravo nahoře). -Pak opět vpravo nahoře zvolte Accounts -a povolte Travis pro váš repozitář.

    -

    Do repozitáře přidejte soubor .travis.yml:

    -
    language: python
    -python:
    -- '3.6'
    -install:
    -- python setup.py install
    -script:
    -- python setup.py test
    -

    Uvedený příklad je pro Python 3.6. -Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

    -
    language: python
    -python:
    -- '3.7'
    -dist: xenial
    -install:
    -- python setup.py install
    -script:
    -- python setup.py test
    -

    Verze Pythonu lze kombinovat:

    -
    language: python
    -python:
    -- '3.6'
    -- '3.7'
    -dist: xenial
    -install:
    -- python setup.py install
    -script:
    -- python setup.py test
    -

    Po pushnutí by se na Travisu měl automaticky spustit test. -Více informací o použití pro Python najdete -v dokumentaci.

    -

    Kvíz

    -

    Co je špatně na této testovací sadě k funkci is_even()?

    -
    def is_even(n):
    -    return n % 2 == 0
    -
    +import piskvorky
     
    -@pytest.mark.parametrize('n', range(0, 1000, 2))
    -def test_is_even(n):
    -    assert is_even(n)
    +def test_tah_chyba():
    +    with pytest.raises(ValueError):
    +        piskvorky.tah_pocitace('oxoxoxoxoxoxoxoxoxox')
     
    \ No newline at end of file diff --git a/pyladies/course.json b/pyladies/course.json index cb4192c9..64633454 100644 --- a/pyladies/course.json +++ b/pyladies/course.json @@ -7,7 +7,7 @@ "description": "Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba.", "edit_info": { "branch": "main", - "url": "https://github.com/encukou/naucse-python" + "url": "https://github.com/pyvec/naucse-python" }, "lessons": { "beginners/and-or": { From 54bacf2a3e3e2e8105c7321c242621fc4d614547 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 25 Jan 2022 15:53:13 +0000 Subject: [PATCH 06/31] Compiled --- lessons/and-or/index.html | 87 + lessons/asteroids/index.html | 345 + lessons/asteroids/screenshot.png | Bin 0 -> 53112 bytes lessons/async/index.html | 387 + lessons/basic-functions/index.html | 146 + lessons/basics/diagram.svg | 534 ++ lessons/basics/dropbox.png | Bin 0 -> 41480 bytes lessons/basics/gitk.png | Bin 0 -> 59093 bytes lessons/basics/index.html | 339 + lessons/branching/branch1.png | Bin 0 -> 5370 bytes lessons/branching/branches.png | Bin 0 -> 6496 bytes lessons/branching/index.html | 166 + lessons/branching/merge.png | Bin 0 -> 7185 bytes lessons/circular-imports/index.html | 108 + lessons/class/index.html | 253 + lessons/click/index.html | 187 + lessons/cmdline/index.html | 276 + lessons/cmdline/windows-cmd-properties.png | Bin 0 -> 23872 bytes lessons/collaboration/gh-workflow-diagram.svg | 346 + lessons/collaboration/index.html | 359 + lessons/comparisons/index.html | 184 + lessons/course.json | 2817 +++++++ lessons/cython/index.html | 590 ++ lessons/cython/test_matmul.py | 34 + lessons/decorators/index.html | 351 + lessons/def/index.html | 217 + lessons/deployment/index.html | 23 + lessons/deployment/pythonanywhere.html | 77 + lessons/dict/index.html | 136 + lessons/distribution/index.html | 404 + lessons/docs/index.html | 389 + lessons/drawing/apple.png | Bin 0 -> 2482 bytes lessons/drawing/caterpillar.png | Bin 0 -> 18444 bytes lessons/drawing/coords-blocks.svg | 611 ++ lessons/drawing/coords-px.svg | 777 ++ lessons/drawing/coords.svg | 642 ++ lessons/drawing/green.png | Bin 0 -> 215 bytes lessons/drawing/index.html | 386 + lessons/drawing/red.png | Bin 0 -> 214 bytes lessons/drawing/screenshot-dir.png | Bin 0 -> 18904 bytes lessons/drawing/screenshot-finished.png | Bin 0 -> 10635 bytes lessons/drawing/screenshot-initial.png | Bin 0 -> 987 bytes lessons/drawing/snake-tiles.png | Bin 0 -> 87807 bytes lessons/drawing/snake-tiles.zip | Bin 0 -> 65885 bytes lessons/drawing/snake-tiles/bottom-bottom.png | Bin 0 -> 313 bytes lessons/drawing/snake-tiles/bottom-dead.png | Bin 0 -> 2140 bytes lessons/drawing/snake-tiles/bottom-head.png | Bin 0 -> 2275 bytes lessons/drawing/snake-tiles/bottom-left.png | Bin 0 -> 2328 bytes lessons/drawing/snake-tiles/bottom-right.png | Bin 0 -> 1989 bytes lessons/drawing/snake-tiles/bottom-tongue.png | Bin 0 -> 2460 bytes lessons/drawing/snake-tiles/bottom-top.png | Bin 0 -> 313 bytes lessons/drawing/snake-tiles/left-bottom.png | Bin 0 -> 2328 bytes lessons/drawing/snake-tiles/left-dead.png | Bin 0 -> 2257 bytes lessons/drawing/snake-tiles/left-head.png | Bin 0 -> 2162 bytes lessons/drawing/snake-tiles/left-left.png | Bin 0 -> 277 bytes lessons/drawing/snake-tiles/left-right.png | Bin 0 -> 277 bytes lessons/drawing/snake-tiles/left-tongue.png | Bin 0 -> 2444 bytes lessons/drawing/snake-tiles/left-top.png | Bin 0 -> 2156 bytes lessons/drawing/snake-tiles/right-bottom.png | Bin 0 -> 1989 bytes lessons/drawing/snake-tiles/right-dead.png | Bin 0 -> 2020 bytes lessons/drawing/snake-tiles/right-head.png | Bin 0 -> 1944 bytes lessons/drawing/snake-tiles/right-left.png | Bin 0 -> 277 bytes lessons/drawing/snake-tiles/right-right.png | Bin 0 -> 277 bytes lessons/drawing/snake-tiles/right-tongue.png | Bin 0 -> 2328 bytes lessons/drawing/snake-tiles/right-top.png | Bin 0 -> 2302 bytes lessons/drawing/snake-tiles/tail-bottom.png | Bin 0 -> 2113 bytes lessons/drawing/snake-tiles/tail-dead.png | Bin 0 -> 2227 bytes lessons/drawing/snake-tiles/tail-head.png | Bin 0 -> 2186 bytes lessons/drawing/snake-tiles/tail-left.png | Bin 0 -> 1885 bytes lessons/drawing/snake-tiles/tail-right.png | Bin 0 -> 1651 bytes lessons/drawing/snake-tiles/tail-tongue.png | Bin 0 -> 2186 bytes lessons/drawing/snake-tiles/tail-top.png | Bin 0 -> 2179 bytes lessons/drawing/snake-tiles/top-bottom.png | Bin 0 -> 313 bytes lessons/drawing/snake-tiles/top-dead.png | Bin 0 -> 2156 bytes lessons/drawing/snake-tiles/top-head.png | Bin 0 -> 2352 bytes lessons/drawing/snake-tiles/top-left.png | Bin 0 -> 2156 bytes lessons/drawing/snake-tiles/top-right.png | Bin 0 -> 2302 bytes lessons/drawing/snake-tiles/top-tongue.png | Bin 0 -> 2510 bytes lessons/drawing/snake-tiles/top-top.png | Bin 0 -> 313 bytes lessons/exceptions/index.html | 171 + lessons/expressions/index.html | 71 + lessons/files/index.html | 126 + lessons/first-steps/index.html | 83 + lessons/flask/index.html | 365 + lessons/fstring/index.html | 67 + lessons/functions/call-anatomy.svg | 413 + lessons/functions/index.html | 206 + lessons/generators/index.html | 239 + lessons/git-collaboration-2in1/diagram.png | Bin 0 -> 40629 bytes .../gh-workflow-diagram.svg | 346 + lessons/git-collaboration-2in1/index.html | 227 + lessons/github-api/index.html | 129 + lessons/hello-world/index.html | 68 + lessons/http/index.html | 132 + lessons/http/url-anatomy.svg | 461 ++ lessons/ignoring/index.html | 203 + lessons/inheritance/index.html | 199 + lessons/install-editor/atom.html | 73 + lessons/install-editor/gedit.html | 66 + lessons/install-editor/gedit_indent.png | Bin 0 -> 21030 bytes lessons/install-editor/gedit_linenums.png | Bin 0 -> 28001 bytes lessons/install-editor/gedit_prefs.png | Bin 0 -> 87034 bytes lessons/install-editor/index.html | 91 + lessons/install-editor/kate.html | 68 + lessons/install-editor/notepad-plus-plus.html | 55 + lessons/install-editor/others.html | 77 + lessons/install-editor/vscode.html | 57 + lessons/install/index.1.html | 60 + lessons/install/index.2.html | 80 + lessons/install/index.html | 12 + lessons/install/linux.html | 63 + lessons/install/macos.html | 15 + lessons/install/windows.html | 26 + lessons/install/windows_32v64-bit.png | Bin 0 -> 36230 bytes .../install/windows_add_python_to_path.png | Bin 0 -> 70057 bytes lessons/installing-naucse/index.html | 40 + lessons/json/index.html | 102 + lessons/list/index.html | 414 + lessons/local-run/index.html | 224 + lessons/local-run/info.yml | 35 + lessons/local-variables/index.html | 150 + lessons/logic/index.html | 814 ++ lessons/magic/index.html | 577 ++ lessons/micropython/circuits/led.fzz | Bin 0 -> 32066 bytes lessons/micropython/circuits/led_bb.svg | 4537 +++++++++++ lessons/micropython/circuits/led_bb_off.svg | 4528 +++++++++++ lessons/micropython/index.1.html | 194 + lessons/micropython/index.html | 619 ++ lessons/micropython/nodemcu-devkit.jpg | Bin 0 -> 39363 bytes lessons/micropython/nodemcu-popisky.svg | 2911 +++++++ lessons/micropython/noty.py | 8 + lessons/micropython/putty-config.jpg | Bin 0 -> 38324 bytes lessons/micropython/usb-ttl.png | Bin 0 -> 374407 bytes lessons/mini-workshop/boot.py | 59 + lessons/mini-workshop/icon_gedit.png | Bin 0 -> 43585 bytes lessons/mini-workshop/icon_terminal.png | Bin 0 -> 24218 bytes lessons/mini-workshop/index.html | 203 + lessons/mini-workshop/module_detail.jpg | Bin 0 -> 222134 bytes lessons/mini-workshop/module_full.jpg | Bin 0 -> 111593 bytes lessons/mini-workshop/organizers.html | 142 + lessons/mini-workshop/semafor.gif | Bin 0 -> 20996 bytes lessons/modules/index.html | 84 + lessons/mypy/index.html | 267 + lessons/nested-traceback/index.html | 58 + lessons/notebook/index.html | 116 + lessons/numpy/index.html | 4175 ++++++++++ lessons/numpy/python.jpg | Bin 0 -> 126582 bytes lessons/numpy/sample.wav | Bin 0 -> 925262 bytes lessons/numpy/secret.png | Bin 0 -> 4883 bytes lessons/pandas/actors.csv | 7 + lessons/pandas/index.html | 7214 +++++++++++++++++ lessons/pandas/spouses.csv | 12 + lessons/pandas/style-table.css | 57 + lessons/pong/index.html | 499 ++ lessons/pong/pong.png | Bin 0 -> 941 bytes lessons/print/index.html | 112 + lessons/pyglet/had.gif | Bin 0 -> 10907 bytes lessons/pyglet/had.png | Bin 0 -> 12723 bytes lessons/pyglet/had2.png | Bin 0 -> 14573 bytes lessons/pyglet/index.html | 413 + lessons/pyglet/pong.py | 325 + lessons/pyqt/basic-screenshot.png | Bin 0 -> 52134 bytes lessons/pyqt/index.html | 560 ++ lessons/pyqt/pics/README/index.md | 11 + lessons/pyqt/pics/arrows/down.svg | 83 + lessons/pyqt/pics/arrows/left.svg | 83 + lessons/pyqt/pics/arrows/right.svg | 83 + lessons/pyqt/pics/arrows/up.svg | 83 + lessons/pyqt/pics/castle.svg | 130 + lessons/pyqt/pics/dude1.svg | 120 + lessons/pyqt/pics/dude2.svg | 116 + lessons/pyqt/pics/dude3.svg | 116 + lessons/pyqt/pics/dude4.svg | 116 + lessons/pyqt/pics/dude5.svg | 116 + lessons/pyqt/pics/fish.svg | 97 + lessons/pyqt/pics/fish2.svg | 97 + lessons/pyqt/pics/grass.svg | 84 + lessons/pyqt/pics/lines/1.svg | 89 + lessons/pyqt/pics/lines/10.svg | 89 + lessons/pyqt/pics/lines/11.svg | 85 + lessons/pyqt/pics/lines/12.svg | 89 + lessons/pyqt/pics/lines/13.svg | 85 + lessons/pyqt/pics/lines/14.svg | 85 + lessons/pyqt/pics/lines/15.svg | 89 + lessons/pyqt/pics/lines/2.svg | 89 + lessons/pyqt/pics/lines/3.svg | 89 + lessons/pyqt/pics/lines/4.svg | 89 + lessons/pyqt/pics/lines/5.svg | 89 + lessons/pyqt/pics/lines/6.svg | 89 + lessons/pyqt/pics/lines/7.svg | 85 + lessons/pyqt/pics/lines/8.svg | 89 + lessons/pyqt/pics/lines/9.svg | 89 + lessons/pyqt/pics/shark.svg | 57 + lessons/pyqt/pics/wall.svg | 94 + lessons/pyqt/pics/wall2.svg | 94 + lessons/pyqt/pics/water.svg | 71 + lessons/reassignment/index.html | 92 + lessons/recursion/index.html | 146 + lessons/requests/index.html | 153 + lessons/snake/apple.png | Bin 0 -> 2482 bytes lessons/snake/coords.svg | 642 ++ lessons/snake/green.png | Bin 0 -> 215 bytes lessons/snake/index.html | 233 + lessons/snake/screenshot-cat.png | Bin 0 -> 13753 bytes lessons/snake/screenshot-final.png | Bin 0 -> 19063 bytes lessons/snake/snake-tiles.png | Bin 0 -> 87807 bytes lessons/snake/snake-tiles.zip | Bin 0 -> 65885 bytes lessons/str-index-slice/index.html | 165 + lessons/str-methods/index.html | 83 + lessons/str/index.html | 209 + lessons/str/quote-comic.svg | 466 ++ lessons/submitting-a-run/index.html | 71 + lessons/submitting-a-run/naucse_fork.png | Bin 0 -> 49953 bytes lessons/testing/index.1.html | 564 ++ lessons/testing/index.html | 226 + lessons/tuple/index.html | 125 + lessons/turtle/index.html | 412 + lessons/turtle/turtle-dashed.png | Bin 0 -> 255 bytes lessons/turtle/turtle-dashed2.png | Bin 0 -> 310 bytes lessons/turtle/turtle-hexagons.png | Bin 0 -> 1735 bytes lessons/turtle/turtle-rect.png | Bin 0 -> 340 bytes lessons/turtle/turtle-square.png | Bin 0 -> 323 bytes lessons/turtle/turtle-squares.png | Bin 0 -> 890 bytes lessons/turtle/turtle-stairs.png | Bin 0 -> 1055 bytes lessons/variables/index.html | 151 + lessons/venv-setup/dirs.png | Bin 0 -> 3429 bytes lessons/venv-setup/index.html | 110 + lessons/while/index.html | 98 + 228 files changed, 51792 insertions(+) create mode 100644 lessons/and-or/index.html create mode 100644 lessons/asteroids/index.html create mode 100644 lessons/asteroids/screenshot.png create mode 100644 lessons/async/index.html create mode 100644 lessons/basic-functions/index.html create mode 100644 lessons/basics/diagram.svg create mode 100644 lessons/basics/dropbox.png create mode 100644 lessons/basics/gitk.png create mode 100644 lessons/basics/index.html create mode 100644 lessons/branching/branch1.png create mode 100644 lessons/branching/branches.png create mode 100644 lessons/branching/index.html create mode 100644 lessons/branching/merge.png create mode 100644 lessons/circular-imports/index.html create mode 100644 lessons/class/index.html create mode 100644 lessons/click/index.html create mode 100644 lessons/cmdline/index.html create mode 100644 lessons/cmdline/windows-cmd-properties.png create mode 100644 lessons/collaboration/gh-workflow-diagram.svg create mode 100644 lessons/collaboration/index.html create mode 100644 lessons/comparisons/index.html create mode 100644 lessons/course.json create mode 100644 lessons/cython/index.html create mode 100644 lessons/cython/test_matmul.py create mode 100644 lessons/decorators/index.html create mode 100644 lessons/def/index.html create mode 100644 lessons/deployment/index.html create mode 100644 lessons/deployment/pythonanywhere.html create mode 100644 lessons/dict/index.html create mode 100644 lessons/distribution/index.html create mode 100644 lessons/docs/index.html create mode 100644 lessons/drawing/apple.png create mode 100644 lessons/drawing/caterpillar.png create mode 100644 lessons/drawing/coords-blocks.svg create mode 100644 lessons/drawing/coords-px.svg create mode 100644 lessons/drawing/coords.svg create mode 100644 lessons/drawing/green.png create mode 100644 lessons/drawing/index.html create mode 100644 lessons/drawing/red.png create mode 100644 lessons/drawing/screenshot-dir.png create mode 100644 lessons/drawing/screenshot-finished.png create mode 100644 lessons/drawing/screenshot-initial.png create mode 100644 lessons/drawing/snake-tiles.png create mode 100644 lessons/drawing/snake-tiles.zip create mode 100644 lessons/drawing/snake-tiles/bottom-bottom.png create mode 100644 lessons/drawing/snake-tiles/bottom-dead.png create mode 100644 lessons/drawing/snake-tiles/bottom-head.png create mode 100644 lessons/drawing/snake-tiles/bottom-left.png create mode 100644 lessons/drawing/snake-tiles/bottom-right.png create mode 100644 lessons/drawing/snake-tiles/bottom-tongue.png create mode 100644 lessons/drawing/snake-tiles/bottom-top.png create mode 100644 lessons/drawing/snake-tiles/left-bottom.png create mode 100644 lessons/drawing/snake-tiles/left-dead.png create mode 100644 lessons/drawing/snake-tiles/left-head.png create mode 100644 lessons/drawing/snake-tiles/left-left.png create mode 100644 lessons/drawing/snake-tiles/left-right.png create mode 100644 lessons/drawing/snake-tiles/left-tongue.png create mode 100644 lessons/drawing/snake-tiles/left-top.png create mode 100644 lessons/drawing/snake-tiles/right-bottom.png create mode 100644 lessons/drawing/snake-tiles/right-dead.png create mode 100644 lessons/drawing/snake-tiles/right-head.png create mode 100644 lessons/drawing/snake-tiles/right-left.png create mode 100644 lessons/drawing/snake-tiles/right-right.png create mode 100644 lessons/drawing/snake-tiles/right-tongue.png create mode 100644 lessons/drawing/snake-tiles/right-top.png create mode 100644 lessons/drawing/snake-tiles/tail-bottom.png create mode 100644 lessons/drawing/snake-tiles/tail-dead.png create mode 100644 lessons/drawing/snake-tiles/tail-head.png create mode 100644 lessons/drawing/snake-tiles/tail-left.png create mode 100644 lessons/drawing/snake-tiles/tail-right.png create mode 100644 lessons/drawing/snake-tiles/tail-tongue.png create mode 100644 lessons/drawing/snake-tiles/tail-top.png create mode 100644 lessons/drawing/snake-tiles/top-bottom.png create mode 100644 lessons/drawing/snake-tiles/top-dead.png create mode 100644 lessons/drawing/snake-tiles/top-head.png create mode 100644 lessons/drawing/snake-tiles/top-left.png create mode 100644 lessons/drawing/snake-tiles/top-right.png create mode 100644 lessons/drawing/snake-tiles/top-tongue.png create mode 100644 lessons/drawing/snake-tiles/top-top.png create mode 100644 lessons/exceptions/index.html create mode 100644 lessons/expressions/index.html create mode 100644 lessons/files/index.html create mode 100644 lessons/first-steps/index.html create mode 100644 lessons/flask/index.html create mode 100644 lessons/fstring/index.html create mode 100644 lessons/functions/call-anatomy.svg create mode 100644 lessons/functions/index.html create mode 100644 lessons/generators/index.html create mode 100644 lessons/git-collaboration-2in1/diagram.png create mode 100644 lessons/git-collaboration-2in1/gh-workflow-diagram.svg create mode 100644 lessons/git-collaboration-2in1/index.html create mode 100644 lessons/github-api/index.html create mode 100644 lessons/hello-world/index.html create mode 100644 lessons/http/index.html create mode 100644 lessons/http/url-anatomy.svg create mode 100644 lessons/ignoring/index.html create mode 100644 lessons/inheritance/index.html create mode 100644 lessons/install-editor/atom.html create mode 100644 lessons/install-editor/gedit.html create mode 100644 lessons/install-editor/gedit_indent.png create mode 100644 lessons/install-editor/gedit_linenums.png create mode 100644 lessons/install-editor/gedit_prefs.png create mode 100644 lessons/install-editor/index.html create mode 100644 lessons/install-editor/kate.html create mode 100644 lessons/install-editor/notepad-plus-plus.html create mode 100644 lessons/install-editor/others.html create mode 100644 lessons/install-editor/vscode.html create mode 100644 lessons/install/index.1.html create mode 100644 lessons/install/index.2.html create mode 100644 lessons/install/index.html create mode 100644 lessons/install/linux.html create mode 100644 lessons/install/macos.html create mode 100644 lessons/install/windows.html create mode 100644 lessons/install/windows_32v64-bit.png create mode 100644 lessons/install/windows_add_python_to_path.png create mode 100644 lessons/installing-naucse/index.html create mode 100644 lessons/json/index.html create mode 100644 lessons/list/index.html create mode 100644 lessons/local-run/index.html create mode 100644 lessons/local-run/info.yml create mode 100644 lessons/local-variables/index.html create mode 100644 lessons/logic/index.html create mode 100644 lessons/magic/index.html create mode 100644 lessons/micropython/circuits/led.fzz create mode 100644 lessons/micropython/circuits/led_bb.svg create mode 100644 lessons/micropython/circuits/led_bb_off.svg create mode 100644 lessons/micropython/index.1.html create mode 100644 lessons/micropython/index.html create mode 100644 lessons/micropython/nodemcu-devkit.jpg create mode 100644 lessons/micropython/nodemcu-popisky.svg create mode 100644 lessons/micropython/noty.py create mode 100644 lessons/micropython/putty-config.jpg create mode 100644 lessons/micropython/usb-ttl.png create mode 100644 lessons/mini-workshop/boot.py create mode 100644 lessons/mini-workshop/icon_gedit.png create mode 100644 lessons/mini-workshop/icon_terminal.png create mode 100644 lessons/mini-workshop/index.html create mode 100644 lessons/mini-workshop/module_detail.jpg create mode 100644 lessons/mini-workshop/module_full.jpg create mode 100644 lessons/mini-workshop/organizers.html create mode 100644 lessons/mini-workshop/semafor.gif create mode 100644 lessons/modules/index.html create mode 100644 lessons/mypy/index.html create mode 100644 lessons/nested-traceback/index.html create mode 100644 lessons/notebook/index.html create mode 100644 lessons/numpy/index.html create mode 100644 lessons/numpy/python.jpg create mode 100644 lessons/numpy/sample.wav create mode 100644 lessons/numpy/secret.png create mode 100644 lessons/pandas/actors.csv create mode 100644 lessons/pandas/index.html create mode 100644 lessons/pandas/spouses.csv create mode 100644 lessons/pandas/style-table.css create mode 100644 lessons/pong/index.html create mode 100644 lessons/pong/pong.png create mode 100644 lessons/print/index.html create mode 100644 lessons/pyglet/had.gif create mode 100644 lessons/pyglet/had.png create mode 100644 lessons/pyglet/had2.png create mode 100644 lessons/pyglet/index.html create mode 100644 lessons/pyglet/pong.py create mode 100644 lessons/pyqt/basic-screenshot.png create mode 100644 lessons/pyqt/index.html create mode 100644 lessons/pyqt/pics/README/index.md create mode 100644 lessons/pyqt/pics/arrows/down.svg create mode 100644 lessons/pyqt/pics/arrows/left.svg create mode 100644 lessons/pyqt/pics/arrows/right.svg create mode 100644 lessons/pyqt/pics/arrows/up.svg create mode 100644 lessons/pyqt/pics/castle.svg create mode 100644 lessons/pyqt/pics/dude1.svg create mode 100644 lessons/pyqt/pics/dude2.svg create mode 100644 lessons/pyqt/pics/dude3.svg create mode 100644 lessons/pyqt/pics/dude4.svg create mode 100644 lessons/pyqt/pics/dude5.svg create mode 100644 lessons/pyqt/pics/fish.svg create mode 100644 lessons/pyqt/pics/fish2.svg create mode 100644 lessons/pyqt/pics/grass.svg create mode 100644 lessons/pyqt/pics/lines/1.svg create mode 100644 lessons/pyqt/pics/lines/10.svg create mode 100644 lessons/pyqt/pics/lines/11.svg create mode 100644 lessons/pyqt/pics/lines/12.svg create mode 100644 lessons/pyqt/pics/lines/13.svg create mode 100644 lessons/pyqt/pics/lines/14.svg create mode 100644 lessons/pyqt/pics/lines/15.svg create mode 100644 lessons/pyqt/pics/lines/2.svg create mode 100644 lessons/pyqt/pics/lines/3.svg create mode 100644 lessons/pyqt/pics/lines/4.svg create mode 100644 lessons/pyqt/pics/lines/5.svg create mode 100644 lessons/pyqt/pics/lines/6.svg create mode 100644 lessons/pyqt/pics/lines/7.svg create mode 100644 lessons/pyqt/pics/lines/8.svg create mode 100644 lessons/pyqt/pics/lines/9.svg create mode 100644 lessons/pyqt/pics/shark.svg create mode 100644 lessons/pyqt/pics/wall.svg create mode 100644 lessons/pyqt/pics/wall2.svg create mode 100644 lessons/pyqt/pics/water.svg create mode 100644 lessons/reassignment/index.html create mode 100644 lessons/recursion/index.html create mode 100644 lessons/requests/index.html create mode 100644 lessons/snake/apple.png create mode 100644 lessons/snake/coords.svg create mode 100644 lessons/snake/green.png create mode 100644 lessons/snake/index.html create mode 100644 lessons/snake/screenshot-cat.png create mode 100644 lessons/snake/screenshot-final.png create mode 100644 lessons/snake/snake-tiles.png create mode 100644 lessons/snake/snake-tiles.zip create mode 100644 lessons/str-index-slice/index.html create mode 100644 lessons/str-methods/index.html create mode 100644 lessons/str/index.html create mode 100644 lessons/str/quote-comic.svg create mode 100644 lessons/submitting-a-run/index.html create mode 100644 lessons/submitting-a-run/naucse_fork.png create mode 100644 lessons/testing/index.1.html create mode 100644 lessons/testing/index.html create mode 100644 lessons/tuple/index.html create mode 100644 lessons/turtle/index.html create mode 100644 lessons/turtle/turtle-dashed.png create mode 100644 lessons/turtle/turtle-dashed2.png create mode 100644 lessons/turtle/turtle-hexagons.png create mode 100644 lessons/turtle/turtle-rect.png create mode 100644 lessons/turtle/turtle-square.png create mode 100644 lessons/turtle/turtle-squares.png create mode 100644 lessons/turtle/turtle-stairs.png create mode 100644 lessons/variables/index.html create mode 100644 lessons/venv-setup/dirs.png create mode 100644 lessons/venv-setup/index.html create mode 100644 lessons/while/index.html diff --git a/lessons/and-or/index.html b/lessons/and-or/index.html new file mode 100644 index 00000000..d7393bda --- /dev/null +++ b/lessons/and-or/index.html @@ -0,0 +1,87 @@ +

    Nebo anebo a

    +

    Vzpomínáš na tabulku operátorů +z lekce o Porovnávání? +Nyní si ji doplníme o další tři operátory, +které se hodí do podmínek:

    + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    andTrue and False
    2 < 3 and 5 < 3
    „a zároveň“
    orTrue or False
    2 < 3 or 5 < 3
    „a nebo“
    notnot False
    not 5 < 3 +
    „ne“

    Například, chceš-li zjistit, jestli je kterékoli z dvou čísel záporné, +můžeš napsat:

    +
    a = float(input("Zadej první stranu obdélníka: "))
    +b = float(input("Zadej druhou stranu obdélníka: "))
    +
    +if a <= 0 or b <= 0:
    +    print("Délka nemůže být záporná!")
    +

    Falešní kamarádi

    +

    Pozor na to, že and a or nejsou anglická slovíčka, ale operátory, +které spojují logické výrazy. +Na obě strany and i or patří výraz, jehož hodnota je True/False +(například porovnání).

    +
    if a <= 0 or b <= 0:
    +

    Může se zdát, že by se to dalo zkrátit a napsat if a or b <= 0: – „pokud +je A nebo B menší než 0“. +Ale to si Python přeloží na:

    +
    if (a) or (b <= 0):
    +

    ... tedy „pokud platí A, a nebo je B menší než 0“. +A to moc smyslu nedává. +(Kdy „platí“ celé číslo?)

    +

    Šťastná/Bohatá

    +

    Pro příklad použijeme and ve vylepšeném programu, který rozdává nejapné rady +do života. +Zkus si ho projít a okomentovat části, které nejsou na první pohled jasné.

    +
    # Tento program rozdává nejapné rady do života.
    +
    +print('Odpovídej "ano" nebo "ne".')
    +stastna_retezec = input('Jsi šťastná? ')
    +if stastna_retezec == 'ano' or stastna_retezec == 'Ano':
    +    stastna = True
    +elif stastna_retezec == 'ne' or stastna_retezec == 'Ne':
    +    stastna = False
    +else:
    +    print('Nerozumím!')
    +
    +bohata_retezec = input('Jsi bohatá? ')
    +if bohata_retezec == 'ano' or bohata_retezec == 'Ano':
    +    bohata = True
    +elif bohata_retezec == 'ne' or bohata_retezec == 'Ne':
    +    bohata = False
    +else:
    +    print('Nerozumím!')
    +
    +if bohata and stastna:
    +    # Je bohatá a zároveň štǎstná, ta se má.
    +    print('Gratuluji!')
    +elif bohata:
    +    # Je bohatá, ale není „bohatá a zároveň šťastná“,
    +    # takže musí být jen bohatá.
    +    print('Zkus se víc usmívat.')
    +elif stastna:
    +    # Tady musí být jen šťastná.
    +    print('Zkus míň utrácet.')
    +else:
    +    # A tady víme, že není ani šťastná, ani bohatá.
    +    print('To je mi líto.')
    +

    Všimni si co se stane, když zadáš něco jiného než „ano“ nebo „ne“.

    +

    Proměnná stastna nebo bohata se nenastaví, a když je ji potom +potřeba použít, program skončí s chybou.

    +

    O tom, jak se vypořádat s chybami, si povíme později.

    +
    \ No newline at end of file diff --git a/lessons/asteroids/index.html b/lessons/asteroids/index.html new file mode 100644 index 00000000..eab3f1f5 --- /dev/null +++ b/lessons/asteroids/index.html @@ -0,0 +1,345 @@ +

    Hra typu Asteroids

    +

    Dnes to všechno – třídy, grafiku, seznamy, a tak dále – +spojíme dohromady do závěrečného projektu. +Doufám, že se ti bude líbit!

    +

    Zkusíme udělat klon hry Asteroids, +která poprvé vyšla na konci sedmdesátých let. +V našem podání bude hra nakonec vypadat nějak takhle:

    +

    Screenshot hry typu Asteroids

    +

    Projekt je to docela složitý a – jako většina +praktických projektů – využívá i některých věcí, které ještě na kurzu nebyly. +Věřím, že ale přesto zvládneš všechno pochopit nebo dohledat!

    +

    A ještě jedna věc: protože začátečnický kurz končí, +začneme kód psát v angličtině, aby se pak dal sdílet s celým světem.

    +

    Procházíš-li si projekt doma, je možné, že narazíš na +něco s čím si nebudeš vědět rady. +Kdyby se to stalo, prosím, ozvi se nám! +Rádi ti s projektem pomůžeme.

    +

    Vesmírná loď

    +

    První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesnicí.

    +
      +
    • Vesmírnou loď bude reprezentovat objekt třídy Spaceship.
    • +
    • Každá loď má vlastní atributy x a y (pozice), +x_speed a y_speed (rychlost), rotation (úhel natočení) a +sprite (2D objekt v Pygletu s polohou, rotací a obrázkem).
    • +
    • Loď má metodu tick, která obstarává +mechaniku týkající se lodi – posouvání, natáčení a ovládání.
    • +
    • Všechny objekty ve hře si budeme dávat do globálního seznamu objects. +Zatím tam bude jenom vesmírná loď.
    • +
    • Co se ovládání týče, stisknuté klávesy si uchovávej v množině (angl. set), +což je datový typ podobný seznamu, jen nemá dané pořadí +prvků a každý prvek v ní může být pouze jednou. +(Na množinu se dá dívat i jako na slovník bez hodnot.) +Je k dispozici tahák na množiny +a pythonní dokumentace obsahuje k množinám +tutoriál +i podrobný popis. +Vesmírná loď se pak do množiny „podívá” v rámci +své metody tick.
    • +
    • Můžeš použít sadu obrázků, +které nakreslil Kenney Vleugels +a zpřístupnil je zadarmo komukoli. Nebo si nakresli/stáhni vlastní!
    • +
    • Ve hře později použijeme velké množství +Sprite-ů a vykreslovat je jeden po druhém by trvalo docela dlouho. +Všechny Sprite-y proto přidej do kolekce +pyglet.graphics.Batch, +kterou pak Pyglet umí efektivně vykreslit najednou. +Do „batche” jde přidávat pomocí argumentu při vytváření Sprite() +a odebírat pomocí sprite.delete(). Například:

      +
      batch = pyglet.graphics.Batch()
      +sprite1 = pyglet.sprite.Sprite(obrazek, batch=batch)
      +sprite2 = pyglet.sprite.Sprite(obrazek, batch=batch)
      +
      +# a potom můžeš vykreslit všechny najednou:
      +batch.draw()
      +

      Kolekci batch si stejně jako objects uchovávej globálně.

      +
    • +
    • Aby se objekty hýbaly a otáčely podle svých středů, je dobré nastavit „kotvu“ +obrázku na jeho střed (jinak je kotva v levém dolním rohu):

      +
      image = pyglet.image.load(...)
      +image.anchor_x = image.width // 2
      +image.anchor_y = image.height // 2
      +self.sprite = pyglet.sprite.Sprite(image, batch=batch)
      +
    • +
    • Pro pohyb raketky půjde použít klávesy s šipkami doleva, doprava a rovně. +Šipky do stran raketu točí, šipka dopředu zrychluje pohyb tím směrem, kam je +raketka otočená.

      +
        +
      • Základní pohyb raketky je jednoduchý: k x-ové +souřadnici se přičte x-ová rychlost krát uplynulý čas +a to samé v y-ové souřadnici i pro úhel otočení:

        +
          self.x = self.x + dt * self.x_speed
        +  self.y = self.y + dt * self.y_speed
        +  self.rotation = self.rotation + dt * rotation_speed
        +

        Rychlost otáčení závisí na stisknutých šipkách (doleva nebo doprava). + V jednom případě je záporná, v druhém kladná. Vhodnou hodnotu zvol + experimentováním – začni třeba u 4 radiánů za sekundu. + Všechny podobné „magické hodnoty“ je vhodné definovat + jako konstanty – tedy proměnné, které na začátku nastavíš a nikdy + je neměníš. Bývá zvykem je označovat velkými písmeny a dávat je na + začátek souboru, hned za importy:

        +
          ROTATION_SPEED = 4  # radians per second
        +
      • +
      • Zrychlení je trochu složitější: k x-ové rychlosti +se přičte kosinus úhlu otočení krát uplynulý čas. +U y-ové osy se použije sinus.

        +
          self.x_speed += dt * ACCELERATION * math.cos(self.rotation)
        +  self.y_speed += dt * ACCELERATION * math.sin(self.rotation)
        +

        Všimni si v příkladu konstanty ACCELERATION. Tu opět zvol podle uvážení.

        +
      • +
      • Když máš hodnoty self.x, self.y a self.rotation spočítané, nezapomeň +je promítnout do self.sprite, jinak se nic zajímavého nestane.

        +

        Pozor na to, že funkce math.sin a math.cos používají radiány, +kdežto pyglet používá pro Sprite.rotation stupně. +(A k tomu je navíc 0° jinde, a otáčí se na opačnou stranu.) +Pro sprite je tedy potřeba úhel převést:

        +
          self.sprite.rotation = 90 - math.degrees(self.rotation)
        +  self.sprite.x = self.x
        +  self.sprite.y = self.y
        +
      • +
      • Když raketka vyletí z okýnka ven, vrať +ji zpátky do hry na druhé straně okýnka. +(Zkontroluj si, že to funguje na všech čtyřech stranách.)
      • +
      +
    • +
    +
      +
    • Bonus 1: Zkus si přidat několik raketek, +každou trochu jinak natočenou.

      +

      Každý jednotlivý objekt třídy Spaceship +si udržuje vlastní stav, takže by nemělo být složité +jich vytvořit víc (a všechny ovládat najednou).

      +
    • +
    • Bonus 2: +Možná sis všiml/a „skoku”, když +raketa vyletí z okýnka a vrátí se na druhé straně. +Tomu se dá zabránit tak, že +vlevo, vpravo, nahoře i dole vedle naší „scény” +vykreslíš celou scénu ještě jednou.

      +

      Pyglet na to má speciální nízkoúrovňové funkce, +kterými můžeš říct „tady kresli všechno posunuté o +X pixelů vlevo”. Úplné vysvětlení by bylo na dlouho, +takže si zatím jen zkopíruj kód:

      +
      from pyglet import gl
      +
      +def draw():
      +    window.clear()
      +
      +    for x_offset in (-window.width, 0, window.width):
      +        for y_offset in (-window.height, 0, window.height):
      +            # Remember the current state
      +            gl.glPushMatrix()
      +            # Move everything drawn from now on by (x_offset, y_offset, 0)
      +            gl.glTranslatef(x_offset, y_offset, 0)
      +
      +            # Draw
      +            batch.draw()
      +
      +            # Restore remembered state (this cancels the glTranslatef)
      +            gl.glPopMatrix()
      +

      Pro přehled, dokumentace k použitým funkcím je tady: +glPushMatrix, glPopMatrix, +glTranslatef.

      +
    • +
    +

    Povedlo se? Můžeš létat vesmírem? +Čas to všechno dát do Gitu!

    +

    Projdi si předchozí body, jestli máš opravdu všechno, a můžeš pokračovat dál!

    +

    Asteroidy

    +

    Přidej druhý typ vesmírného objektu: Asteroid.

    +
      +
    • Asteroidy a vesmírné lodě mají mnoho společného: +každý takový vesmírný objekt bude mít polohu, +rychlost, natočení a pravidla, jak se pohybuje. +Vytvoř proto třídu SpaceObject, +ve které bude všechno to společné, a z ní poděď +třídu Spaceship, ve které zůstane +kód specifický pro vesmírnou loď (t.j. ovládání +klávesnicí, obrázek lodě, začátek v prostředku +obrazovky).
    • +
    • Část kódu pro pohyb bude společná pro všechny +vesmírné objekty (např. věci kolem zrychlení); +část bude specifická jen pro raketku (ovládání +pomocí klávesnice). +Využij funkci super() z lekce o dědičnosti.
    • +
    • Napiš ještě třídu Asteroid, +která taky dědí ze SpaceObject, +ale má svoje vlastní chování: +začíná buď na levé nebo spodní straně obrazovky +s náhodnou rychlostí +a ke každému asteroidu se přiřadí +náhodně vybraný obrázek. +(V Asteroidech je levý a pravý okraj v podstatě + to samé; a stejně tak horní a spodní.)
    • +
    • A pak pár asterojdíků různých velikostí přidej +na začátku do hry.
    • +
    +

    Povedlo se? Máš dva typy objektů? +Čas to všechno dát do Gitu!

    +

    Zase si projdi, jestli máš všechno hotové, +a jdeme na další část!

    +

    Kolize

    +

    Naše asteroidy jsou zatím docela neškodné. Pojďme to změnit.

    +
      +
    • V této sekci bude tvým úkolem zjistit, kdy +loď narazila do asteroidu. +Pro zjednodušení si každý objekt nahradíme +kolečkem a budeme počítat, kdy se srazí kolečka. +Každý objekt bude potřebovat mít poloměr – atribut radius.
    • +
    • Aby bylo vidět co si hra o objektech „myslí”, +nakresli si nad každým objektem příslušné kolečko. +Nejlepší je to udělat pomocí +pyglet.gl +a trochy matematiky; pro teď si jen opiš funkci +draw_circle a pro každý objekt ji zavolej. +Až to bude všechno fungovat, můžeš funkci dát pryč.

      +
      def draw_circle(x, y, radius):
      +    iterations = 20
      +    s = math.sin(2*math.pi / iterations)
      +    c = math.cos(2*math.pi / iterations)
      +
      +    dx, dy = radius, 0
      +
      +    gl.glBegin(gl.GL_LINE_STRIP)
      +    for i in range(iterations+1):
      +        gl.glVertex2f(x+dx, y+dy)
      +        dx, dy = (dx*c - dy*s), (dy*c + dx*s)
      +    gl.glEnd()
      +
    • +
    • Když asteroid narazí do lodi, loď exploduje a zmizí. +Explozi necháme na později, teď je důležité odebrání objektu ze hry. +Dej ho do metody SpaceObject.delete, +protože vyndávat ze hry se dá jakýkoli objekt. +V této metodě musíš objekt jednak odstranit +ze seznamu objects a pak zrušit jeho Sprite, aby se už v rámci +batch nevykresloval.
    • +
    • A jak udělat ono narážení? +V rámci Spaceship.tick projdi +každý objekt, zjisti jestli vzdálenost mezi lodí +a objektem je menší než součet poloměrů +(t.j. narazily do sebe) a pokud ano, +zavolej na objektu metodu hit_by_spaceship.

      +

      Zjišťování vzdálenosti ve hře, kde se +objekty které vyletí ven vrací na druhé straně, +není úplně přímočaré, takže si příslušný kód pro teď jen zkopíruj:

      +
      def distance(a, b, wrap_size):
      +    """Distance in one direction (x or y)"""
      +    result = abs(a - b)
      +    if result > wrap_size / 2:
      +        result = wrap_size - result
      +    return result
      +
      +def overlaps(a, b):
      +    """Returns true iff two space objects overlap"""
      +    distance_squared = (distance(a.x, b.x, window.width) ** 2 +
      +                        distance(a.y, b.y, window.height) ** 2)
      +    max_distance_squared = (a.radius + b.radius) ** 2
      +    return distance_squared < max_distance_squared
      +

      Většina objektů v dokončené hře (např. oheň z +rakety, střela) nebude při kolizi s lodí dělat nic, +takže metoda SpaceObject.hit_by_spaceship +by neměla dělat nic (musí jen existovat). +Jen asteroid loď rozbije, takže předefinuj +Asteroid.hit_by_spaceship, aby +zavolala delete lodi.

      +

      Protože lodí může být v naší hře obecně více, musí asteroid +vědět, se kterou lodí se srazil, aby ji mohl rozbít. +Metoda hit_by_spaceship by tedy na to měla mít argument.

      +
    • +
    +

    Povedlo se? Konečně se dá prohrát? +Čas to všechno zkontrolovat, dát do Gitu a můžeme pokračovat!

    +

    Útok

    +

    Teď zkusíme asteroidy rozbíjet.

    +
      +
    • Raketka umí jednou za 0,3 s vystřelit laser. +Ulož si pro každou raketku (jako atribut) číslo, +které po každém výstřelu nastav na 0,3 +a pak ho v metodě tick nech klesat o 1 za vteřinu. +Když bude záporné, může hráč vystřelit znovu.
    • +
    • Když hráč drží mezerník a může vystřelit, vystřelí. +Ve hře se to projeví tak, že se přidá objekt nové třídy Laser. +Začne na souřadnicích raketky, s natočením raketky +a s rychlostí raketky plus něco navíc ve směru natočení.
    • +
    • Každý objekt třídy Laser si „pamatuje“, +jak dlouho ještě bude ve hře. +Na začátku se tohle číslo nastaví tak, aby přeletěl +zhruba něco víc než jednu obrazovku. +Když dojde čas, Laser zmizí.
    • +
    • Ve své metodě tick laser projde +všechny objekty, a pokud se s některým překrývá, +tak na něm zavolá metodu hit_by_laser. +U většiny objektů tahle metoda nedělá nic, +jen asteroidy bude rozbíjet.
    • +
    • Když se laser dotkne asteroidu, asteroid se +rozdělí na dva menší (nebo, je-li už příliš malý, zmizí úplně).

      +

      Rychlosti nových asteroidů si můžeš nastavit +podle sebe – důležité je jen, aby každý menší +asteroid letěl jinam. +Většinou bývají nové asteroidy rychlejší než ten původní.

      +
    • +
    • A to je vše! Máš funkční hru!
    • +
    +

    Povedlo se? Dá se i vyhrát? Čas to všechno dát do Gitu!

    +

    Dokončení a rozšíření

    +

    Chceš-li ve hře pokračovat, tady jsou další nápady. +Můžeš je dělat v jakémkoli pořadí – nebo si vymysli +vlastní rozšíření!

    +
      +
    • Je hra příliš těžká?

      +

      Můžeš přidat životy: na začátku jsou tři, +a dokud nějaký zbývá, raketka se po zásahu +asteroidem objeví znovu uprostřed, +s nulovou rychlostí. +Hra by taky při tomto „restartu” měla ignorovat +držené klávesy, dokud je hráč znovu nezmáčkne +(nejlépe pomocí pressed_keys.clear()).

      +

      Počet náhradních lodí můžeš ukázat ikonkami +na spodku obrazovky.

      +

      Bonus: Několik vteřin po +„restartu” může být raketka nezničitelná, +aby měla čas odletět, když je zrovna uprostřed +okýnka asteroid.

      +
    • +
    • Je hra příliš lehká?

      +

      Přidej úrovně: až hráč vystřílí všechny asteroidy, +postoupí na další úroveň, kde je asteroidů víc než v té předchozí.

      +

      Číslo úrovně můžeš ukázat pomocí +pyglet.text.Label.

      +
    • +
    • Je pozadí příliš černé?

      +

      V sadě obrázků v adresáři Backgrounds +si vyber pozadí, a vytapetuj s ním celý vesmír.

      +
    • +
    • Je hra moc strohá?

      +

      Přidej oheň a exploze! +Chovají se podobně jako Laser, +jen nic neničí a můžou třeba měnit barvu podle +toho, jak dlouho už jsou ve hře.

      +

      Na efekty můžeš použít obrázky +„Smoke particle assets”, +které nakreslil opět Kenney Vleugels. +Doporučuji „White Puff”, které můžeš zmenšit +(např. sprite.scale = 1/10), +přibarvit +(např. sprite.color = 255, 100, 0) +nebo částečně zprůhlednit +(např. sprite.opacity = 100).

      +

      Doporučuji si na efekty udělat nový Batch +a vykreslit ho před tím hlavním, aby efekty +nepřekrývaly herní objekty.

      +
    • +
    • Nepoznáš, kdy jsi prohrál/a nebo vyhrál/a?

      +

      Na konci můžeš ukázat veliký nápis GAME OVER nebo WINNER.

      +
    • +
    • Nudíš se?

      +

      V původní hře se občas objeví UFO, které občas +vystřelí na místo, kde je právě hráčova raketka, +takže pokud hráč stojí pořád na jednom místě a +jenom se točí dokola, UFO ho sestřelí. +Můžeš zkusit dodělat třídu Ufo +a z Laser podědit ShipLaser a UfoLaser.

      +
    • +
    +

    Povedlo se? Vypadá to a chová se to profesionálně? +Čas to všechno dát do Gitu!

    \ No newline at end of file diff --git a/lessons/asteroids/screenshot.png b/lessons/asteroids/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd8d12f78f1446843e58a4870344c18553153cb GIT binary patch literal 53112 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%0AI~l!L3%W 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 Y**g`xSE?W1OueV>dBbz1XC3bTF9PSSV*mgE literal 0 HcmV?d00001 diff --git a/lessons/async/index.html b/lessons/async/index.html new file mode 100644 index 00000000..6ac5d5d6 --- /dev/null +++ b/lessons/async/index.html @@ -0,0 +1,387 @@ +

    Ve cvičení použijeme ukázku z PyQt5. +Máte-li ještě virtualenv s nainstalovaným PyQt, použijte ho, případně ho +podle lekce o PyQt nainstalujte znovu.

    +

    K PyQt si přiinstalujte knihovnu asyncqt:

    +
    $ python -m pip install asyncqt
    +

    Nejde-li to, nevadí – nezbytné dnes PyQt nebude.

    +

    Navíc si nainstalujte knihovnu aiohttp:

    +
    $ python -m pip install aiohttp
    +

    +

    V minulosti byly na této stránce popsány i generátory. +Neovládáte-li je ještě, přečtěte si o nich.

    +

    +

    AsyncIO

    +

    Pojďme si povídat o souběžnosti – možnostech, jak nechat počítač dělat víc +úloh věcí najednou.

    +

    Jak jsme si řekli v lekci o C API, Python má globální zámek, takže pythonní kód +může běžet jen v jednom vlákně najednou. +Taky jsme si řekli, že to většinou příliš nevadí: typický síťový nebo GUI program +stráví hodně času čekáním na události (odpověď z internetu, kliknutí myší atp.) +a u tohoto čekání není potřeba držet zámek zamčený.

    +

    Servery typicky při zpracovávání požadavku stráví většinu času síťovou komunikací. +Proto se často spouští několik vláken nebo přímo procesů najednou, aby se mohl vytížit +procesor. +Při velkém množství vláken ale nastanou dva problémy. +První je, že vláken nemůže být neomezeně mnoho. +Každé vlákno potřebuje vlastní stack, tj. poměrně velkou část paměti; a počet vláken +bývá omezen i jinak (na Linuxu je globální limit počtu procesů, do kterého se počítají +i jednotlivá vlákna – viz cat /proc/sys/kernel/threads-max). +Druhý problém je, že přepnutí z jednoho vlákna do druhého se může stát kdykoli. +Ověřit si, že je na to program připravený, je poměrně složité a na zajištění +správné funkčnosti je potřeba zamykání či jiné techniky. Ty bývají relativně +pomalé, a tak se jim programátoři snaží vyhnout. +A chyby vzniklé nesprávným ošetřením přepínání vláken bývají složité na odhalení +a vyřešení.

    +

    Vlákna jsou příklad preemptivního multitaskingu, kdy operační systém rozhoduje, +kdy přepne z jednoho vlákna do druhého, a tuto změnu si prakticky vynutí. +Jednotlivá vlákna se s tím musí vyrovnat. +Alternativou je kooperativní multitasking, kdy se jednotlivé úlohy umí samy vzdát +procesorového času, když např. čekají na síťovou komunikaci. +Programátor tak ví, že dokud takto nepředá kontrolu ostatním úlohám, žádná jiná +úloha mu pod rukama nemůže měnit stav procesu. +Na druhou stranu je ale potřeba dostatečně často kontrolu předávat, aby se všechny +úlohy dostaly ke slovu. +Tuto techniku tak nemůže používat operační systém, pod kterým můžou běžet i špatně +napsané programy. V rámci jednoho procesu se to ale dá s úspěchem využít.

    +

    Souběžnost v Pythonu

    +

    V Pythonu existovala a existuje řada knihoven, které nám umožňují „dělat více +věcí zároveň“. +Pro preemptivní multitasking jsou tu threading, tedy podpora pro vlákna, +a multiprocessing, tedy způsob jak spustit nový pythonní proces, +ve kterém se provede určitá funkce +(přičemž vstup a výstup se předává serializovaný přes pipes).

    +

    Další knihovna, kterou lze z PyPI nainstalovat, je greenlet. +Ta nám dává k dispozici tzv. mikro-vlákna, +která se mezi sebou přepínají v rámci jednoho procesu. +Na rozdíl od systémových vláken nepotřebují tolik paměti navíc, ale +stále jde (alespoň z pohledu programátora) o preemptivní strategii: +k přepnutí může dojít kdykoli, +je tedy potřeba zamykat a složitě hledat málo časté chyby.

    +

    Byly vyvinuty i knihovny pro kooperativní přepínání, založené na tzv. +futures. +Nejznámější jsou Twisted a Tornado. +Obě jsou relativně staré (2002, resp. 2009), ale stále populární.

    +

    Ačkoli byly Twisted, Tornado a podobné knihovny užitečné, měly zásadní problém +v tom, že každá má jiné API. +Vznikaly tak kolem nich ekosystémy vázané na konkrétní knihovnu: +server napsaný pro Tornado se nedal použít pod Twisted a aplikace +využívající Twisted nemohla využít knihovnu pro Tornado.

    +

    Jak to vyřešit?

    +

    Jeden standard

    +

    xkcd 927

    +

    Komiks xkcd, © Randall Munroe, CC-BY-NC

    +

    Podobně jako přístup k různým SQL databázím je v Pythonu standardizovaný +(knihovny pro SQLite, Postgres, MySQL atd. všechny podporují API definované +v PEP 249) nebo je standardizované API webových serverů (WSGI, PEP 3333), +tak vzniklo standardizované API pro kooperativní multitasking. +Toto API je definováno v PEP 3156 a jeho referenční implementace, asyncio, +je ve standardní knihovně Pythonu. +(Ne že by to zabránilo vzniku dalších asynchronních knihoven jako +Curio a Trio. +Ty ovšem spíš experimentují s novými paradigmaty a osvědčené principy se z nich +postupně dostávají do asyncio.)

    +

    Interně je asyncio postavené na konceptu futures inspirovaných Tornado/Twisted, +ale jeho „hlavní“ API je postavené na coroutines podobných generátorům.

    +

    Od Pythonu verze 3.5 používá asyncio místo „normálních“ generátorů +speciální syntaxi, která umožňuje kombinovat asynchronní funkce s příkazy +for a with nebo i yield. +Tuto syntaxi použijeme i tady; máte-li starší Python, podívejte se na potřebné změny uvedené níže.

    +

    Jak vypadá taková asynchronní funkce? +Definuje se pomocí async def místo def, a může používat příkaz await.

    +

    Ukažme si to na příkladu:

    +
    import asyncio
    +
    +async def count(name, interval):
    +    """Prints numbers from 0 in regular intervals"""
    +    i = 0
    +    while True:
    +        print(name, 'counts', i)
    +        await asyncio.sleep(interval)
    +        i += 1
    +
    +
    +loop = asyncio.get_event_loop()
    +loop.run_until_complete(count('Counter', 1))
    +loop.close()
    +

    Co se tu děje? +Příkazem await asyncio.sleep(interval) se asynchronní funkce pozastaví +(podobně jako generátor při yield) a předá kontrolu knihovně asyncio +s informací že za daný čas by kontrolu chtěla zase zpátky. +Než daný interval uplyne, asyncio může spouštět jiné úlohy; +po jeho uplynutí pozastavenou funkci „probudí“ a její algoritmus pokračuje dál.

    +

    Když žádné jiné úlohy neexistují, je pomalé počítání trochu nudné. +Zkuste proto spustit počítadla dvě. +(Detaily funkce ensure_future a příkazu await task vysvětlíme níže.)

    +
    import asyncio
    +
    +async def count(name, interval):
    +    ...
    +
    +async def run_two_counters():
    +    fast_task = asyncio.ensure_future(count('Fast', 0.3))
    +    slow_task = asyncio.ensure_future(count('Slow', 1))
    +    await fast_task
    +    await slow_task
    +
    +loop = asyncio.get_event_loop()
    +loop.run_until_complete(run_two_counters())
    +loop.close()
    +

    Spouštění a ukončení – poslední tři řádky – je poněkud složité na zápis, +ale typicky to v každém programu potřebujete napsat jen jednou.

    +

    V Pythonu verze 3.7 a vyšší lze ty tři poslední řádky nahradit jednodušším:

    +
    asyncio.run(run_two_counters())
    +

    V Pythonu verze 3.4 a nižší ještě neexistovala klíčová slova async a +await; asynchronní funkce byly implementovány jako generátory. +Ve starších verzích Pythonu bylo potřeba místo:

    +
    async def ...:
    +    await ...
    +

    psát:

    +
    @asyncio.coroutine
    +def ...:
    +    yield from ...
    +

    Starý způsob zatím funguje i v novějším Pythonu a dokonce se ještě někdy +objeví i v dokumentaci. +Od Pythonu 3.8 je ale deprecated.

    +

    Event Loop

    +

    Knihovna asyncio nám dává k dispozici smyčku událostí, která se, podobně jako +app.exec v Qt, stará o plánování jednotlivých úloh. +Smyček událostí může být více. +Tradiční způsob je, že každé vlákno může mít vlastní smyčku událostí, +kterou získáme pomocí asyncio.get_event_loop a pak ji můžeme spustit dvěma +způsoby:

    +
      +
    • loop.run_forever() spustí smyčku na tak dlouho, dokud jsou nějaké úlohy +naplánovány (to trochu odporuje názvu, ale většinou se nestává, že by se +úlohy „vyčerpaly“), nebo
    • +
    • loop.run_until_complete(task) – tahle funkce skončí hned, jakmile je hotová +daná úloha, a vrátí její výsledek.
    • +
    +

    Nakonec je smyčku potřeba uzavřít (loop.close()), což např. dá použitým +knihovnám možnost korektně uzavřít zbylá síťová spojení.

    +

    Od Pythonu 3.7 můžete použít asyncio.run(task), což vytvoří novou +smyčku událostí, spustí v ní danou úlohu (pomocí run_until_complete) +a zase ji zavře. +Chcete-li ji použít (a tedy psát kód jen pro Python 3.7+), používejte pak všude +místo ensure_future funkci create_task, která vás lépe ochrání před +těžko nalezitelnými chybami.

    +

    Async funkce a Task

    +

    Smyčka událostí provádí úlohy a asynchronní funkce.

    +

    Asynchronní funkce se definují pomocí async def a umožňují použít příkaz +(nebo operátor) await, kterým se provádění funkce pozastaví a kontrola se +předá jiným úlohám do doby, než nastane nějaká událost (např. uplynul časový +intervaluj, jsou dostupná nová data ze socketu…).

    +

    Pozastavení funguje podobně jako yield u generátoru.

    +

    Zavoláním asynchronní funkce dostaneme coroutine pozastavenou na začátku +těla funkce:

    +
    >>> async def demo():
    +...     print('Demo')
    +...
    +>>> coroutine = demo()
    +>>> coroutine
    +<coroutine object demo at 0x7fda8be22b90>
    +

    Naplánujeme-li provádění coroutine na smyčce událostí +(např. pomocí run_until_complete), tělo funkce se začne vykonávat:

    +
    >>> loop = asyncio.get_event_loop()
    +>>> result = loop.run_until_complete(coroutine)
    +Demo
    +

    V rámci jedné coroutine pak lze provedení jiné coroutine naplánovat +a počkat na jejich skončení pomocí await. +Jak run_until_complete tak await nám dají k dispozici návratovou hodnotu +příslušné asynchronní funkce.

    +
    import asyncio
    +
    +async def add(a, b):
    +    await asyncio.sleep(1)  # schedule a "sleep" and wait for it to finish
    +    return a + b
    +
    +async def demo():
    +    coroutine = add(2, 3)
    +    result = await coroutine  # schedule "add" and wait for it to finish
    +    print('The result is:', result)
    +
    +loop = asyncio.get_event_loop()
    +result = loop.run_until_complete(demo())
    +loop.close()
    +

    Nevýhoda čistých coroutines spočívá v tom, že na každé zavolání +takové funkce lze použít jen jeden await. +Výsledek se nikam neukládá, jen se po skončení jednou předá. +Druhý await pro stejné zavolání asynchronní funkce skončí s chybou. +Zkuste si to – v kódu výše přidejte daší řádek s await coroutine:

    +
        print('The result is:', (await coroutine))
    +

    Tenhle problém můžeme vyřešit tak, že asynchronní funkci „zabalíme“ +jako úlohu, Task. +V Pythonu 3.7 se Task tvoří pomocí asyncio.create_task; +pro kompatibilitu se staršími verzemi ale použijeme ekvivalentní +asyncio.ensure_future. +Task se chová stejně jako coroutine – lze použít v await nebo +run_until_complete, ale navíc:

    +
      +
    • výsledek je k dispozici kdykoli po ukončení funkce (např. pro druhý await) a
    • +
    • úloha se naplánuje hned po zavolání ensure_future.
    • +
    +

    Druhou vlastnost je lepší ukázat na příkladu:

    +
    import asyncio
    +
    +async def print_and_wait():
    +    print('Async function starting')
    +    await asyncio.sleep(0.5)
    +    print('Async function done')
    +    return 'result'
    +
    +async def demo_coro():
    +    coroutine = print_and_wait()
    +    await asyncio.sleep(1)
    +    print('Awaiting coroutine')
    +    print(await coroutine)     # schedule coroutine and wait for it to finish
    +
    +async def demo_task():
    +    task = asyncio.ensure_future(print_and_wait())  # schedule the task
    +    await asyncio.sleep(1)
    +    print('Awaiting task')
    +    print(await task)  # task is finished at this point; retreive its result
    +
    +
    +loop = asyncio.get_event_loop()
    +print('Coroutine:')
    +result = loop.run_until_complete(demo_coro())
    +print('Task:')
    +result = loop.run_until_complete(demo_task())
    +loop.close()
    +

    Fan-Out a Fan-In

    +

    S pomocí asynchronních funkcí můžeme nad našimi programy přemýšlet tak, +jako by to byly „normální“ procedurálně zapsané algoritmy: máme jedno +„vlákno“, které se provádí od začátku do konce, jen na některých místech +(označených await) se provádění přeruší a zatímco náš kód čeká na výsledek +nějaké operace, může se spustit jiný kus kódu. +Funkce, na které je takto potřeba čekat, bývají v dokumentaci patřičně +označeny (v síťovém programování je to většinou čtení ze socketů nebo inicializace +či ukončení serveru).

    +

    Pomocí ensure_future a await můžeme k tomu dělat něco navíc: +rozdělit běh našeho programu na víc úloh, které se budou vykonávat „souběžně“ – +například autor scraperu chce stáhnout několik stránek najednou +nebo server souběžně odpovídá na několik požadavků. +Tomuto rozdělení se říká fan-out.

    +

    Opačná operace je fan-in, kdy několik úloh opět spojíme do jedné. +Výše uvedený scraper může počkat, než jsou všechny stránky stažené – +třeba pomocí jednoho await pro každý Task nebo asynchronní funkce +gather. +Poté může pokračovat zpracováním získaných dat.

    +

    Počkáním na úlohu (pomocí await, gather, run_until_complete atp.) +získáte její návratovou hodnotu. +Ale na všechny úlohy, i na ty, které nic zajímavého nevrací, je důležité počkat. +Neuděláte-li to, bude asyncio vypisovat varovné hlášky:

    +
    >>> import asyncio
    +>>> asyncio.sleep(1)  # no await
    +>>> exit()
    +sys:1: RuntimeWarning: coroutine 'sleep' was never awaited
    +

    Toto varování nikdy neignorujte. Kdyby váš program nedělal co má, spolu s +varováním byste ignorovali výjimky v této coroutine.

    +

    Asynchronní cykly a kontexty

    +

    Až budete používat některé „asynchronní“ knihovny, setkáte se pravděpodobně se dvěma +novými konstrukcemi: async for a async with.

    +

    Fungují jako jejich „ne-async“ varianty, jen na začátku a konci každé iterace (resp. +na začátku a konci bloku) můžou přerušit vykonávání funkce – podobně jako await.

    +

    Typický příklad je u databází: začátek a konec transakce i získávání jednotlivých +řádků pravděpodobně potřebují komunikaci po síti, takže hypotetická databázová +knihovna by se mohla používat nějak takto:

    +
    async with database.transaction_context():
    +    await database.execute('UPDATE ...')
    +    async for row in (await database.execute('SELECT ...')):
    +        handle(row)
    +

    A další

    +

    Nakonec několik tipů, o kterých je dobré vědět.

    +

    V asyncio najdeme synchronizační mechanismy známé z vláknového programování, např. +Lock a Semaphore – viz dokumentace.

    +

    Musíme-li použít blokující funkci, která např. komunikuje po síti bez await a která by +tedy zablokovala i všechny ostatní úlohy, můžeme použít +loop.run_in_executor(), a tím danou funkci zavolat ve vlákně nebo podprocesu, ale výsledek zpřístupnit +jako objekt, na který lze počkat pomocí await. +Použití je opět popsáno v dokumentaci.

    +

    Občas vás při programování s asyncio zaskočí zrádná chyba. +V takových případech je dobré zapnout debug režim pomocí proměnné prostředí PYTHONASYNCIODEBUG=1. +V tomto režimu asyncio upozorňuje na časté chyby, do některých chybových výpisů přidává informaci o tom, +kde aktuální Task vznikl, apod. +Více informací je zase v dokumentaci.

    +

    Alternativní smyčky událostí

    +

    Jak bylo zmíněno na začátku, hlavní cíl asyncio je definovat společné rozhraní +pro různé asynchronní knihovny, aby bylo možné např. kombinovat knihovny pro +Tornado se smyčkou událostí v Twisted. +Samotné asyncio je jen jedna z mnoha implementací tohoto rozhraní. +Zajímavá je například knihovna uvloop, která je asi 2-4× rychlejší než asyncio +(ale má závislosti, které se pro součást standardní knihovny nehodí).

    +

    Další zajímavá implementace je asyncqt, která pod standardním asyncio API používá +smyčku událostí z Qt. +Umožňuje tak efektivně zpracovávat Qt události zároveň s asynchronními funkcemi +známými z asyncio.

    +

    Event loop z asyncqt je potřeba na začátku programu naimportovat a nastavit +jako hlavní smyčku událostí, a poté ji, místo Qt-ovského app.exec(), spustit. +Jednotlivé asynchronní funkce se pak používají jako v čistém asyncio: +pomocí asyncio.ensure_future, await, atd.

    +

    Ukázka:

    +
    import asyncio
    +
    +from PyQt5 import QtGui, QtWidgets
    +from asyncqt import QEventLoop
    +
    +app = QtWidgets.QApplication([])
    +loop = QEventLoop(app)
    +asyncio.set_event_loop(loop)
    +
    +display = QtWidgets.QLCDNumber()
    +display.setWindowTitle('Stopwatch')
    +
    +display.show()
    +
    +async def update_time():
    +    value = 0
    +    while True:
    +        display.display(value)
    +        await asyncio.sleep(1)
    +        value += 1
    +
    +asyncio.ensure_future(update_time())
    +
    +loop.run_forever()
    +

    Komunikace

    +

    Ono io v asyncio naznačuje, že je tato knihovna dělaná především na +vstup a výstup – konkrétně na komunikaci přes síť (případně s jinými procesy).

    +

    Ke komunikaci používá asyncio tři úrovně abstrakce: Transport, Protocol +a Stream. +V krátkosti si je tu popíšeme; detaily pak najdete v dokumentaci (je pro nás +totiž mnohem důležitější abyste pochopili principy, než abyste uměli konkrétní +API, které lze dohledat v dokumentaci).

    +

    Transporty a protokoly jsou postaveny na konceptech knihovny Twisted.

    +

    Transport zajišťuje samotné posílání bajtů mezi počítači (transportní vrstvu), kdežto +Protocol implementuje nějaký aplikační protokol. +Transport většinou nepíšeme sami, použijeme existující. +V asyncio jsou zabudované transporty pro TCP, UDP a SSL. +Protocol je pak použit pro implementaci konkrétních protokolů jako +HTTP, FTP a podobně. +V dokumentaci najdete podrobnější popis včetně příkladů.

    +

    Kromě toho existuje i „Stream API“ založené na asynchronních funkcích. +Většinou platí, že operace otevření, čtení, flush a zavření Streamu +jsou asynchronní funkce (v dokumentaci označované jako coroutines), a je +tedy nutné je použít s await; oproti tomu zápis asynchronní není – data +se uloží do bufferu a pošlou se, až to bude možné.

    +

    Typicky ale místo čistého asyncio použijeme existující knihovnu. +Tady je příklad z knihovny aiohttp, která implementuje server a klienta +pro HTTP:

    +
    import asyncio
    +import aiohttp
    +
    +async def main(url):
    +    # Use a a session
    +    session = aiohttp.ClientSession()
    +    async with session:
    +
    +        # Get the response (acts somewhat like a file; needs to be closed)
    +        async with session.get(url) as response:
    +
    +            # Fetch the whole text
    +            html = await response.text()
    +            print(html)
    +
    +loop = asyncio.get_event_loop()
    +loop.run_until_complete(main('http://python.cz'))
    +loop.close()
    +
    \ No newline at end of file diff --git a/lessons/basic-functions/index.html b/lessons/basic-functions/index.html new file mode 100644 index 00000000..96557cee --- /dev/null +++ b/lessons/basic-functions/index.html @@ -0,0 +1,146 @@ +

    Užitečné funkce

    +

    Ukažme si pár základních funkcí, které Python nabízí.

    +

    Tato kapitola ukazuje výběr z nástrojů, které jsou ti v Pythonu k dispozici. +Tvůj cíl není naučit se vše nazpaměť, ale mít přehled o tom, co je zhruba +možné. +Detaily můžeš vždycky dohledat – ať už na taháku (které jsou, na rozdíl od +školy, vždycky povoleny!), v těchto materiálech, nebo v oficiální +dokumentaci či jinde na Internetu.

    +

    Můžeš si stáhnout i +tahák, +který se rozdává na srazech. +Doporučuji mít ho ze začátku při ruce. +Když narazíš na úkol, se kterým si nevíš rady, projdi si tahák a zamysli se, +která z funkcí by se dala použít.

    +

    Vstup a výstup

    +

    Tyhle funkce už známe. +print vypíše nepojmenované argumenty, oddělené mezerou. +Pojmenovaný argument end určuje, co se vypíše na konci (místo přechodu +na nový řádek); +sep udává, co se vypíše mezi jednotlivými argumenty (místo mezery).

    +

    Příklad opět spusť ze souboru, ne interaktivně:

    +
    print(1, 'dvě', False)
    +print(1, end=' ')
    +print(2, 3, 4, sep=', ')
    +

    Základní funkce pro načtení vstupu, input, +vypíše otázku, počká na text od uživatele a ten vrátí jako řetězec.

    +
    input('zadej vstup: ')
    +

    Kontrolní otázky:

    +
      +
    • Je input „normální“ funkce, nebo procedura?
    • +
    • Co bere funkce input jako argument?
    • +
    • Jaká je návratová hodnota funkce input?
    • +
    +
    +

    Řešení

    + + +

    Převádění typů

    +

    Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? +Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky. +Každý ze tří typů (angl. types) proměnných, které zatím známe, +má funkci, která vezme nějakou hodnotu a vrátí podobnou hodnotu „svého“ typu. +Na celá čísla je funkce int (z angl. integer), na reálná čísla je float +(z angl. floating-point), a pro řetězce str (z angl. string).

    +
    int(x)              # převod na celé číslo
    +float(x)            # převod na reálné číslo
    +str(x)              # převod na řetězec
    +

    Příklady:

    +
    3 == int('3') == int(3.0) == int(3.141) == int(3)
    +8.12 == float('8.12') == float(8.12)
    +8.0 == float(8) == float('8') == float(8.0)
    +'3' == str(3) == str('3')
    +'3.141' == str(3.141) == str('3.141')
    +

    Ne všechny převody jsou možné:

    +
    int('blablabla')    # chyba!
    +float('blablabla')  # chyba!
    +int('8.9')          # chyba!
    +

    …a jak si poradit s chybou, která nastane, +když použiješ špatnou hodnotu, si řekneme později.

    +

    Převádění a input

    +

    Převádění typů se často používá při načítání vstupu, třeba takto:

    +
    cislo = int(input('Zadej číslo: '))
    +

    Jak Python vyhodnotí tento výraz? +Zadá-li uživatel 42Enter, +funkce input vrátí řetězec'42'. +Ten pak funkce int vezme jako argument, udělá podle něj číslo a to +číslo vrátí:

    +
    cislo = int(input('Zadej číslo: '))
    +      #     ╰─────────┬─────────╯
    +cislo = int(        '42'          )
    +      # ╰────────────┬────────────╯
    +cislo =             42
    +

    Matematické funkce

    +

    Matematika je občas potřeba, takže se pojďme +podívat, jak v Pythonu pracovat s čísly.

    +

    Jedna zajímavá matematická funkce je k dispozici vždy:

    +
    round(cislo)    # zaokrouhlení
    +

    Spousta dalších není k dispozici od začátku programu. +Ne každý má rád matematiku, a ne ve všech druzích programu jsou takové operace +potřeba. +Proto musíš předem – typicky na začátku souboru – říct, že je budeš používat. +To se dělá naimportováním z modulu math:

    +
    from math import sqrt, floor, ceil
    +

    Naimportované funkce pak můžeš použít:

    +
    sqrt(cislo)                 # druhá odmocnina
    +
    +floor(cislo)                # zaokrouhlení dolů
    +ceil(cislo)                 # zaokrouhlení nahoru
    +

    Kdybys potřeboval/a goniometrické funkce jako sinus, jsou k dispozici taky. +Jen pozor na to, že počítají pro úhly v radiánech. +Hodnoty ve stupních je potřeba na radiány převést.

    +
    from math import sin, cos, tan, degrees, radians
    +
    +sin(uhel)       # sinus
    +cos(uhel)       # kosinus
    +tan(uhel)       # tangens
    +
    +degrees(uhel)   # převod z radiánů na stupně
    +radians(uhel)   # převod ze stupňů na radiány
    +

    Import a pojmenování souborů

    +

    Při importování je potřeba si dávat pozor na pojmenování souborů: +importuješ-li from math, nesmí se tvůj program jmenovat math.py.

    +

    Proč? Když Python v adresáři, ze kterého program pouštíš, najde soubor +math.py, bude se snažit importovat sin z něho místo +z předpřipravené sady matematických funkcí.

    +

    Náhoda

    +

    Nakonec si ukážeme dvě funkce, které vrací náhodná čísla. +Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají +náhodné karty.

    +

    Opět nejsou potřeba tak často a je potřeba je naimportovat. +Tentokrát z modulu random:

    +
    from random import randrange, uniform
    +

    Pak už se dají použít:

    +
    randrange(a, b)   # náhodné celé číslo od a do b-1
    +uniform(a, b)     # náhodné reálné číslo od a do b
    +

    Pozor na to, že randrange(a, b) +nikdy nevrátí samotné b. +Pokud potřebuješ náhodně vybrat ze tří možností, +použij randrange(0, 3), +což vrátí 0, 1, nebo +2:

    +
    from random import randrange
    +
    +cislo = randrange(0, 3)  # číslo je 0, 1, nebo 2
    +if cislo == 0:
    +    print('Kolečko')
    +elif cislo == 1:
    +    print('Čtvereček')
    +else:  # tady musí být číslo 2
    +    print('Trojúhelníček')
    +

    Pamatuj, když importuješ z modulu random, nesmí se tvůj soubor +jmenovat random.py.

    +

    A další

    +

    Python dává k dispozici obrovské množství dalších +funkcí a modulů, i když ne všem budeš ze začátku +rozumět. +Všechny jsou – anglicky – popsány v dokumentaci Pythonu, např. +vestavěné funkce, +matematika.

    \ No newline at end of file diff --git a/lessons/basics/diagram.svg b/lessons/basics/diagram.svg new file mode 100644 index 00000000..8617e530 --- /dev/null +++ b/lessons/basics/diagram.svg @@ -0,0 +1,534 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/basics/dropbox.png b/lessons/basics/dropbox.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbaf321b9f2315da7838e43bd1b03b656bd8567 GIT binary patch literal 41480 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 A;s5{u literal 0 HcmV?d00001 diff --git a/lessons/basics/gitk.png b/lessons/basics/gitk.png new file mode 100644 index 0000000000000000000000000000000000000000..08b671d94ba3664ebc3543c0287396e998e967da GIT binary patch literal 59093 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 literal 0 HcmV?d00001 diff --git a/lessons/basics/index.html b/lessons/basics/index.html new file mode 100644 index 00000000..d1fa7911 --- /dev/null +++ b/lessons/basics/index.html @@ -0,0 +1,339 @@ +

    Git

    +

    Ať už programuješ nebo píšeš dokumenty, stává se, +že vytvoříš několik verzí. +Tuhle chceš archivovat část, která už není potřeba, +tamhle chceš svoji práci poslat k ohodnocení, +nebo dokonce kolegům, kteří na ni spolupracují. +A když se verze začnou kupit, může být problém se v nich vyznat.

    +

    Část těchto problémů řeší nástroje jako Dropbox či +Google Drive, se kterými ses možná již setkal/a. +Tam můžeš například sdílet svůj dokument s dalšími +lidmi nebo se můžeš vrátit k dřívější verzi dokumentu, +když něco pokazíš a nemůžeš si vzpomenout, jak to bylo +předtím. Příklad toho, jak to může vypadat, je zde:

    +

    Verzovací Rozhraní služby Dropbox

    +

    V tomto rozhraní ale vidíš pouze verze jednoho dokumentu a navíc +nemůžeš tušit, ke které verzi se to vlastně chceš +vrátit. Nevidíš ani čím se jednotlivé verze liší. +Pro větší projekt by byl takový způsob práce +neefektivní.

    +

    Programátoři proto používají mocnější nástroje na +správu verzí (angl. version control system. VCS). +Asi nejpopulárnější z nich je Git, se kterým +se teď seznámíme.

    +

    Budeme hodně pracovat s příkazovou řádkou. +Jestli se s ní ještě nekamarádíš, koukni se na +úvod.

    +

    Nezapomeň: $ na začátku se nepíše; +je tu proto, aby šlo poznat že jde o příkaz.

    +

    Instalace

    +

    Popis instalace Gitu najdeš +zde. +Jestli jsi instalaci přeskočil/a, projdi si ji teď.

    +

    Repozitář

    +

    Každý projekt, který budeš verzovat, musí mít pro sebe +vyhrazený adresář. +Vytvoř si tedy nový adresář a přepni se do něj (pomocí cd). +Pak vytvoř gitový repozitář (angl. repository) +pomocí příkazu git init:

    +
    $ git init
    +Initialized empty Git repository in .../.git/

    Na první pohled to vypadá, že se nic nestalo. +Tenhle příkaz totiž vytvořil skrytý adresář +.git, do kterého uložil nějaké informace. +Přesvědč se příkazem ls -a (Linux) nebo dir /a (Windows). +Adresář .git je schovaný proto, že +ho spravuje Git a ty bys v něm neměl/a nic měnit.

    +

    V repozitáři zatím nic není. +Zkus to ověřit příkazem git status, který +vypisuje informace o stavu repozitáře:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +nothing to commit (create/copy files and use "git add" to track)

    „On branch master” říká něco o větvích, k tomu se vrátíme později. +„No commits yet” říká, že zatím nemáš uloženou žádnou revizi. +A „nothing to commit” říká, že je adresář +prázdný – nejsou tu žádné soubory k verzování.

    +

    První revize

    +

    Teď si zkus do Gitu něco přidat!

    +

    Vytvoř soubor basnicka.txt a napiš do něj +nějakou básničku. +Měla by mít aspoň pět řádků, ať pak máme s čím pracovat. +Pak zkus znovu git status: Git oznámí, +že v adresáři je soubor, o kterém ještě „neví“.

    + + +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    basnicka.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    U každého nového souboru musíme Gitu říct, že +chceme jeho obsah sledovat. +Proveď to se svojí básničkou:

    +
    $ git add basnicka.txt

    a znovu zkontroluj stav repozitáře:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   basnicka.txt

    To, co je zelené („changes to be committed“), +se přidá do další revize (angl. commit), +kterou vytvoříš. +Pojď tedy vytvořit revizi:

    +
    $ git commit
    +[master (root-commit) eb0fcd9] První revize
    + 1 file changed, 6 insertions(+)
    + create mode 100644 basnicka.txt

    Po zadání tohoto příkazu se otevře editor, +do kterého musíš napsat nějaký popisek, +abys věděl/a, co tahle revize obsahuje za změny. +Pro začátek napiš jen První revize. +Předvyplněné řádky začínající # nech být +(nebo vymaž, podle chuti – Git je ignoruje). +Pak soubor ulož a zavři editor.

    +

    Jak na editory?

    +

    Na Windows, máš-li +správně nastavený Git, +se použije Poznámkový blok (Notepad) – stačí něco +napsat, uložit (Ctrl+S) a zavřít +(Alt+F4).

    +

    Na Linuxu a macOS se objeví editor v příkazové řádce, +který se jmenuje Nano. +Pozná se tak, že v dolních dvou řádcích má malou nápovědu. +Něco napiš, pomocí Ctrl+O +soubor ulož, potvrď jméno souboru (Enter) +a pomocí Ctrl+X editor zavři.

    +

    Nemáš-li Git nastavený podle instrukcí, objeví se přímo +v příkazové řádce Vim – poměrně složitý editor, který +se teď učit nebudeme. Pozná se tak, že úplně +spodní řádek je prázdný. +V takovém případě stiskni +Esc, napiš :q! (dvojtečka, Q, vykřičník) +a potvrď pomocí Enter. +Pak si nastav Git a zkus git commit znovu.

    +

    Znovu zkus vypsat stav repozitáře:

    +
    $ git status
    +On branch master
    +nothing to commit, working tree clean

    Tenhle krátký výstup znamená, že od poslední revize +se nic nezměnilo. +Což dává smysl – poslední revizi jsi právě vytvořil/a!

    +

    A co všechno je v téhle první/poslední revizi? +To ti poví příkaz git show:

    +
    $ git show
    +commit eb0fcd9317cbba3d9406ffe2918dfaad667f100f
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    První revize
    +
    +diff --git a/basnicka.txt b/basnicka.txt
    +new file mode 100644
    +index 0000000..558d133
    +--- /dev/null
    ++++ b/basnicka.txt
    +@@ -0,0 +1,6 @@
    ++Holka modrooká, nesedávej u potoka
    ++Holka modrooká, nesedávej tam
    ++
    ++V potoce je hastrmánek
    ++Zatahá tě za copánek
    ++Holka modrooká, nesedávej tam

    Vidíš unikátní +označení revize, +pomocí kterého se vždy bude dát dostat k této konkrétní +verzi projektu. +Pak je tam jméno autora a datum vytvoření, +popisek +a nakonec shrnutí změn: byl přidán soubor basnicka.txt +s nějakým obsahem.

    +

    Když je výpis moc dlouhý, můžeš se v něm pohybovat +(, , PgUp, PgDn) +a zpět se dostaneš klávesou Q jako Quit.

    +

    Kódování ve Windows

    +

    Pokud výpis nezvládá znaky s diakritikou, zadej před git show příkaz

    +
    > set LC_ALL=C.UTF-8
    +

    Tento příkaz nastaví aktuální terminál: když si otevřeš nové okno +s příkazovou řádkou, bude ho potřeba zadat znovu.

    +

    Druhá revize

    +

    Udělej v básničce nějakou malou změnu – změň slovo, +uprav interpunkci nebo přidej sloku. +Pak se opět zeptej Gitu na stav repozitáře.

    +
    $ git status
    +On branch master
    +Changes not staged for commit:
    +  (use "git add <file>..." to update what will be committed)
    +  (use "git restore <file>..." to discard changes in working directory)
    +    modified:   basnicka.txt
    +
    +no changes added to commit (use "git add" and/or "git commit -a")

    Soubor je opět červený! Něco se v něm změnilo! +Ale co? +Na to nám odpoví příkaz git diff.

    +
    $ git diff
    +diff --git a/basnicka.txt b/basnicka.txt
    +index 558d133..24e2384 100644
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@ -1,6 +1,9 @@
    +-Holka modrooká, nesedávej u potoka
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej u potoka
    ++Holka modrooká
    ++Nesedávej tam
    + 
    + V potoce je hastrmánek
    + Zatahá tě za copánek
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej tam

    Změny se ukazují po řádcích. +Červeně, s -, jsou ukázány +odebrané řádky; zeleně s + +řádky přidané.

    +

    Změnilo-li se na řádku jen jedno slovo nebo i písmeno, +celý řádek se ukáže jako smazaný a zase přidaný. +Dá se to nastavit i jinak, když je potřeba, +ale je dobré si na tento standard zvyknout.

    +

    Takhle se dá jednoduše zjistit, co se dělo od poslední verze. +Když ti program přestane fungovat (a v poslední uložené +revizi fungoval), použij git diff – +v jedné ze změn musí být chyba!

    +

    Řádek začínající @@ říká, +kde v souboru změna je (u mě začínal vypsaný kousek +souboru řádkem 1 a měl 6 řádků; v nové verzi je +opět od 1. řádku, ale narostl na 9).

    +

    Jsi-li se změnami spokojen/a, řekni Gitu, ať je +použije v další revizi:

    +
    $ git add basnicka.txt

    A pro úplnost se znovu koukni, co říká +status – co je zelené, přidá se do další +revize.

    +
    On branch master
    +Changes to be committed:
    +  (use "git restore --staged <file>..." to unstage)
    +    modified:   basnicka.txt

    Než uděláš druhou revizi, ještě řeknu něco o tom, +jak správně psát k revizím popisky. +Na to je totiž úzus, který téměř všichni programátoři +respektují: na prvním řádku je krátké shrnutí změn, +následuje prázdný řádek a pak detailnější popis důvodů +ke změně a případně změny samotné. +Snaž se délku řádků držet do zhruba 70 znaků; +vodítkem můžou být předvyplněné řádky začínající #. +Nemá cenu popisovat, co je jasné ze změn samotných, +zajímavé jsou hlavně širší souvislosti a důvody ke změnám. +Cokoli, co může přijít vhod, až se změny bude snažit někdo pochopit. +(Ten někdo můžeš být klidně ty, za pár měsíců.)

    +

    Můj popisek bude znít takhle:

    +
    Rozdělení dlouhých řádků
    +
    +Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +důvod je ukázat co dělá git diff.)

    Nebude-li se ti někdy dařit shrnout změnu +v 70 znacích, zamysli se, jestli neděláš moc velkou +změnu najednou – např. "změna řetězce X +a dopsání nového cyklu Y" by bylo lepší uložit +jako dvě různé revize.

    +

    Pomocí git commit vytvoř druhou revizi. +Pak ji zkontroluj:

    +
    $ git show
    +commit 1fcd654a331f290616c948d9841fd8d2a34aa6b4
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    Rozdělení dlouhých řádků
    +
    +    Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +    takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +    důvod je ukázat co dělá git diff.)
    +
    +diff --git a/basnicka.txt b/basnicka.txt
    +index 558d133..24e2384 100644
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@ -1,6 +1,9 @@
    +-Holka modrooká, nesedávej u potoka
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej u potoka
    ++Holka modrooká
    ++Nesedávej tam
    + 
    + V potoce je hastrmánek
    + Zatahá tě za copánek
    +-Holka modrooká, nesedávej tam
    ++Holka modrooká
    ++Nesedávej tam

    Diagram

    +

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém +stavu můžou být soubory/změny, přikládám tento diagram:

    +

    Diagram revizí

    +

    Log

    +

    Teď, když máme za sebou první(ch) pár revizí, +si ukážeme několik příkazů, které nám umožní se +v nich orientovat. +První z nich je git log.

    +
    $ git log
    +commit 1fcd654a331f290616c948d9841fd8d2a34aa6b4
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    Rozdělení dlouhých řádků
    +
    +    Verše básně se většinou píšou na jednotlivé řádky. Myslím, že
    +    takhle se to líp čte. (Ale, co si budeme povídat, hlavní
    +    důvod je ukázat co dělá git diff.)
    +
    +commit eb0fcd9317cbba3d9406ffe2918dfaad667f100f
    +Author: Adéla Novotná <adela.novotna@example.cz>
    +Date:   Mon May 18 16:18:40 2020 +0200
    +
    +    První revize

    Git log vypíše všechny revize od té nejnovější až po +úplný začátek projektu.

    +

    Až budeš mít verzí tolik, že se nevejdou najednou +na obrazovku, můžeš se v logu pohybovat pomocí šipek a +PgUp/PgDn. +„Ven“ se dostaneš klávesou q.

    +

    Je spousta možností jak vypisovat historii pomocí git log. +Všechno je podrobně – možná až moc podrobně – +popsáno v dokumentaci; stačí zadat git help log. +„Ven“ z dokumentace se opět dostaneš klávesou q.

    +

    Já často používám git log --oneline --graph --decorate --cherry-mark --boundary. +Chceš-li tyhle možnosti studovat, začni v tomto +pořadí a dej si pauzu vždycky, když přestaneš +rozumět. :)

    +

    Když se na nějakou verzi budeš chtít podívat podrobněji, +napiš git show 5ff0b, kde místo 5ff0b +uveď prvních několik čísel z označení revize.

    +

    gitk

    +

    Z příkazové řádky se dá vyčíst všechno potřebné, +ale chce to trochu praxe. +Někdy je přehlednější použít grafické „klikátko“ jménem +gitk, které se dá spustit příkazem +gitk --all:

    +
    $ gitk --all
    +

    +

    Tenhle program vypadá celkem šeredně (skoro jako by ho +psali programátoři, které místo designu zajímá, co je +„vevnitř“), ale pro naše účely postačí. +Zkus se v něm trochu zorientovat, pak ho zavři, +udělej dalších pár revizí a koukni se na ně přes +git log a gitk --all.

    +

    Závěr

    +

    A to je všechno, co z Gitu zatím budeš potřebovat. +Vždycky, když uděláš git add soubor +a git commit, +aktuální verze souborů se uloží a už nejde (jednoduše) +smazat – pokud nesmažeš celý adresář .git. +Jednotlivé verze a změny od posledního uložení, +si umíš i prohlížet.

    +

    Možná to všechno zní jako zbytečně moc práce. +Máš tak trochu pravdu – naše projekty jsou zatím +dost malé na to, aby se jen pro ně vyplatilo učit Git. +Ale je dobré ho používat už od začátku. +Až bude správa verzí opravdu potřeba, bude se tenhle +trénink hodit.

    +

    Takže odteď, kdykoliv uděláš v rámci PyLadies funkční +verzi nějakého programu, pomocí git add a git commit si ji ulož do Gitu.

    \ No newline at end of file diff --git a/lessons/branching/branch1.png b/lessons/branching/branch1.png new file mode 100644 index 0000000000000000000000000000000000000000..837c74e32fa065a767604897277ab7a5dbe0bee1 GIT binary patch literal 5370 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 LEyZ$qi;({T4D~@Z literal 0 HcmV?d00001 diff --git a/lessons/branching/branches.png b/lessons/branching/branches.png new file mode 100644 index 0000000000000000000000000000000000000000..05b37b3c34105fb6d23e80e0e1f2c63764bebd24 GIT binary patch literal 6496 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 wuHwI68Ir;Q literal 0 HcmV?d00001 diff --git a/lessons/branching/index.html b/lessons/branching/index.html new file mode 100644 index 00000000..cdf5fd32 --- /dev/null +++ b/lessons/branching/index.html @@ -0,0 +1,166 @@ +

    Větvení v Gitu

    +

    Takže, Git už znáš! +Teď to začne být trošičku složitější :)

    +

    Programátoři občas potřebují pracovat na dvou +věcech zároveň. +V projektu do práce se objeví se chyba, +která musí být opravená +ještě dnes, tak programátor/ka opustí, co zrovna dělá, +vrátí se k nějaké „stabilní” verzi, opraví chybu +a odešle ji zákazníkům. +A pak se vrátí k tomu, co dělal/a předtím – jen ještě +musí zakomponovat opravu chyby i do verze, na které +pracuje dlouhodobě.

    +

    Git na to má takzvané větve (angl. branches). +Na jedné „větvi” se pracuje, ale je možné se přepnout do +jiné (třeba starší) větve, udělat pár změn +a pak se zase přepnout do nové větve a +pokračovat dál nebo sloučit změny.

    +

    Větvení využijeme i při spolupráci více lidí – každý +dělá na vlastní větvi a když přijde čas, +tak se různé změny sloučí dohromady.

    +

    Podívej se, jaké máš větve ve svém repozitáři. +K tomu slouží příkaz git branch:

    +
    $ git branch
    +* master

    Je tam jenom jedna a jmenuje se master +– to je tradičně jméno „hlavní” větve.

    +

    K vytvoření nové větve znovu použiješ +git branch, jen tomu příkazu dáš navíc +jméno nové větve. +Třeba budeš chtít k básničce doplnit jméno autora, +tak větev pojmenuješ doplneni-autora.

    +
    $ git branch doplneni-autora
    +$ git branch
    +  doplneni-autora
    +* master

    Tenhle příkaz sice udělal novou větev, +ale nepřepnul do ní. +Hvězdička ve výstupu z git branch ukazuje, +že stále pracuješ v master. +Na přepnutí budeš potřebovat další příkaz:

    +
    $ git checkout doplneni-autora
    +Switched to branch 'doplneni-autora'
    +$ git branch
    +* doplneni-autora
    +  master

    Tak. Teď jsi „ve” větvi doplneni-autora. +Doplň nějaké jméno na začátek souboru basnicka.txt, +a pomocí git add a git commit udělej novou revizi. +Pak koukni na gitk --all, jak to vypadá:

    +

    Výstup programu `gitk` s větví doplneni-autora

    +

    Aktuální větev – doplneni-autora – je +zvýrazněná tučně a starší master je stále +na původní revizi.

    +

    Opusťme teď na chvíli práci na doplňování autora. +Vrať se do větve master a vytvoř z ní +větev doplneni-jmena. +Pak se na tuhle novou větev přepni.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git branch doplneni-jmena
    +$ git checkout doplneni-jmena
    +Switched to branch 'doplneni-jmena'
    +$ git branch
    +  doplneni-autora
    +* doplneni-jmena
    +  master

    Doplň jméno básně na začátek souboru (tedy na stejné místo, +jako je v druhé větvi název) a pomocí +git add, git commit ulož revizi. +Všechno zkontroluj přes gitk --all.

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu

    +

    Takhle nějak se dá postupovat v situaci popsané v úvodu: +opuštění rozpracované verze, přechod na „stabilní” +verzi master a začátek práce v jiné +části projektu.

    +

    Mezi jednotlivými větvemi se dá podle libosti přepínat, +jen je vždycky dobré před přepnutím udělat novou revizi +(git commit) a pomocí git status zkontrolovat, jestli je všechno +uložené v Gitu.

    +

    Na stejném principu funguje i spolupráce několika lidí +na jednom projektu: je nějaký společný základ +(master) a každý dělá na vlastní větvi, dokud není se svými změnami spokojený.

    +

    A až je některá větev hotová, může se začlenit +zpátky do master. Podívejme se jak na to.

    +

    Sloučení

    +

    Nedávalo by smysl historii projektu rozdvojovat, +kdyby pak jednotlivé větve nešly zase sloučit dohromady. +V Gitu je většinou slučování poměrně jednoduché, ale tento příklad schválně +ukazuje nejsložitější variantu, která může nastat.

    +

    Přepni se zpátky na master +a použij příkaz git merge, který +sloučí jinou větev s tou aktuální. +Příkazu musíš dát jméno větve, kterou chceš sloučit.

    +
    $ git checkout master
    +Switched to branch 'master'
    +$ git merge doplneni-jmena
    +Updating 1fcd654..5c9bf93
    +Fast-forward
    + basnicka.txt | 3 +++
    + 1 file changed, 3 insertions(+)

    Sloučeno! Ono „Fast-forward” znamená, že +vlastně nebylo co slučovat – jen se do větve +master přidaly nové změny. +Zkontroluj v gitk --all, jak to vypadá.

    +

    A pak zkus sloučit i druhou větev: git merge doplneni-autora. +Tady to bude složitější: pravděpodobně se stane, že změny nepůjdou +automaticky sloučit a ve výstupu se objeví hláška +merge conflict (slučovací konflikt):

    +
    $ git merge doplneni-autora
    +Auto-merging basnicka.txt
    +CONFLICT (content): Merge conflict in basnicka.txt
    +Automatic merge failed; fix conflicts and then commit the result.

    A když ne?

    +

    Jestli se konflikt neobjevil, Git změny sloučil sám. +Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti +někdy „podaří“ konflikt udělat.

    +

    Když nastane konflikt, git status ukáže „both modified“ – tedy že byl soubor +změněný v obou slučovaných větvích:

    +
    $ git status
    +On branch master
    +You have unmerged paths.
    +  (fix conflicts and run "git commit")
    +  (use "git merge --abort" to abort the merge)
    +
    +Unmerged paths:
    +  (use "git add <file>..." to mark resolution)
    +    both modified:   basnicka.txt
    +
    +no changes added to commit (use "git add" and/or "git commit -a")

    V tom případě se na soubor podívej v editoru: objeví +se v něm obsah z obou konfliktních verzí, +společně se značkami <<<<<<<, ======= a >>>>>>>, které upozorňují na +místo kde konflikt nastal.

    +

    Značky ukáže i příkaz git diff, jehož výstup je teď trošku složitější:

    +
    $ git diff
    +diff --cc basnicka.txt
    +index bc7a2de,88e7ea5..0000000
    +--- a/basnicka.txt
    ++++ b/basnicka.txt
    +@@@ -1,4 -1,4 +1,8 @@@
    +++<<<<<<< HEAD
    + +Holka Modrooká
    +++=======
    ++ (Lidová)
    +++>>>>>>> doplneni-autora
    +  
    +  Holka modrooká
    +  Nesedávej u potoka

    Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu +jako Python chybové hlášky: tedy aby ti co nejvíce pomohl. +Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se +ti řešení konfliktu co nejvíc usnadnit.

    +

    Proto hlavně nepanikař! +Soubor otevři v editoru a uprav tak, jak by měl vypadat. +Značky jako <<<<<<< smaž; řádky poskládej tak, jak by měly jít za sebou. +(A pracuješ-li na kódu, spusť testy a ověř, jestli všechno stále funguje.)

    +

    Pak soubor ulož a zadej git commit.

    +

    Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“ +(angl. merge commit), které – jako každé revizi – můžeš dát popisek. +Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.

    +
    $ git add basnicka.txt
    +$ git commit
    +[master 884b30a] Merge branch 'doplneni-autora'

    Povedlo se?

    +

    Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master

    +

    Pokud ano, můžeš staré větve vymazat – všechny jejich +změny jsou v master a nemá na nich cenu +pracovat dál.

    +
    $ git branch --delete doplneni-autora
    +Deleted branch doplneni-autora (was f1cd9be).
    +$ git branch --delete doplneni-jmena
    +Deleted branch doplneni-jmena (was 5c9bf93).
    +$ git branch
    +* master

    Gratuluji, už umíš větvení a slučování!

    \ No newline at end of file diff --git a/lessons/branching/merge.png b/lessons/branching/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..7f74005ba258ffae89f67f3d376966a9418dbfef GIT binary patch literal 7185 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 Z&KM>ammu_^65P&%Xx-OWd#i$c@_$~mno0lw literal 0 HcmV?d00001 diff --git a/lessons/circular-imports/index.html b/lessons/circular-imports/index.html new file mode 100644 index 00000000..07858c6a --- /dev/null +++ b/lessons/circular-imports/index.html @@ -0,0 +1,108 @@ +

    Cyklické importy

    +

    V domácích projektech budeš rozdělovat 1D Piškvorky na několik modulů. +Výsledek bude vypadat třeba nějak takhle: +(Šipky mezi moduly znázorňují importování.)

    +
    ┌──────────────────╮  ┌───────────────╮  ┌──────────────────╮ 
    +│      ai.py       │  │ piskvorky.py  │  │    hra.py        │
    +├──────────────────┤  ├───────────────┤  ├──────────────────┤
    +│                  │◀-│ import ai     │◀-│ import piskvorky │
    +├──────────────────┤  ├───────────────┤  ├──────────────────┤
    +│ def tah_pocitace │  │ def vyhodnot  │  │                  │
    +│                  │  │ def tah       │  │                  │
    +└──────────────────┘  │ def tah_hrace │  └──────────────────┘
    +                      │               │
    +                      └───────────────┘
    +                          ▲
    +                          │
    +                          │ ┌───────────────────╮
    +                          │ │ test_piskvorky.py │
    +                          │ ├───────────────────┤
    +                          └─│ import piskvorky  │
    +                            ├───────────────────┤
    +                            │ def test_...      │
    +                            │                   │
    +                            └───────────────────┘

    Jenže funkce tah_pocitace +většinou potřebuje volat funkci tah. +Co s tím? +Můžeš importovat aipiskvorky a zároveň +piskvorkyai?

    +
    ┌──────────────────╮  ┌───────────────╮
    +│      ai.py       │  │ piskvorky.py  │
    +├──────────────────┤  ├───────────────┤
    +│                  │◀-│ import ai     │
    +│ import piskvorky │-▶│               │
    +│                  │  │               │
    +│ def tah_pocitace │  │ def vyhodnot  │
    +│                  │  │ def tah       │
    +└──────────────────┘  │ def tah_hrace │
    +                      │               │
    +                      └───────────────┘

    Můžeme se na to podívat z hlediska Pythonu, +který příkazy v souborech vykonává. +Když má importovat soubor piskvorky.py, začne ho +zpracovávat řádek po řádku, +když tu (docela brzo) narazí na příkaz import ai. +Otevře tedy soubor ai.py +a začne ho zpracovávat řádek po řádku. +Brzy narazí na příkaz import piskvorky. Co teď?

    +

    Aby nenastala situace podobná nekonečné smyčce – +jeden soubor by importoval druhý, druhý zase první, +a tak stále dokola – +udělá Python taková malý „podvod“: +když zjistí, že soubor piskvorky.py +už importuje, zpřístupní v modulu ai +modul piskvorky tak, jak ho +má: nekompletní, bez většiny funkcí co v něm mají +být nadefinované. +A až potom, co dokončí import ai.py, +se vrátí k souboru piskvorky.py +a pokračuje v provádění příkazů def které v něm jsou. +Takový nekompletní modul může být občas užitečný, +ale ve většině případů se chová skoro +nepředvídatelně a tudíž nebezpečně.

    +

    Jinými slovy: když se dva moduly importují navzájem, +nemusí to fungovat podle očekávání.

    +

    Téhle situaci se budeš chtít vyvarovat.

    +

    Jak na to? Máš dvě možnosti.

    +

    Organizace modulů podle závislostí

    +

    První možnost je importovat funkci tah v modulu ai +a používat ji odtamtud. +To je jednoduché, ale nerespektuje účel modulu +ai, který má obsahovat jenom logiku +vybírání tahu počítače, a ne pomocné funkce, které +můžou být potřeba i jinde.

    +
    ┌──────────────────╮  ┌───────────────╮
    +│      ai.py       │  │ piskvorky.py  │
    +├──────────────────┤  ├───────────────┤
    +│                  │◀-│ import ai     │
    +│                  │  │               │
    +│ def tah_pocitace │  │ def vyhodnot  │
    +│ def tah          │  │ def tah_hrace │
    +│                  │  │               │
    +└──────────────────┘  └───────────────┘

    Pomocný modul

    +

    Druhá možnost je definovat nový, sdílený modul, +který se použije jak v piskvorky.py tak v ai.py.

    +

    Takový modul se často se pojmenovává +util.py (z angl. utility, pomůcka, nástroj).

    +
                  ┌──────────────────╮
    +              │ util.py          │
    +              ├──────────────────┤
    +              │ def tah          │
    +              └──────────────────┘
    +                      ▲  ▲
    +                      │  │
    +┌──────────────────╮  │  │  ┌───────────────╮
    +│      ai.py       │  │  │  │ piskvorky.py  │
    +├──────────────────┤  │  │  ├───────────────┤
    +│ import util      │──┘  └──│ import util   │
    +│                  │◀───────│ import ai     │
    +│                  │        │               │
    +│ def tah_pocitace │        │ def vyhodnot  │
    +│                  │        │ def tah_hrace │
    +│                  │        │               │
    +└──────────────────┘        └───────────────┘

    Nevýhoda pomocného modulu je ta, +že se z něj může stát neudržované „odkladiště“ +všeho kódu, který byl jednou potřeba na dvou +nebo více místech.

    +

    Pro kterou z možností se rozhodnout, záleží +na situaci. +Programování není vždycky jen exaktní věda!

    \ No newline at end of file diff --git a/lessons/class/index.html b/lessons/class/index.html new file mode 100644 index 00000000..93637b1f --- /dev/null +++ b/lessons/class/index.html @@ -0,0 +1,253 @@ +

    Hodnoty a objekty

    +

    Než se dnes začneme zabývat třídami, +podíváme na objekty.

    +

    Co pro programátory znamená slovo objekt?

    +

    V Pythonu je to jednoduché – každá hodnota +(tj. něco, co můžeš uložit do proměnné, vrátit +z funkce nebo třeba seznamu) je objekt. +Některé jazyky (třeba Javascript, C++ nebo Java) mají +i jiné hodnoty než objekty, v některých +jazycích (třeba v C) objekty vůbec nejsou. +Ale v Pythonu mezi hodnotou a objektem není rozdíl, +takže je na jednu stranu trošku složitější pochopit, +v čem spočívá ta „objektovitost“, ale na druhou stranu +to zase není potřeba vědět do detailů.

    +

    Základní vlastnost objektů je to, že obsahují jak data +(informace), tak chování – instrukce nebo metody, +které s těmito daty pracují. +Třeba řetězce v Pythonu obsahují jak informace +(nějakou sekvenci znaků), tak užitečné metody jako +upper nebo count. +Kdyby řetězce nebyly objekty, musel by Python mít +spoustu funkcí jako str_upper a str_count. +Objekty spojují data a funkčnost dohromady.

    +

    Možná namítneš, že třeba len je funkce. +Je to tak, Python není „stoprocentně“ objektový jazyk. +Funkce len ale funguje i na +objektech, které s řetězci nemají nic společného.

    +

    Třídy

    +

    Data každého objektu jsou specifická pro konkrétní +objekt ("abc" obsahuje jiné znaky než +"def"), ale funkčnost – metody – bývají +společné pro všechny objekty daného typu. +Třeba řetězcová metoda count() by se dala +napsat zhruba jako:

    +
    def count(retezec, znak):
    +    pocet = 0
    +    for c in retezec:
    +        if c == znak:
    +            pocet = pocet + 1
    +    return pocet
    +

    … a ačkoliv bude vracet jinou hodnotu pro každý řetězec, +samotná metoda je společná všem řetězcům.

    +

    Tohle společné chování určuje +typ (angl. type) neboli třída (angl. class) daného objektu.

    +

    V jiných jazycích než Python 3 můžou slova „typ“ a „třída“ označovat různé +věci. Pro nás to budou synonyma.

    +

    Typ objektu umí zjistit funkce type:

    +
    >>> type(0)
    +<class 'int'>
    +>>> type(True)
    +<class 'bool'>
    +>>> type("abc")
    +<class 'str'>
    +>>> with open('soubor.txt') as f:
    +...     type(f)
    +... 
    +<class '_io.TextIOWrapper'>
    +

    A co je to třída? Třída je popis, jak se všechny objekty +daného typu chovají.

    +

    Například <class 'int'> obsahuje všechno, co je společné všem celým číslům: +že (a jak) se dají sčítat, jak takové číslo převést na řetězec, a tak dále.

    +

    Tvoření objektů třídy

    +

    Většinu tříd jde navíc v Pythonu zavolat, jako by +to byly funkce, a vytvořit tak nový objekt dané třídy:

    +
    >>> trida_retezcu = type("abc")
    +>>> trida_retezcu(8)
    +'8'
    +>>> trida_retezcu([1, 2, 3])
    +'[1, 2, 3]'
    +

    Chová se to stejně jako funkce str! Není to podivné?

    +

    Tady se musím omluvit: +materiály k funkcím +tak trochu lhaly. Funkce str, int, float apod. totiž vůbec +nejsou funkce – jsou to právě třídy:

    +
    >>> str
    +<class 'str'>
    +>>> type('abcdefgh')
    +<class 'str'>
    +>>> type('abcdefgh') == str
    +True
    +

    Ale dají se, podobně jako funkce, zavolat. +Třída tedy většinou obsahuje nejen „popis“, jak se +její objekty budou chovat, ale „umí“ takové objekty i vytvořit.

    +

    Vlastní třídy

    +

    A proč najednou tolik informací o třídách? +Protože si zkusíme napsat třídu vlastní.

    +

    Třídu se hodí napsat, když plánuješ mít ve svém +programu více objektů s podobným chováním. +Třeba karetní hra by mohla mít třídu Karta, +webová aplikace třídu Uživatel, +tabulkový procesor třídu Řádek.

    +

    My teď potřebujeme napsat program o zvířátkách. +Začni tím, že napíšeš třídu pro koťátka, která umí mňoukat:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print("Mňau!")
    +

    Tak jako se funkce definují pomocí def, +třídy mají klíčové slovo class, +za které napíšeš jméno třídy, dvojtečku a pak odsazené tělo třídy. +Podobně jako def dělá funkce, příkaz +class udělá novou třídu a přiřadí ji +do proměnné daného jména (tady Kotatko).

    +

    Třídy se tradičně pojmenovávají s velkým písmenem, +aby se nepletly s „normálními“ hodnotami.

    +

    Základní třídy (str, int atd.) +velká písmena nemají, a to hlavně z historických +důvodů – původně to byly opravdu funkce.

    +

    V těle třídy můžeš definovat metody, které vypadají +úplně jako funkce – jen mají první parametr self. +Ten si ale vysvětlíme později – napřed zkus zamňoukat:

    +
    # Vytvoření konkrétního objektu
    +kotatko = Kotatko()
    +
    +# Volání metody
    +kotatko.zamnoukej()
    +

    V tomhle příkladu si dej pozor na velikost písmen: +Kotatko (s velkým K) je třída – popis, jak +se koťátka chovají. +kotatko (s malým k) +je konkrétní objekt (angl. instance) té třídy: +hodnota, která reprezentuje kotě.

    +

    Když definuješ třídu (pomocí bloku class), neznamená to zatím, že ve tvém +programu je nějaké koťátko. +Třída je jako recept nebo manuál: když si koupíš kuchařku, budeš teoreticky +vědět jak upéct dort, jak bude takový dort vypadat a že se dá sníst. +Ale neznamená to ještě, že máš samotný dort!

    +

    Konkrétní objekt vytvoříš až zavoláním třídy. +Stejně jako zavoláním str() se dá vytvořit konkrétní řetězec, +volání Kotatko() vytvoří nový objekt tvé třídy, který už můžeš použít.

    +

    Mňau!

    +

    Atributy

    +

    Objekty vytvořené z „vlastních“ tříd mají funkčnost, kterou třídy jako str +nedovolují: máš možnost si definovat vlastní +atributy – informace, které se uloží k danému objektu. +Atributy se označují tak, že mezi hodnotu a jméno +jejího atributu napíšeš tečku:

    +
    mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +
    +micka = Kotatko()
    +micka.jmeno = 'Micka'
    +
    +print(mourek.jmeno)
    +print(micka.jmeno)
    +

    Na začátku jsme si řekli, že objekty spojují chování +a data. +Chování je definováno ve třídě; data se schovávají +právě v atributech jednotlivých objektů. +Podle atributů jako jmeno pak můžeš jednotlivá koťátka +rozlišit.

    +

    Asi sis všiml/a, že tečkou se dostaneš jak k metodám +převzaným z třídy, tak k atributům specifickým +pro konkrétní objekt. +Co se stane, když má atribut stejné jméno jako +metoda z třídy? Vyzkoušej si to:

    +
    micka = Kotatko()
    +micka.zamnoukej = 12345
    +micka.zamnoukej()
    +

    Parametr self

    +

    Teď se na chvíli vraťme k metodám. Konkrétně k parametru self.

    +

    Každá metoda má přístup ke konkrétnímu objektu, na +kterém pracuje, právě přes argument self. +Teď, když máš koťátka pojmenovaná, můžeš v metodě zamnoukej použít self +a dostat se tak ke jménu daného koťátka:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +
    +micka = Kotatko()
    +micka.jmeno = 'Micka'
    +
    +mourek.zamnoukej()
    +micka.zamnoukej()
    +

    Co se stalo? Výraz mourek.zamnoukej udělá metodu. +Když ji pak zavoláš (mourek.zamnoukej()), +objekt mourek se předá funkci zamnoukej jako první argument, self.

    +

    Onen první argument metody můžeš teoreticky pojmenovat i jinak než self, +ale když to uděláš, ostatní programátoři se na tebe budou koukat hodně divně.

    +

    Může taková metoda brát víc než jeden argument? +Může – self se doplní na první místo, +zbytek argumentů se vezme z volání metody. +Třeba:

    +
    class Kotatko:
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko()
    +mourek.jmeno = 'Mourek'
    +mourek.snez('ryba')
    +

    Metoda __init__

    +

    Co se stane, když koťátku zapomeneš nastavit jméno? +Metoda zamnoukej přestane fungovat:

    +
    >>> micka = Kotatko()
    +>>> micka.snez('ryba')
    +Traceback (most recent call last):
    +  File "<zvirata.py>", line 5, in snez
    +AttributeError: 'Kotatko' object has no attribute 'jmeno'
    +

    Aby tahle chyba nemohla nastat, můžeš zařídit, aby každé kotě muselo být +pojmenované – a to už od okamžiku kdy vznikne. +Jméno pak budeš zadávat už při vytváření kotěte, nějak takhle:

    +
    mourek = Kotatko(jmeno='Mourek')
    +

    To ale zatím nefunguje; musíš na to třídu Kotatko připravit.

    +

    Použij na to speciální metodu, která se jmenuje __init__ (dvě podtržítka, +init, dvě podtržítka). +To „opodtržítkování“ znamená, že tohle jméno je nějakým způsobem speciální. +Metodu __init__ totiž Python zavolá +automaticky, když vytvoří nový objekt. +Můžeš tedy napsat:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko('Mourek')
    +mourek.zamnoukej()
    +

    A teď už není možnost, jak vytvořit koťátko beze jména. +Metoda zamnoukej bude vždycky fungovat.

    +

    Jako u jiných funkcí je možné jméno koťátka zadat buď jako pojmenovaný +argument, nebo jako poziční. Obojí funguje stejně:

    +
    mourek = Kotatko('Mourek')  # 'Mourek' je hodnota prvního argument pro __init__ (po self)
    +micka = Kotatko(jmeno='Micka')  # 'Micka' je hodnota argumentu `jmeno`

    Metoda __str__

    +

    Podobných „opodtržítkovaných“ (speciálních) metod je víc. +Třeba metodu __str__ Python zavolá, když je potřeba +převést objekt na řetězec:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def __str__(self):
    +        return f'<Kotatko jmenem {self.jmeno}>'
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: Mňau mňau! {jidlo} mi chutná!")
    +
    +mourek = Kotatko('Mourek')
    +print(mourek)
    +

    A to je o samotných třídách zatím vše. +Příště si něco řekneme o dědičnosti. +A o štěňátkách.

    \ No newline at end of file diff --git a/lessons/click/index.html b/lessons/click/index.html new file mode 100644 index 00000000..e455500b --- /dev/null +++ b/lessons/click/index.html @@ -0,0 +1,187 @@ +

    click

    +

    Knihovna click slouží k vytváření rozhraní pro příkazovou řádku +(angl. command line interface, CLI). +Primárně to je zpracování argumentů, ale click umí zjednodušit i výstup.

    +

    Click je dobré používat s knihovnou colorama, která se stará o obarvování +textu na příkazové řádce ve Windows (a na Unixu nedělá nic). +Nainstalujte si tedy obě:

    +
    $ python -m pip install click colorama
    +

    Argumenty příkazové řádky

    +

    Nástroje na zpracování argumentů z CLI jsou i přímo ve standardní knihovně, +a dokonce jich není málo: sys.argv, argparse, optparse, getopt. +S knihovnou click je ale práce mnohem příjemnější a výsledky většinou +lépe odpovídají zavedeným konvencím.

    +

    Cena za jednoduchost a konzistenci je, že některé styly návrhu CLI click +nepodporuje. +Máte-li existující rozhraní, které chcete jen převést do Pythonu, +click nejspíš nebude nejlepší volba.

    +

    Takto jednoduše se dá vytvořit aplikace s přepínači:

    +
    import click
    +
    +@click.command()
    +@click.option('--count', default=1,  metavar='COUNT',
    +              help='Number of greetings.')
    +@click.option('--name', prompt='Your name', metavar='NAME',
    +              help='The person to greet.')
    +def hello(count, name):
    +    """Simple program that greets NAME for a total of COUNT times."""
    +    for x in range(count):
    +        click.echo(f'Hello {name}!')
    +
    +if __name__ == '__main__':
    +    hello()
    +

    Vyzkoušejte si ji! Máte-li ji uloženou jako hello.py, zkuste:

    +
    $ python hello.py
    +$ python hello.py --help
    +$ python hello.py --name Pythonista
    +$ python hello.py --count 5
    +

    Příkazy a přepínače

    +

    Funkce s dekorátorem @click.command je příkaz – když ji zavoláte, +click zpracuje argumenty příkazové řádky a zavolá původní funkci +s příslušnými pythonními hodnotami. +Proto se dává do bloku if __name__ == '__main__':, který se spustí, jen +když se pythonní soubor spoustí „přímo“. +Když je soubor importován, tenhle blok se neprovede.

    +

    Dekorátory @click.option a @click.argument pak přidávají přepínače +a argumenty.

    +

    Přepínače (angl. options), přidávané pomocí option, jsou nepovinné +parametry, kterými se nějak obměňuje chování programu. +Pokud uživatel nějaký přepínač nezadá, použije se hodnota zadaná jako default +(nebo None, když default chybí).

    +

    Podle default se řídí i typ argumentu, není-li dán explicitně. +Takže count v příkladu výše je celé číslo.

    +

    Jména přepínačů začínají, podle Unixové konvence, pomlčkami: jednou pomlčkou +pro jednopísmenné zkratky, dvěma pomlčkami pro vícepísmenná jména. +Jeden přepínač může mít i víc jmen.

    +

    Speciální případ jsou booleovské přepínače, které mají jedno jméno +pro True a jiné pro False. Lze samozřejmě také vytvořit bezhodnotový +přepínač pomocí is_flag.

    +
    import click
    +
    +@click.command()
    +@click.option('-n', '--name', default='world',
    +              help='Name of the person to greet')
    +@click.option('-c/-C', '--color/--no-color',
    +              help='Make the output colorful')
    +@click.option('-v', '--verbose', is_flag=True,
    +              help='More verbose output')
    +def hello(name, color, verbose):
    +    if color:
    +        name = click.style(name, fg='blue')
    +    click.echo(f'Hello {name}!')
    +    if verbose:
    +        click.echo('Nice to meet you.')
    +
    +if __name__ == '__main__':
    +    hello()
    +
    $ python hello.py
    +Hello world!
    +$ python hello.py --name Guido
    +Hello Guido!
    +$ python hello.py --name Jane -v
    +Hello Jane!
    +Nice to meet you.
    +$ python hello.py -n 'Mr. Git'
    +Hello Mr. Git!
    +$ python hello.py --help
    +Usage: hello.py [OPTIONS]
    +
    +Options:
    +  -n, --name TEXT               Name of the person to greet
    +  -c, --color / -C, --no-color  Make the output colorful
    +  --help                        Show this message and exit.
    +

    Přepínač --help přidává click sám.

    +

    Argumenty

    +

    Kromě přepínačů podporuje click i argumenty. +Přepínače musí uživatel na řádce pojmenovat; argumenty se zadávají beze jména, +ale záleží u nich na pořadí. +Používají se ve dvou případech: pro povinné parametry a pro parametry, kterých +může být zadán libovolný počet. +Na všechno ostatní radši použijte přepínače.

    +

    Například příkaz cd potřebuje jeden argument: jméno adresáře, +do kterého má přepnout. +Jeho rozhraní by v clicku vypadalo takto:

    +
    @click.command()
    +@click.argument('directory')
    +def cd(directory):
    +    """Change the current directory"""
    +    click.echo(f'Changing to directory {directory}')
    +

    Proměnný počet argumentů se zadává pomocí nargs=-1 (0 nebo víc argumentů) +nebo nargs=-1, required=True (1 nebo víc).

    +

    Například příkaz mv bere N souborů a adresář, kam je přesune. +Takové rozhraní by v clicku vypadalo následovně:

    +
    @click.command()
    +@click.argument('source', nargs=-1, required=True)
    +@click.argument('destination')
    +def mv(source, destination):
    +    """Move any number of files to one destination"""
    +    for filename in source:
    +        click.echo(f'Moving {filename} to {destination}')
    +

    Soubory

    +

    Má-li uživatel zadat jméno souboru, nepoužívejte řetězce, ale speciální typ +click.File(). +Click za vás soubor automaticky otevře a zavře. +Kromě toho podporuje unixovskou konvenci, že - znamená standardní +vstup/výstup.

    +

    Argument pro File je mód, ve kterém se soubor otevírá, podobně jako pro +funkci open: +'r' pro čtení, 'w' pro zápis.

    +
    @click.command()
    +@click.argument('files', nargs=-1, type=click.File('r'))
    +def cat(files):
    +    """Print out the contents of the given files"""
    +    for file in files:
    +        print(file.read(), end='')
    +

    Existuje i varianta click.Path(), +která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto +poskytuje i jiné další typy.

    +

    Validace vstupů

    +

    Vstupy získané z přepínačů i argumentů lze ověřit pomocí +vlastních podmínek a podle toho naprogramovat chování včetně +chybových hlášek. Click však opět nabízí pohodlnější způsob, +a to pomocí callback. +V rámci callback funkce můžete ověřit libovolně hodnotu a/nebo +ji vhodně transformovat. Pokud hodnota neodpovídá požadavkům, +můžete použít vyjímku click.UsageError +nebo click.BadParameter +(vztahuje-li se přímo ke konkrétnímu parametru). Click se pak +sám postará o případné ukončení programu s odpovídající chybovou +hláškou a kódem.

    +
    def validate_username(ctx, param, value):
    +    if 2 <= len(value) <= 8 and re.match('^[a-zA-Z]+[0-9]*$', value):
    +        return value.lower()
    +    else:
    +        raise click.BadParameter('not valid CTU username')
    +
    +@click.command()
    +@click.option('-u', '--username', callback=validate_username)
    +def email(username):
    +    click.echo(f'{username}@fit.cvut.cz')
    +
    +if __name__ == '__main__':
    +    email()
    +

    Podpříkazy

    +

    Click má dobrou podporu pro podpříkazy známé z verzovacích systémů jako git: +příkaz git sám o sobě nedělá nic, jen sdružuje podpříkazy jako git add +a git commit.

    +

    Umí-li váš program více akcí, souhrnný příkaz označte @click.group() +a jednotlivé podpříkazy pak přidávejte pomocí command():

    +
    @click.group()
    +def git2():
    +    pass
    +
    +@git2.command()
    +def commit():
    +    message = click.edit('Made some changes')
    +    click.echo(f'Making commit with message: {message}')
    +
    +@git2.command()
    +@click.argument('files', nargs=-1)
    +def add(files):
    +    for file in files:
    +        click.echo(f'Adding {file}')
    +

    A další

    +

    Tahle lekce není popis všeho, co click umí – je to jen ochutnávka, +abyste věděli, co od téhle knihovny očekávat.

    +

    Click má velice dobrou dokumentaci, ve které najdete detaily i všechny +ostatní možnosti.

    \ No newline at end of file diff --git a/lessons/cmdline/index.html b/lessons/cmdline/index.html new file mode 100644 index 00000000..6ef6982b --- /dev/null +++ b/lessons/cmdline/index.html @@ -0,0 +1,276 @@ +

    Příkazová řádka

    +

    V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, +které programátoři používají na zadávání příkazů. +Na první pohled může vypadat nepřirozeně, ale dá se na ni zvyknout :)

    +

    Příkazová řádka +(respektive program, kterému se říká i konzole či terminál; +anglicky command line, console, terminal) +se na různých systémech otevírá různě:

    +
      +
    • Windows (české): Start → napsat na klávesnici „cmd“ → Příkazový řádek
    • +
    • Windows (anglické): Start → napsat na klávesnici „cmd“ → Command Prompt
    • +
    • macOS (anglický): Applications → Utilities → Terminal
    • +
    • Linux (KDE): Hlavní Menu → hledat Konsole
    • +
    • Linux (GNOME): Super → hledat Terminál
    • +
    +

    Nevíš-li si rady, zkus buď googlit, +nebo se zeptat e-mailem.

    +

    Po otevření konzole tě uvítá řádek, +kterým počítač vybízí k zadání příkazu. +Podle systému bude končit buď znakem $ nebo >, +před nímž můžou být ještě další informace:

    +
    +

    Unix (Linux, macOS)

    $
    +
    +

    Windows

    >
    +

    Podle systému se potom liší i samotné příkazy, které budeš zadávat.

    +

    Velikost písma

    +

    Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. +V záložce Písmo si pak můžeš vybrat větší font. +

    +

    Screenshot menu příkazové řádky

    +

    Na ostatních systémech hledej v nastavení, nebo zkus +Ctrl++ a +Ctrl+- (příp. se Shift).

    +

    První příkaz

    +

    Začneme jednoduchým příkazem. +Napiš whoami (z angl. who am I? – kdo jsem?) +a stiskni Enter. +Objeví se přihlašovací jméno. Třeba u Heleny by to vypadalo takhle:

    +
    +

    Unix

    $ whoami
    +helena
    +
    +

    Windows

    > whoami
    +pocitac\Helena
    +

    Znak $ nebo > je v ukázce jen proto, aby bylo jasné, že zadáváme +příkaz do příkazové řádky. +Vypíše ho počítač, většinou ještě s něčím před ním, +takže ho nepiš sama! Zadej jen whoami a Enter.

    +

    Stejně tak počítač sám vypíše přihlašovací jméno.

    +

    Aktuální adresář

    +

    Příkazová řádka pracuje vždy v nějakém adresáři (neboli složce, +angl. directory, folder). +Ve kterém adresáři zrovna je, to nám poví příkaz, který se podle systému +jmenuje pwd nebo cd (z angl. print working directory – vypiš pracovní +adresář, resp. current directory – aktuální adresář).

    +
    +

    Unix

    $ pwd
    +/home/helena/
    +
    +

    Windows

    > cd
    +C:\Users\helena
    +

    Aktuální adresář se většinou ukazuje i před znakem $ nebo >, +ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a +(nebo musel/a pracovat na počítači který před $ ukazuje něco jiného).

    +

    Co v tom adresáři je?

    +

    Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) +nám vypíše, co aktuální adresář obsahuje: všechny soubory, +včetně podadresářů, které se v aktuálním adresáři nacházejí.

    +
    +

    Unix

    $ ls
    +Applications
    +Desktop
    +Downloads
    +Music
    +
    +
    +

    Windows

    > dir
    + Directory of C:\Users\helena
    +05/08/2014 07:28 PM <DIR>  Applications
    +05/08/2014 07:28 PM <DIR>  Desktop
    +05/08/2014 07:28 PM <DIR>  Downloads
    +05/08/2014 07:28 PM <DIR>  Music
    +
    +

    Změna aktuálního adresáře

    +

    Aktuální adresář se dá změnit pomocí příkazu cd +(z angl. change directory – změnit adresář). +Za cd se píše jméno adresáře, kam chceme přejít. +Pokud máš adresář Desktop nebo Plocha, přejdi tam. Pak nezapomeň ověřit, +že jsi na správném místě.

    +

    Jsi-li na Linuxu nebo macOS, dej si pozor na velikost písmen: na těchto +systémech jsou Desktop a desktop dvě různá jména.

    +

    Jsi-li na Windows, cd už jsi používal/a – tento příkaz se chová různě +podle toho, jestli něco napíšeš za něj nebo ne.

    +
    +

    Unix

    $ cd Desktop
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd Desktop
    +> cd
    +C:\Users\helena\Desktop
    +

    Poznámka pro Windows

    +

    Pokud přecházíš do adresáře na jiném disku, +například D: místo C:, je potřeba kromě cd +zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    +

    Vytvoření adresáře

    +

    Co takhle si vytvořit adresář na Python? To se dělá příkazem mkdir +(z angl. make directory – vytvořit adresář). +Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě +naucse-python:

    +
    +

    Unix

    $ mkdir naucse-python
    +
    +

    Windows

    > mkdir naucse-python
    +

    Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na +prohlížení adresářů: zjistíš, že adresář se opravdu vytvořil!

    +

    Úkol

    +

    Zkus v nově vytvořeném adresáři naucse-python +vytvořit adresář test +a zkontrolovat, že se opravdu vytvořil.

    +

    Budou se hodit příkazy cd, mkdir a ls či dir.

    +
    +

    Řešení

    + + +

    Úklid

    +

    Teď vytvořené adresáře zase smažeme.

    +

    Nemůžeš ale smazat adresář, ve kterém jsi. +Proto se vrátíme na Desktop. +Ale nemůžeme použít cd Desktop – v aktuálním adresáři žádný Desktop není. +Potřebuješ se dostat do nadřazeného adresáře: toho, který obsahuje +adresář ve kterém právě jsi. +Nadřazený adresář se značí dvěma tečkami:

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop/naucse-python
    +$ cd ..
    +$ pwd
    +/home/helena/Desktop
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop\naucse-python
    +> cd ..
    +> cd
    +C:\Users\helena\Desktop
    +

    Teď můžeš smazat vytvořený adresář naucse-python. +K tomu použij příkaz rm nebo rmdir +(z remove – odstraň, resp. remove directory – odstraň adresář).

    +

    Pozor!

    +

    Příkazová řádka nepoužívá odpadkový koš! +Všechno se nadobro smaže. Takže si dobře překontroluj, že mažeš +správný adresář.

    +

    Na Unixu za tento příkaz musíš napsat ještě jedno slovo: -rv (minus, +r, v). +To je takzvaný přepínač, který příkazu říká, že má smazat celý adresář +včetně všeho, co obsahuje (r), +a že má informovat o tom co dělá (v).

    +

    Obdobně i na Windows je potřeba zadat přepínač, který říká, že má smazat +adresář a veškerý jeho obsah. Tentokrát je to /S (lomítko, S). +Příkaz rmdir se automaticky ujistí, jestli to co mažeš opravdu chceš smazat.

    +
    +

    Unix

    $ pwd
    +/home/helena/Desktop
    +$ rm -rv naucse-python
    +removed directory: ‘naucse-python’
    +
    +

    Windows

    > cd
    +C:\Users\helena\Desktop
    +> rmdir /S naucse-python
    +naucse-python, Are you sure <Y/N>? Y
    +

    Shrnutí

    +

    Tady je tabulka základních příkazů, se kterými si zatím vystačíme:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    UnixWindowsPopisPříklad
    cdcdzměna adresářecd test
    pwdcdvýpis aktuálního adresářepwd
    cd
    lsdirvýpis adresářels
    dir
    cpcopyzkopírování souboru + cp puvodni.txt kopie.txt +
    + copy puvodni.txt kopie.txt +
    mvmovepřesun/přejmenování souboru + mv puvodni.txt novy.txt +
    + move puvodni.txt novy.txt +
    mkdirmkdirvytvoření adresářemkdir test
    rmdelsmazání souborurm test.txt
    del test.txt
    rm -rrmdir /Ssmazání adresářerm -r test
    rmdir /S test
    exitexitukončeníexit

    Příkazů existuje samozřejmě daleko víc. +Dokonce každý program, který máš na počítači nainstalovaný, jde spustit +z příkazové řádky – a to většinou jen zadáním jeho jména. +Zkus, jestli na tvém počítači bude fungovat firefox, notepad, safari +nebo gedit.

    +

    Při učení Pythonu použiješ programy/příkazy jako python a git, které +zanedlouho nainstalujeme. +

    +

    Konec

    +

    Nakonec vyzkoušej ještě jeden příkaz. +Ten, který příkazovou řádku zavírá: exit.

    +

    Jako většina příkazů (kromě pár z těch základních) funguje exit +stejně na všech systémech. +Proto už nebudu používat ukázku rozdělenou pro Unix a Windows.

    +
    $ exit
    +

    Ve zbytku těchto materiálů budeme pro kód, který je potřeba zadat do +příkazové řádky, používat unixovské $. +S touto konvencí se setkáš i ve většině návodů na internetu. +Používáš-li Windows, je dobré si na $ zvyknout, i když ve své +řádce máš místo něj >.

    \ No newline at end of file diff --git a/lessons/cmdline/windows-cmd-properties.png b/lessons/cmdline/windows-cmd-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb2040b0a9a3ddd60c7965f13b38f64608fc0a6 GIT binary patch literal 23872 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 VS> literal 0 HcmV?d00001 diff --git a/lessons/collaboration/gh-workflow-diagram.svg b/lessons/collaboration/gh-workflow-diagram.svg new file mode 100644 index 00000000..5a33a8d8 --- /dev/null +++ b/lessons/collaboration/gh-workflow-diagram.svg @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + „Hlavní” projektna Githubu + origin + ty + Tvůj projektna Githubu + + > + Lokální repozitář + + + + git pull + git push ty + pull request + + diff --git a/lessons/collaboration/index.html b/lessons/collaboration/index.html new file mode 100644 index 00000000..aebdac11 --- /dev/null +++ b/lessons/collaboration/index.html @@ -0,0 +1,359 @@ +

    Spolupráce

    +

    „Opravdové” programy zřídka vznikají prací jednoho člověka. +Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým.

    +

    Každý člen týmu potřebuje mít přístup k práci ostatních. +K tomu se dá použít Git: někde na internetu si zařídí sdílený repozitář, +se kterým se všichni budou synchronizovat.

    +

    Pro samostudium

    +

    Pokud materiály čteš z domu a máš možnost se +v budoucnu dostat na nějaký sraz, zatím tuhle sekci přeskoč. +Na sraze pak popros zkušenější programátory, aby ti pomohli. +(Nechystáš-li se na sraz, můžeš pokračovat – +zvládnout se to dá.)

    +

    Open Source

    +

    Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného +zdrojového kódu. +První programy vznikaly v akademické sféře, kde byly zcela přirozeně sdíleny, +jako je to s poznatky mezi vědci běžné. +50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů +a technologií, které dnes používáme. +Pak se začalo programování postupně komercializovat a firmy začaly zdrojový +kód skrývat jako konkurenční výhodu. +Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

    +

    Některým programátorům tohle skrývání kódu hluboce vadilo. +Roku 1985 publikoval +Richard Stallman +GNU Manifesto, +kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a +odstartoval tak hnutí svobodného softwaru. +To prosazuje 4 následující svobody (převzato +z Wikipedie):

    +
      +
    1. svoboda používat program za jakýmkoliv účelem,
    2. +
    3. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
    4. +
    5. svoboda redistribuovat kopie programu,
    6. +
    7. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    8. +

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) +dostupná na Internetu a každý je používáme. +Jejich další sdílení je upraveno jednou z licencí, +které tyto základní svobody zaručují.

    +

    Ne všechny jsou v Pythonu (a těm co jsou zatím +nebudeš všem rozumět). Ne všechny jsou v Gitu. +Ne všechny jsou kvalitní – protože si +každý může zveřejnit co chce, na Internetu se válí +spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +A bohužel, ne všechny projekty mají přátelské autory.

    +

    Na druhou stranu ale open-source programy +mají svoje výhody: nejenom že se z nich může kdokoli +učit, ale každý může i zkontrolovat, jestli +dělají to, co dělat mají. +Populární open-source programy tě například +pravděpodobně nebudou špehovat (tj. hlásit autorovi, +co na počítači děláš), ani většinou neobsahují +reklamy: kdyby to dělaly, najde se +někdo kdo tyhle „funkce” odstraní a lidi – časem – +začnou používat opravenou verzi.

    +

    Některé příklady populárních open-source projektů:

    + +

    Jak vidno z posledního příkladu, nejen softwarové +projekty se dají vést takhle veřejně. +Tento kurz vychází z principů open source: +všechno know-how je sdílené a budeme rádi, když +se zapojíš.

    +

    Až příště uvidíš v materiálech chybu (nebo jestli o nějaké víž už teď), +dnes se dozvíš, jak ji opravit!

    +

    A co tvůj kód? Chceš ho taky dávat takhle veřejně k dispozici? +Nutné to samozřejmě není – Git se dá používat i +v uzavřeném týmu – ale na druhou stranu, +máš důvod proč to nedělat? +Zveřejňovat zdrojový kód se hodí už jen pro to, +aby ti s ním mohli zkušenější programátoři snadněji pomáhat.

    +

    GitHub

    +

    Na Internetu existuje spousta stránek, kam se dají nahrávat gitové repozitáře +s kódem – např. GitLab, +BitBucket, +Pagure nebo +Launchpad. +Aktuálně nejpopulárnější je ale GitHub, který si tady +ukážeme.

    +

    Jestli ještě nemáš uživatelský účet na github.com, jdi +tam a založ si ho.

    +

    Naklonování repozitáře (git clone)

    +

    Pro začátek zkusíme práci s repozitářem, který už vytvořil někdo jiný. +V příkazové řádce zadej příkaz, který ti oznámí kouč; něco jako

    +
    $ git clone https://github.com/naucse/prezencka
    +

    Vytvoří se ti nový repozitář – adresář se jménem +prezencka, ve kterém je nějaký soubor.

    +

    Na URL (adresu), kterou jsi v tomhle příkladě +použil/a, se můžeš podívat i v prohlížeči. +Uvidíš seznam souborů a spoustu odkazů k +informacím o repozitáři (například pod „commits” +je historie).

    +

    Přepni se do nového adresáře (cd prezencka) +a zkus se podívat na historii (gitk nebo git log). +Možná je krátká, ale hlavně, že nějaká je. +Máš na počítači kopii projektu, který založil někdo jiný!

    +

    Jak už napovídá název repozitáře, tvůj příspěvek do tohoto projektu bude +zápis do prezenčky: konkrétně přidání souboru s tvým jménem. +Jméno je to proto, aby nedocházelo ke kolizím: potřebujeme, aby příspěvky od +všech lidí, kteří prochází tenhle kurz, byly jiné.

    +

    Tvůj příspěvek bude ovšem veřejně vystaven na internetu. +Pokud nechceš vystavovat svoje občanské jméno, použij místo něj klidně +přezdívku, oblíbené jídlo nebo pár náhodných písmen. Ale:

    +
      +
    • když budeš pojmenovávat soubor, buď originální, aby nedošlo ke konfliktům, a
    • +
    • nesdílej nic, co nemáš právo sdílet (např. texty moderních písní).
    • +
    +

    Vytvoření větve

    +

    Pomocí git branch zjisti, na jaké jsi aktuálně větvi. +Měla by to být větev master.

    +

    Tuhle „základní“ větev je dobré používat jen na revize, na kterých se už +shodl celý tým. +Proto když chceš do projektu přispět, jako první krok si pro svůj příspěvek +udělej novou větev a přepni se do ní. +Například pomocí:

    +
    $ git branch pridani-jmena
    +$ git checkout pridani-jmena
    +

    Posílání změn (git push)

    +

    Teď se do projektu zapoj. +Přidej soubor pojmenovaný podle tvého jména (nebo přezdívky) +a dej ho do gitu (git add ...; git commit).

    +

    Teď zbývá „jen” změnu začlenit do původního sdíleného repozitáře. +To ale není jen tak: repozitář, který jsi +naklonoval/a, patří koučovi. A tomu by se asi +nelíbilo, kdyby kdokoliv na Internetu mohl přijít +a nahrát mu do repozitáře změny.

    +

    Spousta míst na Internetu (blogy, zpravodajství, e-shopy) funguje tak, že +vybraná skupina lidí, „editorů“, má právo měnit obsah, jak se jim líbí. +Takovým editorům musí správce projektu věřit, než jim přístup povolí.

    +

    S Gitem se používá trošku jiný mechanismus: +změny nahraješ do vlastního sdíleného +repozitáře, který máš právo měnit jen ty. +Majiteli původního projektu pak napíšeš +žádost o začlenění těch změn (angl. pull request). +Může to být třeba mail se slovy „Hele, na té a té +adrese mám nějaké změny, které by se ti mohly hodit! +Přidej je do svého projektu!”

    +

    Výhoda je v tom, že se do projektu – pokud je +veřejný – může zapojit kdokoliv. Nemusíš se +předem ptát, nemusíš dokazovat že jsi důvěryhodná +osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo +ne, to už je jiná věc – ale můžou posuzovat samotnou +změnu, ne důvěryhodnost jejího autora.

    +

    Služby jako github.com +ti umožňují si udělat vlastní sdílený repozitář (který bude k dispozici na +internetu) a zjednodušují začleňování změn (místo posílání mailů stačí +zmáčknout tlačítko). Pojďme se podívat, jak na to.

    +

    Přihlaš se na GitHub a pak zajdi na adresu +kterou jsi použil/a pro git clone. +Vlevo nahoře najdi tlačítko „Fork” a klikni na něj. +Tím si vytvoříš na GitHubu vlastní kopii repozitáře: +adresa by měla být něco jako +https://github.com/tvojejmeno/prezencka.

    +

    Kdybys měl/a v různých kopiích repozitáře zmatek, +přijde vhod malé vysvětlení: jedna kopie je původní +projekt na GitHubu, kam správce projektu dává +aktuální „oficiální“ nebo „hlavní“ verzi. Další kopie na GitHubu +je „tvoje“ a můžeš si do ní nahrát co chceš +(nejčastěji v ní ale zveřejňuješ změny, které můžou +být užitečné pro ostatní). +Tyhle dvě kopie existují na serverech GitHubu a jsou volně dostupné +přes internet.

    +

    Třetí kopii repozitáře pak máš u sebe na počítači. +K té se dostaneš jen ty.

    +

    Z „hlavní“ verze si stáhneš práci ostatních členů týmu; +do tvého projektu na GitHubu dáváš své změny, aby je ostatní mohli +schválit a začlenit do „hlavní“ verze.

    +

    Diagram tří repozitářů

    +

    A teď, jak z tvého počítače nahrát změny na GitHub? +Git si u každého repozitáře na tvém počítači +pamatuje adresy, odkud se dají stahovat +a kam se dají posílat změny. +Seznam těchhle adres ti ukáže příkaz git remote -v. +Třeba:

    +
    $ git remote -v
    +origin  https://github.com/naucse/prezencka (fetch)
    +origin  https://github.com/naucse/prezencka (push)
    +

    Tenhle výstup znamená, že pod zkratkou „origin” +se schovává adresa, ze které jsi repozitář +naklonoval/a.

    +

    Přidej si podobnou zkratku pro vlastní repozitář na GitHubu. +Nezapomeň nahradit tvojejmeno za jméno účtu, +který máš na GitHubu ty. (Pozor, v příkazu je tvojejmeno dvakrát!)

    +
    +
    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    +

    a zkontroluj si, že se to povedlo:

    +
    +
    $ git remote -v
    +origin  git@github.com:naucse/prezencka.git (fetch)
    +origin  git@github.com:naucse/prezencka.git (push)
    +tvojejmeno      https://github.com/tvojejmeno/prezencka (fetch)
    +tvojejmeno      https://github.com/tvojejmeno/prezencka (push)
    +

    Tolik k nastavení – git remote add +stačí udělat jednou pro každý repozitář. +Pak už můžeš změny nahrávat pomocí:

    +
    +
    $ git push tvojejmeno pridani-jmena
    +

    což znamená: pošli na adresu uloženou pod zkratkou +tvojejmeno +větev pridani-jmena.

    +

    Funguje? Podívej se na +https://github.com/tvojejmeno/prezencka +v prohlížeči a ujisti se, že tam tvoje změny jsou.

    +

    Žádost o začlenění (pull request)

    +

    Teď zbývá požádat autory původního projektu, +aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +GitHub na to má mechanismus zvaný pull request (žádost o začlenění).

    +

    Jdi na stránku původního projektu (na adresu, +kterou jsi použil/a na začátku pro +git clone). +Měl/a bys tam vidět oznámení o své nově nahrané větvi +s velkým zeleným tlačítkem Compare & pull request. +Klikni na něj. Pokud chceš, tak dopiš/změň popisek +toho, co tahle změna obnáší. +Pak zmáčkni další tlačítko.

    +

    Jestli tlačítko Compare & pull request nevidíš, běž na adresu +své kopie repozitáře a stiskni tlačítko New pull request. +Vyber, co kam chceš začlenit, dopiš/změň popisek a pak zmáčkni +Create pull request.

    +

    Hotovo; teď je na autorech projektu, aby +se na změny podívali a přijali – nebo začali diskusi +o tom, jak je ještě vylepšit. +(Diskutovat se dá na stránce pull requestu nebo přes mail.)

    +

    Pro samostudium

    +

    Procházíš-li materiály z domu, musíš teď počkat, +než si někdo tvé žádosti všimne a začlení ji. +To může trvat i pár dní; kdyby to bylo přes týden, +tak se na stránce pull requestu zkus připomenout.

    +

    U přidání jména do prezenčky se to asi nestane, ale kdybys potřeboval/a +na změně před začleněním ještě trochu zapracovat (třeba i po +pár dnech diskuse), nebyl by to problém. +Přepni se na svém počítači do větve pridani-jmena, udělej další revize, +a pomocí git push tvojejmeno pridani-jmena +pull request aktualizuj.

    +

    Aktualizace (git pull)

    +

    Když budou tvé změny – a změny od ostatních – +začleněné, můžeš si aktualizovat lokální repozitář. (To je ten, +který máš u sebe na počítači.)

    +

    Nejdřív se přepni zpět do větve master. +Teď už nebudeš pracovat na pridani-jmena; tahle větev už je odeslaná.

    +

    To se dělá příkazem +git pull origin master (stáhni změny +z větve „master” z adresy pod zkratkou „origin”). +Pomocí gitk --all nebo git log +se můžeš podívat, jak se projekt mezitím vyvinul.

    +

    Tohle git pull je dobré provést vždycky předtím, než začneš pracovat na +nové změně/větvi. +Zaručíš tím, že projekt, který měníš, je „čerstvý“.

    +

    Gratuluji! Právě jsi prošel/prošla „kolečkem“, +které většina programátorů dělá denně: udělání nějaké změny, +odeslání kolegům na kontrolu a začlenění a stažení změn od ostatních.

    +

    Hlášení chyb (issues)

    +

    Občas nastane situace, kdy v nějakém projektu +na GitHubu najdeš chybu, ale nemáš čas nebo +znalosti, abys ji opravil/a. V takovém případě +často na GitHubu na stránce projektu pod záložkou Issues +najdeš seznam nahlášených problémů. +Nenajdeš-li mezi nimi „svoji” chybu, můžeš ji +nahlásit – stačí kliknout na New Issue +a můžeš psát, kdy chyba nastává, co program dělá +špatně a co by měl dělat místo toho.

    +

    Některé projekty nepoužívají Issues na GitHubu. +Kdybys záložku Issues nenašel/nenašla, podívej se +do dokumentace projektu, jestli tam není odkaz na +seznam chyb.

    +

    README: Informace pro ostatní

    +

    Pokud vytváříš projekt a chceš, aby do něj přispívali i ostatní, +je potřeba aby věděli, co tvůj projekt dělá, k čemu se hodí, +jak se používá a podobně.

    +

    Na základní informace o projektu/repozitáři se používá soubor README +(z angl. read me, čti mě). +Do tohoto souboru patří mj.:

    +
      +
    • název projektu,
    • +
    • stručný popis projektu (jedna až dvě věty),
    • +
    • krátký návod k instalaci projektu,
    • +
    • krátký návod ke spuštění projektu,
    • +
    • krátký návod k používání projektu, případně odkaz na rozsáhlejší dokumentaci,
    • +
    • pokud má projekt testy, informace o tom, jak je spustit,
    • +
    • informace o tom, jak se zapojit do vývoje projektu,
    • +
    • informace o autorech projektu,
    • +
    • informace o licenci (více se licencích dozvíš později).
    • +
    +

    README by mělo být členěné a jeho přečtení by nemělo zabrat uživateli hodinu, +většinou stačí krátké úderné informace s případným odkazem někam dál. +Nemusíš tedy například vysvětlovat v každém projektu, jak se instaluje Python. +Stačí říct, že Python je potřeba (a v jaké verzi) +a odkázat uživatele na patřičný návod. +Je také třeba brát v úvahu, kdo bude README číst. +Píšeš-li program pro jiné vývojářky a vývojáře, +často nemusíš zabrušovat do detailů.

    +

    GitHub (a spousty jiných podobných služeb) umožňuje pro README použít nějaký +značkovací jazyk, například Markdown. +Je možné pak používat nadpisy, obrázky apod.

    +

    A v neposlední řadě: aby se do projektu mohl zapojit +kdokoli z celého světa, bývají open-source projekty v angličtině. +Jména proměnných, komentáře, dokumentace – všechno +je primárně v anglické verzi. +Tenhle kurz je česky, aby byly začátky jednodušší, +ale jestli se ti programování zalíbilo a chceš +v něm po kurzu pokračovat dál, bez angličtiny +to bude velice složité.

    +

    Licence

    +

    Aby sdílení fungovalo i pro právní stránce, +nestačí když nahraješ kus kódu na Internet. +Musíš taky oficiálně oznámit, že si s ním ostatní můžou hrát. +Na svůj kód totiž máš autorské právo, podle kterého ostatní nesmí tvůj program +používat, natož vylepšovat, dokud jim to nepovolíš. +Pro formální udělení tohohle povolení se používají licence, které píšou +právníci.

    +

    Problematika licencí může být, bohužel, docela složitá. +Když to ale zjednodušíme na minimum, budeš +chtít jen zajistit, aby každý mohl tvůj výtvor +používat, učit se z něj, předávat ho dál +a vylepšovat ho. V tom případě vyber třeba +licenci MIT.

    +

    Pokud chceš navíc zabránit tomu, že si tvůj kód +někdo vezme a začne ho „vylepšovat“ a vydělávat na +něm, aniž by se o vylepšení podělil s ostatními, +zkus licenci AGPL.

    +

    A tyto materiály jsou pod ještě jinou licencí – +CC BY-SA – +protože výše jmenované licence jsou dělané na programy, ne na text.

    +

    Kód se nejčastěji licencuje tak, že text licence +dáš do souboru jménem LICENSE a přidáš do Gitu. +Je dobré licenci zmínit i v souboru README.

    +

    Chceš-li si o licencích přečíst něco víc, odkážu tě na +choosealicense.com, +případně creativecommons.org +a opensource.org.

    \ No newline at end of file diff --git a/lessons/comparisons/index.html b/lessons/comparisons/index.html new file mode 100644 index 00000000..998cf5fd --- /dev/null +++ b/lessons/comparisons/index.html @@ -0,0 +1,184 @@ +

    Porovnávání

    +

    Pamatuješ si ještě, co je to operátor?

    +

    V domácím projektu jsme si ukázali základní aritmetické operátory. +Přidáme-li jeden další (//), jsou to tyhle:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    +, -, *, /1 + 1Základní aritmetika
    --5Negace
    //; %7 // 2; 7 % 2Dělení se zbytkem (celočíselné dělení); zbytek po dělení
    **3 ** 2Umocnění (3 na druhou)

    Python ale zná i další druhy operátorů. +Důležité jsou operátory porovnávací. +Zkus si co dělají! +(Buď z programu pomocí print, +nebo pusť python z příkazové řádky.)

    + + + + + + + + + + + + + + + + + + + + + +
    SymbolPříkladPopis
    ==, !=1 == 1, 1 != 1Je rovno, není rovno
    <, >3 < 5, 3 > 5Menší než, větší než
    <=, >=3 <= 5, 3 >= 5Menší nebo rovno, větší nebo rovno

    Hodnoty provnání jsou takzvané booleovské hodnoty +(angl. boolean, podle G. Boolea). +V Pythonu je můžeš použít vždycky, když potřebuješ vědět, jestli něco platí +nebo neplatí. +Jsou jenom dvě – buď True (pravda), nebo False (nepravda).

    +

    Jako všechny hodnoty, True a False můžeš přiřadit do proměnných:

    +
    pravda = 1 < 3
    +print(pravda)
    +
    +nepravda = 1 == 3
    +print(nepravda)
    +

    Všimni si, že rovnost zjistíš pomocí dvou rovnítek: 3 == 3. +Jedno rovnítko přiřazuje do proměnné; dvě rovnítka porovnávají.

    +

    Slova True a False můžeš +v programu použít i přímo, +jen si dej pozor na velikost písmen:

    +
    print(True)
    +print(False)
    +

    Podmínky

    +

    Teď oprášíme program na výpočet obvodu a obsahu.

    +

    Otevři si v editoru nový soubor. +Jestli ještě v adresáři, kde máš soubory ke kurzům Pythonu, +nemáš adresář pro tuto lekci (třeba 02), vytvoř si ho. +Nový soubor ulož do něj pod jménem if.py.

    +

    Do souboru pak napiš následující program:

    +
    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Program spusť. Funguje?

    +

    Co se stane, když jako stranu zadáš záporné číslo? +Dává výstup smysl?

    +

    Tady je vidět, jak počítač dělá přesně, co se mu řekne. Nepřemýšlí o významu. +Bylo by dobré uživateli, který zadá záporné číslo, +přímo říct, že zadal blbost. Jak na to?

    +

    Nejdřív zkus nastavit proměnnou která bude True, +když uživatel zadal kladné číslo.

    +
    +

    Řešení

    + + +

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. +K tomu můžeš použít dvojici příkazů if (pokud) +a else (jinak):

    +
    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +cislo_je_spravne = strana > 0
    +
    +if cislo_je_spravne:
    +    print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +    print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +else:
    +    print('Strana musí být kladná, jinak z toho nebude čtverec!')
    +
    +print('Děkujeme za použití geometrické kalkulačky.')
    +

    Neboli: po if následuje podmínka (angl. condition), +což je výraz, podle kterého se budeme rozhodovat. +Za podmínkou je dvojtečka. +Potom následují příkazy, které se provedou, pokud je podmínka pravdivá. +Všechny jsou odsazeny o čtyři mezery.

    +

    Čtyři mezery neznamenají, že musíš čtyřikrát zmáčknout mezerník! +K odsazení použij klávesu Tab, která vloží správný počet mezer. +(Pokud ne, nemáš správně nastavený editor – podívej se do lekce o instalaci.) +Pomocí Shift+Tab můžeš odsazení zase zmenšit.

    +

    A ani Tab není vždycky potřeba. +Pokud napíšeš řádek s if bez chyby, některé editory za tebe další řádek odsadí automaticky.

    +

    Po téhle části stačí napsat neodsazené else:, zase s dvojtečkou na konci, +a odsazené příkazy, které se provedou v opačném případě.
    +Potom můžeš psát příkazy, které se provedou vždycky – ty odsazené nebudou, +podmíněná část programu už skončila.

    +

    Vzato čistě technicky, odsazení nemusí být o čtyři mezery. +Může být třeba o dvě nebo o jedenáct, nebo se dokonce dá místo mezer použít +tabulátor. +V rámci jednoho bloku musí být ale odsazení vždycky stejné, +takže když pak na jednom programu spolupracuje více lidí, musí se shodnout. +No a na čtyřech mezerách se shodla většina Pythonního světa.

    +

    Další podmíněné příkazy

    +

    Někdy není else vůbec potřeba. +V následujícím programu se nedělá nic navíc, pokud je číslo nenulové:

    +
    cislo = int(input('Zadej číslo, přičtu k němu 3: '))
    +if cislo == 0:
    +    print('Jé, to je jednoduché!')
    +print(cislo, '+ 3 =', cislo + 3)
    +

    Někdy je naopak potřeba podmínek několik, +k čemuž slouží příkaz elif – kombinace else a if. +Dává se „mezi“ bloky if a else. +Příkazů elif může být za jedním if-em několik, +ale vždy se provede jen jedna „větev“: +ta první, jejíž podmínka je splněna.

    +
    vek = int(input('Kolik ti je let? '))
    +if vek >= 150:
    +    print('A ze kterépak jsi planety?')
    +elif vek >= 18:
    +    # Tahle větev se např. pro "200" už neprovede.
    +    print('Můžeme nabídnout: víno, cider, nebo vodku.')
    +elif vek >= 1:
    +    print('Můžeme nabídnout: mléko, čaj, nebo vodu')
    +elif vek >= 0:
    +    print('Sunar už bohužel došel.')
    +else:
    +    # Nenastala ani nedna ze situací výše – muselo to být záporné
    +    print('Pro návštěvy z budoucnosti bohužel nemáme nic v nabídce.')
    +

    Zanořování

    +

    Příkazy if se dají zanořovat (angl. nest). +V odsazeném (podmíněném) bloku kódu může být další if s dalším odsazeným +kódem. +Třeba u tohoto programu, který rozdává nejapné rady do života:

    +
    stastna = input('Jsi šťastná?')
    +bohata = input('Jsi bohatá?')
    +
    +if stastna == 'ano':
    +    # Tenhle kus kódu se provede, když je "šťastná"
    +    if bohata == 'ano':
    +        print('Gratuluji!')
    +    else:
    +        print('Zkus míň utrácet.')
    +else:
    +    # Tenhle kus kódu se provede, když není "šťastná"
    +    if bohata == 'ano':
    +        print('Zkus se víc usmívat!')
    +    else:
    +        print('To je mi líto.')
    +
    \ No newline at end of file diff --git a/lessons/course.json b/lessons/course.json new file mode 100644 index 00000000..801e1ced --- /dev/null +++ b/lessons/course.json @@ -0,0 +1,2817 @@ +{ + "api_version": [ + 0, + 3 + ], + "course": { + "description": "Seznam udržovaných lekcí bez ladu a skladu.", + "edit_info": { + "branch": "main", + "url": "https://github.com/pyvec/naucse-python" + }, + "lessons": { + "advanced/generators": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "generators/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/advanced/generators/index.md", + "title": "Generátory", + "vars": {} + } + }, + "source_file": "lessons/advanced/generators/info.yml", + "static_files": {}, + "title": "Generátory" + }, + "beginners/and-or": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "and-or/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/and-or/index.md", + "title": "Nebo anebo a", + "vars": {} + } + }, + "source_file": "lessons/beginners/and-or/info.yml", + "static_files": {}, + "title": "Nebo anebo a" + }, + "beginners/basic-functions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "basic-functions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Funkce input vrací hodnotu, se kterou může program dál pracovat.\nZařadil bych ji tedy mezi „normální“ funkce.

    \n

    Jako argument bere input otázku, na kterou se uživatele zeptá.

    \n

    Návratová hodnota funkce input je řetězec s odpovědí uživatele.

    " + } + ], + "source_file": "lessons/beginners/basic-functions/index.md", + "title": "Užitečné funkce", + "vars": {} + } + }, + "source_file": "lessons/beginners/basic-functions/info.yml", + "static_files": {}, + "title": "Užitečné funkce" + }, + "beginners/circular-imports": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "circular-imports/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/circular-imports/index.md", + "title": "Cyklické importy", + "vars": {} + } + }, + "source_file": "lessons/beginners/circular-imports/info.yml", + "static_files": {}, + "title": "Cyklické importy" + }, + "beginners/class": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "class/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/class/index.md", + "title": "Třídy", + "vars": {} + } + }, + "source_file": "lessons/beginners/class/info.yml", + "static_files": {}, + "title": "Třídy" + }, + "beginners/cmdline": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", + "Založeno na tutoriálu Django Girls." + ], + "content": { + "path": "cmdline/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    \n

    Unix

    $ cd naucse-python\n$ mkdir test\n$ ls\ntest\n
    \n

    Windows

    > cd naucse-python\n> mkdir test\n> dir\n05/08/2014 07:28 PM <DIR>  test\n
    " + } + ], + "source_file": "lessons/beginners/cmdline/index.md", + "title": "Úvod do příkazové řádky", + "vars": {} + } + }, + "source_file": "lessons/beginners/cmdline/info.yml", + "static_files": { + "windows-cmd-properties.png": { + "path": "cmdline/windows-cmd-properties.png" + } + }, + "title": "Úvod do příkazové řádky" + }, + "beginners/comparisons": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "comparisons/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Taková proměnná se dá nastavit pomocí tohoto kódu:

    \n
    strana = float(input('Zadej stranu čtverce v centimetrech: '))\ncislo_je_spravne = strana > 0\n
    " + } + ], + "source_file": "lessons/beginners/comparisons/index.md", + "title": "Porovnávání", + "vars": {} + } + }, + "source_file": "lessons/beginners/comparisons/info.yml", + "static_files": {}, + "title": "Porovnávání" + }, + "beginners/def": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "def/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def obsah_obdelnika(a, b):\n    return a * b\n\nprint('Obsah obdélníka se stranami 3 cm a 5 cm je', obsah_obdelnika(3, 5), 'cm2')\n
    " + } + ], + "source_file": "lessons/beginners/def/index.md", + "title": "Definice funkcí", + "vars": {} + } + }, + "source_file": "lessons/beginners/def/info.yml", + "static_files": {}, + "title": "Definice funkcí" + }, + "beginners/dict": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "dict/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/dict/index.md", + "title": "Slovníky", + "vars": {} + } + }, + "source_file": "lessons/beginners/dict/info.yml", + "static_files": {}, + "title": "Slovníky" + }, + "beginners/exceptions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "exceptions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/exceptions/index.md", + "title": "Výjimky", + "vars": {} + } + }, + "source_file": "lessons/beginners/exceptions/info.yml", + "static_files": {}, + "title": "Výjimky" + }, + "beginners/expressions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2019." + ], + "content": { + "path": "expressions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/expressions/index.md", + "title": "Vyhodnocování výrazů", + "vars": {} + } + }, + "source_file": "lessons/beginners/expressions/info.yml", + "static_files": {}, + "title": "Vyhodnocování výrazů" + }, + "beginners/files": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "files/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " + } + ], + "source_file": "lessons/beginners/files/index.md", + "title": "Soubory", + "vars": {} + } + }, + "source_file": "lessons/beginners/files/info.yml", + "static_files": {}, + "title": "Soubory" + }, + "beginners/first-steps": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019.", + "Část této kapitoly je založena na materiálech DjangoGirls.", + "Část této kapitoly je založena na kurzu Geek Girls Carrots.", + "Původní DjangoGirls tutoriál přeložila do češtiny skupina dobrovolníků.\nPoděkování patří hlavně: Davidovi (dakf), Kristýně Kumpánové,\nVeronice Gabrielové, Tomáši Ehrlichovi, Aničce Jaegerové,\nMatějovi Stuchlíkovi, Filipovi Sivákovi a Juraji M. Bezručkovi." + ], + "content": { + "path": "first-steps/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/first-steps/index.md", + "title": "První krůčky", + "vars": {} + } + }, + "source_file": "lessons/beginners/first-steps/info.yml", + "static_files": {}, + "title": "První krůčky" + }, + "beginners/fstring": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2018-2019." + ], + "content": { + "path": "fstring/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/fstring/index.md", + "title": "Šablony (formátovací řetězce)", + "vars": {} + } + }, + "source_file": "lessons/beginners/fstring/info.yml", + "static_files": {}, + "title": "Šablony (formátovací řetězce)" + }, + "beginners/functions": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "functions/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Funkce print zavolaná bez argumentů napíše prázdný řádek.

    " + } + ], + "source_file": "lessons/beginners/functions/index.md", + "title": "Funkce", + "vars": {} + } + }, + "source_file": "lessons/beginners/functions/info.yml", + "static_files": { + "call-anatomy.svg": { + "path": "functions/call-anatomy.svg" + } + }, + "title": "Funkce" + }, + "beginners/hello-world": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "hello-world/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/hello-world/index.md", + "title": "První program", + "vars": {} + } + }, + "source_file": "lessons/beginners/hello-world/info.yml", + "static_files": {}, + "title": "První program" + }, + "beginners/inheritance": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "inheritance/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/inheritance/index.md", + "title": "Dědičnost", + "vars": {} + } + }, + "source_file": "lessons/beginners/inheritance/info.yml", + "static_files": {}, + "title": "Dědičnost" + }, + "beginners/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install/index.md", + "title": "Instalace Pythonu", + "vars": {} + }, + "linux": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/linux.html" + }, + "license": "cc-by-sa-40", + "slug": "linux", + "solutions": [], + "source_file": "lessons/beginners/install/linux.md", + "subtitle": "Linux", + "title": "Instalace Pythonu – Linux", + "vars": {} + }, + "macos": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/macos.html" + }, + "license": "cc-by-sa-40", + "slug": "macos", + "solutions": [], + "source_file": "lessons/beginners/install/macos.md", + "subtitle": "macOS", + "title": "Instalace Pythonu – macOS", + "vars": {} + }, + "windows": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "install/windows.html" + }, + "license": "cc-by-sa-40", + "slug": "windows", + "solutions": [], + "source_file": "lessons/beginners/install/windows.md", + "subtitle": "Windows", + "title": "Instalace Pythonu – Windows", + "vars": {} + } + }, + "source_file": "lessons/beginners/install/info.yml", + "static_files": { + "windows_32v64-bit.png": { + "path": "install/windows_32v64-bit.png" + }, + "windows_add_python_to_path.png": { + "path": "install/windows_add_python_to_path.png" + } + }, + "title": "Instalace Pythonu" + }, + "beginners/install-editor": { + "pages": { + "atom": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/atom.html" + }, + "license": "cc-by-sa-40", + "slug": "atom", + "solutions": [], + "source_file": "lessons/beginners/install-editor/atom.md", + "subtitle": "Atom", + "title": "Instalace Atomu", + "vars": {} + }, + "gedit": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/gedit.html" + }, + "license": "cc-by-sa-40", + "slug": "gedit", + "solutions": [], + "source_file": "lessons/beginners/install-editor/gedit.md", + "subtitle": "Gedit", + "title": "Instalace Geditu", + "vars": {} + }, + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/install-editor/index.md", + "title": "Instalace editoru", + "vars": {} + }, + "kate": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/kate.html" + }, + "license": "cc-by-sa-40", + "slug": "kate", + "solutions": [], + "source_file": "lessons/beginners/install-editor/kate.md", + "subtitle": "Kate", + "title": "Instalace Kate", + "vars": {} + }, + "notepad-plus-plus": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/notepad-plus-plus.html" + }, + "license": "cc-by-sa-40", + "slug": "notepad-plus-plus", + "solutions": [], + "source_file": "lessons/beginners/install-editor/notepad-plus-plus.md", + "subtitle": "Notepad++", + "title": "Instalace Notepadu++", + "vars": {} + }, + "others": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/others.html" + }, + "license": "cc-by-sa-40", + "slug": "others", + "solutions": [], + "source_file": "lessons/beginners/install-editor/others.md", + "subtitle": "Nastavení", + "title": "Nastavení editoru", + "vars": {} + }, + "vscode": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Tomáš Roj (2019)" + ], + "content": { + "path": "install-editor/vscode.html" + }, + "license": "cc-by-sa-40", + "slug": "vscode", + "solutions": [], + "source_file": "lessons/beginners/install-editor/vscode.md", + "subtitle": "Visual Studio Code", + "title": "Instalace Visual Studio Code", + "vars": {} + } + }, + "source_file": "lessons/beginners/install-editor/info.yml", + "static_files": { + "gedit_indent.png": { + "path": "install-editor/gedit_indent.png" + }, + "gedit_linenums.png": { + "path": "install-editor/gedit_linenums.png" + }, + "gedit_prefs.png": { + "path": "install-editor/gedit_prefs.png" + } + }, + "title": "Instalace editoru" + }, + "beginners/list": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "list/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def vyber_chybne(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        if jmeno[0].islower() or prijmeni[0].islower():\n            vysledek.append(zaznam)\n    return vysledek\n\ndef vyber_spravne(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        if not jmeno[0].islower() and not prijmeni[0].islower():\n            vysledek.append(zaznam)\n    return vysledek\n\ndef oprav_zaznamy(seznam):\n    vysledek = []\n    for zaznam in seznam:\n        jmeno_a_prijmeni = zaznam.split(' ')\n        jmeno = jmeno_a_prijmeni[0]\n        prijmeni = jmeno_a_prijmeni[1]\n        vysledek.append(jmeno.capitalize() + ' ' + prijmeni.capitalize())\n    return vysledek\n
    " + } + ], + "source_file": "lessons/beginners/list/index.md", + "title": "Seznamy", + "vars": {} + } + }, + "source_file": "lessons/beginners/list/info.yml", + "static_files": {}, + "title": "Seznamy" + }, + "beginners/local-variables": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "local-variables/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
      \n
    • pi je globální – nepřiřazuje se do ní ve funkci;\nje „vidět“ v celém programu.
    • \n
    • Proměnné obsah jsou v programu dvě – jedna globální,\na jedna je lokální pro funkci obsah_elipsy,\nprotože do ní tahle funkce přiřazuje.
    • \n
    • Proměnné a jsou taky dvě, podobně jako obsah.\nTady byl chyták: příkaz a = a + 3 nemá žádný smysl;\ndo a se sice uloží větší číslo, ale vzápětí funkce obsah_elipsy skončí\na její lokální proměnná a přestane existovat.
    • \n
    • Proměnná b je jenom lokální – jako parametr funkce obsah_elipsy.
    • \n
    • Proměnná obsah_elipsy je globální (a je v ní funkce).
    • \n
    \n

    A pro úplnost

    \n
      \n
    • Klíčová slova from, import, def, return neoznačují proměnné.
    • \n
    • Jméno modulu math taky neoznačuje proměnnou.
    • \n
    • Proměnná print se dá považovat za globální.\n(Ve skutečnosti existuje zvláštní kategorie zabudovaných (angl. builtin)\nproměnných – ty jsou „ještě globálnější“.)
    • \n
    \n
    " + } + ], + "source_file": "lessons/beginners/local-variables/index.md", + "title": "Lokální proměnné", + "vars": {} + } + }, + "source_file": "lessons/beginners/local-variables/info.yml", + "static_files": {}, + "title": "Lokální proměnné" + }, + "beginners/micropython": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2016-2017.", + "Diagramy s LED vytvořeny pomocí Fritzing." + ], + "content": { + "path": "micropython/index.html" + }, + "css": ".part-green { outline: 2px solid hsla(113, 100%, 50%, 1);\n background-color: hsla(113, 100%, 50%, 0.25); }\n.part-cyan { outline: 2px solid hsla(180, 100%, 50%, 1);\n background-color: hsla(180, 100%, 50%, 0.25); }\n.part-blue { outline: 2px solid hsla(236, 100%, 50%, 1);\n background-color: hsla(236, 100%, 50%, 0.25); }\n.part-yellow { outline: 2px solid hsla( 60, 100%, 50%, 1);\n background-color: hsla( 60, 100%, 50%, 0.25); }\n.part-orange { outline: 2px solid hsla( 42, 100%, 50%, 1);\n background-color: hsla( 42, 100%, 50%, 0.25); }\n.part-red { outline: 2px solid hsla( 0, 100%, 50%, 1);\n background-color: hsla( 0, 100%, 50%, 0.25); }\n.pull-right, .pull-left { margin: 1em; }\n.highlight { background-color: hsla( 0, 100%, 50%, 0.1); }\n.img-fluid { max-width: 100%; }\n.highlight-nocolor{ background-color: hsla( 60, 100%, 50%, 0.75); }\n.highlight-red { background-color: hsla( 0, 100%, 50%, 0.25); }\n.highlight-green { background-color: hsla(113, 100%, 50%, 0.25); }\n.highlight-blue { background-color: hsla(236, 100%, 50%, 0.25); }\n", + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from machine import Pin\npin_diody = Pin(14, Pin.OUT)\npin_tlacitka = Pin(0, Pin.IN)\nwhile True:\n    pin_diody.value(1 - pin_tlacitka.value())\n
    " + } + ], + "source_file": "lessons/beginners/micropython/index.md", + "title": "MicroPython", + "vars": {} + } + }, + "source_file": "lessons/beginners/micropython/info.yml", + "static_files": { + "circuits/led.fzz": { + "path": "micropython/circuits/led.fzz" + }, + "circuits/led_bb.svg": { + "path": "micropython/circuits/led_bb.svg" + }, + "circuits/led_bb_off.svg": { + "path": "micropython/circuits/led_bb_off.svg" + }, + "nodemcu-devkit.jpg": { + "path": "micropython/nodemcu-devkit.jpg" + }, + "nodemcu-popisky.svg": { + "path": "micropython/nodemcu-popisky.svg" + }, + "noty.py": { + "path": "micropython/noty.py" + }, + "putty-config.jpg": { + "path": "micropython/putty-config.jpg" + }, + "usb-ttl.png": { + "path": "micropython/usb-ttl.png" + } + }, + "title": "MicroPython" + }, + "beginners/modules": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "modules/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/modules/index.md", + "title": "Moduly", + "vars": {} + } + }, + "source_file": "lessons/beginners/modules/info.yml", + "static_files": {}, + "title": "Moduly" + }, + "beginners/nested-traceback": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "nested-traceback/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/nested-traceback/index.md", + "title": "Chybové hlášky ze zanořených funkcí", + "vars": {} + } + }, + "source_file": "lessons/beginners/nested-traceback/info.yml", + "static_files": {}, + "title": "Chybové hlášky ze zanořených funkcí" + }, + "beginners/print": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "print/index.html" + }, + "css": ".err-lineno {\n display: inline-block;\n background-color: #FCC;\n}\n.err-exctype {\n display: inline-block;\n background-color: #CFC;\n}\n", + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/print/index.md", + "title": "Print a chybové hlášky", + "vars": {} + } + }, + "source_file": "lessons/beginners/print/info.yml", + "static_files": {}, + "title": "Print a chybové hlášky" + }, + "beginners/reassignment": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "reassignment/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    celkem = 0\n\ndelka_trasy = 8\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 45\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 9\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\ndelka_trasy = 21\nprint('Jdu', delka_trasy, 'km do další vesnice.')\ncelkem = celkem + delka_trasy\n\nprint('Celkem jsem ušla', celkem, 'km')\n

    Příkaz celkem = celkem + delka_trasy vypočítá hodnotu\ncelkem + delka_trasy, tedy přičte aktuální číslo k součtu.\nVýsledek uloží opět do proměnné celkem.\nNová hodnota celkem se pak použije v dalším průchodu cyklem.

    \n

    Na začátku je celkem 0 a na konci se celkový součet všech čísel vypíše.

    " + } + ], + "source_file": "lessons/beginners/reassignment/index.md", + "title": "Přepisování proměnných", + "vars": {} + } + }, + "source_file": "lessons/beginners/reassignment/info.yml", + "static_files": {}, + "title": "Přepisování proměnných" + }, + "beginners/recursion": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2019." + ], + "content": { + "path": "recursion/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/recursion/index.md", + "title": "Rekurze", + "vars": {} + } + }, + "source_file": "lessons/beginners/recursion/info.yml", + "static_files": {}, + "title": "Rekurze" + }, + "beginners/str": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019.", + "Jako jeden z příkladů byl použit úryvek z povídky „Chlap, děd, vnuk, pes a hrob“ Jana Wericha." + ], + "content": { + "path": "str/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    >>> print(".\\".")\n.".\n>>> len(".\\".")\n3\n>>> ".\\"."\n'.".'\n
    " + } + ], + "source_file": "lessons/beginners/str/index.md", + "title": "Zápis řetězců", + "vars": {} + } + }, + "source_file": "lessons/beginners/str/info.yml", + "static_files": { + "quote-comic.svg": { + "path": "str/quote-comic.svg" + } + }, + "title": "Zápis řetězců" + }, + "beginners/str-index-slice": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "str-index-slice/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Nedostal/a – dostal/a jsi šesté písmeno.

    " + }, + { + "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯
    " + }, + { + "content": "

    Zápis retezec[5:] vybere podřetězec od znaku číslo 5 dál.

    " + }, + { + "content": "

    Zápis retezec[od:do] vybere podřetězec od pozice od do pozice do.\nKdyž jednu z hodnot vynecháš, vybírá se od začádku, resp. do konce.

    \n
    retezec = 'čokoláda'\nprint(retezec[:4])      # → čoko\nprint(retezec[2:6])     # → kolá\nprint(retezec[-3:])     # → áda\nprint(retezec[:])       # → čokoláda\n
    " + }, + { + "content": "
    slovo = input('Slovo: ')\npozice = int(input('Které písmeno zaměnit (od nuly)? '))\nnovy_znak = input('Nové písmeno: ')\n\nzacatek_slova = slovo[:pozice]\nkonec_slova = slovo[pozice + 1:]\nnove_slovo = zacatek_slova + novy_znak + konec_slova\n\nprint(nove_slovo)\n
    " + } + ], + "source_file": "lessons/beginners/str-index-slice/index.md", + "title": "Výběr z řetězců", + "vars": {} + } + }, + "source_file": "lessons/beginners/str-index-slice/info.yml", + "static_files": {}, + "title": "Výběr z řetězců" + }, + "beginners/str-methods": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2019." + ], + "content": { + "path": "str-methods/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    jmeno = input('Zadej jméno: ')\nprijmeni = input('Zadej příjmení ')\ninicialy = jmeno[0] + prijmeni[0]\nprint('Iniciály:', inicialy.upper())\n

    Způsobů, jak takový program napsat, je více.\nLze například zavolat upper() dvakrát – zvlášť na jméno a zvlášť na příjmení.

    \n

    Nebo to jde zapsat i takto –\nmetoda se dá volat na výsledku jakéhokoli výrazu:

    \n
    jmeno = input('Zadej jméno: ')\nprijmeni = input('Zadej příjmení ')\nprint('Iniciály:', (jmeno[0] + prijmeni[0]).upper())\n

    Doporučuji spíš první způsob, ten se smysluplnými názvy proměnných.\nJe sice delší, ale mnohem přehlednější.

    " + } + ], + "source_file": "lessons/beginners/str-methods/index.md", + "title": "Řetězcové funkce a metody", + "vars": {} + } + }, + "source_file": "lessons/beginners/str-methods/info.yml", + "static_files": {}, + "title": "Řetězcové funkce a metody" + }, + "beginners/testing": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "testing/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/testing/index.md", + "title": "Testování", + "vars": {} + } + }, + "source_file": "lessons/beginners/testing/info.yml", + "static_files": {}, + "title": "Testování" + }, + "beginners/tuple": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "tuple/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/tuple/index.md", + "title": "N-tice", + "vars": {} + } + }, + "source_file": "lessons/beginners/tuple/info.yml", + "static_files": {}, + "title": "N-tice" + }, + "beginners/variables": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "variables/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "

    Program, který vypíše správný výsledek, může vypadat třeba takhle:

    \n
    print('Obvod čtverce se stranou 356 cm je', 4 * 356, 'cm')\nprint('Obsah čtverce se stranou 356 cm je', 356 * 356, 'cm2')\n
    " + }, + { + "content": "
    print('Obvod čtverce se stranou 123 cm je', 4 * 123, 'cm')\nprint('Obsah čtverce se stranou 123 cm je', 123 * 123, 'cm2')\n
    " + } + ], + "source_file": "lessons/beginners/variables/index.md", + "title": "Proměnné", + "vars": {} + } + }, + "source_file": "lessons/beginners/variables/info.yml", + "static_files": {}, + "title": "Proměnné" + }, + "beginners/venv-setup": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2018." + ], + "content": { + "path": "venv-setup/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/venv-setup/index.md", + "title": "Nastavení prostředí", + "vars": {} + } + }, + "source_file": "lessons/beginners/venv-setup/info.yml", + "static_files": { + "dirs.png": { + "path": "venv-setup/dirs.png" + } + }, + "title": "Nastavení prostředí" + }, + "beginners/while": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "while/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from random import randrange\n\nsoucet = 0\nwhile soucet < 21:\n    print('Máš', soucet, 'bodů')\n    odpoved = input('Otočit kartu? ')\n    if odpoved == 'ano':\n        karta = randrange(2, 11)\n        print('Otočil/a jsi', karta)\n        soucet = soucet + karta\n    elif odpoved == 'ne':\n        break\n    else:\n        print('Nerozumím! Odpovídej "ano", nebo "ne"')\n\nif soucet == 21:\n    print('Gratuluji! Vyhrál/a jsi!')\nelif soucet > 21:\n    print('Smůla!', soucet, 'bodů je moc!')\nelse:\n    print('Chybělo jen', 21 - soucet, 'bodů!')\n
    " + } + ], + "source_file": "lessons/beginners/while/index.md", + "title": "Cyklus While", + "vars": {} + } + }, + "source_file": "lessons/beginners/while/info.yml", + "static_files": {}, + "title": "Cyklus While" + }, + "fast-track/http": { + "pages": { + "index": { + "attribution": [ + "Pro naucse.python.cz napsal Petr Viktorin, 2018.", + "Inspirováno tutoriálem Django Girls" + ], + "content": { + "path": "http/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/fast-track/http/index.md", + "title": "HTTP – Jak funguje Internet", + "vars": {} + } + }, + "source_file": "lessons/fast-track/http/info.yml", + "static_files": { + "url-anatomy.svg": { + "path": "http/url-anatomy.svg" + } + }, + "title": "HTTP – Jak funguje Internet" + }, + "fast-track/install": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok a Petr Viktorin, 2016-2017." + ], + "content": { + "path": "install/index.1.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/fast-track/install/index.md", + "title": "Vytvoření virtuáního prostředí", + "vars": {} + } + }, + "source_file": "lessons/fast-track/install/info.yml", + "static_files": {}, + "title": "Vytvoření virtuáního prostředí" + }, + "git/basics": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "basics/index.html" + }, + "css": ".green { color: #0a0; }\n.red { color: #a00; }\n.yellow { color: #a50; }\n.strong { font-weight: bold; }\n.blue { color: #0aa; }\n", + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/basics/index.md", + "title": "Git", + "vars": {} + } + }, + "source_file": "lessons/git/basics/info.yml", + "static_files": { + "diagram.svg": { + "path": "basics/diagram.svg" + }, + "dropbox.png": { + "path": "basics/dropbox.png" + }, + "gitk.png": { + "path": "basics/gitk.png" + } + }, + "title": "Git" + }, + "git/branching": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "branching/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/branching/index.md", + "title": "Větvení v Gitu", + "vars": {} + } + }, + "source_file": "lessons/git/branching/info.yml", + "static_files": { + "branch1.png": { + "path": "branching/branch1.png" + }, + "branches.png": { + "path": "branching/branches.png" + }, + "merge.png": { + "path": "branching/merge.png" + } + }, + "title": "Větvení v Gitu" + }, + "git/collaboration": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsali Petr Viktorin a Oskar Hollman, 2015-2017." + ], + "content": { + "path": "collaboration/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/collaboration/index.md", + "title": "Spolupráce a Open source", + "vars": {} + } + }, + "source_file": "lessons/git/collaboration/info.yml", + "static_files": { + "gh-workflow-diagram.svg": { + "path": "collaboration/gh-workflow-diagram.svg" + } + }, + "title": "Spolupráce a Open source" + }, + "git/git-collaboration-2in1": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsali Petr Viktorin a Oskar Hollman, 2015-2017." + ], + "content": { + "path": "git-collaboration-2in1/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/git-collaboration-2in1/index.md", + "title": "Spolupráce a Git", + "vars": {} + } + }, + "source_file": "lessons/git/git-collaboration-2in1/info.yml", + "static_files": { + "diagram.png": { + "path": "git-collaboration-2in1/diagram.png" + }, + "gh-workflow-diagram.svg": { + "path": "git-collaboration-2in1/gh-workflow-diagram.svg" + } + }, + "title": "Spolupráce a Git" + }, + "git/ignoring": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsal Petr Viktorin, 2017." + ], + "content": { + "path": "ignoring/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/ignoring/index.md", + "title": "Ignorování souborů", + "vars": {} + } + }, + "source_file": "lessons/git/ignoring/info.yml", + "static_files": {}, + "title": "Ignorování souborů" + }, + "git/install": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017" + ], + "content": { + "path": "install/index.2.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/git/install/index.md", + "title": "Instalace Gitu", + "vars": {} + } + }, + "source_file": "lessons/git/install/info.yml", + "static_files": {}, + "title": "Instalace Gitu" + }, + "intro/async": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "async/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/async/index.md", + "title": "AsyncIO", + "vars": {} + } + }, + "source_file": "lessons/intro/async/info.yml", + "static_files": {}, + "title": "AsyncIO" + }, + "intro/click": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "click/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/click/index.md", + "title": "Click – Rozhraní pro příkazovou řádku", + "vars": {} + } + }, + "source_file": "lessons/intro/click/info.yml", + "static_files": {}, + "title": "Click – Rozhraní pro příkazovou řádku" + }, + "intro/cython": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "cython/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/cython/index.md", + "title": "Cython", + "vars": {} + } + }, + "source_file": "lessons/intro/cython/info.yml", + "static_files": { + "test_matmul.py": { + "path": "cython/test_matmul.py" + } + }, + "title": "Cython" + }, + "intro/decorators": { + "pages": { + "index": { + "attribution": [ + "Lubomír Sedlář, Lumír Balhar 2019-2020." + ], + "content": { + "path": "decorators/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def co_se_deje(func):\n    def nahradni_funkce(x):\n        print(f"Voláme {func.__name__}({x})")\n        vysledek = func(x)\n        print(f"Výsledek {func.__name__}({x}) = {vysledek}")\n        return vysledek\n\n    return nahradni_funkce\n
    " + } + ], + "source_file": "lessons/intro/decorators/index.md", + "title": "Dekorátory", + "vars": {} + } + }, + "source_file": "lessons/intro/decorators/info.yml", + "static_files": {}, + "title": "Dekorátory" + }, + "intro/deployment": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "deployment/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/deployment/index.md", + "title": "Deployment webových aplikací", + "vars": {} + }, + "pythonanywhere": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "deployment/pythonanywhere.html" + }, + "license": "cc-by-sa-40", + "slug": "pythonanywhere", + "solutions": [], + "source_file": "lessons/intro/deployment/pythonanywhere.md", + "subtitle": "PythonAnywhere", + "title": "Deployment webových aplikací – PythonAnywhere", + "vars": {} + } + }, + "source_file": "lessons/intro/deployment/info.yml", + "static_files": {}, + "title": "Deployment webových aplikací" + }, + "intro/distribution": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "distribution/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/distribution/index.md", + "title": "Moduly", + "vars": {} + } + }, + "source_file": "lessons/intro/distribution/info.yml", + "static_files": {}, + "title": "Moduly" + }, + "intro/docs": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "docs/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/docs/index.md", + "title": "Dokumentace", + "vars": {} + } + }, + "source_file": "lessons/intro/docs/info.yml", + "static_files": {}, + "title": "Dokumentace" + }, + "intro/flask": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "flask/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/flask/index.md", + "title": "Flask", + "vars": {} + } + }, + "source_file": "lessons/intro/flask/info.yml", + "static_files": {}, + "title": "Flask" + }, + "intro/json": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "json/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/json/index.md", + "title": "JSON", + "vars": {} + } + }, + "source_file": "lessons/intro/json/info.yml", + "static_files": {}, + "title": "JSON" + }, + "intro/magic": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "magic/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/magic/index.md", + "title": "Magie", + "vars": {} + } + }, + "source_file": "lessons/intro/magic/info.yml", + "static_files": {}, + "title": "Magie" + }, + "intro/micropython": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "micropython/index.1.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/micropython/index.md", + "title": "MicroPython", + "vars": {} + } + }, + "source_file": "lessons/intro/micropython/info.yml", + "static_files": {}, + "title": "MicroPython" + }, + "intro/mypy": { + "pages": { + "index": { + "attribution": [ + "Pro kurz pokročilého Pythonu PyLadies Ostrava napsal Lumír Balhar, 2020." + ], + "content": { + "path": "mypy/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/mypy/index.md", + "title": "Mypy — statická typová kontrola pro Python", + "vars": {} + } + }, + "source_file": "lessons/intro/mypy/info.yml", + "static_files": {}, + "title": "Mypy — statická typová kontrola pro Python" + }, + "intro/notebook": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "notebook/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "modules": { + "katex": "0.7.1" + }, + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/notebook/index.ipynb", + "title": "Notebook", + "vars": {} + } + }, + "source_file": "lessons/intro/notebook/info.yml", + "static_files": {}, + "title": "Notebook" + }, + "intro/numpy": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "numpy/index.html" + }, + "license": "cc-by-sa-40", + "modules": { + "katex": "0.7.1" + }, + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/numpy/index.ipynb", + "title": "NumPy", + "vars": {} + } + }, + "source_file": "lessons/intro/numpy/info.yml", + "static_files": { + "python.jpg": { + "path": "numpy/python.jpg" + }, + "sample.wav": { + "path": "numpy/sample.wav" + }, + "secret.png": { + "path": "numpy/secret.png" + } + }, + "title": "NumPy" + }, + "intro/pandas": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "pandas/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pandas/index.ipynb", + "title": "Pandas", + "vars": {} + } + }, + "source_file": "lessons/intro/pandas/info.yml", + "static_files": { + "actors.csv": { + "path": "pandas/actors.csv" + }, + "spouses.csv": { + "path": "pandas/spouses.csv" + }, + "style-table.css": { + "path": "pandas/style-table.css" + } + }, + "title": "Pandas" + }, + "intro/pyglet": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017.", + "Ikonku hada vytvořil Martin Berube." + ], + "content": { + "path": "pyglet/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pyglet/index.md", + "title": "Grafika", + "vars": {} + } + }, + "source_file": "lessons/intro/pyglet/info.yml", + "static_files": { + "had.gif": { + "path": "pyglet/had.gif" + }, + "had.png": { + "path": "pyglet/had.png" + }, + "had2.png": { + "path": "pyglet/had2.png" + }, + "pong.py": { + "path": "pyglet/pong.py" + } + }, + "title": "Grafika" + }, + "intro/pyqt": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Petr Viktorin, Miro Hrončok a další, 2016-2017." + ], + "content": { + "path": "pyqt/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/pyqt/index.md", + "title": "GUI v Pythonu", + "vars": {} + } + }, + "source_file": "lessons/intro/pyqt/info.yml", + "static_files": { + "basic-screenshot.png": { + "path": "pyqt/basic-screenshot.png" + }, + "pics/README/index.md": { + "path": "pyqt/pics/README/index.md" + }, + "pics/arrows/down.svg": { + "path": "pyqt/pics/arrows/down.svg" + }, + "pics/arrows/left.svg": { + "path": "pyqt/pics/arrows/left.svg" + }, + "pics/arrows/right.svg": { + "path": "pyqt/pics/arrows/right.svg" + }, + "pics/arrows/up.svg": { + "path": "pyqt/pics/arrows/up.svg" + }, + "pics/castle.svg": { + "path": "pyqt/pics/castle.svg" + }, + "pics/dude1.svg": { + "path": "pyqt/pics/dude1.svg" + }, + "pics/dude2.svg": { + "path": "pyqt/pics/dude2.svg" + }, + "pics/dude3.svg": { + "path": "pyqt/pics/dude3.svg" + }, + "pics/dude4.svg": { + "path": "pyqt/pics/dude4.svg" + }, + "pics/dude5.svg": { + "path": "pyqt/pics/dude5.svg" + }, + "pics/fish.svg": { + "path": "pyqt/pics/fish.svg" + }, + "pics/fish2.svg": { + "path": "pyqt/pics/fish2.svg" + }, + "pics/grass.svg": { + "path": "pyqt/pics/grass.svg" + }, + "pics/lines/1.svg": { + "path": "pyqt/pics/lines/1.svg" + }, + "pics/lines/10.svg": { + "path": "pyqt/pics/lines/10.svg" + }, + "pics/lines/11.svg": { + "path": "pyqt/pics/lines/11.svg" + }, + "pics/lines/12.svg": { + "path": "pyqt/pics/lines/12.svg" + }, + "pics/lines/13.svg": { + "path": "pyqt/pics/lines/13.svg" + }, + "pics/lines/14.svg": { + "path": "pyqt/pics/lines/14.svg" + }, + "pics/lines/15.svg": { + "path": "pyqt/pics/lines/15.svg" + }, + "pics/lines/2.svg": { + "path": "pyqt/pics/lines/2.svg" + }, + "pics/lines/3.svg": { + "path": "pyqt/pics/lines/3.svg" + }, + "pics/lines/4.svg": { + "path": "pyqt/pics/lines/4.svg" + }, + "pics/lines/5.svg": { + "path": "pyqt/pics/lines/5.svg" + }, + "pics/lines/6.svg": { + "path": "pyqt/pics/lines/6.svg" + }, + "pics/lines/7.svg": { + "path": "pyqt/pics/lines/7.svg" + }, + "pics/lines/8.svg": { + "path": "pyqt/pics/lines/8.svg" + }, + "pics/lines/9.svg": { + "path": "pyqt/pics/lines/9.svg" + }, + "pics/shark.svg": { + "path": "pyqt/pics/shark.svg" + }, + "pics/wall.svg": { + "path": "pyqt/pics/wall.svg" + }, + "pics/wall2.svg": { + "path": "pyqt/pics/wall2.svg" + }, + "pics/water.svg": { + "path": "pyqt/pics/water.svg" + } + }, + "title": "GUI v Pythonu" + }, + "intro/requests": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "requests/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/requests/index.md", + "title": "Requests – Weboví klienti", + "vars": {} + } + }, + "source_file": "lessons/intro/requests/info.yml", + "static_files": {}, + "title": "Requests – Weboví klienti" + }, + "intro/testing": { + "pages": { + "index": { + "attribution": [ + "Pro kurz MI-PYT na ČVUT napsali Miro Hrončok, Petr Viktorin a další, 2016-2017." + ], + "content": { + "path": "testing/index.1.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/intro/testing/index.md", + "title": "Testování", + "vars": {} + } + }, + "source_file": "lessons/intro/testing/info.yml", + "static_files": {}, + "title": "Testování" + }, + "intro/turtle": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "turtle/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(100)\nleft(90)\nforward(50)\nleft(90)\nforward(100)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nleft(20)\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nleft(20)\n\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\nforward(50)\nleft(90)\n\nexitonclick()\n
    " + }, + { + "content": "

    Vypíšou se čísla od 0 do 4!\nProgram funguje steně, jako kdybys napsal/a:

    \n
    i = 0\nprint(i)\n\ni = 1\nprint(i)\n\ni = 2\nprint(i)\n\ni = 3\nprint(i)\n\ni = 4\nprint(i)\n

    V sekvenci range(5) jsou čísla 0, 1, 2, 3 a 4. Je jich celkem pět.

    " + }, + { + "content": "
    from turtle import forward, penup, pendown, exitonclick\n\nfor i in range(10):\n    forward(10)\n    penup()\n    forward(5)\n    pendown()\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, penup, pendown, left, exitonclick\n\nfor i in range(20):\n    forward(i)\n    penup()\n    forward(5)\n    pendown()\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, exitonclick\n\nfor i in range(4):\n    forward(50)\n    left(90)\n\nexitonclick()\n
    " + }, + { + "content": "
    from turtle import forward, left, right, speed, exitonclick\n\n# Třikrát:\nfor i in range(3):\n\n    # Nakresli čtverec (kód zkopírovaný z předchozí úlohy a odsazený)\n    for j in range(4):\n        forward(50)\n        left(90)\n\n    # Otoč se o 20°\n    left(20)\n\nexitonclick()\n
    " + } + ], + "source_file": "lessons/intro/turtle/index.md", + "title": "Želva a cykly", + "vars": {} + } + }, + "source_file": "lessons/intro/turtle/info.yml", + "static_files": { + "turtle-dashed.png": { + "path": "turtle/turtle-dashed.png" + }, + "turtle-dashed2.png": { + "path": "turtle/turtle-dashed2.png" + }, + "turtle-hexagons.png": { + "path": "turtle/turtle-hexagons.png" + }, + "turtle-rect.png": { + "path": "turtle/turtle-rect.png" + }, + "turtle-square.png": { + "path": "turtle/turtle-square.png" + }, + "turtle-squares.png": { + "path": "turtle/turtle-squares.png" + }, + "turtle-stairs.png": { + "path": "turtle/turtle-stairs.png" + } + }, + "title": "Želva a cykly" + }, + "meta/installing-naucse": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "installing-naucse/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/installing-naucse/index.md", + "title": "Lokální instalace Nauč se Python", + "vars": {} + } + }, + "source_file": "lessons/meta/installing-naucse/info.yml", + "static_files": {}, + "title": "Lokální instalace Nauč se Python" + }, + "meta/local-run": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "local-run/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/local-run/index.md", + "title": "Vytvoření lokálního kurzu", + "vars": {} + } + }, + "source_file": "lessons/meta/local-run/info.yml", + "static_files": { + "info.yml": { + "path": "local-run/info.yml" + } + }, + "title": "Vytvoření lokálního kurzu" + }, + "meta/submitting-a-run": { + "pages": { + "index": { + "attribution": [ + "Napsal Mikuláš Poul, 2018" + ], + "content": { + "path": "submitting-a-run/index.html" + }, + "license": "cc-by-sa-40", + "license_code": "cc0", + "slug": "index", + "solutions": [], + "source_file": "lessons/meta/submitting-a-run/index.md", + "title": "Přidání kurzu na Nauč se Python", + "vars": {} + } + }, + "source_file": "lessons/meta/submitting-a-run/info.yml", + "static_files": { + "naucse_fork.png": { + "path": "submitting-a-run/naucse_fork.png" + } + }, + "title": "Přidání kurzu na Nauč se Python" + }, + "micropython/mini-workshop": { + "pages": { + "index": { + "attribution": [ + "Napsal Petr Viktorin, 2017.", + "Ikonky textového editoru a terminálu jsou\nze sady Adwaita\nz GNOME Project.", + "Semafor je založen na\nanimaci\nod Matia na Wikipedii." + ], + "content": { + "path": "mini-workshop/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/micropython/mini-workshop/index.md", + "title": "Workshop MicroPythonu", + "vars": {} + }, + "organizers": { + "attribution": [ + "Napsal Petr Viktorin, 2017.", + "Ikonky textového editoru a terminálu jsou\nze sady Adwaita\nz GNOME Project.", + "Semafor je založen na\nanimaci\nod Matia na Wikipedii." + ], + "content": { + "path": "mini-workshop/organizers.html" + }, + "license": "cc-by-sa-40", + "slug": "organizers", + "solutions": [], + "source_file": "lessons/micropython/mini-workshop/organizers.md", + "title": "Pokyny pro organizátory", + "vars": {} + } + }, + "source_file": "lessons/micropython/mini-workshop/info.yml", + "static_files": { + "boot.py": { + "path": "mini-workshop/boot.py" + }, + "icon_gedit.png": { + "path": "mini-workshop/icon_gedit.png" + }, + "icon_terminal.png": { + "path": "mini-workshop/icon_terminal.png" + }, + "module_detail.jpg": { + "path": "mini-workshop/module_detail.jpg" + }, + "module_full.jpg": { + "path": "mini-workshop/module_full.jpg" + }, + "semafor.gif": { + "path": "mini-workshop/semafor.gif" + } + }, + "title": "Workshop MicroPythonu" + }, + "projects/asteroids": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "asteroids/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/projects/asteroids/index.md", + "title": "Asteroids", + "vars": {} + } + }, + "source_file": "lessons/projects/asteroids/info.yml", + "static_files": { + "screenshot.png": { + "path": "asteroids/screenshot.png" + } + }, + "title": "Asteroids" + }, + "projects/github-api": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2015-2017." + ], + "content": { + "path": "github-api/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/projects/github-api/index.md", + "title": "Github API", + "vars": {} + } + }, + "source_file": "lessons/projects/github-api/info.yml", + "static_files": {}, + "title": "Github API" + }, + "projects/pong": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Praha napsal Oskar Hollmann s použitím kódu Petra Viktorina, 2016." + ], + "content": { + "path": "pong/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    def vykresli():\n    ...\n    # Vykresleni micku\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        pozice_mice[0] + VELIKOST_MICE // 2,\n        pozice_mice[1] + VELIKOST_MICE // 2,\n    )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])]:\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            x + TLOUSTKA_PALKY,\n            y + DELKA_PALKY // 2,\n        )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            SIRKA // 2 + 1,\n            y + DELKA_PULICI_CARKY\n        )\n
    " + }, + { + "content": "
    def vykresli():\n    ...\n    # A nakonec vypiseme skore obou hracu\n    nakresli_text(\n        str(skore[0]),\n        x=ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='left',\n    )\n\n    nakresli_text(\n        str(skore[1]),\n        x=SIRKA - ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='right',\n    )\n
    " + }, + { + "content": "
    from pyglet.window import key\n...\ndef stisk_klavesy(symbol, modifikatory):\n    if symbol == key.W:\n        stisknute_klavesy.add(('nahoru', 0))\n    if symbol == key.S:\n        stisknute_klavesy.add(('dolu', 0))\n    if symbol == key.UP:\n        stisknute_klavesy.add(('nahoru', 1))\n    if symbol == key.DOWN:\n        stisknute_klavesy.add(('dolu', 1))\n\n\ndef pusteni_klavesy(symbol, modifikatory):\n    if symbol == key.W:\n        stisknute_klavesy.discard(('nahoru', 0))\n    if symbol == key.S:\n        stisknute_klavesy.discard(('dolu', 0))\n    if symbol == key.UP:\n        stisknute_klavesy.discard(('nahoru', 1))\n    if symbol == key.DOWN:\n        stisknute_klavesy.discard(('dolu', 1))\n...\n
    " + }, + { + "content": "
    import random\n...\ndef reset():\n    pozice_mice[0] = SIRKA // 2\n    pozice_mice[1] = VYSKA // 2\n\n    # x-ova rychlost - bud vpravo, nebo vlevo\n    if random.randint(0, 1):\n        rychlost_mice[0] = RYCHLOST\n    else:\n        rychlost_mice[0] = -RYCHLOST\n    # y-ova rychlost - uplne nahodna\n    rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST\n\n# nastavit vychozi stav pro start hry\nreset()\n
    " + } + ], + "source_file": "lessons/projects/pong/index.md", + "title": "Praktické cvičení: Pong", + "vars": {} + } + }, + "source_file": "lessons/projects/pong/info.yml", + "static_files": { + "pong.png": { + "path": "pong/pong.png" + } + }, + "title": "Praktické cvičení: Pong" + }, + "projects/snake": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Ostrava napsal Lumr Balhar, 2018." + ], + "content": { + "path": "snake/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from pathlib import Path\n\nimport pyglet\n\nTILES_DIRECTORY = Path('snake-tiles')\n\nsnake_tiles = {}\nfor path in TILES_DIRECTORY.glob('*.png'):\n    snake_tiles[path.stem] = pyglet.image.load(path)\n\nprint(snake_tiles)\n
    " + } + ], + "source_file": "lessons/projects/snake/index.md", + "title": "Snake", + "vars": {} + } + }, + "source_file": "lessons/projects/snake/info.yml", + "static_files": { + "apple.png": { + "path": "snake/apple.png" + }, + "coords.svg": { + "path": "snake/coords.svg" + }, + "green.png": { + "path": "snake/green.png" + }, + "screenshot-cat.png": { + "path": "snake/screenshot-cat.png" + }, + "screenshot-final.png": { + "path": "snake/screenshot-final.png" + }, + "snake-tiles.png": { + "path": "snake/snake-tiles.png" + }, + "snake-tiles.zip": { + "path": "snake/snake-tiles.zip" + } + }, + "title": "Snake" + }, + "snake/drawing": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsal Petr Viktorin, 2018." + ], + "content": { + "path": "drawing/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    import pyglet\n\nTILE_SIZE = 64\ngreen_image = pyglet.image.load('green.png')\n\nwindow = pyglet.window.Window()\n\n@window.event\ndef on_draw():\n    window.clear()\n    green_image.blit(4 * TILE_SIZE, 5 * TILE_SIZE,\n                     width=TILE_SIZE, height=TILE_SIZE)\n\npyglet.app.run()\n
    " + }, + { + "content": "
    import pyglet\n\nTILE_SIZE = 64\n\nsnake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]\n\ngreen_image = pyglet.image.load('green.png')\n\nwindow = pyglet.window.Window()\n\n@window.event\ndef on_draw():\n    window.clear()\n    for x, y in snake:\n        green_image.blit(x * TILE_SIZE, y * TILE_SIZE,\n                        width=TILE_SIZE, height=TILE_SIZE)\n\npyglet.app.run()\n
    " + }, + { + "content": "
    import pyglet\n\nTILE_SIZE = 64\n\nsnake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]\nfood = [(2, 0), (5, 1), (1, 4)]\n\nred_image = pyglet.image.load('apple.png')\ngreen_image = pyglet.image.load('green.png')\n\nwindow = pyglet.window.Window()\n\n@window.event\ndef on_draw():\n    window.clear()\n    for x, y in snake:\n        green_image.blit(x * TILE_SIZE, y * TILE_SIZE,\n                        width=TILE_SIZE, height=TILE_SIZE)\n    for x, y in food:\n        red_image.blit(x * TILE_SIZE, y * TILE_SIZE,\n                        width=TILE_SIZE, height=TILE_SIZE)\n\npyglet.app.run()\n
    " + }, + { + "content": "
    from pathlib import Path\n\nimport pyglet\n\nTILES_DIRECTORY = Path('snake-tiles')\n\nsnake_tiles = {}\nfor path in TILES_DIRECTORY.glob('*.png'):\n    snake_tiles[path.stem] = pyglet.image.load(path)\n\nprint(snake_tiles)\n
    " + }, + { + "content": "
    from pathlib import Path\n\nimport pyglet\n\nTILE_SIZE = 64\nTILES_DIRECTORY = Path('snake-tiles')\n\nsnake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]\nfood = [(2, 0), (5, 1), (1, 4)]\n\nred_image = pyglet.image.load('apple.png')\nsnake_tiles = {}\nfor path in TILES_DIRECTORY.glob('*.png'):\n    snake_tiles[path.stem] = pyglet.image.load(path)\n\nwindow = pyglet.window.Window()\n\n@window.event\ndef on_draw():\n    window.clear()\n    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)\n    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)\n    for x, y in snake:\n        snake_tiles['tail-head'].blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n    for x, y in food:\n        red_image.blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n\npyglet.app.run()\n
    " + } + ], + "source_file": "lessons/snake/drawing/index.md", + "title": "Kreslení hada", + "vars": {} + } + }, + "source_file": "lessons/snake/drawing/info.yml", + "static_files": { + "apple.png": { + "path": "drawing/apple.png" + }, + "caterpillar.png": { + "path": "drawing/caterpillar.png" + }, + "coords-blocks.svg": { + "path": "drawing/coords-blocks.svg" + }, + "coords-px.svg": { + "path": "drawing/coords-px.svg" + }, + "coords.svg": { + "path": "drawing/coords.svg" + }, + "green.png": { + "path": "drawing/green.png" + }, + "red.png": { + "path": "drawing/red.png" + }, + "screenshot-dir.png": { + "path": "drawing/screenshot-dir.png" + }, + "screenshot-finished.png": { + "path": "drawing/screenshot-finished.png" + }, + "screenshot-initial.png": { + "path": "drawing/screenshot-initial.png" + }, + "snake-tiles.png": { + "path": "drawing/snake-tiles.png" + }, + "snake-tiles.zip": { + "path": "drawing/snake-tiles.zip" + }, + "snake-tiles/bottom-bottom.png": { + "path": "drawing/snake-tiles/bottom-bottom.png" + }, + "snake-tiles/bottom-dead.png": { + "path": "drawing/snake-tiles/bottom-dead.png" + }, + "snake-tiles/bottom-head.png": { + "path": "drawing/snake-tiles/bottom-head.png" + }, + "snake-tiles/bottom-left.png": { + "path": "drawing/snake-tiles/bottom-left.png" + }, + "snake-tiles/bottom-right.png": { + "path": "drawing/snake-tiles/bottom-right.png" + }, + "snake-tiles/bottom-tongue.png": { + "path": "drawing/snake-tiles/bottom-tongue.png" + }, + "snake-tiles/bottom-top.png": { + "path": "drawing/snake-tiles/bottom-top.png" + }, + "snake-tiles/left-bottom.png": { + "path": "drawing/snake-tiles/left-bottom.png" + }, + "snake-tiles/left-dead.png": { + "path": "drawing/snake-tiles/left-dead.png" + }, + "snake-tiles/left-head.png": { + "path": "drawing/snake-tiles/left-head.png" + }, + "snake-tiles/left-left.png": { + "path": "drawing/snake-tiles/left-left.png" + }, + "snake-tiles/left-right.png": { + "path": "drawing/snake-tiles/left-right.png" + }, + "snake-tiles/left-tongue.png": { + "path": "drawing/snake-tiles/left-tongue.png" + }, + "snake-tiles/left-top.png": { + "path": "drawing/snake-tiles/left-top.png" + }, + "snake-tiles/right-bottom.png": { + "path": "drawing/snake-tiles/right-bottom.png" + }, + "snake-tiles/right-dead.png": { + "path": "drawing/snake-tiles/right-dead.png" + }, + "snake-tiles/right-head.png": { + "path": "drawing/snake-tiles/right-head.png" + }, + "snake-tiles/right-left.png": { + "path": "drawing/snake-tiles/right-left.png" + }, + "snake-tiles/right-right.png": { + "path": "drawing/snake-tiles/right-right.png" + }, + "snake-tiles/right-tongue.png": { + "path": "drawing/snake-tiles/right-tongue.png" + }, + "snake-tiles/right-top.png": { + "path": "drawing/snake-tiles/right-top.png" + }, + "snake-tiles/tail-bottom.png": { + "path": "drawing/snake-tiles/tail-bottom.png" + }, + "snake-tiles/tail-dead.png": { + "path": "drawing/snake-tiles/tail-dead.png" + }, + "snake-tiles/tail-head.png": { + "path": "drawing/snake-tiles/tail-head.png" + }, + "snake-tiles/tail-left.png": { + "path": "drawing/snake-tiles/tail-left.png" + }, + "snake-tiles/tail-right.png": { + "path": "drawing/snake-tiles/tail-right.png" + }, + "snake-tiles/tail-tongue.png": { + "path": "drawing/snake-tiles/tail-tongue.png" + }, + "snake-tiles/tail-top.png": { + "path": "drawing/snake-tiles/tail-top.png" + }, + "snake-tiles/top-bottom.png": { + "path": "drawing/snake-tiles/top-bottom.png" + }, + "snake-tiles/top-dead.png": { + "path": "drawing/snake-tiles/top-dead.png" + }, + "snake-tiles/top-head.png": { + "path": "drawing/snake-tiles/top-head.png" + }, + "snake-tiles/top-left.png": { + "path": "drawing/snake-tiles/top-left.png" + }, + "snake-tiles/top-right.png": { + "path": "drawing/snake-tiles/top-right.png" + }, + "snake-tiles/top-tongue.png": { + "path": "drawing/snake-tiles/top-tongue.png" + }, + "snake-tiles/top-top.png": { + "path": "drawing/snake-tiles/top-top.png" + } + }, + "title": "Kreslení hada" + }, + "snake/logic": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies CZ napsal Petr Viktorin, 2018." + ], + "content": { + "path": "logic/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [ + { + "content": "
    from pathlib import Path\n\nimport pyglet\n\nfrom had import State\n\nTILE_SIZE = 64\nTILES_DIRECTORY = Path('snake-tiles')\n\nred_image = pyglet.image.load('apple.png')\nsnake_tiles = {}\nfor path in TILES_DIRECTORY.glob('*.png'):\n    snake_tiles[path.stem] = pyglet.image.load(path)\n\nwindow = pyglet.window.Window()\n\nstate = State()\n\n@window.event\ndef on_draw():\n    window.clear()\n    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)\n    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)\n    for x, y in state.snake:\n        source = 'tail'     # (Tady případně je nějaké\n        dest = 'head'       #  složitější vybírání políčka)\n        snake_tiles[source + '-' + dest].blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n    for x, y in state.food:\n        red_image.blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n\ndef move(dt):\n    state.move()\n\npyglet.clock.schedule_interval(move, 1/6)\n\npyglet.app.run()\n
    " + }, + { + "content": "

    Ve funkci move je potřeba jinak nastavit proměnné new_x a new_y:

    \n
            new_x = old_x\n        new_y = old_y + 1\n
    " + }, + { + "content": "
            new_x = old_x\n        new_y = old_y - 1\n
    " + }, + { + "content": "
        def move(self):\n        old_x, old_y = self.snake[-1]\n        dir_x, dir_y = self.snake_direction\n        new_x = old_x + dir_x\n        new_y = old_y + dir_y\n\n        # Kontrola vylezení z hrací plochy\n        if new_x < 0:\n            exit('GAME OVER')\n        if new_y < 0:\n            exit('GAME OVER')\n        if new_x >= self.width:\n            exit('GAME OVER')\n        if new_y >= self.height:\n            exit('GAME OVER')\n\n        new_head = new_x, new_y\n        self.snake.append(new_head)\n        del self.snake[0]\n
    " + }, + { + "content": "
            # Kontrola vylezení z hrací plochy\n        if new_x < 0:\n            new_x = self.width - 1\n        if new_y < 0:\n            new_y = self.height - 1\n        if new_x >= self.width:\n            new_x = 0\n        if new_y >= self.height:\n            new_y = 0\n
    " + }, + { + "content": "

    Do metody move, kamkoli za řádek který nastavuje new_head.

    " + }, + { + "content": "
        def move(self):\n        old_x, old_y = self.snake[-1]\n        dir_x, dir_y = self.snake_direction\n        new_x = old_x + dir_x\n        new_y = old_y + dir_y\n\n        # Kontrola vylezení z hrací plochy\n        new_x = new_x % self.width\n        new_y = new_y % self.height\n\n        new_head = new_x, new_y\n        self.snake.append(new_head)\n        if new_head in self.food:\n            self.food.remove(new_head)\n        else:\n            del self.snake[0]\n
    " + }, + { + "content": "
        def add_food(self):\n        x = random.randrange(self.width)\n        y = random.randrange(self.height)\n        position = x, y\n        self.food.append(position)\n
    " + }, + { + "content": "

    V metodě __init__ se dá místo nastavení self.food na seznam s pozicemi\njídla napsat:

    \n
            self.food = []\n        self.add_food()\n        self.add_food()\n

    Pak budou na začátku hry na hada čekat dvě náhodné jídla.

    " + }, + { + "content": "

    Kód patří do metody move, hned za nastavení proměnné new_head.

    " + }, + { + "content": "
      \n
    • „Prvotní nastavení atributu“ do metody __init__.
    • \n
    • „Kontrola, jestli had narazil“ do move místo původní kontroly,\nkdy se hra ukončila pomocí exit().
    • \n
    • „Zabránění pohybu“ na úplný začátek metody move (příkaz return\nokamžitě ukončí provádění metody).
    • \n
    • „Grafická indikace“ do ui.py, za sekci pro vybírání obrázku pro kousek\nhada.
    • \n
    " + }, + { + "content": "

    had.py:

    \n
    import random\n\nclass State:\n    def __init__(self):\n        self.food = []\n        self.add_food()\n        self.add_food()\n        self.snake = [(0, 0), (1, 0)]\n        self.snake_direction = 0, 1\n        self.width = 10\n        self.height = 10\n        self.snake_alive = True\n        self.queued_directions = []\n\n    def move(self):\n        if self.queued_directions:\n            new_direction = self.queued_directions[0]\n            del self.queued_directions[0]\n            old_x, old_y = self.snake_direction\n            new_x, new_y = new_direction\n            if (old_x, old_y) != (-new_x, -new_y):\n                self.snake_direction = new_direction\n\n        if not self.snake_alive:\n            return\n\n        old_x, old_y = self.snake[-1]\n        dir_x, dir_y = self.snake_direction\n        new_x = old_x + dir_x\n        new_y = old_y + dir_y\n\n        new_x = new_x % self.width\n        new_y = new_y % self.height\n\n        new_head = new_x, new_y\n        if new_head in self.snake:\n            self.snake_alive = False\n        self.snake.append(new_head)\n\n        if new_head in self.food:\n            self.food.remove(new_head)\n            self.add_food()\n        else:\n            del self.snake[0]\n\n    def add_food(self):\n        for try_number in range(100):\n            x = random.randrange(self.width)\n            y = random.randrange(self.height)\n            position = x, y\n            if (position not in self.snake) and (position not in self.food):\n                self.food.append(position)\n                return\n

    ui.py:

    \n
    from pathlib import Path\n\nimport pyglet\n\nfrom had import State\n\nTILE_SIZE = 64\nTILES_DIRECTORY = Path('snake-tiles')\n\nred_image = pyglet.image.load('apple.png')\nsnake_tiles = {}\nfor path in TILES_DIRECTORY.glob('*.png'):\n    snake_tiles[path.stem] = pyglet.image.load(path)\n\nwindow = pyglet.window.Window()\n\nstate = State()\nstate.width = window.width // TILE_SIZE\nstate.height = window.height // TILE_SIZE\n\n\n@window.event\ndef on_draw():\n    window.clear()\n    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)\n    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)\n    for x, y in state.snake:\n        source = 'tail'     # (Tady případně je nějaké\n        dest = 'head'       #  složitější vybírání políčka)\n        if dest == 'head' and not state.snake_alive:\n            dest = 'dead'\n        snake_tiles[source + '-' + dest].blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n    for x, y in state.food:\n        red_image.blit(\n            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)\n\n\n@window.event\ndef on_key_press(symbol, mod):\n    if symbol == pyglet.window.key.LEFT:\n        new_direction = -1, 0\n    if symbol == pyglet.window.key.RIGHT:\n        new_direction = 1, 0\n    if symbol == pyglet.window.key.DOWN:\n        new_direction = 0, -1\n    if symbol == pyglet.window.key.UP:\n        new_direction = 0, 1\n    state.queued_directions.append(new_direction)\n\n\ndef move(dt):\n    state.move()\n\n\npyglet.clock.schedule_interval(move, 1/6)\n\npyglet.app.run()\n
    " + } + ], + "source_file": "lessons/snake/logic/index.md", + "title": "Had – Logika hry", + "vars": {} + } + }, + "source_file": "lessons/snake/logic/info.yml", + "static_files": {}, + "title": "Had – Logika hry" + } + }, + "long_description": "

    Seznam udržovaných lekcí bez ladu a skladu.

    \n

    Jednotlivé kurzy jsou poskládané z těchto materiálů\n(a doplněné jinými).

    ", + "sessions": [ + { + "materials": [ + { + "lesson_slug": "advanced/generators", + "title": "Generátory", + "type": "lesson" + } + ], + "serial": "1", + "slug": "advanced", + "source_file": "lessons", + "title": "`advanced`" + }, + { + "materials": [ + { + "lesson_slug": "beginners/and-or", + "title": "Nebo anebo a", + "type": "lesson" + }, + { + "lesson_slug": "beginners/basic-functions", + "title": "Užitečné funkce", + "type": "lesson" + }, + { + "lesson_slug": "beginners/circular-imports", + "title": "Cyklické importy", + "type": "lesson" + }, + { + "lesson_slug": "beginners/class", + "title": "Třídy", + "type": "lesson" + }, + { + "lesson_slug": "beginners/cmdline", + "title": "Úvod do příkazové řádky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/comparisons", + "title": "Porovnávání", + "type": "lesson" + }, + { + "lesson_slug": "beginners/def", + "title": "Definice funkcí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/dict", + "title": "Slovníky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/exceptions", + "title": "Výjimky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/expressions", + "title": "Vyhodnocování výrazů", + "type": "lesson" + }, + { + "lesson_slug": "beginners/files", + "title": "Soubory", + "type": "lesson" + }, + { + "lesson_slug": "beginners/first-steps", + "title": "První krůčky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/fstring", + "title": "Šablony (formátovací řetězce)", + "type": "lesson" + }, + { + "lesson_slug": "beginners/functions", + "title": "Funkce", + "type": "lesson" + }, + { + "lesson_slug": "beginners/hello-world", + "title": "První program", + "type": "lesson" + }, + { + "lesson_slug": "beginners/inheritance", + "title": "Dědičnost", + "type": "lesson" + }, + { + "lesson_slug": "beginners/install", + "title": "Instalace Pythonu", + "type": "lesson" + }, + { + "lesson_slug": "beginners/install-editor", + "title": "Instalace editoru", + "type": "lesson" + }, + { + "lesson_slug": "beginners/list", + "title": "Seznamy", + "type": "lesson" + }, + { + "lesson_slug": "beginners/local-variables", + "title": "Lokální proměnné", + "type": "lesson" + }, + { + "lesson_slug": "beginners/micropython", + "title": "MicroPython", + "type": "lesson" + }, + { + "lesson_slug": "beginners/modules", + "title": "Moduly", + "type": "lesson" + }, + { + "lesson_slug": "beginners/nested-traceback", + "title": "Chybové hlášky ze zanořených funkcí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/print", + "title": "Print a chybové hlášky", + "type": "lesson" + }, + { + "lesson_slug": "beginners/reassignment", + "title": "Přepisování proměnných", + "type": "lesson" + }, + { + "lesson_slug": "beginners/recursion", + "title": "Rekurze", + "type": "lesson" + }, + { + "lesson_slug": "beginners/str", + "title": "Zápis řetězců", + "type": "lesson" + }, + { + "lesson_slug": "beginners/str-index-slice", + "title": "Výběr z řetězců", + "type": "lesson" + }, + { + "lesson_slug": "beginners/str-methods", + "title": "Řetězcové funkce a metody", + "type": "lesson" + }, + { + "lesson_slug": "beginners/testing", + "title": "Testování", + "type": "lesson" + }, + { + "lesson_slug": "beginners/tuple", + "title": "N-tice", + "type": "lesson" + }, + { + "lesson_slug": "beginners/variables", + "title": "Proměnné", + "type": "lesson" + }, + { + "lesson_slug": "beginners/venv-setup", + "title": "Nastavení prostředí", + "type": "lesson" + }, + { + "lesson_slug": "beginners/while", + "title": "Cyklus While", + "type": "lesson" + } + ], + "serial": "2", + "slug": "beginners", + "source_file": "lessons", + "title": "`beginners`" + }, + { + "materials": [ + { + "lesson_slug": "fast-track/http", + "title": "HTTP – Jak funguje Internet", + "type": "lesson" + }, + { + "lesson_slug": "fast-track/install", + "title": "Vytvoření virtuáního prostředí", + "type": "lesson" + } + ], + "serial": "3", + "slug": "fast-track", + "source_file": "lessons", + "title": "`fast-track`" + }, + { + "materials": [ + { + "lesson_slug": "git/basics", + "title": "Git", + "type": "lesson" + }, + { + "lesson_slug": "git/branching", + "title": "Větvení v Gitu", + "type": "lesson" + }, + { + "lesson_slug": "git/collaboration", + "title": "Spolupráce a Open source", + "type": "lesson" + }, + { + "lesson_slug": "git/git-collaboration-2in1", + "title": "Spolupráce a Git", + "type": "lesson" + }, + { + "lesson_slug": "git/ignoring", + "title": "Ignorování souborů", + "type": "lesson" + }, + { + "lesson_slug": "git/install", + "title": "Instalace Gitu", + "type": "lesson" + } + ], + "serial": "4", + "slug": "git", + "source_file": "lessons", + "title": "`git`" + }, + { + "materials": [ + { + "lesson_slug": "intro/async", + "title": "AsyncIO", + "type": "lesson" + }, + { + "lesson_slug": "intro/click", + "title": "Click – Rozhraní pro příkazovou řádku", + "type": "lesson" + }, + { + "lesson_slug": "intro/cython", + "title": "Cython", + "type": "lesson" + }, + { + "lesson_slug": "intro/decorators", + "title": "Dekorátory", + "type": "lesson" + }, + { + "lesson_slug": "intro/deployment", + "title": "Deployment webových aplikací", + "type": "lesson" + }, + { + "lesson_slug": "intro/distribution", + "title": "Moduly", + "type": "lesson" + }, + { + "lesson_slug": "intro/docs", + "title": "Dokumentace", + "type": "lesson" + }, + { + "lesson_slug": "intro/flask", + "title": "Flask", + "type": "lesson" + }, + { + "lesson_slug": "intro/json", + "title": "JSON", + "type": "lesson" + }, + { + "lesson_slug": "intro/magic", + "title": "Magie", + "type": "lesson" + }, + { + "lesson_slug": "intro/micropython", + "title": "MicroPython", + "type": "lesson" + }, + { + "lesson_slug": "intro/mypy", + "title": "Mypy — statická typová kontrola pro Python", + "type": "lesson" + }, + { + "lesson_slug": "intro/notebook", + "title": "Notebook", + "type": "lesson" + }, + { + "lesson_slug": "intro/numpy", + "title": "NumPy", + "type": "lesson" + }, + { + "lesson_slug": "intro/pandas", + "title": "Pandas", + "type": "lesson" + }, + { + "lesson_slug": "intro/pyglet", + "title": "Grafika", + "type": "lesson" + }, + { + "lesson_slug": "intro/pyqt", + "title": "GUI v Pythonu", + "type": "lesson" + }, + { + "lesson_slug": "intro/requests", + "title": "Requests – Weboví klienti", + "type": "lesson" + }, + { + "lesson_slug": "intro/testing", + "title": "Testování", + "type": "lesson" + }, + { + "lesson_slug": "intro/turtle", + "title": "Želva a cykly", + "type": "lesson" + } + ], + "serial": "5", + "slug": "intro", + "source_file": "lessons", + "title": "`intro`" + }, + { + "materials": [ + { + "lesson_slug": "meta/installing-naucse", + "title": "Lokální instalace Nauč se Python", + "type": "lesson" + }, + { + "lesson_slug": "meta/local-run", + "title": "Vytvoření lokálního kurzu", + "type": "lesson" + }, + { + "lesson_slug": "meta/submitting-a-run", + "title": "Přidání kurzu na Nauč se Python", + "type": "lesson" + } + ], + "serial": "6", + "slug": "meta", + "source_file": "lessons", + "title": "`meta`" + }, + { + "materials": [ + { + "lesson_slug": "micropython/mini-workshop", + "title": "Workshop MicroPythonu", + "type": "lesson" + } + ], + "serial": "7", + "slug": "micropython", + "source_file": "lessons", + "title": "`micropython`" + }, + { + "materials": [ + { + "lesson_slug": "projects/asteroids", + "title": "Asteroids", + "type": "lesson" + }, + { + "lesson_slug": "projects/github-api", + "title": "Github API", + "type": "lesson" + }, + { + "lesson_slug": "projects/pong", + "title": "Praktické cvičení: Pong", + "type": "lesson" + }, + { + "lesson_slug": "projects/snake", + "title": "Snake", + "type": "lesson" + } + ], + "serial": "8", + "slug": "projects", + "source_file": "lessons", + "title": "`projects`" + }, + { + "materials": [ + { + "lesson_slug": "snake/drawing", + "title": "Kreslení hada", + "type": "lesson" + }, + { + "lesson_slug": "snake/logic", + "title": "Had – Logika hry", + "type": "lesson" + } + ], + "serial": "9", + "slug": "snake", + "source_file": "lessons", + "title": "`snake`" + } + ], + "source_file": "lessons", + "title": "Kanonické lekce" + } +} \ No newline at end of file diff --git a/lessons/cython/index.html b/lessons/cython/index.html new file mode 100644 index 00000000..13bfa81f --- /dev/null +++ b/lessons/cython/index.html @@ -0,0 +1,590 @@ +

    Dnes budeme potřebovat do virtuálního prostředí nainstalovat tyto knihovny:

    +
    $ python -m pip install --upgrade pip
    +$ python -m pip install notebook numpy cython pytest pytest-profiling
    +

    Také je potřeba nainstalovat překladač jazyka C +a hlavičkové soubory Pythonu:

    +
      +
    • Na Linuxu bude stačit nainstalovat balíčky gcc +a python3-devel (Fedora) nebo python3-dev (Ubuntu/Debian).
    • +
    • Na Windows se řiďte instrukcemi pro vaši verzi Pythonu +na Python wiki.
    • +
    +
    +

    C API

    +

    Mluvíme-li o „Pythonu“, máme často na mysli jak jazyk samotný, tak i interpret, +program, který programy v tomto jazyce umí spouštět. +Správně je ale „Python“ pouze jméno jazyka. +Interpretů tohoto jazyka je více, například:

    +
      +
    • CPython, referenční implementace napsaná v C; interpret, který spouštíme příkazem python3
    • +
    • PyPy, implementace zaměřená na rychlost, napsaná v Pythonu
    • +
    • MicroPython, implementace pro mikroprocesory a zařízení s minimem paměti
    • +
    • Jython, implementace napsaná v Javě, která umožňuje využívat javovské třídy
    • +
    • IronPython, napsaný v C#, s integrací do .NET
    • +
    • Batavia, Brython, pyjs – různé pokusy o integraci do JavaScriptu
    • +
    +

    Jednotlivé interprety se liší v detailech jako jsou přesnost reálných čísel, +vypisování chybových hlášek, řazení záznamů ve slovnících nebo přístup +k interním strukturám interpretu. +Správně napsaný pythonní program by neměl na takových detailech záviset, pokud +není k nekompatibilitě mezi interprety dobrý důvod.

    +

    Někdy to ale je potřeba, a dnešní přednáška bude specifická pro CPython +a přímé využití jeho API pro jazyk C.

    +

    Rychlost

    +

    Častý důvod proč sáhnout k C API je rychlost: CPython je celkem pomalý. +Tradiční metoda optimalizace je zjistit, které části jsou kritické, a přepsat +je do C. +Využijí se tak výhody obou jazyků: Python pro rychlý vývoj, snadné +prototypování a přehlednost kódu, a C pro rychlost.

    +

    Když je náš program příliš pomalý, je potřeba ho optimalizovat. +První krok k tomu je vždy zkontrolovat, co zabírá více času, než by mělo. +K tomu se dá použít nástroj profile ze standardní knihovny, který vypíše +tabulku počtu volání jednotlivých funkcí a času v nich stráveného:

    +
    $ python -m profile -s cumtime program.py
    +

    Profilovat běh pytest testů se dá jednoduše pomocí modulu pytest-profiling:

    +
    $ python -m pip install pytest-profiling
    +$ python -m pytest --profile
    +

    Když máme představu o tom, co nás brzdí, můžeme začít přepisovat do C způsoby +popsanými níže.

    +

    Jiná možnost, jak program zrychlit, je ho pustit, tak jak je, pod interpretem +PyPy, který obsahuje optimalizovaný překladač. To je ale jiná kapitola.

    +

    Externí knihovny

    +

    Druhý důvod, proč programátoři používají C API, je použití knihoven, které mají +rozhraní pro C. +Takových knihoven existuje mnoho – pokud není něco specifické pro určitý jazyk, +často se to dá volat i z C.

    +

    Pro práci s externími knihovnami se dá použít C API nebo vestavěný modul +ctypes, ale v dnešní době je dobré místo toho použít CFFI, knihovnu +která funguje i s PyPy (a teoreticky jinými implementacemi).

    +

    CPython

    +

    Třetí důvod, proč použít C API, je práce s CPythonem samotným. +Když člověk zabředne do složitého problému, může na CPython pustit C debugger +jako gdb nebo Valgrind, prozkoumat potíže na nižší úrovni +a zjistit, kde přesně se chyba nachází.

    +

    Modul v C

    +

    Pojďme začít příkladem. +Vytvořte si následující soubor, který implementuje rozšíření +(importovatelný modul) s jednou funkcí.

    +

    (Nebudeme chtít, abyste podobný kód uměli napsat, ale měli byste být schopní +porozumět tomu, co dělá.)

    +

    demo.c:

    +
    #include <Python.h>
    +
    +PyDoc_STRVAR(
    +    mod_docstring, 
    +    "Demo extension module with a Python wrapper for the system(3) function");
    +
    +static PyObject *demo_system(PyObject *self, PyObject *args){
    +    const char *command;
    +    int retval;
    +
    +    /* Parse the given arguments: expect one string, convert to char* */
    +    if (!PyArg_ParseTuple(args, "s", &command)) {
    +        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
    +        return NULL;
    +    }
    +
    +    /* Call the C function */
    +    retval = system(command);
    +
    +    /* Return result as Python int (error handling built in) */
    +    return PyLong_FromLong(retval);
    +}
    +
    +/* List of all methods in the module */
    +static PyMethodDef DemoMethods[] = {
    +    {"system",  demo_system, METH_VARARGS,
    +            PyDoc_STR("Execute a shell command.")},
    +    {NULL, NULL, 0, NULL}        /* Sentinel */
    +};
    +
    +/* Module specification */
    +static struct PyModuleDef demo_module = {
    +   PyModuleDef_HEAD_INIT,
    +   "demo",          /* name of module */
    +   mod_docstring,   /* dosctring (may be NULL) */
    +   0,               /* size of per-interpreter state of the module */
    +   DemoMethods,     /* list of methods */
    +};
    +
    +
    +/* Module entrypoint */
    +PyMODINIT_FUNC
    +PyInit_demo(void)
    +{
    +    return PyModuleDef_Init(&demo_module);
    +}
    +

    Z tohoto souboru by měla být patrná struktura podobných rozšíření: +máme funkci (demo_system), která převádí objekty Pythonu +na datové typy C, volá samotnou funkci a výsledek převádí zpět na pythonní +objekt.

    +

    Dále máme pole záznamů o funkcích (DemoMethods), kde je ke každé funkci +přiřazeno jméno, dokumentační řetězec a způsob volání (v našem případě +METH_VARARGS, tedy volání s proměnným počtem nepojmenovaných argumentů, +podobně jako bychom v Pythonu napsali def system(*args)).

    +

    Další potřebná proměnná, demo_module, obsahuje informace o modulu: +jméno, dokumentační řetězec a seznam funkcí. +Kdybychom potřebovali kromě funkcí definovat i třídy nebo konstanty, +zde bychom pomocí slotů definovali funkci, která modul +inicializuje, t.j. má podobnou funkci jako __init__ u třídy v Pythonu.

    +

    Poslední část je funkce PyInit, jediná která není definována jako static, +takže jediná, která je exportována jako API knihovny, kterou vytváříme. +Až bude Python tento modul importovat, najde tuto funkci podle jména, spustí ji +a podle vrácené struktury typu PyModuleDef vytvoří pythonní objekt s modulem.

    +

    Překlad

    +

    Abychom mohli takovýto modul naimportovat, musíme ho nejdřív přeložit a sestavit +z něj sdílenou knihovnu – soubor .so (nebo .dll) – s názvem modulu: +buď jen demo.so, nebo i s identifikací architektury a verze Pythonu, +např. demo.cpython-35m-x86_64-linux-gnu.so. +(Výhoda delších názvů je v tom, že v jednom adresáři může být víc modulů pro +různé architektury a že se Python nebude snažit načíst nekompatibilní moduly.)

    +

    Překlad je nutné provést se správnými přepínači a volbami, nejlépe takovými, +s jakými byl sestaven samotný Python.

    +

    Pro zjednodušení tohoto procesu můžeme použít setuptools: do nám už známého +souboru setup.py přidáme argument ext_modules se seznamem rozšiřovacích modulů. +Podrobný popis třídy Extension je v dokumentaci; nám bude stačit +jen jméno a seznam zdrojových souborů:

    +

    setup.py:

    +
    from setuptools import setup, Extension
    +
    +module1 = Extension(
    +    'demo',
    +    sources=['demo.c'],
    +)
    +
    +setup(
    +    name = 'demo',
    +    version = '0.1',
    +    description = 'Demo package',
    +    ext_modules = [module1]
    +)
    +

    Příkazy python setup.py sdist a python setup.py install budou fungovat jako normálně, +jen je na instalaci potřeba překladač jazyka C.

    +

    Aby uživatelé překladač mít nemuseli, můžeme nainstalovat knihovnu wheel (python -m pip install wheel) a pak příkazem python setup.py bdist_wheel vygenerovat tzv. wheel archiv, +např. dist/demo-0.1-cp35-cp35m-linux_x86_64.whl. Tento archiv jde nahrát na PyPI a následně +nainstalovat, ovšem jen na architektuře a verzi Pythonu, pro které byl vytvořen.

    +

    Existuje způsob, jak vytvořit co nejvíce platformě nezávislý linuxový wheel. +Jedná se o platformu nazvanou manulinux1, což je ve zkratce velmi stará verze +Linuxu (CentOS 5), na které se wheely vytvoří, aby šly použít na různých +novějších i relativně starých distribucích. Pro tvorbu wheelů se používá +Docker obraz manylinux, +vývojáři samozřejmě nepoužívají pro vývoj CentOS 5 (tedy většina ne).

    +

    Zajímavým nástrojem, který stojí za zmínku, je cibuildwheel. +Zjednodušuje tvorbu wheelů pro Linux, macOS i Windows pomocí +CI služeb Travis CI a AppVeyor.

    +

    Wheels jdou vytvářet i pro moduly tvořené jen pythonním kódem. +Nejsou pak vázané na verzi a architekturu. +Jejich výhoda oproti sdist archivům spočívá v tom, že se rychleji instalují.

    +

    Alternativa k instalaci, alespoň pro lokální vývoj, je rozšíření jen přeložit a dát do +aktuálního adresáře (nebo jakéhokoli jiného adresáře, odkud se importují moduly). +K tomu slouží příkaz python setup.py build_ext --inplace. +Pozor na to, že po každé změně zdrojového kódu je potřeba rozšíření znovu přeložit.

    +

    Příkaz python setup.py develop bude fungovat jako dřív (používá build_ext --inplace), +jen je opět potřeba příkaz po každé změně znovu spustit.

    +

    PyObject

    +

    Podívejme se teď na základní mechanismy interpretu CPython.

    +

    Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject +(dokumentace, +definice). +Skládá se ze dvou prvků:

    +
    typedef struct _object {
    +    Py_ssize_t ob_refcnt;
    +    struct _typeobject *ob_type;
    +} PyObject;
    +

    První je počet referencí (reference count), který se dá popsat jako počet míst, +ze kterých je možné k tomuto objektu přistoupit. +Když objekt uložíme do proměnné nebo do seznamu, zvýší se počet referencí o 1. +Když seznam nebo proměnná zanikne (nebo náš objekt přepíšeme jiným), +počet referencí se zase sníží. +Když počet referencí dosáhne nuly, znamená to, že se k objektu už nedá dostat a Python ho +uvolní z paměti.

    +

    Druhý prvek struktury PyObject je ukazatel na typ. +Typ je pythonní objekt (class), který definuje chování třídy objektů: operátory, +atributy a metody, které ten objekt má.

    +

    Struktura PyObject slouží jako hlavička, za kterou pak následují data interpretovaná podle +typu daného objektu. +Například pythonní objekt typu float vypadá následovně:

    +
    typedef struct {
    +    PyObject ob_base;
    +    double ob_fval;
    +} PyFloatObject;
    +

    ...tedy struktura PyObject, za kterou je v paměti číselná hodnota.

    +

    Seznamy obsahují za hlavičkou např. velikost a (ukazatel na) pole ukazatelů na jednotlivé +prvky. +Podobně objekty typu int (které mají v Pythonu neomezený rozsah) mají délku a pole +jednotlivých 30bitových „číslic“. +NumPy matice mají metadata (velikost, typ, popis rozložení v paměti) a ukazatel na pole hodnot.

    +

    To základní, co potřebujeme vědět, je, že na úrovni C je každý pythonní objekt reprezentován +jako struktura počtu referencí, ukazatele na typ a dat specifických pro daný typ.

    +

    Reference counting

    +

    Tak jako v C je důležité správně alokovat a dealokovat paměť, při tvorbě rozšíření do CPythonu +je třeba správně pracovat s referencemi: ke každému Py_INCREF (přičtení 1 k počtu referencí) +je potřeba později zavolat Py_DECREF (odečtení 1 a případné uvolnění objektu). +Jakákoli práce s objektem se smí provádět jen mezi INCREF a příslušným DECREF.

    +

    Platí konvence, že argumenty funkcí se předávají jako tzv. borrowed reference: o počitadlo +se stará volající a v průběhu volané funkce se objekt dá používat. +Pokud bychom ale argument potřebovali i po skončení volané funkce (např. si ho uložíme +do globální proměnné), je potřeba mu počitadlo zvýšit (a po skončení práce zase snížit).

    +

    V našem modulu demo přebíráme jako parametr n-tici. +Zodpovědnost zavolat na tuto n-tici Py_DECREF má ale volající, ne my. +Zavoláním funkce PyArg_ParseTuple získáme char*, který ale můžeme používat jen v rámci naší +funkce: po jejím skončení může volající argumenty funkce uvolnit, a tím řetězec zrušit.

    +

    Funkce, které vracejí pythonní objekty, předpokládají, že na vrácenou hodnotu provede DECREF volající. +V modulu demo voláme funkci PyLong_FromLong, která vytvoří nové pythonní číslo. +Za vzniklou referenci naše funkce přebírá zodpovědnost, je tedy na nás, abychom se postarali +o zavolání Py_DECREF. +Vrácením výsledku tuto zodpovědnost ale předáváme na funkci, která volá tu naši.

    +

    Hodnoty a výjimky

    +

    Další konvence, kterou většina funkcí v C API dodržuje, je způsob vracení výjimek.

    +

    Funkce, které vrací pythonní objekty, na úrovni C vrací PyObject*. +Nastane-li výjimka, objekt výjimky se zaznamená do globální (přesněji, thread-local) +proměnné a funkce vrátí NULL.

    +

    V našem modulu demo voláme funkci PyArg_ParseTuple, která může vyvolat výjimku: typicky +TypeError kvůli nesprávnému počtu nebo typu argumentů. +V takovém případě tato funkce výjimku zaznamená a vrátí NULL. +Naší funkci system už stačí vrátit NULL, protože víme, že výjimka už je zaznamenaná.

    +

    Další funkce, která může neuspět, je PyLong_FromLong. +Vzhledem k tomu, že její výsledek rovnou vracíme, není potřeba úspěch kontrolovat – vrátíme +buď správnou hodnotu nebo NULL se zaznamenanou výjimkou.

    +

    GIL

    +

    Poslední omezení, kterého si autor rozšíření musí být vědom, je Global Interpreter Lock. +Stručně řečeno, s objekty PyObject* může pracovat pouze jedno vlákno. +Toto vlákno drží globální zámek, který čas od času odemkne a znovu se pokusí zamknout, +aby mohly běžet i ostatní vlákna.

    +

    Díky GIL je vícevláknové programování v Pythonu relativně bezpečné: nemůže např. nastat souběh +(race condition), kdy by se nastavilo počitadlo referencí na špatnou hodnotu. +Na druhou stranu tento zámek ale omezuje paralelismus, a tedy i rychlost programu.

    +

    Globální zámek se dá odemknout v situacích, kdy nepracujeme s PyObject* a nevoláme pythonní kód. +Například čtení ze souboru nebo sítě ostatní vlákna neblokuje. +Stejně tak maticové operace v NumPy typicky nedrží GIL zatímco počítají na úrovni C nebo Fortranu.

    +

    Cython

    +

    Teď, když víme jak to všechno funguje, se můžeme podívat na způsob, jak rozšíření psát +jednoduše. +C API se totiž dá použít nejen z C, ale z jakéhokoli jazyka, který umí volat funkce se +stejnými konvencemi, např. C++ (s pomocí extern C). +Další způsob, jak použít C API ale nepsat C, je použít překladač z příjemnějšího jazyka do C.

    +

    Jeden takový jazyk je Cython (neplést s CPython).

    +

    Cython je jazyk podobný Pythonu, který ale lze přeložit na C a dále optimalizovat.

    +

    Cython si nainstalujte pomocí příkazu:

    +
    $ python -m pip install cython
    +

    Kompilace Pythonu

    +

    Když chceme převést modul z Pythonu do Cythonu, nejjednodušší začátek je přejmenovat soubor .py +na .pyx, aby bylo jasné, že jde o jiný jazyk, který nepůjde naimportovat přímo.

    +

    Jazyky Python a Cython nejsou 100% kompatibilní, ale zvláště u kódu, který pracuje hlavně s +čísly, se nekompatibilita neprojeví. +Vývojáři Cythonu považují každou odchylku od specifikace jazyka za chybu, kterou je nutno opravit.

    +

    Jako příklad můžete použít tuto naivní implementaci celočíselného a maticového násobení. +Uložte si ji jako matmul.py:

    +
    import numpy
    +
    +def intmul(a, b):
    +    result = a * b
    +    return result
    +
    +def matmul(a, b):
    +    n = a.shape[0]
    +    m = a.shape[1]
    +    if b.shape[0] != m:
    +        raise ValueError('incompatible sizes')
    +    p = b.shape[1]
    +    result = numpy.zeros((n, p))
    +    for i in range(n):
    +        for j in range(p):
    +            for k in range(m):
    +                x = a[i, k]
    +                y = b[k, j]
    +                result[i, j] += x * y
    +    return result
    +

    Stáhněte si testy a zkontrolujte, že prochází.

    +

    Potom soubor přejmenujte na matmul.pyx.

    +

    Výsledek bychom mohli převést na C pomocí příkazu cython -3 matmul.pyx, čímž +vznikne matmul.c. Ten můžeme přeložit výše uvedeným způsobem.

    +

    Jednodušší varianta je použít Cython v setup.py. +Pro naše účely bude setup.py s Cythonem a NumPy vypadat takto:

    +
    from setuptools import setup
    +from Cython.Build import cythonize
    +import numpy
    +
    +setup(
    +    name='matmul',
    +    ext_modules=cythonize('matmul.pyx', language_level=3),
    +    include_dirs=[numpy.get_include()],
    +    setup_requires=[
    +        'Cython',
    +        'NumPy',
    +    ],
    +    install_requires=[
    +        'NumPy',
    +    ],
    +)
    +

    V případě problémech s nefungujícím include_dirs na systému macOS +použijte komplikovanější variantu:

    +
    from distutils.extension import Extension
    +...
    +ext_modules = cythonize([Extension('matmul', ['matmul.pyx'],
    +                                   include_dirs=[numpy.get_include()])],
    +                        language_level=3)
    +

    Po zadání python setup.py develop nebo python setup.py build_ext --inplace atp. +se modul matmul.pyx zkompiluje s použitím nainstalovaného NumPy a bude připraven na použití. +(Zkontrolujte, že testy prochází i se zkompilovaným modulem.)

    +

    Nevýhoda tohoto přístupu je, že k spuštění takového setup.py je již potřeba +mít nainstalovaný cython a numpy. +Instalace z archivu sdist se tedy nemusí povést – je potřeba uživatelům říct, +že dané moduly už musí mít nainstalované. +Tento problém aktuálně řeší PyPA (správci pip a setuptools).

    +

    Instalace z archivů wheel by měla být bezproblémová.

    +

    Anotace

    +

    Kód, který takto vznikne, není o moc rychlejší než původní Python. +Je to tím, že sekvence příkazů ve funkci je sice převedená do C a přeložená do strojového kódu, +ale každá operace pracuje s generickými pythonními objekty, takže musí pro každé číslo +číslo z matice zkonstruovat pythonní objekt, vyhledat implementaci sčítání pro dvě celá čísla, +a výsledek převést zpět na int64 a uložit do matice.

    +

    Na situaci se můžeme podívat pomocí přepínače --annotate:

    +
    $ cython -3 --annotate matmul.pyx
    +

    To vygeneruje soubor matmul.html, kde jsou potencionálně pomalé operace vysvíceny žlutě. +Ke každému řádku se navíc dá kliknutím ukázat odpovídající kód v C (který bývá docela složitý, +protože řeší věci jako zpětnou kompatibilitu a ošetřování chyb, a navíc používá hodně pomocných +maker).

    +

    Obecně nebývá problém mít „žluté“ ty řádky, které se ve funkci provádí pouze jednou. +Ale v cyklech, zvláště těch třikrát zanořených, se autor rozšíření typicky snaží žlutým řádkům +vyhnout. +Nejjednodušší způsob, jak toho docílit, je doplnění statických informací o typech.

    +

    Doplnění typů

    +

    Začneme u funkce intmul, kde doplníme informaci o tom, že parametry a a b a proměnná +result jsou typu int. +Parametrům stačí doplnit typ podobně jako v C, ostatní lokální proměnné potřebují definici pomocí +příkazu cdef:

    +
    def intmul(int a, int b):
    +    cdef int result
    +    result = a * b
    +    return result
    +

    Teď bude funkce nepatrně rychlejší, ale také méně obecná: nejde jí násobit řetězec číslem, +ale ani reálná čísla (float), a dokonce ani celá čísla, která se nevejdou do 64 bitů (příp. +jiné velikosti, dle systému). +Typ int v Cythonu je totiž int z C, ne ten neomezený z Pythonu.

    +

    Další věc, kterou můžeme udělat, je změnit příkaz def na cpdef a doplnit typ návratové +hodnoty:

    +
    cpdef int intmul(int a, int b):
    +    cdef int result
    +    result = a * b
    +    return result
    +

    Tím se zbavíme nákladného převodu výsledku na PyObject. +Bohužel ale toto zrychlení pocítíme, jen když takovou funkci zavoláme +z jiné funkce napsané v Cythonu.

    +

    Tři typy funkcí

    +

    Funkce jdou deklarovat třemi způsoby:

    +
      +
    • def func(...): je funkce, která jde volat z Pythonu i z Cythonu, ale volání z Cythonu je pomalé (argumenty a výsledek se převádí na pythonní objekty a zpět),
    • +
    • cdef <type> func(...): je funkce, která jde volat pouze z Cythonu, ale volání je rychlé (pracuje se s C typy),
    • +
    • cpdef <type> func(...): je funkce, která se z Cythonu volá rychle, ale jde volat i z Pythonu (ve skutečnosti Cython vytvoří dva druhy této funkce).
    • +
    +

    Třídy

    +

    Cython umožňuje vytvářet tzv. built-in třídy: stejný druh tříd jako je +např. str nebo int. +Práce s takovými třídami je rychlejší, ale mají pevně danou strukturu. +Ani jim ani jejich instancím nelze z Pythonu nastavovat nové atributy:

    +
    >>> "foo".bar = 3
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +AttributeError: 'str' object has no attribute 'bar'
    +

    Příklad definice built-in třídy:

    +
    cdef class Foo:
    +    # Všechny členské proměnné musí být nadefinované tady
    +    cdef int foo
    +    ...
    +
    +    def __cinit__(self, int f):
    +        # Inicializace třídy.
    +        # Cython zajistí, že se tato funkce zavolá pouze jednou (na rozdíl
    +        # od __init__, kterou lze z pythonního kódu zavolat kdykoli)
    +        self.foo = f
    +        ...
    +
    +    def __dealloc__(self):
    +        # Deinicializace třídy
    +        ...
    +
    +    cpdef int method(self):
    +        ...
    +        return self.foo
    +

    Více o definici tříd najdete v dokumentaci Cythonu.

    +

    Používání NumPy

    +

    Pro funkci matmul můžeme nadefinovat číselné proměnné (n, m, p, i, j, k, x, y) +jako int, ale tím si moc nepomůžeme: většinu času program stráví vybíráním a ukládáním hodnot +z/do matic, a protože Cython nemá informace o tom, že jsou to NumPy matice, používá obecný +protokol pro pythonní kontejnery, takže se každá hodnota převede na pythonní objekt.

    +

    Je tedy potřeba říct Cythonu, že používáme NumPy matice. +Naštěstí v NumPy existuje integrace s Cythonem, takže můžeme na úrovni C „naimportovat“ +rozšíření pro NumPy:

    +
    cimport numpy
    +

    ... a potom použít typ „dvourozměrná matice celých čísel“, který se v Cythonu jmenuje +numpy.ndarray[numpy.int64_t, ndim=2]. +Naše funkce tedy bude začínat takto:

    +
    cpdef numpy.ndarray[numpy.int64_t, ndim=2] matmul(
    +        numpy.ndarray[numpy.int64_t, ndim=2] a,
    +        numpy.ndarray[numpy.int64_t, ndim=2] b):
    +    cdef numpy.ndarray[numpy.int64_t, ndim=2] result
    +    ...
    +

    Kdybychom si nebyli jistí typem matice, můžeme si ho nadefinovat pomocí ctypedef:

    +
    ctypedef numpy.int64_t DATATYPE
    +

    ...a pak používat tento alias. +Na maticové typy bohužel typedef zatím nefunguje.

    +

    Pro práci s maticí ASCII znaků lze použít typ numpy.int8_t, ale je třeba při zapisování přímo na konkrétní pozice zapisovat číselný typ char:

    +
    cdef numpy.ndarray[numpy.int8_t, ndim=2]  directions = numpy.full((h, w), b'#', dtype=('a', 1))
    +directions[maze >= 0] = b' '  # Python level, using b' '
    +directions[1, 2] == ord('x')  # C level, using char
    +

    Použití matrix[a, b] je v Cythonu rychlejší než matrix[a][b], protože se +uvnitř dějí jiné věci. Při použití matrix[a, b] u matice deklarované jako +dvourozměrné pole nějakého typu Cython přistoupí přímo k obsahu na úrovni +jazyka C. Při použití matrix[a][b] se ale dějí operace dvě, nejprve +matrix[a] vrací jeden řádek matice a až poté [b] vrací jeden prvek z +tohoto řádku. Obě operace probíhají na úrovni Pythonu a proto budou pomalejší +a při použití --annotate bude řádek s takovou operací označen žlutě.

    +

    Direktivy

    +

    Anotací typů matic se naše demo maticového násobení dostalo skoro na úroveň +C, ale ne úplně: řádky, které pracují s maticemi, jsou ve výstupu --annotate +stále trochu žluté. +Cython totiž při každém přístupu k matici kontroluje, jestli nečteme nebo +nezapisujeme mimo pole a případně vyvolá IndexError.

    +

    Pokud víme – jako v našem případě – že je taková kontrola zbytečná, +můžeme Cythonu říct, aby ji nedělal. +Přístupy mimo pole pak způsobí nedefinované chování (většinou program spadne, +nebo hůř, bude pracovat se špatnými daty). +Kontrola se vypíná direktivou boundscheck, která se dá zadat dvěma hlavními +způsoby: dekorátorem:

    +
    @cython.boundscheck(False)
    +cpdef funkce():
    +    ...
    +
    +

    ... nebo příkazem with:

    +
    with cython.boundscheck(False):
    +    ...
    +
    +

    ... případně i pro celý soubor, viz dokumentace.

    +

    Další zajímavá direktiva je cython.wraparound(False), která podobným způsobem +vypíná pythonní způsob indexování zápornými čísly: místo indexování od konce +s ní dostaneme nedefinované chování.

    +

    Seznam dalších direktiv najdete v dokumentaci.

    +

    Cython podporuje ještě blok with cython.nogil:, který je podobný direktivám, +ale dá se použít jen s with. +V rámci tohoto bloku je odemčený GIL (globální zámek). +Smí se použít, pouze pokud nepracujeme s pythonními objekty – například když +operujeme jen na obsahu už existujících maticí. +Opak je with cython.gil:, kterým zámek zase zamkneme – například když +potřebujeme vyhodit výjimku.

    +

    Struktury, ukazatele a dynamická alokace

    +

    Přestože v Cythonu můžete používat pythonní n-tice, slovníky, seznamy a další +podobné nehomogenní typy, jejich použití je pomalé, protože vždy pracují +s pythonními objekty.

    +

    Pokud máte kód, který potřebuje dočasné pole takových záznamů, +je pro časově kritické části kódu lepší k problému přistoupit spíše „céčkovsky“, +přes alokaci paměti a ukazatele.

    +

    Následující příklad ukazuje, jak naplnit pole heterogenních záznamů:

    +
    # Import funkcí pro alokaci paměti – chovají se jako malloc() apod.
    +from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
    +
    +# Definice struktury
    +cdef struct coords:
    +    int row
    +    int column
    +    char data
    +
    +MAXSIZE = ...
    +
    +def path(...):
    +    # Definice ukazatele, přetypování
    +    cdef coords * path = <coords *>PyMem_Malloc(MAXSIZE*sizeof(coords))
    +    if path == NULL:
    +        # nedostatek paměti
    +        raise MemoryError()
    +
    +    cdef int used = 0
    +    for ...:
    +        ...
    +
    +        #
    +        path[used] = coords(row, column, data)
    +        used += 1
    +
    +    # pole můžeme používat
    +    ...
    +
    +    # a musíme ho před vrácením předělat na list
    +    lpath = []
    +    cdef int i
    +    for i in range(used):
    +        lpath.append(path[i])
    +
    +    # a uvolnit
    +    PyMem_Free(path)
    +    return lpath
    +

    Pro homogenní pole ale doporučujeme spíše NumPy matice.

    +

    Následující příklad ukazuje, jak lze přiřazovat do struktur:

    +
    cdef struct coord:
    +    float x
    +    float y
    +    float z
    +
    +cdef coord a = coord(0.0, 2.0, 1.5)
    +
    +cdef coord b = coord(x=0.0, y=2.0, z=1.5)
    +
    +cdef coord c
    +
    +c.x = 42.0
    +c.y = 2.0
    +c.z = 4.0
    +
    +cdef coord d = {'x':2.0,
    +                'y':0.0,
    +                'z':-0.75}
    +

    Použití knihoven z C

    +

    Pro použití C knihoven z Pythonu je lepší použít CFFI. +Ale když už píšete kód v Cythonu +a potřebujete zavolat nějakou C funkci, můžete to udělat takto:

    +
    cdef extern from "stdlib.h":
    +    int rand()
    +    void srand(long int seedval)
    +
    +cdef extern from "time.h":
    +    ctypedef long time_t
    +    long int time(time_t *)
    +
    +srand(time(NULL))
    +print(rand())
    +

    Deklarace můžete vložit přímo do .pyx souboru, ale pokud je chcete používat +z různých míst, pojmenujte soubor .pxd, to vám umožní na něj použít cimport.

    +

    Pro části standardní knihovny jsou takové deklarace již v Cythonu +předpřipravené, můžete tedy použít cimport rovnou:

    +
    from libc.stdlib cimport rand, srand
    +from libc.time cimport time
    +
    +srand(time(NULL))
    +print(rand())
    +

    Zkratky: pyximport a %%cython

    +

    Pro interaktivní práci v Jupyter Notebook má Cython vlastní „magii“. +Na začátku Notebooku můžeme zadat:

    +
    %load_ext cython
    +

    a potom můžeme na začátku kterékoli buňky zadat %%cython:

    +
    %%cython
    +
    +cpdef int mul(int a, int b):
    +    return a * b
    +

    Kód v takové buňce pak Notebook zkompiluje Cythonem a funkce/proměnné v něm +nadefinované dá k dispozici.

    +

    Můžeme použít i %%cython --annotate, což vypíše anotace přímo do Notebooku.

    +

    Další zkratka je modul pyximort, který dává možnost importovat moduly .pyx +přímo: hledají se podobně jako .py nebo .so a před importem se zkompilují. +Zapíná se to následovně:

    +
    import pyximport
    +pyximport.install()
    +
    +import matmul
    +

    Video

    +

    Před nedávnem měl Miro na Středisku unixových technologií nahrávanou ukázku přepsání +úlohy ruksaku z předmětu MI-PAA z Pythonu do Cythonu (včetně nepříjemného záseku a live +ukázky debugování problému). +Na video se můžete podívat, mohlo by vám prozradit spoustu tipů, které se vám mohou hodit +ke splnění úlohy. +K obsahu jen dodáme, že místo malloc a free je lepší použít PyMem_Malloc a +PyMem_Free z ukázky výše.

    \ No newline at end of file diff --git a/lessons/cython/test_matmul.py b/lessons/cython/test_matmul.py new file mode 100644 index 00000000..23004276 --- /dev/null +++ b/lessons/cython/test_matmul.py @@ -0,0 +1,34 @@ +import pytest +import numpy + +import matmul + + +@pytest.mark.parametrize( + ('a', 'b', 'expected'), + ( + (1, 1, 1), + (3, 3, 9), + ) +) +def test_intmul(a, b, expected): + assert matmul.intmul(a, b) == expected + + +@pytest.mark.parametrize( + ('a', 'b', 'expected'), + ( + ([[1, 0], [0, 1]], [[1, 2], [3, 4]], [[1, 2], [3, 4]]), + ([[1, 2], [3, 4]], [[1, 0], [0, 1]], [[1, 2], [3, 4]]), + ([[1, 2], [3, 4]], [[5, 6], [7, 8]], [[19, 22], [43, 50]]), + ([[1, 2, 3, 4]], [[5], [6], [7], [8]], [[70]]), + ([[2]], [[3]], [[6]]), + ) +) +def test_matmul(a, b, expected): + a = numpy.array(a) + b = numpy.array(b) + expected = numpy.array(expected) + result = matmul.matmul(a, b) + assert result.shape == (a.shape[0], b.shape[1]) + assert (result == expected).all() diff --git a/lessons/decorators/index.html b/lessons/decorators/index.html new file mode 100644 index 00000000..5e33322b --- /dev/null +++ b/lessons/decorators/index.html @@ -0,0 +1,351 @@ +

    Dekorátory

    +

    V této lekci se nebudeme věnovat žádné externí knihovně. Místo toho se seznámíme +s jednou vlastností Pythonu, kterou knihovny často využívají, a která obvykle +vypadá trochu magicky.

    +

    Touto vlastností jsou dekorátory.

    +

    Dekorátory se hodí tehdy, když potřebujeme upravit chování nějaké funkce, ale +nechceme ji přímo upravovat.

    +

    Teorie do začátku

    +

    Co je to vlastně dekorátor? Dekorátor je vlastně jenom funkce, která dostane +jeden argument a vrátí jednu hodnotu. Je ale trochu speciální v tom, že jak +argument, tak návratová hodnota jsou zase jiné funkce.

    +

    Funkcím, které operují nad jinými funkcemi, říkáme funkce vyššího řádu.

    +

    Použití dekorátorů v kódu vypadá zhruba takto:

    +
    @dekorator
    +def funkce():
    +    pass
    +

    Tento zápis se zavináčem je jenom syntaktický cukr. Usnadňuje nám zápis, ale +chová se přesně stejně jako následující kód, na kterém je lépe vidět, že +dekorator je funkce:

    +
    def funkce():
    +    pass
    +funkce = dekorator(funkce)
    +

    Na řádku za zavináčem může být libovolný výraz, který po vyhodnocení vrátí +funkci, která má požadované rozhraní.

    +

    Přiklad 0 – registrace funkcí

    +

    Jak už při programování bývá zvykem, náš první dekorátor nás pozdraví.

    +

    Začneme s jednoduchým programem, který definuje funkci pro pozdrav a zavolá ji.

    +
    def ahoj():
    +    print("Ahoj")
    +
    +
    +if __name__ == "__main__":
    +    ahoj()
    +

    Do tohoto programu bychom rádi přidali další pozdravy, a zavolali je všechny.

    +
    def ahoj():
    +    print("Ahoj")
    +
    +
    +def nazdar():
    +    print("Nazdar")
    +
    +
    +if __name__ == "__main__":
    +    ahoj()
    +    nazdar()
    +

    Tento přístup ale povede k tomu, že by na konci byl dlouhý seznam pozdravů. +Můžeme si funkce rovnou uložit do seznamu a potom přes něj jenom iterovat.

    +
    def ahoj():
    +    print("Ahoj")
    +
    +
    +def nazdar():
    +    print("Nazdar")
    +
    +
    +if __name__ == "__main__":
    +    funkce = [ahoj, nazdar]
    +    for f in funkce:
    +        f()
    +

    A jako poslední krok přidáme dekorátor, který nám bude funkce rovnou přidávat +do seznamu.

    +
    funkce = []
    +
    +
    +def pridej_pozdrav(func):
    +    funkce.append(func)
    +    return func
    +
    +
    +@pridej_pozdrav
    +def ahoj():
    +    print("Ahoj")
    +
    +
    +@pridej_pozdrav
    +def nazdar():
    +    print("Nazdar")
    +
    +
    +if __name__ == "__main__":
    +    for f in funkce:
    +        f()
    +

    Zkuste přidat ještě jeden pozdrav.

    +

    V tomto příkladu jde o docela zbytečné použití dekorátorů. Ukazuje ale +praktický způsob, jak řešit registraci funkcí. Stejné řešení používá +například knihovna flask pro definování webových služeb nebo click pro +vytváření příkazů pro terminál.

    +

    Příklad 1 – trasování volání funkcí

    +

    Podívejme se třeba na tuto na pohled nevinnou funkci. Počítá, jak vypadá n-té +číslo ve Fibonacciho posloupnosti. Funguje docela pěkně, pokud jí nezadáme jako +argument příliš velké číslo. Na autorově počítači příliš velká čísla začínají +kolem 35.

    +
    def fib(x):
    +    """Spočítá x-té číslo ve Fibonacciho posloupnosti."""
    +    if x <= 1:
    +        return x
    +    return fib(x - 1) + fib(x - 2)
    +

    Napíšeme si jednoduchý dekorátor, který nám bude vypisovat informace o tom, co +se ve funkci děje.

    +
    def co_se_deje(func):
    +    print("Aplikuju dekorátor")
    +    return func
    +
    +
    +@co_se_deje
    +def fib(x):
    +    """Spočítá x-té číslo ve Fibonacciho posloupnosti."""
    +    if x <= 1:
    +        return x
    +    return fib(x - 1) + fib(x - 2)
    +
    +if __name__ == "__main__":
    +    print(fib(4))
    +

    Tento dekorátor funkci nijak nemění. Akorát nám oznámí, že byl aplikovaný. V +těle dekorátoru ale můžeme nadefinovat novou funkci a vrátit ji.

    +

    Zkusme si to:

    +
    def co_se_deje(func):
    +    def nahradni_funkce(x):
    +        return "Spočítej si to sám!"
    +
    +    return nahradni_funkce
    +

    Nebo můžeme vrátit funkci, která akorát zavolá tu původní.

    +
    def co_se_deje(func):
    +    def nahradni_funkce(x):
    +        return func(x)
    +
    +    return nahradni_funkce
    +

    Pojďme vracenou funkci rozšířit tak, aby vypisovala informace o tom, co dělá.

    +
    def co_se_deje(func):
    +    def nahradni_funkce(x):
    +        print(f"Voláme {func.__name__}({x})")
    +        return func(x)
    +
    +    return nahradni_funkce
    +

    Úkol: upravte dekorátor tak, aby vypisoval i vypočítanou hodnotu.

    +
    +

    Řešení

    + + +

    Tento dekorátor není úplně praktický. Pokud toho vypíše trochu víc, tak už se +v tom logu nikdo nevyzná. Myšlenka jako taková ovšem není úplně špatná. Kdyby +třeba dekorátor počítal, kolikrát se funkce spustí, a jak dlouho obvykle +trvá, mohl by nám pomoct najít místa pro optimalizaci.

    +

    Nápověda pro funkce

    +

    Zkuste si v interaktivní konzoli Pythonu spustit následující příklad:

    +
    >>> help(print)
    +Help on built-in function print in module builtins:
    +
    +print(...)
    +    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    +
    +    Prints the values to a stream, or to sys.stdout by default.
    +    Optional keyword arguments:
    +    file:  a file-like object (stream); defaults to the current sys.stdout.
    +    sep:   string inserted between values, default a space.
    +    end:   string appended after the last value, default a newline.
    +    flush: whether to forcibly flush the stream.
    +

    Dostaneme krátkou nápovědu o tom, jak používat funkci print.

    +

    Odkud se tato nápověda bere? Z dokumentačního komentáře. Takže bychom měli +dostat pěknou nápovědu třeba i pro naši známou funkci fib.

    +
    >>> from fib import fib
    +>>> help(fib)
    +Help on function nahradni_funkce in module fib:
    +
    +nahradni_funkce(x)
    +
    +>>>
    +

    Něco je špatně. Protože jsme původní implementaci funkce fib pomocí +dekorátoru nahradili naší pomocnou funkcí, komentář se cestou ztratil. Mohli +bychom přidat dokumentační komentář k náhradní funkci, ale přece nebudeme +stejný kód kopírovat dvakrát.

    +

    Standardní knihovna má naštěstí možnost, jak to snadno opravit. V modulu +functools je definovaný dekorátor wraps, který umí zkopírovat dokumentační +komentář a jméno z jedné funkce do druhé.

    +
    import functools
    +
    +
    +def co_se_deje(func):
    +    @functools.wraps(func)
    +    def nahradni_funkce(x):
    +        pass
    +
    >>> from fib import fib
    +>>> help(fib)
    +Help on function fib in module fib:
    +
    +fib(x)
    +    Spočítá x-té číslo ve Fibonacciho posloupnosti.
    +
    +>>>
    +

    Předávání všech argumentů.

    +

    Při psaní dekorátorů je dobré myslet na to, jak moc univerzální by měly být. +Například náš co_se_deje momentálně funguje pouze pro funkce, které mají +jeden argument.

    +

    To je ale docela hloupé omezení. Stejně dobře bychom mohli chtít sledovat +volání jiné funkce, která má třeba argumentů víc.

    +

    Pokud dekorátor nepotřebuje vědět nic o argumentech funkce, je docela praktické +jej nadefinovat tak, aby byly prostě všechny předal dál, ať už jich je kolik +chce.

    +

    To můžeme udělat následovně:

    +
    def co_se_deje(func):
    +    @functools.wraps(func)
    +    def nahradni_funkce(*args, **kwargs):
    +        print(f"Voláme {func.__name__}{args}")
    +        vysledek = func(*args, **kwargs)
    +        print(f"Výsledek {func.__name__}{args} = {vysledek}")
    +        return vysledek
    +    return nahradni_funkce
    +

    Do n-tice args posbíráme všechny poziční argumenty, do slovníku kwargs +všechny pojmenované argumenty. A při volání dekorované funkce je všechny zase +předáme dál.

    +

    Ve výstupu teď používáme pouze poziční argumenty. Přidání těch pojmenovaných je +cvičení pro čtenáře.

    +

    Příklad 2 – opakování HTTP požadavků

    +

    Pokud náš program musí pracovat s nějakou externí službou nebo systémem, může +se stát, že komunikace mezi nimi nebude vždy bezproblémová. Pěkný příklad je +třeba stahování webové stránky se špatným připojením. S tím z Pythonu nic +udělat nemůžeme.

    +

    Můžeme ale zkusit požadavek zopakovat, pokud poznáme, že je to typ chyby, kde +opakování může pomoct.

    +

    Začneme s jednoduchým programem, který udělá HTTP požadavek.

    +

    Následující příklady používají knihovnu requests. Nainstalujte si ji, pokud ji +ve virtuálním prostředí ještě nemáte.

    +
    import requests
    +
    +def stahni():
    +    """Stáhne stránku a něco s ní udělá."""
    +    print("Stahuju stránku")
    +    odpoved = requests.get("https://httpbin.org/status/200,400,500")
    +    print(f"Dostali jsme {odpoved.status_code}")
    +    odpoved.raise_for_status()
    +    return "OK"
    +
    +
    +if __name__ == "__main__":
    +    stahni()
    +

    Použitá stránka náhodně odpoví jedním z vyjmenovaných kódu, takže ve dvou +třetinách případů bychom měli dostat chybu. Pokud požadavek zkusíme zopakovat, +máme dobrou šanci, že to projde.

    +

    Začneme s jednoduchým dekorátorem, který jenom zavolá funkci.

    +
    def opakuj_pri_neuspechu(func):
    +    """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci
    +    zavolat znovu.
    +    """
    +    @functools.wraps(func)
    +    def nahradni_funkce(*args, **kwargs):
    +        return func(*args, **kwargs)
    +
    +    return nahradni_funkce
    +
    +
    +@opakuj_pri_neuspechu
    +def stahni():
    +    """Stáhne stránku a něco s ní udělá."""
    +    print("Stahuju stránku")
    +    odpoved = requests.get("https://httpbin.org/status/200,400,500")
    +    print(f"Dostali jsme {odpoved.status_code}")
    +    odpoved.raise_for_status()
    +    return "OK"
    +

    Co by měla dělat naše náhradní funkce? Donekonečna bude zkoušet zavolat +dekorovanou funkci. Pokud se to podaří, vrátí její výsledek. Pokud dostaneme +výjimku requests.exceptions.HTTPError, chvilku počkáme, a půjdeme na další +pokus.

    +
    import functools
    +import time
    +
    +import requests
    +
    +
    +def opakuj_pri_neuspechu(func):
    +    """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci
    +    zavolat znovu.
    +    """
    +
    +    @functools.wraps(func)
    +    def nahradni_funkce(*args, **kwargs):
    +        while True:
    +            try:
    +                return func(*args, **kwargs)
    +            except requests.exceptions.HTTPError:
    +                print("Chyba, zkusíme to znovu")
    +                time.sleep(1)
    +
    +    return nahradni_funkce
    +
    +
    +@opakuj_pri_neuspechu
    +def stahni():
    +    """Stáhne stránku a něco s ní udělá."""
    +    print("Stahuju stránku")
    +    odpoved = requests.get("https://httpbin.org/status/200,400,500")
    +    print(f"Dostali jsme {odpoved.status_code}")
    +    odpoved.raise_for_status()
    +    return "OK"
    +

    Teď by program měl vypisovat, že se snaží stránku stáhnout několikrát, a +opakovat to tak dlouho, dokud se to nepodaří.

    +

    Co když ale potřebujeme opakování pokusů na více místech, ale chceme reagovat +na jiné výjimky?

    +

    Mohli bychom si nadefinovat nový dekorátor pro každý typ výjimky, kterou +chceme chytat. To zní jako hodně práce a duplicitního kódu.

    +

    Místo toho můžeme dekorátor upravit tak, aby přijímal argumenty, a pak mu +s jejich pomocí řekneme, kterou výjimku ošetřovat.

    +

    Výraz za @ musí při vyhodnocení vždy vracet funkci, která se chová jako +dekorátor. Takže musíme přidat jednu vrstvu do našich vnořených funkcí.

    +

    Funkce opakuj_pri_neuspechu je vlastně továrna na dekorátory. Vždy, když ji +zavoláme, vrátí nám funkci, která se chová podle našich potřeb a funguje jako +dekorátor.

    +
    import functools
    +import time
    +
    +import requests
    +
    +
    +def opakuj_pri_neuspechu(vyjimka):
    +
    +    def dekorator(func):
    +
    +        @functools.wraps(func)
    +        def nahradni_funkce(*args, **kwargs):
    +            while True:
    +                try:
    +                    return func(*args, **kwargs)
    +                except vyjimka:
    +                    print("Chyba, zkusíme to znovu")
    +                    time.sleep(1)
    +
    +        return nahradni_funkce
    +
    +    return dekorator
    +
    +
    +@opakuj_pri_neuspechu(requests.exceptions.HTTPError)
    +def stahni():
    +    """Stáhne stránku a něco s ní udělá."""
    +    print("Stahuju stránku")
    +    odpoved = requests.get("https://httpbin.org/status/200,400,500")
    +    print(f"Dostali jsme {odpoved.status_code}")
    +    odpoved.raise_for_status()
    +    return "OK"
    +
    \ No newline at end of file diff --git a/lessons/def/index.html b/lessons/def/index.html new file mode 100644 index 00000000..d087fcc2 --- /dev/null +++ b/lessons/def/index.html @@ -0,0 +1,217 @@ +

    Definice funkcí

    +

    Dříve jsme +volali funkce, které napsal někdo jiný:

    +
    print('Ahoj světe!')
    +

    Dnes si ukážeme, jak psát funkce vlastní.

    +

    K čemu jsou funkce?

    +

    Často se stává, že kód, který dělá nějakou jednoduchou věc, není úplně +jednoduchý. +Jako příklad uvedu nám už známý kód, který v určitém řetězci zamění znak +na dané pozici:

    +
    zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +

    Z takového kódu není na první pohled jasné, co přesně dělá. +Zvlášť když kód použiješ ve složitějším programu.

    +

    Dá se to vyřešit komentářem: ten, kdo bude program číst, si může přečíst +co to má dělat. Samotný složitější kód pak může ignorovat.

    +
    # Ve slově `slovo` zaměnit znak na pozici `pozice` za `novy_znak`;
    +# výsledek bude v proměnné `nove_slovo`.
    +zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +

    Ještě lepší ale bude si vytvořit funkci, která tenhle složitější postup +provede. +Jakmile takovou funkci vytvoříš, ve složitějším programu pak můžeš místo kódu +výše psát jen:

    +
    nove_slovo = zamen(slovo, pozice, novy_znak)
    +

    Podobně fungují funkce, které už znáš: můžeš zavolat print(123), aniž bys +potřeboval/a znát jakékoli detaily postupu, kterým se číslo převede na +jednotlivé číslice a ty se pak vykreslí na obrazovce. +Nebo řekneš želvě forward(100) a nezatěžuješ se tím, jak si želva „pamatuje“ +svůj aktuální úhel natočení nebo jak se vlastně kreslí čára.

    +

    Funkce umožňuje pojmenovat nějaký kousek programu, který se pak dá +použít pomocí jména bez detailních znalostí toho, jak to vevnitř funguje.

    +

    Definice funkce

    +

    Protože už znáš if a for, které mají jednořádkovou hlavičku a odsazené tělo +příkazu, neměl by ti zápis funkce připadat příliš zvláštní:

    +
    def zamen(slovo, pozice, novy_znak):
    +    """V daném slově zamění znak na dané pozici za daný nový znak."""
    +    zacatek = slovo[:pozice]
    +    konec = slovo[pozice + 1:]
    +    nove_slovo = zacatek + novy_znak + konec
    +    return nove_slovo
    +
    +print(zamen('kočka', 1, 'a'))
    +print(zamen('kačka', 2, 'p'))
    +

    Jak to funguje?

    +

    Funkce se definuje příkazem def, za nějž napíšeš jméno funkce, +pak do závorky seznam parametrů, které funkce bere, a pak dvojtečku.

    +

    Potom následuje odsazené tělo funkce – příkazy, které funkce provádí.

    +

    Tělo může začít dokumentačním řetězcem (angl. docstring), který popisuje +co funkce dělá. +To může být jakýkoli řetězec, ale tradičně se uvozuje třemi uvozovkami +(i v případě že je jen jednořádkový).

    +

    Příkazem return pak můžeš z funkce vrátit nějakou hodnotu.

    +

    Při volání funkce se hodnoty, se kterými funkci +zavoláš, přiřadí jednotlivým parametrům. +Takže když zavoláš třeba zamen('kočka', 1, 'a'), +můžeš si představit, že se provede toto:

    +
    # Nastavení proměnných podle zadaných argumentů
    +slovo = 'kočka'
    +pozice = 1
    +novy_znak = 'a'
    +
    +# Samotné tělo funkce
    +zacatek = slovo[:pozice]
    +konec = slovo[pozice + 1:]
    +nove_slovo = zacatek + novy_znak + konec
    +return nove_slovo
    +

    Už víš, že volání zamen('kočka', 1, 'a') je výraz. +Aby ho Python vyhodnotil, udělá celý postup výše a jako hodnotu výrazu dosadí +návratovou hodnotu – tedy to, co následuje po return.

    +

    Tělo funkce může mít více příkazů – včetně podmínek, cyklů a podobně. +Následující procedura třeba vypíše skóre daného hráče a k tomu hlášku:

    +
    def napis_hlasku(nazev, skore):
    +    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
    +
    +    print(nazev, 'skóre je', skore)
    +    if skore > 1000:
    +        print('Světový rekord!')
    +    elif skore > 100:
    +        print('Skvělé!')
    +    elif skore > 10:
    +        print('Ucházející.')
    +    elif skore > 1:
    +        print('Aspoň něco')
    +    else:
    +        print('Snad příště.')
    +
    +napis_hlasku('Tvoje', 256)
    +napis_hlasku('Protivníkovo', 5)
    +

    Cvičení

    +

    Zkus napsat funkci, která vrátí obsah obdélníka daných rozměrů. +Příslušný vzoreček je S = a×b, +kde a a b jsou délky stran.

    +

    Funkci zavolej a výsledek vypiš.

    +
    +

    Řešení

    + + +

    Vracení ukončuje funkci

    +

    Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou +návratovou hodnotu ven z funkce a zároveň ukončí provádění funkce.

    +

    Chová se tedy trochu jako break, jen místo cyklu opouští celou funkci.

    +

    Podobně jako break se dá použít v případech, kdy potřebuješ od uživatele +dostat odpověď – a opakuješ dotaz tak dlouho, dokud požadovanou odpověď +nedostaneš. +Třeba, chceš-li odpověď „ano“ nebo „ne“:

    +
      +
    • Takhle se zjišťuje odpověď ano (Pravda) nebo ne (Nepravda) na danou otázku:
        +
      • Pořád dokola:
          +
        • Zeptej se na otázku; zapamatuj si odpověď.
        • +
        • Je-li odpověď „ano“:
            +
          • Výsledek je Pravda. Hotovo; dál nepokračuj.
          • +
          +
        • +
        • Jinak, je-li odpověď „ne“:
            +
          • Výsledek je Nepravda. Hotovo; dál nepokračuj.
          • +
          +
        • +
        • Pouč uživatele, ať odpoví „ano“ nebo „ne“. +
          (a zkus to znovu – viz „Pořád dokola“)
        • +
        +
      • +
      +
    • +
    +
    def ano_nebo_ne(otazka):
    +     """Vrátí True nebo False podle odpovědi uživatele"""
    +    while True:
    +        odpoved = input(otazka)
    +        if odpoved == 'ano':
    +            return True
    +        elif odpoved == 'ne':
    +            return False
    +
    +        print('Nerozumím! Odpověz "ano" nebo "ne".')
    +
    +# Příklad použití
    +if ano_nebo_ne('Chceš si zahrát hru? '):
    +    print('OK! Ale napřed si ji musíš naprogramovat.')
    +else:
    +    print('Škoda.')
    +

    Stejně jako if nebo break je return příkaz, ne funkce. +Kolem „své“ hodnoty nepotřebuje závorky.

    +

    Vrátit nebo vypsat?

    +

    Podívejme se teď na následující program, který vypíše obsah elipsy:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    return pi * a * b
    +
    +print('Obsah elipsy s poloosami 3 a 5 je', obsah_elipsy(3, 5), 'cm2')
    +

    Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic +nevrací. +Procedura může výsledek třeba vypsat na obrazovku:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    print('Obsah je', pi * a * b)  # Pozor, `print` místo `return`!
    +
    +obsah_elipsy(3, 5)
    +

    Program takhle funguje, ale přichází o jednu z hlavních výhod funkcí: +možnost vrácenou hodnotu použít i jinak jež jen v print.

    +

    Funkci, která vrací výsledek, můžeš použít v dalších výpočtech:

    +
    def objem_eliptickeho_valce(a, b, vyska):
    +    return obsah_elipsy(a, b) * vyska
    +
    +print(objem_eliptickeho_valce(3, 5, 3))
    +

    ... ale s procedurou, která výsledek přímo vypíše, by to nešlo. +Proto je dobré psát funkce, které spočítané hodnoty vrací, +a zpracování výsledku (např. vypsání) nechat na kód mimo funkci.

    +

    Další důvod proč hodnoty spíš vracet než vypisovat je ten, že jedna funkce se +dá použít v různých situacích. +Proceduru s print by nešlo rozumně použít tehdy, když nás příkazová +řádka vůbec nezajímá – třeba v grafické hře, webové aplikaci, nebo pro ovládání +robota.

    +

    Podobně je to se vstupem: když použiju v rámci své funkce input, bude se +moje funkce dát použít jen v situacích, kdy je u počítače klávesnice a za ní +člověk. +Proto je lepší funkcím potřebné informace předávat jako argumenty +a volání input (nebo čtení textového políčka či měření čidlem robota) +nemít ve funkci, ale vně, v kódu, který funkci volá:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    """Vrátí obsah elipsy s poloosami daných délek"""
    +    # Jen samotný výpočet:
    +    return pi * a * b
    +
    +# print a input jsou "venku":
    +x = float(input('Zadej délku poloosy 1: '))
    +y = float(input('Zadej délku poloosy 2: '))
    +print('Obsah je', obsah_elipsy(x, y))
    +

    Samozřejmě existují výjimky: procedura, která přímo vytváří textový výpis +(např. tabulku), může používat print; funkce, která načítá textové informace +(jako ano_nebo_ne výše), zase input. +Když ale funkce něco počítá, nebo když si nejsi jistý/á, +je dobré ve funkci print ani input nemít.

    +

    None

    +

    Když funkce neskončí příkazem return, +automaticky se vrátí hodnota None.

    +

    Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, +a znamená „nic“.

    +
    def nic():
    +     """Tahle funkce nic nedělá """
    +
    +print(nic())
    +

    Procedury v Pythonu vracejí právě toto „nic“.

    \ No newline at end of file diff --git a/lessons/deployment/index.html b/lessons/deployment/index.html new file mode 100644 index 00000000..15bcb097 --- /dev/null +++ b/lessons/deployment/index.html @@ -0,0 +1,23 @@ +

    Deployment webových aplikací

    +

    Aplikace napsaná v Pythonu běží na našem počítači, ale jak ji dostat do Internetu? +Existují různé možnosti, jednou z nich je nasadit ji do cloudu.

    +

    Nemáte ještě webovou aplikaci? Můžete vyzkoušet framework +Flask.

    +

    WSGI

    +

    Nasazování webových aplikací v Pythnu se opírá o WSGI, +což je standardní pythonní rozhraní pro komunikaci +mezi webovou aplikací a webovým serverem definované v PEPu 333.

    +

    Naprostá většina webových frameworků v Pythonu toto rozhraní implementuje přímo, +případně k tomuto účelu obsahuje wrapper.

    +

    Je tedy jedno, jestli používáte Flask, Pyramid, Django, Bottle nebo Falcon, +vždy vaší aplikaci představuje application objekt, který se navenek chová +stejně. Webové frameworky implementují aplikační část WSGI.

    +

    Stejně tak existují webové servery, které implementují serverovou část WSGI, +například Gunicorn nebo mod_wsgi pro httpd (Apache). Tyto servery umí +pracovat s application objektem a nezajímá je, v jakém frameworku je aplikace +napsaná.

    +

    Většině cloudových providerům stačí nějakým způsobem application objekt předat +a o zbytek se postarají za vás. Jedním z takových providerů je i +PythonAnywhere.

    +

    Deployment webových aplikací na PythonAnywhere je popsaný v lekci +PythonAnywhere.

    \ No newline at end of file diff --git a/lessons/deployment/pythonanywhere.html b/lessons/deployment/pythonanywhere.html new file mode 100644 index 00000000..961daaad --- /dev/null +++ b/lessons/deployment/pythonanywhere.html @@ -0,0 +1,77 @@ +

    Deployment webových aplikací na PythonAnywhere

    +

    PythonAnywhere je pro limitované použití zdarma.

    +

    K posílání kódu na produkční prostředí budeme používat Git. +Nejprve proto uložte celý projekt do Gitu a nahrajte na GitHub.

    +

    Potom se zaregistrujte na +www.pythonanywhere.com a vyberte +Beginner Account. +Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. +V té vytvořte a aktivujte virtuální prostředí a nainstalujte Flask (plus +případně další závislosti nebo jiný webový framework).

    +

    PythonAnywhere používá specificky nastavený Linux, +tak je ve webové konzoli potřeba použít jiný příkaz +na vytvoření virtuální prostředí, než jste z toho kurzu zvyklí. +Napište příkazy takto (bez úvodního $):

    +
    $ virtualenv --python=python3.7 __venv__
    +$ . __venv__/bin/activate
    +$ python -m pip install flask
    +

    Pokud máte na PythonAnywhere starší účet, možná tam Python 3.7 nenajdete. +Můžete použít Python 3.6, nemělo by to vadit, protože tento návod je +koncipován tak, aby s touto verzí také fungoval. +Případně můžete zažádat o aktualizaci systémové +image.

    +

    Následně naklonujte na PythonAnywhere váš kód. +S veřejným repozitářem je to jednodušší – stačí ho naklonovat „anonymně” +(git clone https://github.com/<github-username>/<github-repo>). +Pokud ale používáme privátní repozitář, bude potřeba si vygenerovat SSH klíč:

    +
    $ ssh-keygen  # (zeptá se na hesla ke klíči)
    +$ cat ~/.ssh/id_rsa.pub
    +

    Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním +nastavení v sekci "SSH and GPG Keys". +Pak můžete klonovat přes SSH:

    +
    $ git clone git@github.com:<github-username>/<github-repo>.git
    +

    Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

    +

    Přejděte na stránkách PythonAnywhere do Dashboard do záložky Web, +a vytvořte novou aplikaci. +V nastavení zvolte Manual Configuration a Python 3.7. +(Volby jiné než Manual Configuration automaticky vytvoří kostru aplikace. +Vy ale už aplikaci máte hotovou, takže je nepotřebujete.)

    +

    V konfiguraci vzniklé webové aplikace je potřeba nastavit Virtualenv +na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/__venv__), +a obsah WSGI Configuration File přepsat. +To jde buď kliknutím na odkaz v konfiguraci (otevře se webový editor) +nebo zpět v bashové konzoli pomocí editoru jako vi nebo nano.

    +

    Nový obsah souboru by měl být:

    +
    import sys
    +path = '/home/<uživatelské-jméno>/<jméno-adresáře>'
    +if path not in sys.path:
    +    sys.path.append(path)
    +
    +from <jméno-souboru> import app as application
    +

    (Za <uživatelské-jméno>, +<jméno-adresáře> a +<jméno-souboru> +je samozřejmě potřeba doplnit +vaše údaje. Jméno souboru je zde bez přípony .py.)

    +

    Nakonec restartujte aplikaci velkým zeleným tlačítkem na záložce Web +a na adrese <uživatelské-jméno>.pythonanywhere.com +si ji můžete prohlédnout.

    +

    Deployment soukromých údajů

    +

    Protože vaše hesla, tajné klíče apod. nejsou v repozitáři, je nutné je předat +aplikaci zvlášť. +Konfigurační i jiné soubory jde nahrát v záložce Files nebo opět vytvořit +a editovat ve webové konzoli.

    +

    Pokud vaše aplikace vyžaduje nastavení nějakých proměnných prostředí +(například s cestou ke konfiguračnímu souboru nebo přímo s nějakou konfigurací), +můžete tak učinit přímo z WSGI Configuration File. +Buďto „nízkoúrovňově“ (os.environ) nebo více sofistikovaně například pomocí modulu dotenv, +což ostatně doporučují i v dokumentaci.

    +

    Doporučujeme pro tyto potřeby stejně raději nepoužívat API klíče +k vlastním účtům, raději si vyrobte nějaké účty pouze pro tento účel. +GitHub povoluje všem vytvořit si jeden účet pro automatické operace, ale +takový účet musí mít napsané v popisu, že je robot.

    +

    Aktualizace

    +

    Když nahrajeme nový kód na GitHub, je vždy potřeba provést na PythonAnywhere +v konzoli git pull a pak v záložce Web aplikaci restartovat.

    +

    Placená varianta PythonAnywhere má API a tento proces jde zautomatizovat.

    +

    Ve verzi zadarmo to není tak pohodlné.

    \ No newline at end of file diff --git a/lessons/dict/index.html b/lessons/dict/index.html new file mode 100644 index 00000000..8b3bde22 --- /dev/null +++ b/lessons/dict/index.html @@ -0,0 +1,136 @@ +

    Slovníky

    +

    Další základní datový typ, který si představíme – +po číslech, řetězcích, seznamech a n-ticích – +jsou slovníky (angl. dictionary, dict).

    +

    Podobně jako seznamy, slovníky v sobě obsahují další hodnoty. +Na rozdíl od seznamů, ve kterých jsou všechny prvky +uspořádané do jedné sekvence, ve slovnících máme dva druhy +prvků: takzvaný klíč (angl. key) a hodnotu (angl. value). +Každému klíči je přiřazena jedna hodnota.

    +

    Slovník můžeš použít, když máš několik kousků +informací, které se dají pojmenovat, ale chceš s nimi +pracovat jako s jednou proměnnou.

    +

    Tady je slovník, který má tři klíče, a k nim příslušné tři hodnoty:

    +
    >>> ja = {'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7]}
    +

    Hodnoty ze slovníku můžeš získat podobně jako +ze seznamu, jen místo indexu (pozice) použiješ klíč:

    +
    >>> ja['jméno']
    +'Anna'
    +

    Zeptáš-li se na neexistující klíč, nebude se to Pythonu líbit:

    +
    >>> ja['věk']
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in &lt;module&gt;
    +KeyError: 'věk'
    +

    Hodnoty jdou podle klíče i měnit:

    +
    >>> ja['čísla'] = [3, 7, 42]
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42]}
    +

    ... nebo přidávat:

    +
    >>> ja['jazyk'] = 'Python'
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'čísla': [3, 7, 42], 'jazyk': 'Python'}
    +

    ... nebo ubírat příkazem del, podobně jako u seznamů:

    +
    >>> del ja['čísla']
    +>>> ja
    +{'jméno': 'Anna', 'město': 'Brno', 'jazyk': 'Python'}
    +

    Vyhledávací tabulka

    +

    Trochu jiné použití slovníku, než sdružování +„různých“ typů informací, je takzvaná +vyhledávací tabulka (angl. lookup table). +V ní mají typicky všechny hodnoty stejný typ.

    +

    Taková tabulka se hodí vždycky, když je potřeba +přiřadit nějaké hodnoty jiným hodnotám. +Jako v telefonním seznamu, kde každému jménu přísluší +nějaké číslo, nebo v překladovém slovníku, kde jsou slovům +přiřazeny překlady.

    +
    cisla = {
    +    'Maruška': '153 85283',
    +    'Terka': '237 26505',
    +    'Renata': '385 11223',
    +    'Michal': '491 88047',
    +}
    +
    +barvy = {
    +    'hruška': 'zelená',
    +    'jablko': 'červená',
    +    'meloun': 'zelená',
    +    'švestka': 'modrá',
    +    'ředkvička': 'červená',
    +    'zelí': 'zelená',
    +    'mrkev': 'červená',
    +}
    +

    Iterace

    +

    Když dáš slovník do cyklu for, dostaneš klíče:

    +
    >>> popisy_funkci = {'len': 'délka', 'str': 'řetězec', 'dict': 'slovník'}
    +>>> for klic in popisy_funkci:
    +...     print(klic)
    +str
    +dict
    +len
    +

    Pokud chceš hodnoty, stačí použít metodu values:

    +
    >>> for hodnota in popisy_funkci.values():
    +...     print(hodnota)
    +řetězec
    +slovník
    +délka
    +

    Většinou ale potřebuješ jak klíče tak hodnoty. +K tomu mají slovníky metodu items, +která bude v cyklu for dávat dvojice:

    +
    >>> for klic, hodnota in popisy_funkci.items():
    +...     print('{}: {}'.format(klic, hodnota))
    +str: řetězec
    +dict: slovník
    +len: délka
    +

    Existuje i metoda keys(), která vrací klíče.

    +

    To, co keys(), values() a items() vrací, jsou speciální objekty, +které kromě použití ve for umožňují další +operace: například pracovat s klíči jako s množinou. +V dokumentaci +Pythonu je to všechno popsáno.

    +

    V průběhu takového for cyklu nesmíš +do slovníku přidávat záznamy, ani záznamy odebírat:

    +
    >>> for klic in popisy_funkci:
    +...     del popisy_funkci[klic]
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +RuntimeError: dictionary changed size during iteration
    +

    Hodnoty u už existujících klíčů ale měnit můžeš.

    +

    Jak udělat slovník

    +

    Slovník se dá vytvořit dvěma způsoby. +První, pomocí {složených závorek}, jsme už viděli; +další využívají funkci dict. +Ta, ve stylu str, int či list, převede cokoli, co jde, na slovník.

    +

    Slovník je ovšem dost specifická struktura – +čísla nebo typické seznamy na něj převádět nejdou. +Můžeme ale na slovník převést jiný slovník. +Nový slovník žije svým vlastním životem; +následné změny se promítnou jen do něj.

    +
    barvy_po_tydnu = dict(barvy)
    +for klic in barvy_po_tydnu:
    +    barvy_po_tydnu[klic] = 'černo-hnědo-' + barvy_po_tydnu[klic]
    +print(barvy['jablko'])
    +print(barvy_po_tydnu['jablko'])
    +

    Druhá věc, která jde převést na slovník, je +sekvence dvojic klíč/hodnota:

    +
    data = [(1, 'jedna'), (2, 'dva'), (3, 'tři')]
    +nazvy_cisel = dict(data)
    +

    A to je vše, co se na slovník dá převést.

    +

    Jako bonus umí funkce dict ještě +brát pojmenované argumenty. +Každé jméno argumentu převede na řetězec, +použije ho jako klíč, a přiřadí danou hodnotu:

    +
    popisy_funkci = dict(len='délka', str='řetězec', dict='slovník')
    +print(popisy_funkci['len'])
    +

    Pozor na to, že v tomhle případě musí být klíče +pythonní „jména“ – musí být použitelné jako jména proměnných. +Například takhle nejde zadat jako klíč řetězec +"def" nebo "propan-butan".

    +

    Pojmenované argumenty jde kombinovat s ostatními +způsoby vytvoření dict.

    +

    A to je zatím ke slovníkům vše

    +

    Chceš-li mít všechny triky, které slovníky umí, +pěkně pohromadě, můžeš si stáhnout +Slovníkový tahák.

    +

    Kompletní popis slovníků najdeš +v dokumentaci +Pythonu.

    \ No newline at end of file diff --git a/lessons/distribution/index.html b/lessons/distribution/index.html new file mode 100644 index 00000000..6b76ce55 --- /dev/null +++ b/lessons/distribution/index.html @@ -0,0 +1,404 @@ +

    Moduly

    +

    Zatím jsme tvořili programy v Pythonu tak nějak na divoko, tedy v jednom nebo +více souborech bez nějakého zvláštního řádu. V této lekci se podíváme na +to, jak tvořit redistribuovatelné moduly a balíčky, které jdou nahrát na PyPI +(veřejný seznam balíčků pro Python) a instalovat pomocí nástroje pip.

    +

    Za příklad si vezmeme kód Ondřeje Caletky, který umožňuje určit české svátky +v zadaném roce. Jako příklad je ideální, protože obsahuje jak funkce, které +můžeme volat z Pythonu, tak lze volat z příkazové řádky.

    + +

    Volání z příkazové řádky, pomocí příkazu python isholiday.py nebo +python -m isholiday, zajišťuje blok if __name__ == '__main__':. +Toto je rychlý způsob, jak napsat modul, který jde jak importovat, tak spustit. +Když nějaký modul importujeme, má v proměnné __name__ k dispozici své jméno. +„Hlavní” modul ale není importován a jeho jméno není vždy k dispozici +(např. v cat isholiday.py | python). +Python proto __name__ „hlavního” modulu nastavuje na '__main__', +čehož se často využívá.

    +

    Později se podíváme na elegantnější způsob jak to zařídit; teď se vraťme +zpět k balíčkování.

    +

    Slovníček pojmů

    +

    Než se pustíme do samotného výkladu, zavedeme některé pojmy tak, +aby mezi nimi nedošlo v textu záměně. +Anglické pojmy v závorce jsou převzaty z oficiálního glosáře.

    +
      +
    • (importovatelný) modul (ModuleImport Package) je cokoliv, +co se dá importovat z Pythonu, v tomto textu tedy především Python soubor nebo adresář s nimi;
    • +
    • balíček (Distribution Package) je instalovatelný archiv obsahují +importovatelné moduly pro Python a další potřebné soubory, může být i rozbalený;
    • +
    • zdrojový balíček (Source Distribution, sdsit) je varianta zabaleného balíčku ve zdrojové formě;
    • +
    • binární balíček (Binary Distribution, bdsit) je varianta zabaleného balíčku v nezdrojové (např. zkompilované) formě;
    • +
    • projekt (Project) je knihovna, framework, skript, plugin, aplikace apod. (či jejich kombinace), které balíme do balíčků.
    • +
    +

    setup.py

    +

    Základním stavebním kamenem Python balíčku je soubor setup.py, který +obsahuje všechna potřebná metadata ve volání funkce setup() z modulu +setuptools.

    +

    Pojďme vytvořit jeho minimální variantu:

    +
    from setuptools import setup
    +
    +
    +setup(
    +    name='isholiday',
    +    version='0.1',
    +    description='Finds Czech holiday for given year',
    +    author='Ondřej Caletka',
    +    author_email='ondrej@caletka.cz',
    +    license='Public Domain',
    +    url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
    +    py_modules=['isholiday'],
    +)
    +

    Všimněte si, že jsme balíček pojmenovali stejně jako soubor se zdrojovým kódem +(tedy stejně jako modul). +Je to dobrá konvence, ale není to technicky nutné.

    +

    Balíček můžeme zkusit nainstalovat do virtuálního prostředí:

    +
    $ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
    +$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
    +(__venv__)$ python setup.py install
    +...
    +(__venv__)$ python
    +>>> import isholiday
    +>>> 
    +(__venv__)$ python -m pip freeze
    +isholiday==0.1
    +

    Souboru setup.py rozumí i nástroj pip, takže můžete použít ten:

    +
    (__venv__)$ python -m pip install .
    +

    Mezi výše uvedenými příkazy existují rozdíly, ale pro základní použití se výsledek neliší.

    +

    Alternativně můžete použít příkaz develop (nebo pip install --editable), +který balíček nainstaluje tak, že změny v souborech se projeví rovnou +(není třeba po každé změněně instalovat znovu).

    +

    Přes setup.py můžeme dělat i jiné věci, než jen instalovat, například vytvořit archiv, zdrojový balíček:

    +
    (__venv__)$ python setup.py sdist
    +...
    +warning: sdist: standard file not found: should have one of README, README.rst, README.txt
    +...
    +

    Extra soubory do zdrojového balíčku

    +

    Jak vidíte, setuptools si stěžuje, že náš projekt nemá README – soubor, +do kterého se tradičně píšou základní informace o projektu. +Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, +tedy tam, kde byste jej nejspíš čekali.

    +
    Czech public holiday checker...

    Poté spustíme setup.py sdist znovu:

    +
    (__venv__)$ python setup.py sdist
    +

    V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam +být i soubor README.

    +

    Skvělé, pojďme vytvořit i další speciální soubor, LICENSE, který bude +obsahovat text licence, v tomto případě Public Domain. +Obsah najdete třeba na CC0.

    +

    Pokud ale se souborem LICENSE vytvoříte zdrojový balíček, soubor v archivu +nebude. Je to proto, že se standardně do archivu přidávají jen některé soubory. +Další soubory lze přidat pomocí souboru MANIFEST.in, dle dokumentace.

    +

    V našem případě bude MANIFEST.in vypadat takto:

    +
    include LICENSE

    Při dalším spuštění už setup.py přidá i soubor LICENSE. +To můžete zkontrolovat i ve výsledném archivu.

    +
    (__venv__)$ python setup.py sdist
    +...
    +hard linking LICENSE -> isholiday-0.1
    +hard linking MANIFEST.in -> isholiday-0.1
    +hard linking README -> isholiday-0.1
    +...
    +

    Hotový balíček pak můžete nainstalovat pomocí nástroje pip. +Doporučuji to dělat v jiném virtuálním prostředí – v aktuálním už ho máte +nainstalovaný.

    +
    # v jiné konzoli, v jiném adresáři
    +$ python3 -m venv __venv2__
    +$ . __venv2__/bin/activate
    +(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
    +Processing cesta/k/projektu/dist/isholiday-0.1.tar.gz
    +Installing collected packages: isholiday
    +  Running setup.py install for isholiday ... done
    +Successfully installed isholiday-0.1
    +

    Více argumentů pro setup()

    +

    Na chvíli se vrátíme k volání funkce setup() a přidáme co nejvíc dalších +položek. +Jejich vysvětlení najdete v dokumentaci.

    +
    from setuptools import setup
    +
    +
    +with open('README') as f:
    +    long_description = ''.join(f.readlines())
    +
    +
    +setup(
    +    name='isholiday',
    +    version='0.1',
    +    description='Finds Czech holiday for given year',
    +    long_description=long_description,
    +    author='Ondřej Caletka',
    +    author_email='ondrej@caletka.cz',
    +    keywords='holiday,dates',
    +    license='Public Domain',
    +    url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
    +    py_modules=['isholiday'],
    +    classifiers=[
    +        'Intended Audience :: Developers',
    +        'License :: Public Domain',
    +        'Operating System :: POSIX :: Linux',
    +        'Programming Language :: Python',
    +        'Programming Language :: Python :: Implementation :: CPython',
    +        'Programming Language :: Python :: 3',
    +        'Programming Language :: Python :: 3.6',
    +        'Programming Language :: Python :: 3.7',
    +        'Topic :: Software Development :: Libraries',
    +        ],
    +    zip_safe=False,
    +)
    +

    Všimněte si několika věcí. V první řadě v long_description vidíte, že jsme +pořád ještě v Pythonu a můžeme si ušetřit duplikaci nějakých informací pomocí +malého kousku kódu. Dalším zajímavým argumentem je classifiers. Jsou to +v podstatě takové tagy nebo strukturované informace o balíčku. +Zásadně si je nevymýšlíme sami, ale hledáme je v +seznamu. +Tyto informace budou později vidět na PyPI a +půjde podle nich hledat.

    +

    Argument zip_safe=False zajistí, že se moduly z balíčku nainstalují do adresáře. +Setuptools totiž mají nepříjemný zlozvyk instalovat moduly jako zip, +což komplikuje práci s datovými soubory (např. templates pro Flask). +Je proto lepší zip_safe=False uvést.

    +

    Více souborů s Python kódem

    +

    Doteď jsme vytvářeli balíček jen s modulem ve formě jednoho zdrojového souboru isholiday.py. +Co ale dělat, pokud je náš projekt větší a obsahuje souborů více? +Teoreticky je možné je přidat všechny do py_modules, ale není to dobrý nápad.

    +

    Proč to vlastně není dobrý nápad? Jednotlivé moduly ze všech nainstalovaných +balíčků by byly rozesety bez ladu a skladu mezi ostatními. +Mohl by snadno nastat konflikt v názvech, například pokud by více balíčků +mělo modul utils. +Slušně vychovaný Pythonista dá do každého balíčku právě jeden hlavní modul, +pojmenovaný stejně jako balíček a všechny ostatní moduly zanoří do něj.

    +

    Raději uděláme modul ve formě složky. V našem případě soubor +isholiday.py zatím přesuneme do isholiday/__init__.py:

    +
    (__venv__)$ tree
    +.
    +├── isholiday
    +│   └── __init__.py
    +├── LICENSE
    +├── MANIFEST.in
    +├── README
    +└── setup.py
    +
    +1 directory, 5 files
    +

    Soubor __init__.py jednak značí, že adresář isholiday je importovatelný modul, +a také obsahuje kód, který se spustí při importu modulu isholiday.

    +

    Musíme ještě mírně upravit setup.py – místo py_modules použijeme packages:

    +
    diff --git a/setup.py b/setup.py
    +index 3a69792..6b453ab 100644
    +--- a/setup.py
    ++++ b/setup.py
    +@@ -11,7 +11,7 @@ setup(
    +     keywords='holiday,dates',
    +     license='Public Domain',
    +     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
    +-    py_modules=['isholiday'],
    ++    packages=['isholiday'],
    +     classifiers=[
    +         'Intended Audience :: Developers',
    +         'License :: Public Domain',
    +

    Případně, což je ještě lepší, můžeme použít find_packages():

    +
    from setuptools import setup, find_packages
    +
    +setup(
    +    ...
    +    packages=find_packages(),
    +    ...
    +)
    +

    A jaký je tedy vlastně rozdíl mezi py_modules a packages? +Zjednodušeně: Ten první je na moduly sestávající z jednoho souboru, ten druhý na moduly v adresáři.

    +

    Momentálně máme všechen kód přímo v __init__.py, což sice funguje, +ale ideální to není. Dobré je mít kód v samostatných souborech a v __init__.py +pouze importovat veřejné rozhraní, tedy to, co budou z vašeho modulu importovat +jeho uživatelé.

    +

    V souboru __init__.py by tak prakticky žádný kód kromě importů být neměl. +Přesuňte tedy obsah __init__.py do holidays.py a +do __init__.py místo toho napište:

    +
    from .holidays import getholidays, isholiday
    +
    +__all__ = ['getholidays', 'isholiday']
    +

    Tečka v příkazu import není chyba: je to zkratka pro aktuální modul. +Můžeme psát i from isholiday.holidays import ..., +což ale trochu ztěžuje případné přejmenování modulu.

    +

    Ono __all__ pak explicitně definuje rozhraní modulu. Například s původním +modulem šlo provést from isholiday import datetime, ale asi by nikdo +nečekal, že tahle možnost bude nutně zachována i v příštích verzích knihovny. +Seznamem __all__ dáte najevo, že tyhle funkce nejsou jen „náhodné importy“, +a zároveň tím zamezíte různým varováním o +importovaném ale nevyužitém modulu, které může hlásit vaše IDE nebo linter.

    +

    Python samotný pak __all__ používá jako seznam proměnných importovaných +přes from isholiday import *. Tento způsob importu nevidíme rádi, +protože znepřehledňuje kód, to ale neznamená, že to musíme uživatelům +naší knihovny znepříjemňovat (např. pro interaktivní režim).

    +

    Spouštění modulu

    +

    Pokusíme-li se teď program spustit pomocí python -m isholiday, +narazíme na problém: na rozdíl od souboru se složka s kódem takto spustit nedá:

    +
    $ python -m isholiday
    +python: No module named isholiday.__main__; 'isholiday' is a package and cannot be directly executed
    +

    Namísto spuštění souboru (typicky s blokem if __name__ == '__main__':) totiž +Python v tomto případě hledá soubor pojmenovaný __main__.py a spustí ten.

    +

    Soubor __main__.py není určený k tomu, aby se z něho importovalo, proto +by měl obsahovat co nejméně kódu – ideálně jen volání funkce, která je +definovaná jinde. Vytvořte proto __main__.py s následujícím obsahem:

    +
    from .holidays import main
    +
    +main()
    +

    a v holidays.py zaměňte if __name__ == '__main__': za def main():.

    +

    Modul teď bude možné (opět) spustit pomocí python -m isholiday. +Bude to fungovat i tehdy, když vytvoříte balíček (python setup.py sdist) +a nainstalujete ho v jiném virtuálním prostředí.

    +

    Programy pro příkazovou řádku

    +

    Pokud chcete, aby váš modul umožňoval spouštění přímo z příkazové řádky, +bez python -m, měli byste použít entrypoints. +K tomu je potřeba přidat do volání setup v setup.py příslušný argument:

    +
    setup(
    +    ...
    +    entry_points={
    +        'console_scripts': [
    +            'isholiday_demo = isholiday.holidays:main',
    +        ],
    +    },
    +)
    +

    isholiday_demo je jméno entrypointu, tedy příkazu pro příkazovou řádku. +isholiday.holidays:main je pak cesta k funkci ve tvaru modul:funkce; +funkce může být v modulu definovaná nebo importovaná.

    +

    Skript bude možné použít, je-li aktivní prostředí, kde je nainstalován, jen +zadáním jména entrypointu:

    +
    (__venv__)$ python setup.py sdist
    +
    # v jiné konzoli, v jiném virtuálním prostředí
    +(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
    +(__venv2__)$ isholiday_demo
    +...
    +Mon Mar 28 00:00:00 2016 True
    +Tue Mar 28 00:00:00 2017 False
    +Fri Apr 14 00:00:00 2017 True
    +

    Specifikace závislostí

    +

    Balíčky na PyPI mohou záviset na dalších balíčkách. V případě isholiday to +potřeba není, ale v úlohách z minulých cvičení ano.

    +

    Existuje několik úrovní závislostí, ve většině případů si +vystačíte s argumentem install_requires. +Balíček, který závisí na balíčkách Flask (jakékoli verze) a +click (verze 6 a vyšší) by v setup.py měl mít:

    +
    setup(
    +    ...
    +    install_requires=['Flask', 'click>=6'],
    +)
    +

    Soubor requirements.txt

    +

    Kromě závislostí v setup.py se u pythonních projektů často setkáme se souborem +requirements.txt, který obsahuje přesné verze všech závislostí, včetně +tranzitivních – t.j. závisí-li náš balíček na Flask a Flask na Jinja2, +najdeme v requirements.txt mimo jiné například řádky:

    +
    Flask==0.11.1
    +Jinja2==2.8

    Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde +program běží, například mezi testovacím strojem a produkčním nasazením +webové aplikace. +Tento soubor se dá vygenerovat z aktuálního prostředí zadáním +python -m pip freeze > requirements.txt a balíčky v něm se dají nainstalovat +pomocí python -m pip install -r requirements.txt. +My ho používat nebudeme, vystačíme si s volnější specifikací závislostí +v setup.py.

    +

    Nahrání na PyPI

    +

    Balíček jde zaregistrovat a nahrát na PyPI. Původně k tomu sloužily příkazy +setup.py register a upload, ale tyto příkazy používaly HTTP, což není +bezpečné. Prototo je lepší použít program twine (instalovatelný přes pip), +který používá HTTPS.

    +

    Budete si potřebovat zařídit +účet na PyPI, +účet na testovací PyPI +a vytvořit konfigurační soubor ~/.pypirc:

    +
    [distutils]
    +index-servers=
    +    pypi
    +    testpypi
    +
    +[pypi]
    +username = <your user name goes here>
    +password = <your password goes here>
    +
    +[testpypi]
    +repository = https://test.pypi.org/legacy/
    +username = <your user name goes here>
    +password = <your password goes here>
    +

    Hesla můžete vynechat, pokud je budete chtít pokaždé zadávat.

    +

    Používáte-li Windows, je potřeba nastavit proměnnou prostředí HOME na adresář +se souborem .pypirc, např:

    +
    > set HOME=C:\cesta\k\nastaveni
    +

    Registrace projektu a nahrání na testovací PyPI se provádí pomocí příkazu +upload: ten projekt zaregistrueje (pokud to jde) a nahraje samotný balíček:

    +
    (__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
    +Uploading distributions to https://test.pypi.org/legacy/
    +Uploading isholiday-0.1.tar.gz
    +[================================] 8379/8379 - 00:00:02
    +

    První nahrání se zdaří, jen pokud jméno projektu již není zabrané. +Další nahrávání je povoleno jen vám, případně uživatelům, +kterým to povlíte přes webové rozhraní. +Po úspěšném nahrání lze nahrávat další verze balíčku, ale musí být novější +než ta, co už na PyPI je. Nejde tedy jednou nahraný balíček přepsat.

    +

    Svůj balíček najdete na https://test.pypi.org/project/<název_balíčku>/.

    +

    Pro nahrání na opravdovou PyPI stačí vynechat -r testpypi. +Zabírat jména na opravdové PyPI jen tak není hezké vůči ostatním Pythonistům; +registrujte tedy prosím jen balíčky, které budou nějak pro ostatní užitečné.

    +

    Instalace pomocí pip

    +

    Projekt nahraný na PyPI by mělo jít nainstalovat pomocí pipu. +V případě použití ostré verze PyPI stačí k instalaci zadat název balíčku:

    +
    (__venv__)$ python -m pip install <název_balíčku>
    +

    Pokud však použijeme testovací PyPI, je nutné pipu říct, aby balíček hledal tam. +Postup uvedený v dokumentaci není +v tomto případě nejvhodnější, protože z testovací PyPI vezme jak náš balíček, +tak i případné závislosti, které mohou být zastaralé, rozbité či jinak škodlivé.

    +

    Lepší by bylo, kdyby pip nainstaloval závislosti z ostré PyPI a na testovací +hledal jen náš projekt. Toho se dá docílit přepínačem --extra-index-url.

    +
    (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
    +

    V tomto případě pip nejdřív prohledá ostrou PyPI, a pokud nenajde požadovaný +balíček, použije testovací PyPI. Zde je potřeba dávat pozor na název projektu, +protože případné konflikty mezi ostrou a testovací PyPI se nekontrolují. +Pokud tedy máme projekt na testovací PyPI a na ostré existuje projekt se +stejným názvem, nainstaluje se ten z ostré verze.

    +

    V případě, že tento problém nastane, je možné ho částečně obejít specifikací +verze instalovaného balíčku:

    +
    (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
    +

    Pokud u duplicitního projektu na ostré PyPI neexistuje požadovaná verze, +nainstaluje se náš balíček z testovací PyPI.

    +

    Jiná možnost je zadat přímo cestu k archivu s balíčkem místo jeho názvu. +Zde pak na umístění balíčku ani verzi nezáleží:

    +
    (__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
    +

    Odkaz na archiv se dá najít na informační stránce o našem projektu na PyPI.

    +

    Datové soubory

    +

    Některé moduly kromě samotného kódu potřebují i datové soubory. +Například aplikace ve Flasku potřebují templates. +Taková data se dají do balíčku přidat parametrem package_data:

    +
    setup(...,
    +    packages=['hello_flask'],
    +    ...
    +    package_data={'hello_flask': ['templates/*.html']},
    +)
    +

    Další informace jsou odkázané v dokumentaci.

    +

    Wheel: Binární balíčky

    +

    Zatím jsme se zabývali jen zdrojovými balíčky (sdist). +Existují ale i balíčky „zkompilované” – binární (bdist). +Když se instaluje zdrojový balíček, vykonává se kód ze souboru setup.py. +Binární balíček se místo toho jen rozbalí na patřičné místo.

    +

    Z historických důvodů existuje několik různých druhů binárních distribucí, +v současné době je ale důležitá pouze možnost bdist_wheel:

    +
    (__venv__)$ python setup.py bdist_wheel
    +

    Výsledek je v souboru dist/*.whl.

    +

    Pokud vám příkaz nefunguje, nainstalujte balík wheel.

    +

    Obsah binárního balíčku typu wheel můžete prozkoumat, je to obyčejný ZIP.

    +

    Naše programy jsou zatím platformně nezávislé a ve wheelu, +i když se jmenuje binární, žádné binární soubory nejsou. +To se ale změní, až se budeme zabývat tvorbou modulů v jazyce C: +sdist pak obsahuje zdrojové soubory a bdist_wheel zkompilované moduly.

    +

    Potom je dobré distribuovat oba dva – každý má své výhody:

    +
      +
    • sdist jde nainstalovat na různých operačních systémech i procesorových +architekturách,
    • +
    • sdist tradičně obsahuje soubory jako LICENSE a README, ale
    • +
    • wheel při instalaci nepotřebuje např. překladače C (všechno už je přeložené +pro konkrétní OS a architekturu), a
    • +
    • wheel se rychleji instaluje.
    • +
    +

    Proces vydání složitějšího softwaru pak může vypadat takto:

    +
    (__venv__)$ rm dist/*
    +(__venv__)$ python setup.py sdist bdist_wheel
    +[... kontrola vytvořených balíčků v „čistém“ virtualenvu ...]
    +(__venv__)$ python -m twine upload dist/*
    +

    Další

    +

    K balíčkování existuje obsáhlá dokumentace. +Budete-li chtít dělat něco, co v tomto kurzu není, podívejte se tam!

    \ No newline at end of file diff --git a/lessons/docs/index.html b/lessons/docs/index.html new file mode 100644 index 00000000..cb65975a --- /dev/null +++ b/lessons/docs/index.html @@ -0,0 +1,389 @@ +

    Dokumentace

    +

    Jednou ze zásadních součástí každého kvalitního Python projektu je dokumentace. +Protože chceme, abyste vytvářeli kvalitní projekty, podíváme se tedy i na +dokumentaci.

    +

    Sphinx

    +

    Nejpoužívanějším nástrojem na vytváření dokumentace Python projektů je Sphinx. +Když jste se dívali do dokumentace Flasku, requests, clicku, flexmocku, pytestu, +betamaxu či Pythonu samotného, viděli jste dokumentaci vytvořenou ve Sphinxu.

    +

    Pro vytvoření základní kostry dokumentace se používá jednoduchý průvodce, +sphinx-quickstart.

    +

    Postupujte podle následující ukázky. Jsou v ní zobrazeny jen věci, +kde nestačí nechat výchozí hodnota; u ostatních otázek (dostanete-li je) +stačí výchozí hodnotu potvrdit (Enter).

    +
    $ . __venv__/bin/activate
    +(__venv__) $ python -m pip install sphinx
    +(__venv__) $ mkdir docs
    +(__venv__) $ cd docs
    +(__venv__) $ sphinx-quickstart
    +Welcome to the Sphinx 1.8.1 quickstart utility.
    +
    +Please enter values for the following settings (just press Enter to
    +accept a default value, if one is given in brackets).
    +
    +Selected root path: .
    +
    +You have two options for placing the build directory for Sphinx output.
    +Either, you use a directory "_build" within the root path, or you separate
    +"source" and "build" directories within the root path.
    +> Separate source and build directories (y/n) [n]: 
    +
    +The project name will occur in several places in the built documentation.
    +> Project name: coolthing
    +> Author name(s): Pythonista Dokumentarista
    +> Project release []:  0.1
    +
    +...
    +
    +Finished: An initial directory structure has been created.

    Průvodce vytvoří ve složce docs několik souborů:

    +
      +
    • conf.py – konfigurační soubor,
    • +
    • index.rst – vlastní text dokumantace,
    • +
    • Makefile, make.bat – spouštěcí soubory,
    • +
    • _static – adresář na obrázky, CSS apod.,
    • +
    • _templates – Adresář na vlastní šablony,
    • +
    • _build – adresář pro výstup, tedy hotovou dokumentaci.
    • +
    +

    Do gitu patří všechny nyní vytvořené soubory, kromě složky docs/_build, +která by měla být ignorována.

    +

    Zatím se nebudeme zabývat obsahem těchto souborů, ale zkusíme základní kostru +dokumentace sestavit do HTML.

    +

    Sphinx umí generovat dokumentaci ve více formátech (LaTeX, +manuálové stránky atd.), pro nás bude podstatné především HTML.

    +
    (__venv__) $ make html
    +...
    +The HTML pages are in _build/html.
    +

    Ve zmíněné složce byste měli najít index.html, ten si můžete prohlédnout +v prohlížeči.

    +

    Textový obsah v dokumentaci

    +

    Text dokumentace začíná v souboru index.rst a píše se ve značkovacím formátu +reStructuredText neboli rst. +Ten se od Markdownu liší v syntaxi, která je komplikovanější na +psaní, ale umožňuje dělat komplexnější věci.

    +

    Dokumentaci lze psát i ve formátu Markdown, +ale tato možnost je poměrně nová. +Jazyk Markdown nebyl navržen pro složitější strukturované texty +a nepodporuje přímo všechny možnosti, které Sphinx nabízí. +V dokumentaci se tak dočtete, jak chybějící možnosti doplnit +vložením reStructuredText do Markdownového dokumentu. +My budeme používat reStructuredText.

    +

    Pro přehled o tom, co reStructuredText umí a jakou má syntaxi, +můžete použít přehled z dokumentace Sphinxu, případně tahák.

    +

    V index.rst je seznam kapitol:

    +
    .. toctree::
    +   :maxdepth: 2
    +   :caption: Contents:
    +

    Tam můžete přidat další kapitoly:

    +
    .. toctree::
    +   :maxdepth: 2
    +   :caption: Contents:
    +
    +   intro
    +   tutorial/foo
    +   tutorial/bar
    +   ...
    +

    Soubory s kapitolami je třeba vytvořit ve složce docs s příponou .rst +(např. tutorial/foo.rst). +Text lze pak přidávat samozřejmě do těchto souborů i do +index.rst.

    +

    Chcete-li odkazovat na některou sekci, označíme si ji pomocí .. _label::

    +
    .. _my-reference-label:
    +
    +Section to cross-reference
    +--------------------------
    +
    +This is the text of the section.
    +

    Poté na ni lze odkazovat odkudkoli z dokumentace pomocí +konstrukce ref:

    +
    It refers to the section itself, see :ref:`my-reference-label`.
    +It could refer to a different section as well :)
    +

    Co do dokumentace psát

    +

    Teď, když víte jak něco napsat, pojďme si povědět co vlastně psát. +K čemu dokumentace vlastně je?

    +

    Dobrá dokumentace vysvětluje, proč a jak by váš projekt měl někdo používat. +Jak říká Eric Holscher v jedné své prezentaci,

    +

    Když lidi neví, že váš projekt existuje,
    +nebudou ho používat.
    +Když lidi nepřijdou na to, jak váš projekt nainstalovat,
    +nebudou ho používat.
    +Když lidi nepřijdou na to, jak váš projekt použít,
    +nebudou ho používat.

    +
    +

    Pokud pracujete v malém týmu, teoreticky jde to všechno kolegům prostě říct, +ale potom se musíte spoléhat na to, že to nezapomenete (a neodejdete z týmu). +Mnohem lepší je dokumentaci sepsat co nejdřív, dokud máte všechno čerstvě +v hlavě.

    +

    Nechce-li se vám nastavovat Sphinx, můžete informace napsat aspoň do malého +README. Ale i tam by měl být stejný druh informací jako ve „velké“ dokumentaci.

    +

    Na první stránce dokumentace (nebo v README) typicky najdeme:

    +
      +
    • krátký text o tom, co projekt dělá;
    • +
    • ukázku – u knihovny příklad kódu, u aplikace screenshot, u webové aplikace +odkaz na běžící instanci;
    • +
    • návod na instalaci;
    • +
    • odkazy na zbytek dokumentace;
    • +
    • odkazy pro přispěvatele – kde je repozitář, kde nahlásit chybu;
    • +
    • licenci.
    • +
    +

    Delší dokumentace knihoven pak většinou obsahuje:

    +
      +
    • tutoriál – návod, který uživatele provede použitím a možnostmi knihovny;
    • +
    • popis architektury, návrhu, použitých konceptů;
    • +
    • dokumentaci API – popis všech veřejných modulů, tříd, funkcí a podobně;
    • +
    • podrobný návod jak přispívat.
    • +
    +

    Nastavení a rozšíření

    +

    Průvodce sphinx-quickstart generuje soubor s nastavením, conf.py, +ve kterém můžete měnit nastavení Sphinxu a jeho rozšíření, včetně detailů +jako jméno a verze projektu.

    +

    Průvodce automaticky aktivuje tři rozšíření, která jsou obecně užitečná. +To se ale může v jiných verzích Sphinxu měnit, proto teď nastavení +zkontrolujte a případně rozšíření doplňte:

    +
    extensions = [
    +    'sphinx.ext.autodoc',
    +    'sphinx.ext.doctest',
    +    'sphinx.ext.intersphinx',
    +]
    +

    doctest

    +

    doctest je modul ze standardní knihovny, který najde v dokumentaci bloky kódu +a otestuje, jestli odpovídají ukázanému výstupu. +Rozšíření sphinx.ext.doctest integruje doctest do dokumentů +ve formátu reStructuredText.

    +

    Pro nás to bude způsob, jak testovat dokumentaci – tedy jestli jsou ukázky +kódu v ní stále platné. +Dá se sice použít i k testování samotného kódu, ale na to existují +lepší nástroje.

    +

    Můžete to dělat dvěma způsoby. První je mít v dokumentaci +příklad vypadající jako interaktivní konzole. +Takový příklad nemusí být odsazený ani ničím uvozený; stačí >>> na začátku.

    +
    >>> 1 + 1
    +2
    +

    Doctest v tomto případě otestuje, že vše funguje, jak má. +V tomto případě se provede součet a zkontroluje se, zda výsledek je 2.

    +

    Druhý způsob je mít v dokumentaci nejdříve kód:

    +
    print('foo')
    +

    A dále někde jinde výstup volání:

    +
    foo
    +

    K tomu všemu složí několik direktiv:

    +

    .. testsetup::

    +

    Direktiva pro potřebný kód, který se musí provést, aby příklad fungoval, ale +nebude v dokumentaci zobrazen (např. kód pro vytvoření falešného objektu, +import...).

    +

    .. testcleanup::

    +

    Podobná direktiva jako .. testsetup:: provedená po skončení testů. +V dokumentaci nebude kód zobrazen.

    +

    .. doctest::

    +

    Test s interaktivní konzolí. V dokumentaci bude zobrazen, pokud nepoužijete flag +:hide:.

    +

    .. testcode::

    +

    Kód testu bez interaktivní konzole, co chcete kontrolovat, musíte dát na +standardní výstup. V dokumentaci bude zobrazen, pokud nepoužijete flag +:hide:.

    +

    .. testoutput::

    +

    Výstup posledního testcode bloku. V dokumentaci bude kód zobrazen, pokud +nepoužijete flag :hide:.

    +

    Kompletní příklad

    +

    Zde můžete vidět výše zmíněné direktivy použité dohromady. +Jedná se o umělý příklad, kdy použitou třídu připravíme v direktivě testsetup. +V praxi pak doctestem testujeme, jestli naše dokumentace odpovídá chování +naší implementace, třídu Parrot bychom tedy odněkud naimportovali.

    +
    The parrot module
    +=================
    +
    +.. testsetup::
    +
    +   class Parrot:
    +       def voom(self, voltage):
    +           print('This parrot wouldn\'t voom if you put {} volts through it!'.format(voltage))
    +
    +       def die(self):
    +           return 'RIP'
    +
    +
    +   parrot = Parrot()
    +
    +The parrot module is a module about parrots.
    +
    +Doctest example:
    +
    +.. doctest::
    +
    +   >>> parrot.voom(3000)
    +   This parrot wouldn't voom if you put 3000 volts through it!
    +
    +Test-Output example:
    +
    +.. testcode::
    +
    +   parrot.voom(3000)
    +
    +This would output:
    +
    +.. testoutput::
    +
    +   This parrot wouldn't voom if you put 3000 volts through it!
    +
    +You can use other values:
    +
    +.. testcode::
    +
    +   parrot.voom(230)
    +
    +.. testoutput::
    +   :hide:
    +
    +   This parrot wouldn't voom if you put 230 volts through it!
    +
    +
    +.. testcleanup::
    +
    +   parrot.die()
    +

    Testy se také dají např. zařazovat do skupin. Více najdete +v dokumentaci.

    +
    (__venv__) $ make doctest
    +...
    +Document: intro
    +---------------
    +1 items passed all tests:
    +   3 tests in default
    +3 tests in 1 items.
    +3 passed and 0 failed.
    +Test passed.
    +1 items passed all tests:
    +   1 tests in default (cleanup code)
    +1 tests in 1 items.
    +1 passed and 0 failed.
    +Test passed.
    +
    +Doctest summary
    +===============
    +    3 tests
    +    0 failures in tests
    +    0 failures in setup code
    +    0 failures in cleanup code
    +...
    +

    Import z vlastního kódu

    +

    Pokud nemáte nainstalovaný vlastní balíček a budete z něj chtít v doctestu +importovat, pravděpodobně dostanete ImportError. +V takovém případě pomůže drobná editace na začátku conf.py. +Musíte přidat adresář, ze kterého lze váš kód importovat, do sys.path. +Pokud jste postupovali podle návodu výše, máte dokumentaci v adresáři docs, +je tedy potřeba přidat nadřazený adresář (..):

    +
    # -- Path setup --------------------------------------------------------------
    +
    +# If extensions (or modules to document with autodoc) are in another directory,
    +# add these directories to sys.path here. If the directory is relative to the
    +# documentation root, use os.path.abspath to make it absolute, like shown here.
    +#
    +import os
    +import sys
    +sys.path.insert(0, os.path.abspath('..'))
    +

    Travis CI

    +

    Neexistuje zatím unifikovaný způsob, jak specifikovat závislosti pro sestavení +dokumentace. Proto, pokud chcete mít nějaký jednoduchý způsob, jak pouštět +doctesty na Travisu, vytvořte například soubor docs/requirements.txt +a do něj dejte závislosti potřebné pro sestavení dokumentace. +Je na vás, jestli tam budou pouze extra závislosti oproti těm v setup.py +(většinou pouze sphinx), nebo všechny závislosti, aby šel použít soubor +samostatně.

    +

    Poté na Travisu můžete udělat něco jako:

    +
    language: python
    +python:
    +- '3.7'
    +install:
    +- python setup.py install
    +- pip install -r docs/requirements.txt
    +script:
    +- python setup.py test --addopts -v
    +- cd docs && make doctest
    +

    Chcete-li jít s dobou, můžete vyzkoušet strukturovaný způsob závislostí +pro vývoj pomocí extras. Aktuálně pro to neexistuje standard, +ale vypadá to, že následující způsob je nejlepší kandidát na +standardizaci.

    +

    Do setup.py přidejte:

    +
    extras_require={
    +    'dev':  ["sphinx"],
    +}
    +

    Projekt pak lze nainstalovat pomocí .[dev] (tedy jméno balíčku a za ním +jméno extras v hranatých závorkách):

    +
    install:
    +- python -m pip install .[dev]

    autodoc

    +

    Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, +které průvodce přidává automaticky.

    +

    Nemáte-li toto rozšíření povolené, přidejte jej do conf.py:

    +
    extensions = [
    +    'sphinx.ext.autodoc',
    +    'sphinx.ext.doctest',
    +    'sphinx.ext.intersphinx',
    +]
    +

    Rozšíření autodoc se používá takto:

    +
    .. automodule:: mymodule
    +   :members:
    +

    Tento příklad na dané místo vygeneruje dokumentaci složenou z dokumentačních +řetězců jednotlivých funkcí, tříd a metod v modulu mymodule.

    +

    Pokud chcete selektivně vybrat, dokumentaci čeho chcete generovat, +můžete použít i +jiné direktivy.

    +

    Pro vygenerování hezké struktury si můžete pomoci příkazem sphinx-apidoc:

    +
    (__venv__) $ sphinx-apidoc -o docs mymodule
    +

    V dokumentačních řetězcích samozřejmě můžete použít reStructuredText a je to +dokonce žádoucí.

    +

    Zde je ukázka z betamaxu (Copyright 2013 Ian Cordasco):

    +
    class Betamax:
    +
    +    """This object contains the main API of the request-vcr library.
    +
    +    This object is entirely a context manager so all you have to do is:
    +
    +    .. code::
    +
    +        s = requests.Session()
    +        with Betamax(s) as vcr:
    +            vcr.use_cassette('example')
    +            r = s.get('https://httpbin.org/get')
    +
    +    Or more concisely, you can do:
    +
    +    .. code::
    +
    +        s = requests.Session()
    +        with Betamax(s).use_cassette('example') as vcr:
    +            r = s.get('https://httpbin.org/get')
    +
    +    This object allows for the user to specify the cassette library directory
    +    and default cassette options.
    +
    +    .. code::
    +
    +        s = requests.Session()
    +        with Betamax(s, cassette_library_dir='tests/cassettes') as vcr:
    +            vcr.use_cassette('example')
    +            r = s.get('https://httpbin.org/get')
    +
    +        with Betamax(s, default_cassette_options={
    +                're_record_interval': 1000
    +                }) as vcr:
    +            vcr.use_cassette('example')
    +            r = s.get('https://httpbin.org/get')
    +    """
    +

    Existují různé způsoby, jak dokumentovat argumenty, návratové hodnoty apod. +Zvídavým studentům doporučujeme podívat se na rozšíření Napoleon.

    +

    Odkazy na třídy a moduly

    +

    Máte-li zdokumentovaný modul, funkci, třídu, metodu apod., je možné na ni +odkázat pomocí konstrukce :mod:, :func:, :class:, :meth: a dalších +ze Sphinxové domény Python:

    +
    To test the parrot's electrical resistance, use :meth:`parrot.voom()`.
    +

    V této části dokumentace Sphinxu též najdete způsob, jak dokumentovat API +bez použití autodoc.

    +

    Všechny zdokumentované objekty se automaticky přidávají do rejstříku. +Chcete-li do rejstříku přidat něco navíc, použijte direktivu index.

    +

    README.rst

    +

    Když už se stejně zabýváme reStructuredTextem, je dobré váš README přepsat +nebo převést do stejného formátu. Na PyPI pak bude váš projekt vypadat lépe.

    +

    Při přejmenování na README.rst dejte pozor na patřičné změny v setup.py.

    +

    Read the Docs

    +

    Pokud svůj repositář na GitHubu změníte na veřejný, můžete využít službu +Read the Docs k hostování dokumentace ve Sphinxu. +Dokumentace se sestaví při každém pushnutí na GitHub.

    +

    Pokud Read the Docs použijete, nezapomeňte na dokumentaci odkázat +z README.rst.

    \ No newline at end of file diff --git a/lessons/drawing/apple.png b/lessons/drawing/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..830b78684050289f319e5bcf8b2841fdff56e4f1 GIT binary patch literal 2482 zcmV;j2~GBiP)GrHCNOjYUu^ z{YP!Bv`A6$7Z$-vi+?Dkzidktv1)&2OVhfxrZLTKOtSmlj(?mxd(S=Z%zO830uNyi zT<(2y?>#f$?>Td3?wNV8Dyy<8Bar)nhk)@>H)K@uXCMM!9(6-TCGSHBcy`nc8I`nv zmk|=)JnDvwLY9EvmDlebQ5%5K5diRHdA?wTZ5Sy5Gv)dG5w>BZ1Uz4!-#EfHFm^hX z6>te~8SoBZ8)DrJ!1@6H1!e-=7vR1>z>x=l0Gqxl&+UkCd4$V>^CL_GbHGu=Tb>0T z10E{iiPP2QaHE9*t-`VUkQ$( z2`HqEHv^vrS}ovQ;G7bGRv5|_2B#b<3)|o6I=ySl=YW3$uOK9qr#sicm%al383xZ# z1QhTd;3vS=0K6V}1NA@>`kW(TSqn@PwPfz)&Hx?YMc|)R`3u0O3V5I?rp5#ma5Zoz zFtHxE5OGzjOdnqPph}}T29<+!k7p3i02Ts#W*_`?FsgtM>#IZ}81WcA3hTi3vLRav?Zb?>HAvG3&26SJPPb6;K0xX6cXDW1a?jV+szBw@(Hj8-ZtghJ3KGY zAheY&@UBx1^=`XAg=OXN!K&EuI;VpVC-gd6X=(T=s{;k0z z5;_WSw|uutHDYKIG>O|-o-^zO_5k0_;Ovz`#`HR@L zPeankS^|C8JBbt({IoHJc12hBJXUk=Jwu1CLP-C?X~s{>kW2@ zOrX4HJTLR=8#nJ-!lx>1yDZom0R^-Id^7-?`hZW3OAXUUYP5Z}O|J)dUJ=YYNss4w zw(Ds^wLXRA%EDl-{bjoJzOF2jDwggP3!dxydHreH|jtQ=%m(X2{;q#*0p`mtK5E%Hvv3Ia)ju*nv5Vxni8;*w*J3K4WlJs4(b^h z&3rW1_8Ds>O!+X9^CDfBmqPREhbpHC%}GC1ILgBk^u7&emRhU8{k-kTO-TsYqdC#vx3(s>lGcN!*(t0=2owF zbm%4A5^%7(zO68mAeVqrZVE7em@0baR%;Sy>j|D`bg5gc)2FYXKGz6uFcTCxW(V?GRF#5C(Z$U(N*R&Bi!Z!*D z1wGPlo7}g7tB%8t1IS{do*bnyAL_wtjA|hxm$}J(JmrR5ud8@g*E$ZcJo)*{dGO5~ z$iDNE0xk*gaD;W!$mR%}V6f>iefAbX^t)EP)nRXW+?MHgBeG{`M(UjpaM@n?>xu{f z*bkooejXug171hng1OwGwKZ6RC2I=!0J8mT<2bUv zG|xb_v>nYemYgHVBxkOA_4mN;qS}StNLG@r0|*6t7Wf+F&bc#?0J({31EuaBUe?wU z;8|RgaRS-v@^X1y%1glB0)A*zGy^j13tDc5wR5m1!WU61E|Z97tfN|)O$(VF#7|$L z`YfA7R%AA+XBLr(&k3qM^D3zUV(IT}fLpKcxz$`wiGU=9c=i>@cG?dkj&RDAIOaSI z{1*5baBtx!p@x#vLV%WEK>P3Tc4T|nrAVxt4&@&w5Q9De+;LO6ap?y5KCm14!^L`F wF3NK=NR0av@aS9M@vCYH-c?zZRXIiZABq1YX8&ZR0ssI207*qoM6N<$f?U6*LI3~& literal 0 HcmV?d00001 diff --git a/lessons/drawing/caterpillar.png b/lessons/drawing/caterpillar.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e10accf45954b82cd62255c2e4dacd5ef9547d GIT binary patch literal 18444 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 lD>8skfwTfHG|{*8-*%}&R);XA;9t}8L|#p + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + y + x + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 0 + 1 + 2 + 3 + 4 + + + + + + + + + + + + + + + + + + + + + 5 + 6 + 7 + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/drawing/coords-px.svg b/lessons/drawing/coords-px.svg new file mode 100644 index 00000000..1f302ebe --- /dev/null +++ b/lessons/drawing/coords-px.svg @@ -0,0 +1,777 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + y + x + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 0 + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/drawing/coords.svg b/lessons/drawing/coords.svg new file mode 100644 index 00000000..0aba3b43 --- /dev/null +++ b/lessons/drawing/coords.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + y + x + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 0 + 1 + 2 + 3 + 4 + + + + + + + + + + + + + + + + + + + + + 5 + 6 + 7 + + + + + + + diff --git a/lessons/drawing/green.png b/lessons/drawing/green.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fbc0a2d59590435d15f13a92f9ec5b31d05050 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=h*^TujB(5S{-;18+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VqVW>EalYaqsPUM_vX74weO%|IOXnSZ|);koqY~oryHCoi(tHvA$Mh!$pvdp00i_ I>zopr0M&IYk^lez literal 0 HcmV?d00001 diff --git a/lessons/drawing/index.html b/lessons/drawing/index.html new file mode 100644 index 00000000..1e9ea04b --- /dev/null +++ b/lessons/drawing/index.html @@ -0,0 +1,386 @@ +

    Nakresli mi hada

    +

    Většina videoher má vlastní svět – spoustu čísel, textů, seznamů a jiných +datových objektů, které popisují všechno, co ve hře je – celý stav hry. +Tenhle stav se časem mění, ať už automaticky nebo podle akcí hráče. +A docela často – většinou zhruba šedesátkrát za vteřinu – se stav hry převede +na obrázek, který se hráčovi ukáže.

    +

    Abys mohl/a zobrazit hada, budeš napřed muset definovat stav hry – zadat +to, co se má vykreslovat.

    +

    Zkus se zamyslet, co všechno bude ten stav obsahovat: co všechno si počítač +musí o hře „pamatovat“, aby mohl aktuální stav zobrazit?

    +

    Bude potřebovat například aktuální polohu všech částí hada: kde má začátek? +Kroutí se doprava nebo doleva? Jak je dlouhý? +Naopak barvu hada se stavu ukložit nepotřebuješ – každý had v téhle hře bude +stejný.

    +

    Napadne tě, jak polohu hada zapsat pomocí čísel, seznamů a dalších základních +datových typů?

    +

    Reprezentace hada

    +

    Asi nejjednodušší způsob, jak si v počítači „zapamatovat“ herního hada, +je pomocí seznamu souřadnic.

    +

    Pamatuješ si ze školy na kartézské souřadnice? +To je taková ta část matematiky, co možná vypadala že nemá praktické využití. +Pro počítačovou grafiku jsou ale souřadnice to co pro češtinu písmenka. +Pojďme si je osvěžit.

    +

    Každý bod v rovině (třeba na obrazovce!) +je možné popsat dvěmi čísly: x-ovou a y-ovou souřadnicí. +Ta x-ová říká, jak moc vlevo je bod od nějakého počátku, +ta y-ová udává jak moc je nahoře. +My za onen „počátek“ zvolíme roh okýnka, ve kterém se bude plazit náš had.

    +

    Na rozdíl od školní geometrie se had bude plazit po čtverečkové mřížce. +Je to jako na šachovnici – když jde pěšec na D5, D značí, jak moc je to +políčko vlevo od okraje a 5 jak moc „nahoře“.

    +

    Tady je had, který začíná na souřadnicích (1, 2) a hlavu má na (4, 5):

    +

    Had na „šachovnici“ se souřadnicemi

    +

    Možná si všimneš, že matematický zápis souřadnic – (1, 2) – odpovídá +způsobu, jak se v Pythonu píšou n-tice. +To není náhoda! +Dvojice čísel je perfektní způsob, jak uložit souřadnice kousku hada.

    +

    Had má ale kousků víc, a jinak dlouzí hadi jich budou mít různý počet. +Na to je dobré použít seznam. Seznam souřadnic. +A protože souřadnice pro nás budou dvojice čísel, +seznam souřadnic bude seznam dvojic čísel.

    +

    Had z obrázku výše bude v Pythonu vypadat takto:

    +
    snake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]
    +

    Tohle je reprezentace hada – to, co je z hlediska hry potřeba o konkrétním +hadovi vědět.

    +

    Počítačům (a programátorům?) to takhle stačí. +My si to ale zkusme zobrazit barevně, ať hadovi rozumí i hráč naší budoucí hry.

    +

    Logické a zobrazovací souřadnice

    +

    U vykreslování hada musíme vyřešit jeden základní problém: +převod logických souřadnic na souřadnice obrazovky.

    +

    Displeje počítačů fungují podobně jako naše souřadnicová „šachovnice“: +jsou to čtvercové mřížky plné políček. +Každému políčku – pixelu – lze nastavit barvu. +Hlavní rozdíl proti šachovnici je v tom, že pixelů na obrazovce je mnohem, +mnohem víc.

    +

    Kdyby byl každý „herní“ čtvereček 10×10 pixelů velký, +tak hlava hada z ukázky, která má „herní“ souřadnice (4, 5), +se na obrazovku bude vykreslovat na čtverečku, který začíná na (40, 50):

    +

    Had na „šachovnici“ se souřadnicemi obrazovky

    +

    A ocas s „herními“ (logickými) souřadnicemi (1, 2) se vykreslí na čtvereček +se souřadnicemi (10, 20).

    +

    Sázení čtverečku

    +

    Na to, abychom hada vykreslili, použijeme okýnko z Pygletu. +Tady je základní kostra programu Pyglet, které už bys měl/a rozumět.

    +

    Udělej si nový, prázdný adresář na hadí hru, a kostru si +zkopíruj do souboru ui.py. +Budeme ji dál rozvíjet.

    +
    import pyglet
    +
    +window = pyglet.window.Window()
    +
    +@window.event
    +def on_draw():
    +    window.clear()
    +
    +pyglet.app.run()
    +

    +Stáhni si soubor green.png – zelený čtvereček – +a dej ho do adresáře, kam píšeš kód.

    +

    Pod import pyglet přidej řádek, který tento obrázek načte.

    +
    green_image = pyglet.image.load('green.png')
    +

    Potom zkus dovnitř do funkce on_draw přidat vykreslení obrázku na souřadnice +(40, 50), velikosti 10.

    +
        green_image.blit(40, 50, width=10, height=10)
    +

    Program spusť (cd do nového adresáře; python ui.py). Funguje? +(Je docela důležité, aby fungoval – nevidíš-li zelený čtvereček, +nečti dál a program radši oprav.)

    +

    Jak vidíš, čtvereček je docela malý. +Budeme radši používat čtverečky větší, řekněme 64 pixelů.

    +

    To číslo je „střelené od boku“. +V programu ho použijeme několikrát, a možná ho později budeš chtít upravit. +Uložíme si ho proto do konstanty – proměnné, kterou nebudeme měnit. +Konstanty se tradičně pojmenovávají velkými písmeny, a píšou se hned za řádek +import (i když to není technicky nutné). +Přidej tedy za import řádek:

    +
    TILE_SIZE = 64
    +

    … a ve volání green.blit velikost čtverečku zohledni:

    +
        green_image.blit(4 * TILE_SIZE, 5 * TILE_SIZE,
    +                     width=TILE_SIZE, height=TILE_SIZE)
    +

    Povedlo se? Máš čtvereček? +Jestli ne, zkus si program celý, řádek po řádce, projít a zkontrolovat. +Nebo ho porovnej se vzorovým řešením (což je rychlejší varianta, ale míň +se naučíš).

    +
    +

    Řešení

    + + +

    Sázení hada

    +

    Zkus teď na začátek programu – těsně pod import a konstantu – přidat +definici hada:

    +
    snake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]
    +

    A ve funkci draw vykresli všechny čtverečky hada. +Vzpomeň si, že seznam dvojic můžeš „projít“ pomocí cyklu for a „rozbalení“ +n-tice:

    +
    for x, y in snake:
    +    ...
    +

    Funguje to? Vidíš v tom – aspoň zhruba – hada +(i když je poskládaný ze čtverečků)?

    +

    Had na „šachovnici“ a ukázka programu

    +

    Jestli ne, nezoufej, zkontroluj si to znovu, poptej se na radu. +Řešení využij až jako krajní možnost, jak pokračovat dál – nebo na kontrolu +správného řešení.

    +
    +

    Řešení

    + + +

    Krmení

    +

    + +Aby bylo ve hře co dělat, budeme potřebovat pro hada krmení. +Stáhni si do adresáře s projektem obrázek apple.png (ať už jednoduchý +čtvereček nebo detailnější obrázek), a zkus vykreslit jídlo třeba +na následující souřadnice:

    +
    food = [(2, 0), (5, 1), (1, 4)]
    +
    +

    Řešení

    + + +

    Používáš-li detailnější obrázek, možná si všimneš, že má trošičku „zubaté“ hrany. +To je dáno způsobem, jakým v Pygletu obrázek vykreslujeme. +Úplné vysvětlení by zabralo příliš času, proto ukážu jen řešení. +Až se naučíš grafiku víc do hloubky, pochopíš co se tu děje :)

    +

    Do funkce on_draw, hned za clear, dej následující dva řádky:

    +
        # Lepší vykreslování (pro nás zatím kouzelné zaříkadlo)
    +    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
    +    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
    +

    Načítání kousků hada

    +

    Teď, když umíš kreslit hada ze čtverců, zkusíme ho udělat hezčího. +Stáhni si archiv snake-tiles.zip +a rozbal si ho tak, aby adresář snake-tiles s obrázky byl na stejné úrovni +jako program s hrou. +Struktura adresáře by měla vypadat takhle:

    +

    Adresářová struktura

    +

    V archivuje spousta „kousků“ hada, které můžeme vykreslovat místo zelených +čtverečků. +Kousky vypadají následovně. +Všimni si pojmenování – každý kousek hada buď spojuje dvě strany obrázku, +nebo stranu obrázku s hlavou či ocasem. +Obrázek se jmenuje odkud-kam.png.

    +

    Kousky hada

    +

    Co jsou taková ta divná „hadí vajíčka”? +To je pro přímad, že by had byl jen jedno políčko dlouhý – a tedy měl hlavu +i ocas na stejném políčku. +V naší hře se do takového stavu nedostaneme (had bude začínat s délkou 2), +ale může se stát, že se do něj dostaneš omylem při vývoji hry. +Když jsou obrázky k dispozici, lépe pak zjišťuješ, co je špatně.

    +

    Pojďme si teď tyhle obrázky načíst. +Šlo by to dělat postupně, třeba takhle:

    +
    bottom_left = pyglet.image.load('snake-tiles/bottom-left.png')
    +bottom_right = pyglet.image.load('snake-tiles/bottom-right.png')
    +bottom_top = pyglet.image.load('snake-tiles/bottom-top.png')
    +...
    +

    Ale obrázků je spousta, tímhle způsobem by to bylo zdlouhavé a nejspíš bys +na některý zapomněl/a.

    +

    Proto Pythonu řekneme, aby nám dal všechny soubory s koncovkou .png v daném +adresáři. +Na to se dá použít třída Path z modulu pathlib. +Zkus si napsat (do nového souboru, třeba experiment.py) tento kód +a spustit ho. +Dokážeš vysvětlit, co dělá?

    +
    from pathlib import Path
    +
    +TILES_DIRECTORY = Path('snake-tiles')
    +
    +for path in TILES_DIRECTORY.glob('*.png'):
    +    print(path)
    +

    My z každého souboru potřebujeme nejlépe jméno, tedy místo +snake-tiles/right-head.png jenom right-head. +Na to naštěstí existuje atribut stem (kořen, t.j. jméno bez přípony). +Místo print(path) použij:

    +
        print(path.stem)
    +

    Funguje? Máš vypsané všechny možné kousky hada?

    +

    Teď budeme chtít načíst obrázky do slovníku. +Klíče slovníku, podle kterých budeme vyhledávat, budou jména, která jsi +právě vypsal/a. +Hodnoty pak budou pygletí obrázky, které ve hře můžeš rovnou vykreslit.

    +

    Začni s prázdným slovníkem, {}, a v cyklu for do něj postupně přidávej +záznamy. +Pak slovník vypiš.

    +

    Až to budeš mít, měl by výpis vypadat asi takhle:

    +
    {'right-tongue': <ImageData 64x64>, 'top-tongue': <ImageData 64x64>,
    + 'right-top': <ImageData 64x64>, 'left-bottom': <ImageData 64x64>,
    + 'tail-left': <ImageData 64x64>, 'bottom-tongue': <ImageData 64x64>,
    + 'left-top': <ImageData 64x64>, 'bottom-bottom': <ImageData 64x64>,
    + ...
    +

    Řešení

    + + +

    Housenka

    +

    A teď zkus načtení obrázků začlenit do programu s hadem!

    +

    Všechny importy patří nahoru, konstanty pod ně, a dál pak zbytek kódu. +Vypisovat načtený slovník ve hře nemusíš, zato místo green_image +pak ve vykreslovací funkci použij třeba snake_tiles['tail-head'].

    +

    Místo čtverečků se teď objeví kuličky – místo hada budeš mít „housenku“.

    +

    Housenka

    +
    +

    Řešení

    + + +

    Jak vybrat čtverečky?

    +

    Místo toho, aby byl všude stejný kousek hada, +ale budeme chtít vybrat vždycky ten správný.

    +

    Jak na to?

    +

    Podle čeho ho vybrat?

    +

    Vytvoř soubor smery.py a napiš do něj:

    +
    snake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]
    +
    +for x, y in snake:
    +    print(x, y)
    +

    Tenhle kód vypisuje souřadnice:

    +
    1 2
    +2 2
    +3 2
    +3 3
    +3 4
    +3 5
    +4 5

    Zkus vymyslet, jak by se tenhle kód dal změnit, aby vypisoval ke každé +souřadnici směr k předchozímu a následujícímu políčku – tedy odkud a kam +každý kousek hada „vede“. +Takhle:

    +
    1 2 tail right
    +2 2 left right
    +3 2 left top
    +3 3 bottom top
    +3 4 bottom top
    +3 5 bottom right
    +4 5 left head

    Toto je těžký úkol. +Nepředpokládám, že ho zvládneš vyřešit hned, i když všechny potřebné informace +a nástroje k tomu znáš. +Zkus nad tím ale přemýšlet, nech si to rozležet v hlavě třeba přes noc, +vrať se k materiálům k předchozím lekcím (hlavně k úvodu do Pythonu), +zkoušej a objevuj… A časem na to přijdeš.

    +

    Až se to stane, zkus své řešení co nejvíc zjednodušit a pak ho zakomponovat +do vykreslovací funkce. +To by už nemělo být příliš složité:

    +
        for ??? in ???snake???:
    +        ...
    +        x = ???
    +        y = ???
    +        odkud = ???
    +        kam = ???
    +        ...
    +
    +        snake_tiles[odkud + '-' + kam].blit(
    +            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)
    +

    Soubor smery.py po vyřešení nemaž, bude se ti pak hodit.

    +

    Odměnou za vyřešení tohoto úkolu ti bude had místo housenky.

    +

    Než na to přijdeš, zbytek programu ti neuteče. +Housenka je úplně stejně hratelná jako had, jen jinak vypadá. +Klidně přejdi na další část – logiku hry – s housenkou.

    \ No newline at end of file diff --git a/lessons/drawing/red.png b/lessons/drawing/red.png new file mode 100644 index 0000000000000000000000000000000000000000..c77d100c5a76c179d28da63dcf3b79252028ca7b GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=h*^Sz(fDnzNE%Q`HZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a5Z6x;Tbp+gTe~ HDWM4fD1a+> literal 0 HcmV?d00001 diff --git a/lessons/drawing/screenshot-dir.png b/lessons/drawing/screenshot-dir.png new file mode 100644 index 0000000000000000000000000000000000000000..62382a32847242d7246e004f8bd68c0de4054951 GIT binary patch literal 18904 zcmb`v1z1&U_CF2=p_GcCQX&WlN(j;=-Jz7Uba%G`(k&vA5&|M6-BKdm(hbtx{a;7# z+_`hd`OW;F=j+8s?m4i}-eTAy0SPew`@^U|$LNJvPSq9OuMkdTlK;V&&33Oph~ zG5rqyLD3Qy7C<^f{Fhjn76Ff-TZlZfMnbxL4e=Kl>0Rs%co5Y_R8kOi>ii9KOrqHP zoZ;{gk)fQD4Zpdmsjis~{4Wv`zm@KD8(p2-_J%eFw}nL|WprqDQIU{tBZ&$;mU9?d z9(A^nlaD_;v6rXry&Ktl(TV|`JQQ~Zi$4MZvqi%%sUhXxk45n6{6*lY`Kt zJ3Kl0>B>=6hqe+g4^fewASJyl7_|(Q_*~$p?emJt3&*Oa{=zxY#c-9>MNW5}Clo&v zNYPP_tG<6M{Jgkqy*oCCn=rKekzGap>C@!fUN~BE-AY+OR(SAT!K>{&ZQ+^wXr%Q9 zn1=a|mjdwV!Wc=taFQiVO)-twF!|6JoJ2(~lX`g-;P9cL8JHFOY|vuJtww2}LgsWMPnl2U~gFQliR{vZf;-Nsi|RvyuP_wL=naML-$l@(S(ENVKnsrfvfr%zQbd-NI2*1OL= z&r`A}RVC!w)o+hdz0JAI{NXOelkv_kJ|wOJuKb>=T=2%(q;*bcUY(jk`qtKxR#{mo z9KD^u`E^s*@V@K(W4FzDD>>@xSU#SM=2Z&{W~*F#>oYvMIQRsYJ-Q5Ln%tW;XQka< zDrbG2wUTu{cqlL5r&?);nWfOem9NieIwVICqYY;eOGEo6lhP}6Avk+Ac0;?FnmSkM z{&5Gs`&wRQYN~gDuI_+|-6v)O>c~rivIYn3oOZk(JV+E88c1IqoTpE!v9lD!t*sd! zJb1wL=+XJkp`qrn<>E4;I<36szH59UBKET@D{Wl)dK+`qr;+ZlY@TANR_4YgCNrJR zYhB-e+-4&8@<4L0sHlK*NyKnddy(yIP^i4BQj$1qm!&|XC=Dy-L@g}rnr}RlAFKq~ zGOx9U&sIZ2gcndQh?3N0kUO|M!sv`Q zO?GGI(j`(e!~UIoi%RtlHT$u_mC}0=ZS{>`r)FmbEiD;VR@zB@(v`D*yhmN7WFRF@ z4#Dov?z2AFyw3Z9!wZK8X*HT9Q{|^~einibKdms?7TRkZ1(O)oa&Q+$7#HU5OO)?pYw8 z+fT?-zAxA3!ZmaFE+)p$*LQ;FY>Q|1<0VoZ@)bjosL04^8}`u-XGg~?L|lGeB^gM8 zHH-z{%N}b~w=mPB;ui5%e{Q^XWSlEkYJ^E#d$p^5ebMYzM?|fx z9zK8mTq1!xE;g1BiP&xb`RT02X=)?)WqjHh`|6{(3O+BK;vXVIgJV}J^zsKiKd+FD zbsZnO1e5RtH|c1NSGlI7rpl_Swo1DnK6N|YO2~ITvg=(8-uv|NBlYIimadx$n&nb( zN?dmE1eg0Mr+!EL%8upf@j>vFJnI?$!-cejuR0HrL&L%ztEv*BViW5$h2JeGDzciY zN4FnzJ=(QAJK4L2i%Xt^Lt3B37Orq=PfJEi+dlo7C4A82Lq!Flxw*MQwrZ1#d1XU| z;}(*`QdaSPvHKB=qb(Y#*=X3dLI21|pis{S@lNkk>5bL$weFD-iRaHr;YLqa9j!(v z`ru4`Cla-1ciuHA&Y7^Cg+E;)cL*r~mLn8X2_uIEO9Cgu1-ENRA3=9lB=TOknx|86# z`>c45*<@hi^k^xkdUeO#B-=HgrJA?=qS3pe6|M<2L+D0AP!bBpDRq)wh^5^%Y z#jb0VNhKw3>8kc$k_iWY%Y^N+8OVK&LG&{}iQm0WxM70toPa#^ZJ}J25rtB@F@u+1^@S0Bd`gc?fP16GSvPhcX z)QyblTG~M>*kv5eGwP#$>FK$#vvZe|GgdN&*>;#1PO3eQLsUwN;{N?WScef25z`yH z*^7&dBGS^73=CoW`wri8G^DMqt#fp_GVIsJDpNjuc=){b0)WGxPd+03PvZguUsHAqfDL90-i&1sve+#cjk_^~B(1FM-KS6YySuy7KYrYFa83&h z#L(-Amz0&gk|v$-qdAhsWW1`fqX^Sx1Xfl=T%4q??p-*7-p*oQZ?DbBfYHiO;mpj; z`svY{cK%>`diumnQv|;<_7mtvqkAGlUAkrbOSLJsS0gj{>zJ(_m9TU#O0-%hVFzab*)7la}dkMb9qy zcqLv&t4&%_Dl$qmw}1WmwTzOI2wb{`+riziu&|RiEHQ1bqoS~ljv4~+Em;Z4@7^s< zux5|*d`Cx;u3o7g(xx}v8qGMrbNE~>7giGKXioN4vv%VPcO61%$s0(IpURO7yT3@H z67UYvK5CS*;qHISc|gbr@udrMK`hNV-W4hIr zSX5k8q{VcL&33WZHo^17;!5w>Sa5N1am7_{obe73c2l2=b`?X(twi=|xwAPG$AQY- zirI;Y6V}bt%_Z&|=PQZxt=r)kZy2<{BCSVNAM1WWx_|%vOqek7&0f3wK?zq^uDf^d zzHR&Qc+Wl2sodY+Kk5DZ7w_KP3K_HUf(>1V*G&;YvJk>OqFpYQsx>lTc_ElcT(rrt zJ(jk1R!*s6-fe37sx#Mz;$jw4Q&XiZg|ERxEve#BR8&+G?|q0D3s>P_%;sZ((3uB6 z>k^xz`UVG6JbD!Q$oTvEj~Mf-H*fkiXidWM6A%`jwkjPcv!z*BSg3DkaC8|NtN;2n zJT|tq%ywy@&=`MgY^-8;$au3EmoHFLq`2rk)uoQ(V0H5o5TC| zd!zPS$6Fl{@7{^Y$ly#)PPV>#lqpErp4zDZ^=KBl`DA|iRJB^GHvRZh+d22Gq+~jfN?BF@$ zL{e8*-@J5v3RTK>dEkof#?;+9r_Q=HqLj@icm2C9r&F?7o-CTmolJ!L_yq)!SXG`s z`Q)79w#zlrn3bJPap%syl&%#W8$JWe8Xa^#%m^=V07V=cQ?9^!Tg=>%eE-%M1(*H!x7(ZH{KMrqFOddDNN5*NjTy@Da=t+~Nq@-+|*2e7Rfp>E|*W!OE*1s#L03=FUjyI#KbsB?- z23G9!THihv5<@A#0O?hCJDJ==V}$b5X2mZ#GWfdT$rskhyper%U-%goGdYHq&s z;6V_eypZ5o(KEzN=O+>6D3h=^P%<^7( zpKoq0v7{Iq8#lGLLyzDhCnrx-$b@FMB5MYqEF~p{Ua$2Aty-A?^p@!8Xe0xsTMro- z*=*)v_|) z0QHq0RezTB_I_u$&;d=_7Uxg|`#;dQ+E1BGo0?=hFkH zdDr4P9#Keh`?Tpb8m*krIIpa%I5<0FeLR=fLm@6NGVm!U;HeZG-&j3!Maj^&(DRt z<85P1;GeYK+7VBbyF9svC99y`d=fx%o16Ci_-9lsLd~{!kKVTF!M*O->fpilh>B7i zZ{%@#+ZMyZXgHb zE5#HP@V4eUs&&sTE375pXsw%lJQ7_SDhx$wrKTGRBxh})Qy;UkM z*Vtz3gefbw@@g`J3O`9VkKrVd*l{W{9sbI-H$s-fOIi=B!q)bYyuAE*;@bd!b8~aeIx;E? z3YZ=xQ;7-Ry=ATyv09^&T;nu5b@pKwn_pX7JEw!^U?yU7@fsh7$mrg@;v@jR**N>L zg{`oJgz+UKn)J%jlXk&ls=Glm&fRa__O4d+QZM&^5z$;8$P*A0 z+{n~8`8aITfOt?+Qn%I%T_Tn>447zXagK7K|HOnQ+&^?|Y<*x^C*LEZqJ%9h=rvq- zt|R@X$d`_5!y)rv_iS!%(%%Y#jSk<8tengzhd3=W%5a^;orhaal~Pw*yT1|QE&>pf<3Z5f?(?q^6WV?TeY;bI3CPK zK`E@!%YU9fC?YDlV4rZhxG_TrjPf>V){~5qrR;L0Jgtkeva+K^K_oo!*J%{!jlX~5 z_LNWkjzO=rdN4nbW*FHkeUi#c(U*?GW*$Dzt9j%sQd-(fb0-2$ywe@&>fdCWQ1tGhQ zffC(U-W>-kEZCiI+;~`*F&5ipjT{|Ig^@86H@iJDU1fq~9d|}!OReVsrM+d;#{v~r zZ*`=!HI^-Zd>R&{3A0M^6)TVlA|oSR;F<-5gzRX}I{C3n`Hu(ntJM~cry2r4pbQTW zAL#&?Jv1~_CRuC~JoH|hcBrvYU*?1)J${J|mCsj&HKiP-Fp0|Lc%u;*8P<(XA~M6A z$1ESJU0qyU_7lzyNUW@_n>sq?GScFwgn16bgpHBd{~fsRR&XsLPzBtPXm(p_5|{NC z90e*WDh#)RV%cp!cCc5S9xjn;1io0j*~|vwSQ6>zqx8lg0-r$>V){hnUL(wp$lPel zrU|Febn@X1#k;TcWvI{?mhxO-zj~d{!<}-CKiJ$~FnwzO=lAd5SHQ79saL)O%7}CI z>Pt{ws;c6{!>_jLZ6zM2^ckTZd*nq>?x?OIUOASt%H9VMdGqUg#20NEd%gQL(^5Eg z7d%JJ=3>mNklCvoH|KcHqC-P*U@M`T1pEo_6Sd8X6B83VHpQc8XKPSNboxHZBLQ>= zsNMYTkumgnq%T@|GRn&Anxnt6tX4B<)O}x)cgokQV&)Ru z<9mDMesm;se2|QJ`^Z?K`e=EiGy;T}jUnS4WQ+av=kUZ=5SrF^c68waVISFiDbsI# zTl1qW<{2#fnwlDy{YjsbH)}cZ?_*(ew~77*yt^Ooo%ww2dzsT@E_3wkR`%pJvz2pm zGD56)dFAlg{tUJSvG2LE@bbfNk$ zBB!rPAWC9Ukx)Cdg~0EjSm@}HKOKe8pP>CWK7y8x8y>f+SW8FGNH>!vTU3j85><&R ztt#zBLCg33H${BoC=`_tI`9*~>%Iw`ZPU(5_Ezk1F1wELs&E2c+agbYE1w+R2VJ5L zsyQn(2F!)JplpN=?aE(JY=2+JxKPniMLPYy;o)J~47pei zdn^xNW8FPHq7oA1+}!ayOZ|JLDAT;IBt|OUI4sXaIM_WEc2-2ntb0|R7N{va@$J7} z#37!SRI7~Z<)~fX+FG+GS5sGSZ=tJ}5EHw^9D^CtCIsIg85$Y_mIroCMMFadvLIBo zDGQe)y{^(t2k4~Fo;^cowBTdtle|(M|7~aREwo!vwz9Hv0JSx5&_qs7&SG;$G$c*& z;lqb-xty5=1qEZdUEk3tX6HgD)M5T*A$Ux+#Nq|Wk_hRUmluhfo4aDWTfDcw-}-pp z(!Mk;!R=N=(+pN=NeL?!F(>PMm80_b*B}A}A4UR2nw*|KG%4v0=!E}59Z(C69R8GZ z%7jOMHG%XFSCqvgkwST2lFzay2&Ha^vBXzO^eYcFGA_QNf53iLgV5I^&R~-mK?@PI zGLPH$mH8X1vOKX3-QC^!_^T_)fR^ZXr-*`VV=?Z!w^NqzQ*jiwma4jXsCUrI?K-?NrVvz9S8Q#;}gH@(is=k$7!J%`hd za9{ZA`))5}940|Qt8IKLe?GYZ)*|<1fjR4-ricz`t4I&HSn8s6HA1v` z7u>`8_MmSmE9WTy1yC&bS&M-@d^NNF?%7wkMmDGbB*gq>n9UH@pwFKlw(40YOg>do z0=B@}ZO-#5vno3&DapXVV7}0scA0#9^JatpBzI3|C{IW}urAfOy^uC5f1w1;lbW z+ljdD6=d=Gauagc3Ea#&9q-q8s!AIrtUJ!-BI9_lclN>MKt4=(7R2*2d2~!nc@WgC zCcYpG%HqyK?`(c5&6PT0H*DHmVmbZVhr~@OBR$<>?HVz0_Wr@aJ)vY-^h=kXfIX1` zx@oY1t2-DZ4?OpzLd)e6!F;OCK6`lQ$SJQA3|@u0A`erh(tZ z3lN0HuDH80JSRKuGo(N&u=XeAp&sYOskmQcr^$`unTDL6mG#RCf0V+{H>0QtcHXVu*?GUn z(OxCTKRQ@xHjBDdDK2hCDZsB(1!E6q8Xy#9%~<4xV>Pb1)!TR$t|qA82DmDNCzDFLNa?E3rx!R%4C2HM8? z%isstA$|Ib9dP5=XwtK*vy(o3&iwUSxf^Lc8it&(^>i6Z7AQ|C){|Lwp^6r7{Kfk~ zc9LtylVHbZFFYU7-nUd$mz9@iDbq1dHEw^x=S!k0!ZG50WO)6!;L`glqcnl68B7Y)I5tz$CHF7ASfvTt`v9)g>({u@$EqJ(EHXMe?Bp)rE(3Bpx}1(VRCZz;iE0F_YmMiM>FksNDX0eOuNcTd z5fqYl$jQABn149o{rBpB6R1{Kpt?O!DZ;sS&9g@HHdJM(er1Zn{RT{<3PfPY38y}> zTpeLU`nx+ZuKj#0+jOwhnzE^>$;;cD!S&Dvy3VVtEQFFrCamB2u?noX;CJG5Y7IK; zQ|%>4wdX4{GK(Xegm1XHoe~G7fWP5*veSQXxRm1vi27NTODRVQ_zs|^;$FWltDqoc zW5Wb^tzpta=HHv8SV9N3O@$Ol3lpREBn2B)0 z$xS1Wz}6@^IAQ=2*sYDV0r|+tSSZ=}4tpQ2VDe;d9CRQ+6*Wx}lw9%ZP2aw0f=vJ? zVtKf2n5|mcy%r<&8;7Kf)bzSm@6EQ$U2d*%T|!Hinw^d)Y@8(%XXJA;>T!mDw4oQNNcoob{>nEb}iv9Up{5d)xU?_4RrX(kR!%+J=_m77o_Xe0LUR2Dt4 zq~wWez4-&?heflNI>Yy0^7D0Gyzsp17W=L#(MYTf=%a8Z% zaZ+=qodrwQcIBf#yRr71YC%XyM{XZ>V*e5Vm_J3lWm~m6;C53MtRiA!Ry=by?5I1@ zFMjs%ijI}KJ_S-J(nQ^AbCHd~=g+>e%DtmUdifz;B>424psepDg2vsDxOtas2FFb{ z6J`#DOj{Y-!otGIm6f0*DjSR{rzaV5o~v~hB-l54j~8W@VC@6ob4KgWy`J1PVA}4K z3yy!60TbC6qBHx@hf57Ve?gS9OJ&_Sde7t_6P+jd&2}UW71e(1Xa9$*8pj@uI|aqX zi1zzgw*}-oCT3>nU(>{{MTLd1xL*yL*o6ot>$?h34T4C>sfA$zAbg8l;ND#Y|jWTp-7_Ao~kK4T46!dV)>D-CAJS z^OnV&xT>lO;lC#fhn&;=rBWhx(xx=$#s$PvG0Z_9K726i*Go6OKBbq;Zny0F*B{v%Gq;Bd=hXz13@ zsEsl|JGp>c++E17h5bjSX)|7){12ag$!Yp-l=x#=)p=W#t6FJI*YTk2hrIsrhGL3R znm>zp#AE!YNAFnoJs1)N>$R8ZEI@sSTUWQ{w#VT(i?Gr`$@p!*Ze5`VTS8P?TL0|y zWNh^EG8I$L-F6yiED|1qWCxb!w#4`uy%m`JFp=27cG8ePifTh~ge+9@>$QvKi4<+FXyQ z3E-GMhlaiVA$v?}k?1*~Uu+}txZmlB=htVWG&a8ym;-q6YSXKO{;8tU@{82^ACi*3bU~?j&V`L_F?ZKB$^X!Ufsio;rx2-q;3%M#P{v2DqOCp8#94Ja zJb$)dhVa4h!nBsUg9~-d^h^4K14qJc;1Dx&a}m+e3&f6kdU{s#o$s%#4SQe42P&gG z*B*D_!i9?00XTrC*RyRlP?$Rg6b)b9j^WvngH;De3&V zm$?QU3Xx`8nq|}fqD!_f#diez`dWk#{?aAWIzo5%_9&UQhdFSJ3Y94&-wB9{qJyEW zk#qD@^&|k&@i?dd8UcZ`nki9mRZN>6h{{JJ+^YY7=_@f|_0JwSW=Dm>SpAXel7G^6 znPln{%o6uMxhwygGs5o*(yIpw>9sBSKlDdovYJ1=E#hMF%)Z?NLN;-!W(7*?} zOZCyH+tCW>ul}HFEZZGKC;^@^=_4u~<0n(0H%hInsu)@oxafX)i=ByoT8hYzpx;~h~7 zmD>Opyh;Vi8pDvHGAx7Zt?#yb|15lGi8w^#Bw_B^PVcQZ+y#Me4H(kuslQV5evOD(VOJ!N&;HmE*oeaqkpW?H^h!zEx02kUj%Ihn_kbw1!|gDs15 z^Cp}ZdV&KNWTlES%e&#{ihB`0a`a4ysrCS87YDN zex;|J`bPm-cC*;t9U(C;_M|5pzj6&{HR`R4i$+k4(lay3=;0bi0p3qf~hK zaW19j4Q&)nZ^+b?)*Ui3a12x{ogyKO1hAfmntx5tC=&-#39lM{7i|Dwr1I^*_qdA` z|Mxx4%GMk7GcrlA0f$J`YmD-p~9I8#z|LLyz5p?@ZR<)&3LS`BECMg4h ztokgXZ3h0GhR(Yeu7e~{x(REeRx-~8&*Q(b&+)#20V+l4aim<^p>`!_yFJwVhS&LA z`|c;;ONNTpsgSt5DC~M!*j4NIa_hCcx=>F4`BBANYt-O3|LQ_MT?X|AOyN=e4DM2!eZ?mzqN1?UlOm?KE? zqr?Bk6ir9#Yp>^I{y$iV?^lKFK z5YPnKqu&^@>A!s81qFpIJ+j*yrwUSb7%u>--#T7+TUpKTNbRRg#A&f?T=Jc4Q(nQP<|HHu>U&!o8=x9m|1<4j zDwUSs7$X4%5P&*>jZMHU5GX_cf{=QR3MJy$cgi}f`?)!)%phpq_rW=br3}c zGYET*vw72BcphR!Qeb!_-lGmruI81+O{)ExccM+no?t8y?}8Q67TjklvgOAVQh`&g3wKndyao4YDY&!ONGwPG+Cn)XOYr~Tn$86o z|I!Mx%R{=ly1-Zctk-r6>Jk!6VZ46x=G?@}ilmB4%#k|^c+E+PiC-%J;G)Ne{nZ~T zD~Y078ekKR4y)1PLxA}XC=IT47ZnA#k3-D$ccZqD!!f%74%egmVeLRIdXVs`fK**mWr z$Ui46Kp43h8N~6o{0lLWY=(nHQ(b+-*AOM=s*nWxkX>#$Ma64Zt~^##8?}`zhG6{^ zcnpvx^cIT#P1~hIeo&7Vb|f0`co2e>uuS$353iDtgg}Z9_WPS_Wc6q_`+A5V`b~zI z&iEMSQ%zL#V_5Z>k`*;R65yzE%56cHBv+rf{ zVT$n4K;7yElw#!)hWU_<*60 z(7$i&RZho^p`qBoo6~~UbVs{s)*FK`(P1?(G&(TAngmpphcMYCh~MYPoG0sLf&yu; zV%w%;*M(@Nik%vKC4vX=6-&h`{cKiuuX!-*M8aM`Kwup#bBlg8dj`nQ0r?SyzDVM_ zeFf<^YOS3LW<^24>$~D_Z~&R==#ZON9Z+=UDJ?-77G@CY445Dp+|;t<>{d~|`8!#8 z^f2!?y72iOekfilsTJ@RMT#|m6N!WXZCqS&_4NW%)6>tY-CRR1x|A0o*wVkif}2Hv z$4R*^v4IQP#}K~i0*0^He^i0p4_Y)nYd2y6KV;Nvoi8%|UD|Q!oN)XLw$b-vo%v{H9F(0%gcN$#M@fC)2vb7&&$KHKv<8F_!V&G>hXmv}Fk=jP3u z2>Bd5NvQpZxL(Y zG!1SVQw8IlZd)?YadJmaSU!Gxe9U=i0Th|A@bFs5kCwSQr~KJ4|4g8d6Cat6SH-be z|DZP;VMTCXNc00&uKT_RPHAXNObd()prfIEX>9a~Qg`wL(gZU*tF*-kTP!Ibe#WM_ zuE%XVH7V&O%=19Nax{6hwN(O(h`o1?Tbk#Di6WwjXdMa(A*X`{@U!}?_3tq{c?!$j~31U{_j@n&xEC# zJrBEDg~Jt}y2nqRgdee`^{}O5>j2jSiP+VQBpb10PPi8SXG^tTUjG;OBL_ylr$SNxtd2T?JudE8r62B-*ugZNgVF9 zPf3B$2rSfWg#-n`0OAE9qF8oW)1YvOn@4l2pyH>yny116>7ZYo6QeMtNFT?X&4!U>hgH570RAAT|!-5S18{l=+b|niV z|Bv>nKr~~-Q<5=4PoG``_4)?JD*~%_?-Kb8XaY(1)hl%5m{-@GQ8Oy!{E}=& zSTmM_UOU+cq)ye`#lD75z_YxP{@0wn`A`5?_{oj=v`wB~Yub95phdQYg4CAkD5rpc z0KdRMfwUe=Na;aAdduT}Dv6KB@|4Fc5`GffsBHS^vvEHyIPDNDy35T?3`~F6y!ydO zD6H|Hty1UDSm-OEzqiVY|D#svN^9GPpVrf)pD>51!Vyf!1`2G&7Z^=J80ghUqiZvf zWYE=K1s9@e{H=eUWLvVn9X3)>RE&s^Z-sH0qHtpB_|n z^)!VEO+F{3!s6odnt#m%c`DNv@+7#QvVjzT|5>-?HR>QCet!NsOfGEKKKtZhQm=ht zl#j`!mY|2FSU>MBU02}vM#C!JkZJ^;Dz*M)&}8F=UWm>u+K#`^RnCI38MBT@%*x^YZe_{gv+=>6o3xLWMtc^wj2Y#fQ|?=f%T_`KeEz0wIU-qdhL5ZZZ)@ zmiwU@xg}29vcv9Qt2(0X>+3^6e)m(CH*^|OK)66Tonxs!z=V7#kJF0yZ`4~W^YP!Q zz>*ceQ-SY2W#JonP1f^+)Db>sfE@9;0EWU*3s_l~BfblItqpF3ZH6G2^uVd|6gFANzsi6r^Z zvo8DblD@^2xbQ%CxpP#s*|_){Dgi-(rjCSz%mEXjI5x%wHi zoNb3bjH8qY2X->(FHcYR7!Se-5Qx8}7LyRZJ@tC!=1j>4WAG`W5vOOnt2`eTwu8^_ zmlp;W;R&!(p$hrS)Zk^_#O%38Z}XV70(r+QFU>OgMY?C`>3g!6sSur44Kv5l!&fEA z`7tkGRrn%nKf@KRpfVQws?{KLPxTYmOPYe$8mX?kKJSs=7gTPUH5^rhQ>=4#>}|PL zbrg?FS2+&3kwAbNV%lUA}rBb(8DH2~RR`0k9ZX^4|V3KTqZ4jal&%32-OLZZnJxz*A2%CWDuF+=Cv)qd^~&BFjOebz`p1) zYPLsqN-l8cN?CdNxTyR2XvMg9??7%tyP>Ta_+a2w-QlIiK`i4B+P$Pa00 zSFT>=QzRl?n~t;DxJh8~Bf!zr?X*QAwuB(~dXh{!&u~yRvR1KUb=#w1V(Q(RoU&)&;=+WCVx-u`3_1U>uq%*L>KI+??ZrJjJmhrUEUNZyKJnY5 zZ6j;}5!0n8QiS{lF>!nk3*Wb?H}#6^wRMWTCx(+1{rc4p_?p&sC!Y2-ib%XpoEtxT zG29Ru6@xuk#+0xDer0GxglBj6lkL5|^GGJl1o1rXRr7WP%qG0{_AKn|>=PEO$6^DJ zEDU78z`{y`>1trF@CgPW+kI?@&_ecbzfwEKrl{G*K)x-J}0%G0)3J z9dhhAwiM!X=5G=tGKOu$G%*2(%2SS7P*0D7 z{3<$6Z95`60By0EU%j9mx z^^tV$o%kIM!B&_K1 zI5e&3X|`e_YoIxPeA!M<>J`3?t?QzN@wxDlMd^#t^>S5Om(e~^{eGV}Z}1>3he4-a z!E0!E5A1nyPd>D}3t!-aD2`XwqBKbgkNVsWtVo;B5}(-w)vX#mZ+1SrCj+aO4>n~#xU!Y8#2(o{aZc5M#_0zcr`I;0=8?bYIOkzeMKI~Y!dC+Gugr;O1dO!@W)`Z~ z(B{f(=Gd>a+tZb-lruw0O~#S_^Y97|+6D2VGk6oQ{K;3gk1OxIelAGGZ*l`a!9<+T zh84TtY(bMGuZCNz?xeA!lZAd>lrthCfYK1Aae*KC3f%cNyU8Z5`7BFedAyngtXf|` zzsDedqM)E4RXmd@{PYPUE-ntoPXNB=mzTGdS82vtnHpffgM z;De8J>Fn$T$ppbqoVDIbP=K78R9WdN#pWS6z2U&g8Yg9AZ$Ay;5MN(kUU~WJSR~vS zPz{5G&POzPK`4^%P8e^Nf-@0MS`RuH;eaN<>VsIr4Vbxsbq66(K4{aB8TK6-QihL@ zNXpK}l8)!xs5dk);04NuMaW7|x7)hk7N{mHj2h4F>JOj801z%IBLf}gH)W`BI~Q!g zt@Ba3{}mD%p^=f^@ES0>GYK4Oer>H0stjyHdIp9U;4Dc6wfRhj7Jco``^Dar=t-lt4D0=F9&N0|%-k literal 0 HcmV?d00001 diff --git a/lessons/drawing/screenshot-finished.png b/lessons/drawing/screenshot-finished.png new file mode 100644 index 0000000000000000000000000000000000000000..c08f6137103a356ce251439e1aff9e572a00f1eb GIT binary patch literal 10635 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 M-m1uyNg03o4`{5WQUCw| literal 0 HcmV?d00001 diff --git a/lessons/drawing/screenshot-initial.png b/lessons/drawing/screenshot-initial.png new file mode 100644 index 0000000000000000000000000000000000000000..c5505be7634c8492d91ef4675f972760b67d0dcf GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0y~yU_1xJY#eMrkvFlWnLvuOz$3Dlfq`2Xgc%uT&5-~K zvX^-Jy0SlF7UJSk}%WQgQ3;^^Lp@20X5g%`qGPZwcY!b!uXhnj}&# zynz1{x3|j{1_rxGUj~LloTw<1i9x^*4GA+e6fmKpSquyvn3xmQOG^EDB@Q|e; zK4pqv!BnOKA2dUlP^|{LghQPH4Ph9H=^B_p$xCbem-sL|=!ZEC!z&C97K~^J=t6Xa z?lobw00D8)OaXGyO#zxqi9rpDmssvh;f&E_JkCr(m>@?mTF3&qkifkV@ApyUsp|u) z?_2yo@XWs6kbg;#6+LorX-1A8)I|pLWZ#o@D&^xhd7V@O%$N+Gu6{1-oD!M<#1-PK literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles.png b/lessons/drawing/snake-tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7b1c8d52d5a64b5e1fd0d6b225c359a050f62d GIT binary patch literal 87807 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 jog(^gP3b#4eF*bP0l+XkK**z13 literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles.zip b/lessons/drawing/snake-tiles.zip new file mode 100644 index 0000000000000000000000000000000000000000..7faf9e410509a2e2420b5b7bb27fb956caf2d612 GIT binary patch literal 65885 zcmeFYbx<7PwmmvCxVyW%1$PM+AhLG?4DRku&=5Rm(7_4r7G#j%?gV?}o_DH# z@4j=Y?)~Te^UhT5>8`JK_jLDs)q8zwucfL81B(mz`#EayRI>2!N{T`R0R9Hi>zJ#9 znXM(8n~j~ND~FqzjUAh{rI`i0lf%bIRb@FeWMbsk9JF`x((12UiNApe|N8yS#(50@ zKva7tEvf05bDXVWM=OUn5TG@;mAM!>s7G7F@3dqT0$_?uP4$Jnmx4w$$Roy)x`1$< zB?JqwKn{^$ZaK^Xc|$5h8#sP#{f4CoNZ_g{=6qbqs%JYWEM1v&32Q0HmAmEz>z@Bb!phZ?f2-3N;(v@W2)p?2&=?CmBgSJTM zXH-W{sr>ot85GVM z`#ewiD{cAHyIA6&PPCx{3eI*Ri{H}S9FfDkC`D+=t4LdI=9`@GlaTly zkP6@AGg=;HdPoE>lphj@88kOify#kF5=o-u@XnJu1r~Gvy+@VPNw;Y9LL2nFU1O%BYQsTuf4cEAFI5CTvf{a(z_u7GC5+H1*ww{(l%X5uZ z7sJIC!R>UCK_|aKEmVnhnA=pRuo1M(+C#cKY>D@$pQHs^d?0sggwsqH%dCeX1&0Wk z;R{@LaKYe>-)5rsF)1{;q0ZAILkM)hN2i;?EG|pIK>gf}RhvsV4JqIlH6jzC zG10|YZutDJGO#rndh12L*u>I~?4|a$GoPWoI6sddq*hSUs!GJ-yBPD6XHctNNeZD3 zdljV*wrRFntC0O$4_NC?2jQFi&g=sVu^qpQ(6So0lin$oFhuxiJok%~1 zG(gxKgsWcry{=~~Kn(tl*+$H|k97u008HaxC#YFQJS%H03GrlNSm#Mijl`?wRr>O~ z)2NGAW9y>z^16iG1$6UDT!r&Ges&Kfz|Bt?yR*D-tr9$(#|@Odb@Q`GHA+4SjEw0;g5zul)Ltol zt}-Ef2;`qj%^O|WCW}^2y2i2OsNbJprSlYXY|7kM2+9ZUiLO?xIBDch%UoQb4jJ4z z#$h+iMo1JSk6KkGs?Q@seU%lRWA_w-C=d|gwQ@=C)hqm#1koO)mp;^^o{Ikd(R9*A z4HX2;>7KM2$KvZzf2jg80calvIB+6TUC_BLm401ThuOU>hiw5A z^R|E2SYw6aa5M;s!1}|J`Yb#nufQ0W8pGCPY<3wx^j4ux?8Y}@9T9_6fMay*>r~mb z%XuOY3dW>nPtarMQ$BH&hDF7qV7;V4z7YtuKo1Ps&%!fiJ89H?kh`psB6^S8{}o3< zLGHL5KiU;vS}bS}8%j7$Z2@ggPw{#mS@0Bqe1$k1?~(qw0+ViMHrLSz zyEO-OGrT*6aLaZ4LW%Yd^~&H$q_cvm(`rOd0!p#C3T2xb&;3TJj%st+9Hf#YujH{e zBKa?K^L{?Ch|h7|^DEKK4ZEr-^Jj)girJefp3`)7`PTIb9&poNb!pjX{y^>@oB42z z-a`3`>2}|+df||ysPD<|f)Io8m-`nYr5Te|qPC6tTc|*#@!a`vj*Xc%1P~__&J6)v z+3d}rp}3#Al&R7(-}GU?$&sqm9N39C@wm(iKYx*`l7EsV>2bCmTl>U4r-ii)v&I*B zIQfM%jamJx&HNjNk!+&(uI_Bk@$JVGr(LxwstQ3Hfe)on<%I>h`jq|v1UvE$k3OiL zqn>^4dsy|M59Plu<+86*=jLHT8S%8s^|n)b){-zvB_#ogv(erS0TwU5_0fj6>be)M z;GZYOwUifSr9nkss1ac__hjDMv?H@kXZeq`yo`|dG+iIi-e;uqZH@#wDdSa&-T|Hre^_@-e1i16PNWxv7qbtq#r$tYALn{TQ!Z?> z;E5t?c*PiicQVS-)l#NGs{aoF6Yo@uY=i&+{EdGJVC*cd-2R6E27&gU07f#NmLG30 zp!!>$jXfXrQ6L_R{Y?*@y!<_E&K)c%2oy)Bg^dIU&iSpT1KL;10zQ!-&=1!5C=?GH+DMYBLTBQOGK2w)K)Z(%74JzHhjrR!7U1UWMrV&-tHx>Vi~(b^b8KkKWFwZv+TWcK}7tLN>8z) zgifC$BJzch;CU+mR09+@%l`TO&=>_I^?Kp~A9Lj!Wk!aQ_x=&k&wtv-o0+-ie^8#R z*i)L4Sx<5LbM9F0M(kUE((u6a4QBKI5yRYf=_oF4G8;w;ni4$q;v!Na?Bu5vAGM#Z z8M-5`IqUWs#%q3Y@-YK32ZcKx#@&yD(27>EdT+zsv;5?HcD+)Y$MuU_t_KbD_vBUJ z@pO#8-+$Z(oeQY2vMD(-HnUhzEp;_d>=$W(na(~p-B0NaWAm?fEUloD5%iUKof9+Z z&t6F7vdRq=T38dd^F#N7X$;Qzmo^*W6eU+YUt}9Uk)6_+Kr)=z-$yHm{2`&LRdd~e z-u0T_oF2n4!kSn_^W#%Pmk=fnbVF0kzRp#dNnRoNp=)o61PGg6tz$vh{lt2kSJ9jBGFR+$ zT^{CrCGEdn`!cp;)4nM$eJ5F%^mTsG(uD+z-?*jw%2PpX)RB859HP^PNts0LWoR*~ z-i$SEMN!G7D*dh&R)Bh&)gdw=unBe<|E;t78T16EVIJEv(S9vgPNFo~+lIFYbM*M+ zUPRqjinyU0ON~Abmc&3`sn$%F;~m}spRJfA4j6IkWR`t;e-vq6>o12?h)Dcw{4a})+N5}@5I?WV3cP2G z!7rYfeZ*&acfP26CyO03aQy5}z}5)wP&a0*;W}OejHWJRq7@iZ)ze}bj+LOX$|~?4 zwpRbZ138tWf_>Wk)6_K4#JjtRbcRL37s+>!`$@A@Rn$^5pcfV6hmAZ^co0b#x1FzD zudIoktyB~B6n=QNzzU%xN-QRbO1d%qSP8q5_KC=PtCa>iV?S4o0Tk=A+rjK9Z^^pf zhXa*cSPo38lVDfETgyL`vmN8uYgI7-RY?|#!(hL_QsY>8TI|?Szr!wLyGf;WEqd6p zpR42m;)`J+ebr1Xj;zCqLq9_+-@+(yU-o-g7rIA@f3R z^_1dQ)s{_ued{m;Q47CakKG}qvy{>wcMqPKO@P{h@l)3jGRTEMYc{q${W!Hp$FWGx?9isD!~dm$}_q@HvTn&-6S!&c#GwJOGhYxj3bq!#=NdGBe74moA*eF zMjz_xyB3$E1jct;`aT6!w44F9I_hGdeT^^ctDg%-oT5tKR0+tn3CXD3C_@aN9`+4E zJ9(%GL9#v>(XP=8aZ@1D=iN#2;>RF+_Z^&q1CZ!X1e(FNK~slZzks|mfS!KwIfJbm z4?cPc{n7fb=8l&w_A;q3@Cv5t;WZ!3&LE9!l@*kI&xwa(2Oxaq^&|TA7{}>o{Lad) z^I=Zijq|%B3s0$@^wvC75|Fa@T#BjMl+gIXc2M7u16b-TRpu1MvSY^h@!i{CW_Zq= z&Bt5np7~*e+OpmoI2{XP<12SWi8SSzEN&|8%=oO@K-I3H)qIa*iKlwL@7o@ zp*Os(_+-O6)+#izsGj%rW_Sf>a(lXxTa8nCzmdsp0Q8`-V_mR2!3iW9V|F_}+>udq{odjgRa#YQ z5wL{If#oZQIfYpW{FrP}v%%FRq~cc|w|=9cAu4}lk0e(1F5OnQ8dw1+b;vNuE~}d_ zn6EtEKfD3?FhKAf&F+yG0bhA-8~F5jl=(`F>c~{XYc1V4$;wg$Sh;9~T-*Pd)dbX_+`N~wAH!j(Zhd5`o@Au* z^M^(5VF`5#l8$ipIM*`^PsZW%$gFM7jl_K++{(SAWCzhXNB$#)u9UAa(u= z(pQi1&(`)0vedagUPNk^593w3s$Ba?hkhV6YOrGG9=Y?9ECG}of8PaR(OPWEV*f{p z!e;g64}DE^qExKWCljR#?1B)_sSZQhGy(7R`Vj(1*!oR)GDlY9qS*8oDRtc|`IeU4dAyrnOGVc41|wLjs{nj&iNwm%4Zl_l83 zW@S{?!3sgLSjX@z8TUWn=wSCFV392flNta#F*q-6FRi;Kr5n5U`+c(Jbd-X#LAm1s7%ovw#Ha)ld zJ<)xJ6BG`%krI#Ub7*0_VrN)|w_S3N6VSZ{RldV$VrSk7l;<+E0P=1$mhQyI%=mhv zVd6n8r1=9P170rVPTXiZb>_in&uFK33Nw~B4Qj7x3uN;e$1P9*?*c!eWCGGg z!*RM)Mmu#5ElW=`M6W#5OX0LYl>oh~^dtGA&Y!;GS3NQ9O;2M>xP=N}bm^HnrkwFO zl6ys(r5#i(Y7bDp3pe+X`Fh5brluC?Dh|AQNDtvo?TF$;@vP7z%;MOd>(0 zl6FatJudU)yy7-(^Jx1}^ddd-iC}SC z1saFOx*E``=Z%eMkN-3m7qtTY((Q(3ywK}bN`+57s%^v{$Nj_!|$OJY$Gt1nirOl#Gb0TY9<7!|c11j16ILJJGwt zK%{Z_doM{jSfnla(^g4p2@ye|@#3!$Daui;4#_DSYV`>R+voQ#Yt*OTtKS!!*|Z4H1odD#3@nhWXC{^r>2SJ5!>KP zvY#bf^7wKA!1?&;%{@;pxBT=$McZdc+91y86?~*pNcjr&jGR*l($cC2jg@z@W>DrD zeY$BWzd~!qQq^~MEARS-=*(4ilbgrPN7F)7?ms_AO-EPcG>S}1#j;5VaQ-;CP$>Av zm@9EVBb1V!cP-=_<^20nwcbz#4Swam{|4c|DphWdPXEKzBcj4T3zbO(tsL2)_?&2c zo5#|&L;W^tAwhl$Ay?-EC8F3~k*Nfx$!xg9nsiZuI1U{q$m@p=ojfHqysxITfaWBa z<41(r=|2wSKD8b#Q`} zL0AAFzaOU2q?AAkMaH!er!#sNInm#@Yrff-;l@jMT=rGsO9)8q_yap5rUGR#Wz5?i z#$xgP8S#S|@e>^7w><*V@`0*BG4F`@pPk-bvR0y0@fK;IA8V@qB>LB<5 zA#8h3NSLGWY>!flP@s-MV@VbU3>9YAK&3fi#xeb6`EnRDljr4Mjftrs5M5|V+gqqo zac9E{CWfK|mz;@DEfE{++1o-Srl}DKm)0vg(tqG)8LR61=|`A3eM1Yx0xLa!1{0l@ zqOkXn{etk8HkB*;2G0zMIHJ^Iu%S?~VC4xN!7c)VXF9#s*uaA@3XwxY&v+h&VU*f0 zJ4e~(f7&6?Syl;qbWVits4k5Lh?Sjo-9{|ZCDBA>#6Z|KfKAT)vUyUoxy#bmZBheR z3}j_NIkaCeO#qA81elawum@36GNk3SCC^LrfrLh*L!ONLgL2 z!#U_tZbA_b9tpqUO$Sf_`UdN^rcw1HdMN26rkS`t2f2F)lGNLGa<%xHnp`47FTp~= z$mtf{)Qrv0&lr+QgoezZE7D_bV4Mg@m)EnOu7q(cDoZ2Mw?c!qD>)>myCfB%9R-tO zJ{%yBM(ZkQ$hku_0==mAt74XjZw8ibm9J;C>LsEmg}8&RVzd^wB)jQ$tqPeT+>aQG zX?3)jv)e#!cCs+GX%s^BDF?103@haGL(QaG7c?%V4%(Z|#Ob`zvLvPsi z52RG@x5Qfwtf6S=3x*4RpmsRSW4V(GG>3g9RU@_Ln}?n;U~sQN^`RJW4K^Z-9O$$g zm_#rH#}mnaURMEZVOt!j;uewgi7cC4Lcjl0hvwcw(RH!Di`1DSIv zcXpY1=%f73NoLfh>snTU?nA6tFb`$I4}KocG_waS6Ot}K&^ipMJ=q*j-SCVXepx7D ztLZ)_ywC&x^%Aae=&>LH!6Qgym?E(4-0X-Wij{xX7?W0#$&AW|0=_l3IOQ%%%yM%0 zscfsf8gRN}m~)152Fr8?5823l>&U%e7b%SkpG{}G)mjzvJo;Ju=fe?HD{Rbh+fWEO z!RQGOGL>62u*5BcIKznpxq&?}nm5!|!yc1|YJ_oUw zr;AXEk7{)vHo2Rnrajb(ej9(naHKeR^W2g1O6w1WdBT~#>~uD(F%j*UVGb-sM@!m8 zLcNkSmyc~O>ZaoBzVpzD_s;8BpRMwpB0Pc?v*OB>!t&^*Za|{uSrSQPHy65s4W3>; z8W2hw{)glZX@=vfl^cDY*I6C}MTYGC84`9XVO4gym^nh+R7y~1%?>v{xp4pU(j$QfDr3|v!{&v?&cR)2kN+aWcJ?sgbLfLr@G%yW#1@l|2hE- zHV;VqU_r)Kc4QlHpf&@Dc_6|L@e6Tbp0`xFUXqT>G%-@%YBzd_ZyGyE>>EsFo~@mp zc$A4c#D||TMfztvt-i%Ld_DlLgG@wkCk5F>{a;y+prb06FREXp!myXpmq>Q*seG{U ztQ_-TO8Rszu(>S`tW3J+e;JTEQouaM0ZnWbe}2|zsJ>37eLVJjxSKxvlMt)oC=ko^ zfhSZ#IJ2&EBu^UNWhdZG4YkpTF^-q1r{C9~j#FDd*;86iHT`=C5)I+B`6zx_JZ&AW z<)Nq`TCJ)29<1Y;&S91pZB|ePoJ|3RPmcgfNOx~0&ePf5l$*3j&WxZR0VMfL(7+K4 zPoD+xJjRg8@cSa<1wXhg?Tq-x=P|#q7k2j_>*kP&Hg&;!<7>Fi_)Sa7mKU7cOK1^> zx18$ND8haQ&7meQ$oGdDqk)$(|1~f)TqGaQ&WLNh>KDNseAEKCaW1;TPORzOi|@K{ z5`N*GajTu^!3Ab~{0H~7r78YT^oX5fmrJF`v>7jJpVM&skqq&rYM+08X7@b+ZG6%d zF4O=Y1>xAFe80^XMRy?EYZGZkyt7)!xXs{ZFx~{=7{hnMgh(Ndi~Ht1kaxy6j`4;F zEO9C@(F^0CJ5so~-OA&r1nTH*Av}J4oZfm@yZBKTMhrm&#W&YC67P%Y@g^|~fwr!m z36&ul(jQ6ptM8vx2e30OX3k}GANyw8lG-|<04IwOIWq23J^DjAReLWN<6SqJ3- z#KZ>$kne=gY`xpZxmR=(LgCVGg~A7-ePc2>fF=Mj6cJcE0Kuiokg*9F@a=b_74e^W z+mD%&_o->zIUA@S1$v3bYdIe&5Y0bj0_jp+{ylI}D9+E9d<89kgXCWUmk*9^ZjSc< zQ|yBHe`A-d)o407qSw~_s$Z*z)%d8O&*IY3p2O&1^+LkQ#7qgd%PSzRnRqz?|R z^_Z~YE`0DjQ64~!SrV)e#Al=+f;CUN52)Uj+KJW~qbFA1GvjAgf9zF@{RJ=1%K4E{ z5!I_#@X~R5Is2g9VdMw>$4xthy%& z|B2@N3FcLUSOCWbCwC{jFVWo{w!1oX0>T2R$#5xSz(BcTfuzI(*Wo&0?*KhG(nS&7 z^Wg4**ZhReQGH6FycN>Vck`P?8C${Tai?Uip0^1+%5!_%&}PVO=0$p^;fWlW;(I@p zID9A2QwnjOy}HidCf6F9s_%oRayTkf=Mxoi*_j=d%eIx;`>mlixm%W< zOyZ#Jv*5Sm0o&~}LDYH3BY2oLvMnxESesP~Yn#Ub9cT%Zo^iYPKdE`}aZHE#1M`6~ z;v!a;!=$TM1A|{LhXli3 zKu%dkh~cD!*7!{qGgd}&dYyFNWd(Mja!7ChMeXeYIfN^T#AqSJ0c7#;KoNL67S2y( zLLw~3Hnbapvu^zcn0c!rL60rSorPT}8S>P1>iTm10C?%&P4*36_@#c)cJ^^VCGgml zV4SOSInXx&6Tx{3TRb{Ma|bIS!fxjy_Gw>lvN0DgcBZ{=%RQJ>QiZ1xWThg<4ATM~u zs!{kG4qO&^-0dX6;~rBM?yoF%-q=4ep)YAHpwAw3K!NbX>E5&CPd69Vl)wj0Qi+@8 zr>pNEL?}L#-JMa#8!oaysUYLCS;A!hj4gauyU*U{oUG*1f&q`+_4VJ`2_AeJ`uH^6 z+7U1KkS1z^;kA2I?p#b2MBK}d{56YFx2qwJ;vNvcONx(6xxoUk6}F9~OV&Hb8~0&r zezP-yOx5W8frDK}jZONbexMt!8BhZS@&o5RNbB>3jhH;18YpYR{m%Jxw>)j$Pf~x2 z0Eni3>YMfL%yivngxLC`w-8n$d{V0us%)12R9`yLUd(4vWv-w|>**KUE6zZZcl-{`+5*m^%PLwdq#(B%9pW+_EI^i+_55NuFzEUdKCbm-zC;`N*E3ONL9r%9bf=>oCk}(32r31Uc3rz1`r`&kC?y%=LvHtElj^xzz1OQyK8 zn#w}Zq0dc@&hjcSyjy;({&)tTlvdLeqVXpMj`wayK=SMW&)`286!T8F$34zin$yZ| zDs4d;<7!`6C5GRYjKAlUa;A&U@3-oAK*7y%i9@z}Ee%7p8x1Q`hM}9^7Qma!YKXBj z?)&~rQcV&9T~Bzctmw7+7oqlJ+UY4Q0wvecP<4x zGwq^~ck@X{K}EEyGTr!b0F8wt-H}Q;uKThH;0D*J193^)+n%43?1)Uk^zyB3G@1O? zEH#||V{6+c#HKd`JaAHYit8yZUjrxw1YWZXAmtxKC!9og{>g5#?;I6`yZJ@LS71pc z&3mQ&1CHHRV@vao^QC$lg@Pr)2P7A`dr5hmW5v|EI{~Kcd0^ zhz9>78vKuF@IRu#|A+?vBO3gVXz>3F(O`zd_^0|;;^c4qOVOak|HAd){m-_~SUl-} zQ73ct^-InoaY%=&kp8$3SarS%-3zRSG6>#J1l+!bK$-$Zgg#&_rjsJX4iT0PeIVp#>_N?(?ZC%aEFX&0 zNCpl_1RE3%>ScNeJHQEHgMNl;$*u@lz1kjP{@NZY2#sN@@5WOL#EK&F#D`@xuvw>NasZvOT9!h=eWsPP7Q~M#@%PcG*`~=#XA8sVi=F4 zi|~q{Y6VU0{bHYgh)Iz|JZPZbU}PLASL)*P2cEv!^;3i7hG=0VvLG@~xSHQy~O2rb1#S2Ls^w$|a*DN)A1 zSLg4Q`;|h=yAm^ffG@F&S^;Dc5{iFc@oId?eANOiGUW9E76c~J@%7MMsDLNuIHq#1 z_KFGK1Oj*qS$!h6;&(nwHXL;O3{6$b_%#E46?HF1ogQ5ai35x*#BT_Aq-Wz>obH3_ zEyH~tJ+TxneZa9d3n7>;Tf?$*$J`hGX{nNmv5}RC`b#_2;fmd3wX@iX$QI1@inP>N z&#kxU8rLC9!9+d_x10mkrXSZ<&BTDR@=*9%(RQBgm6_eFpDgA-WxW)Oa92m*&J?N5 zsfLW!P%srW3lkzo4VW+2=OUb5jvr#yiGo+DIVO@Bq>aRfSlgq_g!N+yjY;Q|C*-}R zGfB!iVth5RDcyFRo`iwak#W4t+KlDCqY3YtK7Hn;fBhdaS27bw>3<m{BTc;t@dg4__gDb7)y z`Yk>2E(*hZ#W6f>*8SNLH$DW7>U;gP@YDQ*1bf}4z{H8phcJ`}+tM>+Rc60;0~pgW z8r(Q~s8Zgs6{9uD@GG%x?&5?eL?vYTmH;YJgtcv#Atu3z;SvkRRp(qJJUh$B0Con& zBE)8VBzdHUEQdC3YV86yw40NXDz~?@o4&uP>uC&QYglPMZML#CG`MXNTbHRe0{Do( z#I#kQY#5mw1Oce-ou1}@*uv3qo2ukgRC+`AB*=gFd}y%uYL7CsCBbrV!wJHXd&!pwyfvx zZv6Qls?kgQpDvQG+a!MOs5D?5U4RF{JJ>qb2`IYnxlhkPXDp@^hiD*A3Qz3prUr=W z3bjH1c$s@+)dV|+Zm1Oyx!CqiyM86m1VIdGr9VkL-$;1o@nh(lEXF7`25?H=viVpC zyFRAiJ2!#h!BBP}dN)25i&Jy0?6!x6nR7i7!Xh2i>iHei*!@`TG9T|-zn)iRxd5o3 zkps?mamBV7Kp|BRSj#9-pHU#UYgk8^4|D{s53O}!JT^V4yq&H#CPX%oFh&-%JFHg( zV*sWFs)&<`{^5>@1(CS(2iBN1cT3**C+{Q}9xTM}4)SSD&15#;89*GOsvG znzcvady(TDGtFcz9^7-0c^^bzpufgsTj=o9#*oeDkvOkGD>gKXzk#P9+VDBFWgQ2F zD%Bd{NC_S0O#WCsS<}m|~jXCmt+?Z5d{l%{r<6wDxG=?-Hv9Goidz zGsgzBf7l~<%1r0xq8gffWsRHX)?M-(?@TO? zF-03L;4=nAqMnGN_#DPN!JLD^ZBpgy;3O*La@1_s$omKHYYCpB(2kO@l~88cF`ctrxlR3@Jz= zhKJBe7jR07j+lA3l09fSe{G&MIQr<})9SN%Z=f>auc-C(a_!gXs}&aR84(+n^BK6a zDF=JRZ86Nw36e!@lc0Euv8WJd>|*G&b^>7A^+0sXT}NIFtH(E03fW}NVh9`=cZO@} zV@f&Yfx{dygzH4~#rMSb1fA`6KpRCg3(i0j{up?}I*b!}{RBQYM}i~rNQEw+sDtig zzU^P$>VUZnAPeC1z;tj&k6&N`3FeK|V_f{Ydz^JOyKVm;IKm=KW60Tis8*#os7dx$ zFkjU%{)V>vBnmR`XMEj{Cq2Bzy-sL%n%-Q?k$W*h(!mi0B$Zrk*QTPNnEN+pMwKR8 z&3>)vtyg06!n_({?5{@7+kF=ZMqo`aUFYQ@dal}Tl#ErGkSOo{Xm0*giLY;-b%i&+lck8= z3+OZ%DoXH2)3z@R0L3f^-<%I|Q0h_%@A@_b@bKUNe4!sLBuYThuB%p0OecU6*O+_C z+(&h51poe-Zrd97^-b!jEUK*5DgSR?dlh^Cl3i{|g$WJ@NCtV>DG)V}6dGzgLxOkd zYFj74D%yt|kX}P~`VfDo^deX_rY>4o320j;M3C%ZD^w-< z_ZV$hofv(rKJf6&@N|dmWY@x;hn)&#I^3xuxs@%~Mk{&g5-22{ON7`BW;s}JThTuk z>x}e!UQ>8Y^n#Y?dFA|S7$@5!`WZ8$ru+M%XxiNfRoQw#SPj7Kw)Gk*4LNh}dp?eP z7YWA?9rsY7={Oe4?VXe_`bUCAy{T{zWL4Wgyrm~ealrxv5Uj%a*^)(<30nwrpRxeF z0V^b9Fp$M~56c*lh3Mn9ZN#8t40_VKf6RHb*y*3o{e2_Sr(0Ja>Ht05gx1#vb6;#S zeG_ovdkX>OFKzV3du1aq#TwGdC?e=kkEnP{v{#X5I9I)s)z5IQItl_3kun*C@sx(> zeh?vxgjwnC&FQ;fd<3NXG|@v!E}xo#i3y+$!F&8OLW#+raGcw*#s|0MOA|eM4u6!* zn@5YcD<^3o=!@m_2_EnEIp^!ZF`f!*+;b;Kq=oOm?5Z*4!oj&x;-`G>dF6a=ySU#r z{4pfFZn%V0LLPHHSlIule`uy>P1@4zsCqUc@~E)cz- zEhgJiBLdoc&3Z)nXnS@efh(2U=yW*JrUiXXDed5^h z6cjd=eB0rS51dC&wbvl~{=-dOffcgj!SABZZK~LDVtK6Yj7uh|WRyp=BPnTQNoIWL zd(n0bkw*;Q2fqWoiU_R^gB+R#>nya+*uecjoDik(3;H^MT4(_r{0E%iQcfbNS{Ht{ zpqw{ZhERL(Qit9~q3L^}#vs&kTWd*>q^+!<8kAfR(DI^rzs$R6M4IHz?@~1h`LhX9L}_FijkeI^5jK*_1(VhTZ-2 zRr90KCfbO=`$z&Mg!HYSgxs*|^r6py`a1e=6*?dAT#-9igS1 z%rha4YKm2%<<*yw=YuxsgUTKzi{)!eHcvfVN@5w(PMt29Qr=G+6oM&fh`lvpF#;Ib z#m{au`CsT&13%oNwB4;10-|gG(3j(WY=6%#7WLz4{@AWdl_zG=YqO#0XUXDTY!VZn zcSU7%>?*5~vaNaZNZTS*TuHMoF(6YfWntjS<{J{pP4kaACxw6<--z%r&>A&Cs0f4{puj~2$!tV%J`DZ}Nm5LrOE%N;9WRh*;(f6Mqy5 zw3Kny zP8YTeA+_|LkG@_fFP7z|sH4sPg~!r-_VO_5JykQ2QJIomBhB z)BIm(sr&yqGZkNHu~($2^(v;`TJ4WpuzEs#1B=Pnghx#m#?pgGP35ox4GY1gtw#I} z0mCv96iYivkV;Ao2f`qrG7jB3MI})t^eCp0ou7G+d3OkNuWFHgt7!XH>TNaO#x0C> zuU&GoUtT`g^}JrxS&er$JqR%Tb3`{F4aS0}K@*z6T@6xm?EA`JxQF+;`-X*U*fa#l zwbu8g56lVr0{1<^qBq8lgJyl?=dH_k$uQD)7ED;OrXR6~tFoIXL*aGHCSU+Wb3YJT z6h`QR0Gh$&`9vFm?B7nY3tNX*{U=u~!ihCo^Y5dqqY_Kmc`*s4QJz{E+G5=00OAD` z&ET#<)J6Eoq9sDgZ{nzFg>vH$&RiM#c(FXz<%bm*%AXh+@&zJCX(0q)esC@!_=Y#O zi;Hbyml1fpdcab1XD5%!dT5#RGV3+ZUYS_4BTqM|2^9mgmvI*udkKFJjhgYQy3)nc zH*JtaOe8g!A6aZ^pYn}co-e216_qRTrpKJWXcfAghMh9B#Zx8DwRQXQYAj9xQDyfd z;WJa&z>j`{i9s}qTd>Kd6RVv4L|Mm@hcx_MdgnV3f>@mBAjlAe3FCxNK$@a~psuol z3Fe&msY5oaLxV=oy{E3RQ}uZp|R*wH$LVu3o#J@ z&J}pZTZXUTqSow|(tVL?emP9k`Dx*|5rNYwW7|cHYM*R~3T5nDV!7D(3POR(q_Lm; zF0UQb*r#rh4kp=2TS{$U_z@_m2NM=asG_~) ztWd`Ci2j`xNr^gTW91+@$SF;@y|_dM*&*#aTZ5s2y$p8UZ3ffRtyQ`rCO8;ND}p{239yF#1&Y1~1TPlw;> z(y{L+{yU+wtFx}Rt*3|df4*riWSsvz93s&SHi+;%FtsqJ48_LBt+FM7#y6q?WQB`v z#+57(aaeT`pUkoHJiZo!=SH_Nch5J8C?C5l!1<6hu%Lw zXqk+}rl(FzYXHcZ2JFo>TTXwFOmL`!S)O*>_yko1Arkc6PnqUmfW-_T;z~A#H?&ht z&C^03B#HVr2ic4{EkdsGKa)#l!2-1XF=}t~JAT@?&2eOJQdjHC#97|sV9SJk4p~%x zY6kdt7yu$R{mU)K0D3%~?xQrU*%2wox?XsU2)FPVZ$!Pz;2YP{3-cZ`Bn|QLX=%~G zjW7Y61GQa^;&p+GICpf5dF)Im%Y?5=X^7n?Ov0W*<~&J5EBpo+(-z>_nF)r0&V&w( zo`N(LF#wyAl?G)QxOYi><}S#%)U{9ukA-5vq!x+{JS*(AK^opla0dWj#Ss=e>V>~3 zY~7Nf%*w+lVJ<7?ux2tV!9&itB~G7Rn?*H_bPJGC;yHu zQZxe&ybg54e}HQ{Rce9*B8DRL)T)IG(UqjbgzN*ZrXaU~lb2)v1Z{NMI#GXqFeeHO zz!>#b#<&7Pbj9gU5Y59y}q=FH5Y~@2HFN?D*BE9y7%y$%Rd@> zO?@VfS(G!=3$;TDVa2rt&~>~x0e{+&9xRINetFhn=vsBOS5fw#Y0I;Gj8$!tx6 zGzI9C#Lms#I=W@R9oBuNF4Kgp_p=ma+Cv;N3H1JitM$X3h!k#|W4xc07`Wv-k zSBF8{LvArhgDex>*mTcO!|LWBu5I>*@U71jtzdA-F4gu_z}jvFL?sm0POL4{Hxm06 zx2xV&BE<_<0!|qa;(^N!4^w#c0JQon@c8GE(9`%c?yi_uoSo%x-CL~hl8R&iwctcL z38ykhp8%mMkg}&UN6DMtSr_mI3hyNP`g&}0N1szm4xq{Ep2txii{wZq8iD1%S6VoI zAT_m@fTipkwa(n%;NRu=K2BZ(TDX|Y8T-gr7OZ-GG$UAxfroj0-dt%GScCmJvit0p z%INIJz9|ca&I$Op4j`R+(o{W~LJUNLwcPk|seTYEoRSew5 z0)%%?EywTAkz4N~e8?_W5KSGk#jqy5l3IKb93bbFp>1I=Hr@IeTh9I_0T=VR7&|!^ zRw4@N9OYM$%A{WJ9roF)X0D%CIpFB(&L;UCcGcqICk1YIim$4M;=kX>oLQrP*a}Gp zNaR>p=Qf9L|^u4;sFY6sUw3r5Bg1^^A=bOU^IH7G=X$5m1&sXvRw zAr?*8hjC0Dk^Z)9wL1s#q_j@kb8>$7M@;9HFi{B> zZSuc(%b+LP^-0BpLc5SYY09K9yT7Ys?@|UT1Kk2FDGdBUnAdA-2^*!5x|YA|QbS{pTGlm?I(v7ye91iHn8m-eM&X=_OF9+}4)3Q1 z|CofqFx4xbz(MQ`+8BYzt(a56t`4?djbH8AUk&M8(vV$W045^}Ch8IMdS82E#Hy#& zA=qy7!fx|I+lO9$FJD>pWC2q9uEgCRnK`Rr($(j_r=rejeLfc-QPNkTVFRl#Pe`%< zYCCxS5h7R}E)h5pIA4$__MV7>>!}z({Q}43c?=Gj9Yla>*yjX1_zqtQ=r}l7?_xOp z`BMLg!Cerkgw(HW^zR|44w;U0|0_55H%MR8{!gp)KS0y}O2>^5^H1E=5l`Fys^h+% z5?w!9IU)Bs3c_^4k7%1CifkjTdtFgN2C*0qjmztx`oCY+pzwKS@n+Z28l zI+yACtA+MNAv*lp9BCK`k=|v-?%qk|w}vnVb0RAh+9QAs?BUo9g}e^}6TpNKh-9i4 zh@&?E*+uX57aX=7%r<}sNCeg>VZF?kh+CyXqwvA1>XB$(eONLWP)P&khc8L@m50RA zBj%}HuwM|U+$5_6yCo;bt0&7zJgCVF$Ya?GGdzBT#PVYKN%XRUA8(p4gEw-?LW+SQ zJHQc!Zr>VK}K;3Bl$8$pME!`_MQT>AG0V zFEII7okayUUERCa@Oy;9-3P8vUa=yz!Rs2v;zlfq>ieq+b6OSEp0lKS98kbdm@nP% z6Tr8tW^UwD{Us_p3&x)3PXI&PFgs{WhFF7GgG@OT_G&A_g_gI4)CrT6oRRhs}tT&>r7LSijy-{3on7Of~20 zGpu55>Ggc4DO*ZXXT17Yu1}!@^io`H@SbOSA-R)DJ|*mo5kBp(xH)6GcXaW_h9 zHugdc6(Xel+8G!uKR@%+%*runkEwiWKA`rB2*`fg3MZz`a{!`)J`=W0!Hjp&-=>Fn zHam`M-9tEY38z?`a~~ZsId3DgWUgRkUi4A!u-jBBkIL@Fj%&3(K;OGSSP|=Qxq+-f z(#eIFdLh-y;NJ(LxN6R~T^+ytH~vgY;E`Rt9~n-;yJ(Fro)#oLy?Rt)yA zbO&`GaK7CU9Z9$Ul1~-NhV5MNxLWxK#6MJiG<#iWx~I)nvX7n=UAK2ezK-W^PL`hO zyB42^gmN>WR|7hdg$fPku0gBtj+UAzUhpL;+Vr`-8NkWl^YKsE2Kl$3bv&^CZzXW$ zt{(-?$hFMu{$sGsIs6ZAC#3~_9Z27SU65l8)KoRpfGJSSbW}%S)0TX)Lr$qS*4tXn z@`m!xU?11itOHtD1^1Ma4?I5%vU)mdyB8sDs$M=GJgRd49cdcyNe z(^zAjdcL`TmE?j6oj`9pZ|r2Ye^0^1<5Spq#=SpZ=CXLbU9txVHXrcCjl(vtNymmf z>dh>MGf;<_`Scvc%Z6U;JslHaZp&l$ye)rTD@;zw=xNg2k;@~+IP91g>YBE&<^GWw z)x{5y)pOrL)K;Tb`hatJPGE33pg$ubj-2!%pfF~|Ya{;XX8gLQsnm@eh#C+7=Q!x5 zOFW^o`@1i4{}*5Xj`m4n@qhZK3SpUoW(_Rj&hQhq4xpfO~H znLo*48A^LUt2Sdua{^JlSQMBg+nvs12Ej6b5gNxAF@GOs9_3aPq$c~`Q3W6Uj8Fog zXm}WkWMHuk9Qh5VJ`TzXXcCqqBeGp=f|i4`Mu?mi%8Z?N#q!=0=#f^f_JYhkZNhGhzq}bBh2)w6RCoiA ziCRgYW4@(5ci}u$PkI6|+(AQP2hE*|LFYVjk+y+nupN+tRmjI&u*g)mpYXNoR>xq? zLtusfr(hJ3b9AyJcE~$GHY$Wz9-jW7%%3gcFcIJ{plvT>KAiERkbwuJD3F} z#}m*U3v~pg@_#rvfXV8~yn3pe969jzW;p_>dBg%IAU68VqP*~tokUAZ*9&$*1_8dG zdtZ^R$iwC4-~?X7Eb#~9Wl5Z8S2Oo(3=EBy*EczK$m^9b*V171YT83~ZWU=PUMEh@ zdQK(+0W!y)r>0bT4F7rihpS*0CqQ~@J%5XTzy1GrF!koYwtxM%v$OsdkGSL`2h*k&jX6TNmk<)PS<6nOtE9;y6sGUYzcPDLS&F8@RN&$Bz+_m)8 z%W%B*Wn2Q)(DKhyrdWei>9i(DpKvna_KWQBDqsRe_R_lY--Gl{fE&nbC~HV-aBHN( z+O0*yIWmx0uHVk6UYH0EK$C-l$+Yq*+&FZuZ`i`xT-!*a>I^l>)~e{~4C0bvYp#Cy zSSl35JlIoxANj)fRH1z6^%FtYxM@Ccfh#|AE-%W2p0a)My0|shZ9$=|SD4``5IGa= zm#-wqXOH&eaaq3iTtTN;?S^wpGNZ&Kc*hv=Qb1N-wgW0cM z^tM)G2aK`qt9Th?)2b@X?`@fJcLJ)zJ&ez9@#JaRO@@1?)MOslu{gJzn64|vn>pMQ^Jf7X5 z*uiYHp|Im`M7P5TMxap{!XcJkhY2|Rl6>pNUNAX}I3k2)xVzp`k{Zi{9T0F7Z~zLAhyLusURbiZLq^!sUCz)skPg zOu~JT^|*YG$0ABjq=Lq6ppF;PL4gomB6s5%OvP9Utj>QCW}>$Jwx!0Pb9Jt67<0+2gfi*@1Ix;jzhtHE(+@B^}!j*>WjW|BZ1 zK4d@Mhu166InG@>t`>Lzf!>9W9mM)(yF^(?QCJ|cx3P*!iNo@p@>-Yz(9L*X$tD9x zL?CC}c*NMua2N0{jlE zI#&T(2oU6nD*MWO(K}yNB^Sx81w^e-G4;i(aWlKN==r{4Rx@6zSi&fz5-Mt9`ZuuZ zcSqX`&k?ZbixSHFP&(L;j_jdO>CA@a=K+>*p#UlT6=sL(=8XF~xp1nekH>L0N# zctr$^hUm97Y=--*O#P=|)=MX-GEY+zs}%_QkC@Huw6Qy`kLHfMP-jcT=FOj#GhI(E zAI;()(_q3MpZZd(Pfn6@)LOmh2nVUJLC(7?m)vC@3Z+gCCC30thN|Rc@mLdykkGf{ z-l%$rp&8RDn*YKsLwC1>bCf?hpTGb85Bv?{BIfq{50v5xTr<}56jUa{N~&0l?$K8B zbhZ7`UyF)|;PMcZ<}l`dg;1?R@mPl*qD2POpgG%ko|m}Ler;BR`M=NZPkNL*iJAyA z8zym561)JWng)R?{?h#b9gD&k$+I z%xXG(U~Bx;5~N<|J1;{_yVc=SL5KtX4==#WPd^J0&cSI`M@1#(Cv z#bz2WHc8jZw)+oO48-`2QX~<~SUi0KPA+(3D8~mSP*2-s0<-2GBatUBe4w#Pj8{E2 zR<&-RSEpwoZ@sK*FLcxSsNKrT&mIKOdkUZZ+IQLii`7_bBenI0EJ*UyAZkI{hbc*% zcA|g@y#(gmE;Wss0%nf(R=M#wN6Kj%FY8lJ&p=$@I>UIwk8*(ryetNXXDi7VWxyuo z3Qe=~ro@Icfy{y)xdk{hH*qf`{qZZ;sP>6K3yR_Va}TR*3%$cwJd|@opNz$c9_a%!1n1RVA}7ZZC`u2x*3eLuUW@9bN{H=MT)ip>v*Ya&FSrZZ_t_QU zfX=+?1T!_K<4)*PE|0RAH|Xo9^(vpabXx`1^`o59#xL>UPkz{5(G91USDL{?HEo97 z?*lzewu{>eewigxNK82+&;>68dd_y>Hd+KFTk6{Ir=H?Gx8uh;Q9P9x0xgErHLQxM zIhzlM$L5Y7hsR7lPmA%z?=hS`O<{4!*hUu#g`uyBSFRN@l9Fa$rU|l@t`}CEP*yI% z%C!4_NtAE7nwn$y65e&q7wk-sBgo^KsDHM!=0(+HQ>05{fu$p%Gr*zz+B-s6&}V}{ z-};)m;L!ddh4vM}n38MqtF)QLe^yioV~sy|-;yc+#J?|){ugXFLe;@8C+uzTNu5F)XcydiU@K(QP#`k)>H%o~eDou#Qk%Wbf+RV1C?uR3;Syv3x-fofH;>B7eeSK|7)fH)93z-Cs1aK)g<6ucFbOIM{)vQd zJ?pssZfkJJmN8nM_9?B$SUiNo*Aegc-o!E$m zzeM_e2+D^?uqEmRIdrTq3vOR&T+_9^SiQLPqL7$?!{W4*d)roWe>PltQ**4-^rr9q zM0*Lamx3u0`P+|mgk7vs2OKY0zMV1>*V|ZpBL}Ji9pO{PF4pU%yMFi|*^glF!bh8o zrKr2YpE@B?Ryox6p;J$uD|FBffXtbQ8o%H-HhjfulKdE0d~Cvj{Z>R+Vv1tFo~U+= z#5F?sW)~(A^^PWR%+~=|-RfaOjLonS1zNxH9R&QyTnkY5@t^7Pd1F-zN^f>U)e=?< z;|VtPvNg=8QJuo$?5R9>FBSmDe12bB*~N633ceseP+fq{4B++A1owUSK)VCy~dvi+z9cT0!I z4y)j>8^uuOQF@7kP9EH64ygS1_OUPoH(;t{SzGDZ>&@`ptD8Qm(1B*2cr~gPz zxaj5+O9>KDbONEge(f-lS5(%+C|@a`yW%3ZpWoJ!R?-NDziEeC$y>aKKlhPn5 ziCUI~sA%k3RW?9Uw`JNUA}QP4A>oAe2uC7ts^2g}z-!%e)<+j?$}AM`Of6H*Ru~r=T};}QE!GgRjF`4E-Nl7Yzd^W_ zJUU*l6ml^2nzCbIXe?}A9$+7bchWit{z{ZES7@^p2n*~J7Au0NNUQ++?#AUg@EXEW zp`!V0vV+yqhZtgkivlOctt@agN(0LwXLNTZ8;yTJrk!dn|6u)w7WM1P4Hx7KQi5Z( zqwF<1t_+H?nC2?I7C(qJZ^Qa(=1x%lPE+&#Hv>`-8-x`>!4Tl{1VxLg$yGy(-HPNnw7oA~`v= ze4(CZJojkTMh8}tkBWQGWW+Q!`QRQv-6L9{)oEPwH>t8EyaO4y5IGthsfDod44!FC zseL$h34=KMXRDZH87mi$gby72E9W>0ifXI`)_i}Wa4c&8He8?H!Of=i)Izm|t$Nv> z+vk9Rr^<_wRamWuhxy0a9V2}SCk>=FqO>hzw9wmWnT?m*Rhx=+2Qs3lk&e|usaPl; ziEI8>>XcXoj{S-8tq1fZp-^;bD)6RvQyox+Oa29gPq--4(Y^-OAfev&Y&M8G9Ir6v%2@12hn59>izTP6x9q~0KjKywGiEweF zM_hhyUw00{P-=1h+3G@!fb2BlFSe)Vii466Ul#Rpy!%AE#bptRu zrIE2C@o9__5halsC~74z={+Er^)N_FV-r5C8|{Bf(J}n9zU7@|E&n|^le`I>%RV}) z{dK=ssjgZ6ZHtm@J1D#;%wo$QqBHqJ%w`=UD9=3*gKw-B1_~IYtdFQiYYO54uG&v+ zRY}s*4m?BXpfr>a2PmC$RU4O+Nt<*`FXLPxw(S*f4#>o8M<`JTlhB1)8k6$}?{{%* zx!0ZRO&Ypq473q8$|!7w)NpzVct?PCkSMUHV33>|ES8 z$u5{TGSI{?1 zcWQV+7@t$J5W}BBPiTX9`cH}c?nz-Z5NV-E{-;UG^;N^|fUh#faNTk-`Rh(EwpXp( zuU$#c5aZKRD*NHn&1wOypJ96pvw8bx8fAu5{-d9kVi#zPxpcFy{-c0)i zGe7;QxUWD7?52=s(whm_yl*3Jd_Hzi*d;P2wV4RK6Ef=m#3|h_VZG&@OeKA2a6a{D zi~(i2VAnGcmM1&$zN5;XS zM&c%82hKJ@FAS_nn0)IY1Ggq@tPlE&@{(=X0=G9;OdZzqd2NI^+|=7v3Tu&aL`Z+s z6dFW04~nf#NstQKs0#zR}< zTiHa!jb@A*ZL z#ZU+3qp9=j&pj*fUMODSc=Jcuz4*d;IjNr*2pM(p=kQaD38|9H8so|w0CsPN^&+Z= zI>k7`KPF#dYR%@0qa*iZGLW=jiX5+vpec};6eJZ+Hx}+0PVUMGx49Lv~>9O821u^@6yKQTz<$&2eZTD zGH73%TvB072gkdw5RAwYf0NbO(3wEG8{=x%Xtr>bm~U#Eld|{SS_;+K8Z?rZNKJ-H zdIQ>Hc& z(7tHW-mRKW++EhCVX&#@o>?y3#{P;6)MR*PDjBKvjjc#tLx6CUPDYxzi42QEkHoCG zq@}PPiSQ{+qUl!g+r)1ilj7i5Gk6A*RPoPyW7sH!HD}aR40|5mO}K~8@iPI$mK+*P z^=eGGN@>#BGtNh`d}8(3yZoY@l}m$^knkd#d4oO0eH2Xw?38z|u(>ugNvW`(1lQ7AtBDiN;GI^KyglS%CcZR9pm;?}{b9Cy&{G ze94n2?2>>X%S!FayLP5bS`Ke8eLrcFmZu1_;SW1TcrF5}W_0VGaeG3zw=4D^i(wCBR#psB7VPq{KB9CkeUu>*z5XL%XKC{p+=UnE6W01TE;pF>0f_4h z*FrpggYEr21DVW+5vc`U=hHEXD(@&~ogq@6E~ZMWxY^^gLS@f^ZGLkne(6eL>&uc6 zJmxL3Hk1(CIUGG{Yl97=ho>_7RvD6+Uu*VL-AhwU0`81~6t!C9SJ2y+9))oE&6 zZi504s1>oqrQJ??&~$^uFGb%z{Foa+_BI`?{i#y0pH`e%pTLv8yiF9?dbd<&CuP{- z`NP}NngSAw!ZkZIJXsT$RL*_WAR*iUAf^_4_Jh5{@B5^VbU{`3Ag6f@`l1~ffLVGV z&6!CI@BPWfuQJG}`Tf<`mZ4F@&)9E+yAFDtlvi=(kqGntD5YAD-Tg{ZXnUHB0<0%S(h6%3O%B8WTMcoq1qxO9F zr+;7{-sEKV0>*>*^DOdTJE4UNVXE0Ro9!^&41qmrj^|vF68br75fUKOw~%*Vfq>QW zoxvl7==AjFj*`*1@#W>O+iQGudNq-0JfmBZkSNVO3%Z*il^6DvM!oQBGE@v%*tiw`7-gohlQKFQ48@!Am@m(U|=wCgXY|kO;%qd$T zgUFT=%E+!K_fJ^rCt>ckc0URYz{J18u$t{U8-TxL|7W4{|E9eEtx)+tkoW&D$oqdM zg#JhL{U65r|2r`sz;D=Q|E8Y*iT`bv{XdKOUm)I`{}Rw$3B*6&P^HJ-4iZc#0EPvQ zfaS`Vrt}j&@Cm;pMIOj##uL6pr@76PYe<_*yc~pj`vo8~gW7 zPY=4mv$1Z$NAXK984mD9fAFLGns?r<_olbC6`_g4a9xlbLD<^eIvNok7ztHi<}gT_ zl&PUO_JrXhDdSwwTSp8Ik%9?@O~9bE6$KkmoD8!v(hCb`(hR;47_tn0JN%X?h5-9x zZwo$e!ymbTfTOXtYBm z?^~lk*PJ>U0!>M0{q29B<7XJL7J2|`nku032jY7sJ>QI2@B@iEDx=vSyBXJ zh?%ZO}64dgLsoF!5CjI#ep09V28h;_)zRljRB5d z`0eY$X$QxIte8m3;MRhxkT1mci;vB8dUZMJ&tw>GI24?o`h79YFm>n}aR8ioU$7mw z`X-H+XKuO*qvCj4SD_M^*}k)Og0?fr5zeWrC#`n!(Z~3O1=c5f>zxT-(t$bY=L7do zU)hL#>$>8za}MCr!V?Q@I#&@V?6sI6roelPQ$$R;NpF!_?Ld7v<(LERzbc1p zGGZr;Vx-@gww7bby$y5MiT84eB_1!)$4BHTP4vT2nBN0f7f!Ew z)$tmx_0$qYZ*4Jg2SH^A!WaJh6ghn5o40j?N07e>XsqXO&Yfm52%+AxnGxf91^oty zupeL#byj2C3k2cO-=}qJh#!~?M`E%GU9kSFP4~Qw`R1%VM%!cHWgIT1O!$>HD;LFU zG%@4lua`EVKW^2CF+!*S&2Wfq<2wIFb3Yern!{PRX9@wyk>%xj#AN_P-?HbDt zxFz_q;4x{0J+=P~e`mQ&j`d1<8R1V;F#h;$1%x~IZi*k7%lXe$*m}?G-?nEeh(^|? zk1jT5<#3Sk{_}lRJ1J1aba>G)VT~DNAXoLvQ8_GB_q&v?hWF25xWmX>R+ zk%J^N@Q;2hQscIhU>=&G7fe11%+gHa0OGb%x__P_0ACc82_IGQ_~B$h>E3}p9L>i7 zPlC(MZkh8u0DE={JGrIm_tL@g8W>v~3J2qIv=s7RdlTRu7T+gFqO;^nM)Vs>| zy@vkMObO+OXw?_xW>lHY3>S9_>}9lyQ|7!d2DDbKydSe|h`xEb`l~lrT`V zC8G6S*!y6-uSEu&abhc_gr^0?cS*ZT9e(&^6)^NlSj>rbf%{QJzgc%t8GPVQc$E}w z%kCtH*tj2Ahw)_AX>vIWO9AItJKK3oUEo0Z(MNd#CfrEc}v{MCMDxo_wTf_j*Olf zOs<#YUhx9Ar}cE?V;;#gjy-n$%ap{>+%gtvy?+1cB-$D|KjP%p?!4O%tGN}m8s21q zA)`1;%}Q;dflMAbK-@JUcRSvKC27si-n2Fl3T*zq3 z8((_tD&>8edE!d5T_29U41-y#x_n9gu(YZYV_`D>ajcJZnWb{MS5hK&P5>0kUlNG($P$AE~UDq>->jei%&zj(Rd!Q-g^z+Qs7ayE`b4OyU>Nmba(y|%TtCD9!cfF}LHv?tagYG@Ux2@6i z8|-qiIND7Ec&vG{UEV%oKSNCz&$p!E>l&Q1owf*NGA&_a2B%dq;oA?QL&WJ637Bto zXR#bT-f}Vno4J-q$M~C-ahZlXx2z;Z7@>Wb<~@Wp8d&-nYG%JbKfubNT^ zL<%lnS-;E~B$e~u3$cn=^V?4ACJMhfGIs;cJi4;Jv*NLJx)CV^$-Hwi-k^tygg-u_ zFYywC>P9EorDVL6k}4(`H|j)bp{d(H;mZfUUeJ}l#Qdx~ZSHD$6?`NgcajzVpqL;0 zpQZC;VHOBNAzf~3%4xVop1+gRX6KmQ3Zh!kr>-$ zB*plgp_oWW@sThL{L*09e#!`gq{z?#G{-eeH8DLXDEI_kyeS745nC+h?}|m&ahx#O zq=GhX#Mx2h(b?~Nb6@)?p-QfG;dMjJ&8Lm3#d+?Fye{k4MY<+JK!h0Y>vijGkfI5W zDb6oalax$BzeL6EUT70hfB{|8cTS^K1V>;XoRN$d=`XaEHNlpJ@!s9h^Ew^7_X|3) z>^cs;iKpf8>$8V>bixWT4y~enFE9pDciiclQ~NI@kDSdTX`%*MazHKphe!VhUw?St z5VO@Is0UG7dcRi~&!VZ-U~c3%YQe&LQ~{VDf`&hCe_WGY*YmVJi(&?t@lO^JpE*QitW_b=tGB0|jCn>;}`m_hA3GAD(=))57k zjZOld`S4t1fqW-z5n%>1+D_$e;kdsZz9*gE`=KTPXMm7$PX5@^PwAAuyo-(d^IUDU z{bq1u&ib*pxs|}(OjQvvviE2?>Nk4=?FoQ_CZaPtaY9XgYc0$! zPv6d~49_WlH0L-x<6XfM5)|+*MJ1?!W>ZzZ0{Avr3~-k(LNOUu223I=drQ)thW{dN z@;c(9h&-yAf|KrL_!&k=yGyEFIV#dDp+@NF>$n3$X8ogXIlv)D+#28`*d~jWiofwA)<0OE30HqM82G8tqmC1+Ofg&99{3Tq-(Vi-_jlnK>~63wae7jBxc3 z7(QU=Mu%`qom0p3)^X!L(k!r|F*}wGG5ZH>AHr0^w`hh00r1RY zMv5buf#)`rk8Bq4QAl0uWcrJ(0CIbzj&o`y^YZOLRtDnr?6lpiX= za;Q9`liKasL_(&f4nb+Zm;p!^{hzZvF9BbXvX(+ABbN$r3{iU9Ltxm@`&P{DBx?|% zj4OVhXRO9C0HL;t?|JShX0#UWo6@XI%t(hq;6+uwo1GThIo{H)r2KX027GOYmJuNJ zwg*SKdO9Q9sPtYAar{w3y>Njp%VmEN0GQmpwQIMvsgU7*#m+Vmm(+P4{ z3}C~BHHK5Ht$*6G+#V!=szVNjxVPMZVzhkO!v#BIuZG|`IWiPFXE@buX;`pRT-D1p zQ0!SHYnNJ*BNnckn5z={G~_LbWT70Lz@zEU1Awr_xMdaRGpBM&N);n(6zO!gp%!3v zFKC=D10hqm(eDIq)D9)hcgCcU-#~)kPruH}j2*sRDFB`S6gb1}S;l>@+=WwQ(&?<1 zZNdZ!N$1eZXnMB*#O}m!!vG5Q;YU4bL( z7bwL?0x19xE*~#L8Wp2${or3INmwY-O7&u{D-TdbO&qL z6_m-nu!o%NkE{mzyw@mDI0Wsi0Yr>%yO_$VpGJl`L4$FK0Rbk|g70zKdS?)j0r@qL zM(vFD?4=obINjBm5x6@67X1WJ#hkb=Ar}1NRKPYhe1ud{YvbGfeGT!{^#TKn;Aydf z=9w?6`7D7oYeEL>Qo;n?^ZY0jAYO(zxWW5#%6I0f8C5$~MDs)bHsY2dj6Yi^s@tmfg8 z9VOP{qB_{+cnQ;uB-Ua=T6tfNtJGa01aRAsX5sBV-~&WP66BuFx7+aX1Ku%Ea92oL zPVP$M_ZLSgdX#48V@DfnmmrJV2Af1hNJ?~KrrgZnojXU_i}M1$6ID<_7*zWyiW|3I zk5;Tu_!aG=NB8&9H^x*iZblUA<3E3FdY5#gCc8`lDA2Uj`!ygHVU74Q zmXr!I{YZW32@lA4+WD^2`}Sua!KSo(UnFf2LFPie%%B>JPH!mz=(!ujHAQ8}J`H7+?n`GcoKvr?pDueOh2FQ~`frq~NQ94H4Rq zdUxGN@y_yR!udNnPKE<$~7sap(rE( z>bh$FKA$Wk3SiL;hncE12opubP{fCfQ-Y%vwCPQu0f8+`Hajw(7Zo8A)3QVCWw5tZ zRc)D*8bmfnHQO%%9UPqfu1lrGD~%tiSL~%x@q27-jl!eG)56#Bcbo4rAjxh$qt`j! z!Ntk3zs|JwIb=2s_R-X+16VehP7&7kv`?;!uK#^)gU-|Tj@D7hT;vhNaEo90sWHU? z(sstRfmtM4;GaRp*>e{cH4*cl>~+?Dbejm*r?tC@48wm8;NQ-{hgk^TXILABwv2at{ zCD_>5(Kx%V`PZf5civfE-p>`z_#HD%IFs&z)?Oyq?%$QZga z_t`OO0ImWiP?QZ94U_s1O|cWJn3wBEP1K@!k(P#ZJkSXA61+`74y{{D$dc}g&LjfD zP!@bt>?Fczk?50_T|&(r`dbem8Qf`oN=#93dB5xflBdu@%%RNPLq8ql`Q!8T`JUv0 zuj39E154@0iG#Qp*0k-wLz?@F_R3+rQc+!jS2B_E1zS}L(m7otoBr*dwJ`Dns7Zo6b;-33t;TcQ_{fli}t`I^qwz7zjOexUl6!$?Zh zBz79L!O(2+s_r_LP~Sf?yReB0`m zb)mIISa<92F7K~=GhI0@OyrWgGrlS_m3{bmS-*0SQ|w3ZrCD8u<+7}yM6@mASU%ci zc+B<2&er-tp~t?yN)+f5BU01_BT^Z$QY0IkB4aGQW#lS*hO&{gBr3d-Z79<}%P3%(ELgb(SlntJYwFdW@GuL{$`Yt9sDK)*h@{?4w+Z{aI5KNxsr(Wp_UJ0rqzeUYe$k zo$ERUedo=EIr$%0W#0l>?mkUQznzF zx^xM5#&KzIOwigu?C!9h33fKcF-4X>zA1r1UPZnzb+q*hM~X$>S}e@i$yd2AFD5Mn zLCDS^HsrJRb|N;!sQPFP>gw~RUM>3-VKuZ18c~9eKRzIwG3~w(T*#TAx1_+oQ$1X~ zGx@EQ5%gu9+PNEP@=DD??qyqZrX}|i2owQ!+QPdu4m(v41ErngEwp-dA2jv3hL~`` z)BJwNL@S2miYJ2Lhkpk$394h{gL6UvH4LL?8+qQyhH5A4*Z8~{65B4JJbfqb3dMO@ z=2~Bv5AfYSl@VK5GW*?1?v~WHDUr_%IS4X`$S)<(7)U=~Rv_aA($WO11zbiiap_#1$`YYf^+Fs?!P>h!*8*fAxK($|F~>rL zQxvmJha|-S%GB)h{yBTk=EO%z=nh}PH4jxmz1*lnY;516Bg{KV@gIy#wqhQ5kqc_t zE6mGgse->RD|a9Fu~iy4$Fipz;IWN8JwuYtWruCS6$ZyJ!p240gQl8GJ|Ma-(v~hD z+XsnIrQ+jGr0|aMvQJ{u={il6bi|p}7lgB!biX?H$#2Vgr^~eSWdl~vLx_K|Um6Ute}R1TmoD5#j!&`=L+}pch)*Q; zh^_wlR)K`!{rT#ZdI1O`e|-M_(ZGBLdz<>ZApCNeuw4?0#NS_>`>>9HZn7}k$&*9NILB8qs(`)!2}%eJo)Rxw|T*LOIbRCl&q zLOo&aQ>TdEu?fHfJ<=nC?mS3%O&?{;ctd7dCfTCiESJ%@2?+0LcgzIZ-kH zIe~zY{4lz^Cy3A^xDbKn0rtbgyPv`o(}OFe-08-K@bwI2yBBxXFa@z-SQsXab#+oN z$ubXZG|{6xtd$39j)>ZWLxXz)wgNHmD#nJA8~2eYjpm~|0E}6y#%0{-YqBjY((v)GRIz+FZOMdR!cG!)Pe(kTjH?JYAB?j4D*>O!M zo@E+1k+Ky*-#-!Nuaj@A_ZTIwF!GOplST>k+PlQ}dlQOO+Q;ypO&g&=c>9)eG~ z7?mRdKC>yBAI?3p4Gm>3?8u(&r@G)GQ&xWL8<<0sts86V(6-|Fp>3u0Sgx|Rzb6Id zi#A83uPA0*xGmNCsek0!w zwA__FJv_KLI|Lsabp5b2Ko8pp-qAtawrsWUBas*ok5U*A;oV@a3WE2gF68`GFJO?Q z2Wh9{V$2Yyg$C;od+Y6ah4A@Y9 zsBUNvwrgJ9)scl{4*KryEd9JL0`j-$vOJ6o0l*wni?xez#HsE{3+-q6lGD^C!I^t> zFL*E1J1l0dvWj0p6!iHb-XGhUYU5ZmJogwP;V7kuqMHF*r#ruq3g7 zKM3QUG7UJ{Ou2TXdUZ{Q2FIaQf{2@v-l4cYIEmgxZR{W#b-jmt;3Y#5AtCaJR^Q*4 z#pQ={t+vPW0l(NrgY4MDl-_P6l|RuKc-z-NDw9(`vl7?c52y} zMwhJMb7DwXMpJ98YSNp(4Qf@>_g>2(N@g!Pp9uftYw|;cet__I4^A&vuFF(gd14@T zoyVTP?J1L-uWO4l=kD4Ho&iyinT~W>0i-UgbBF6Yk&CD= z^Q*)|gGS%K*Cc284Bj?W@oA(rCCzkB(M*R*;$#QfB-fT#s5>Dg!Gt)$c_z#9-JF?c zE&;w;h51?+dx)3q1+paY0^zVm4Ev<=Qs>H=$egx#NUWv{l%~-J-xJ{}eR!Ln*+hy( zi#0?vAV)?3lbw-W-BXYLW-^VgFO4^JjmU-*1#~Q zv?!!%7@_kgI^v-1hDGF9!5nVj1mo!1mi<)aV2G&A0Sj-mFWR zu*2TS!(K#ws>AFV;l)8slF!`ZZ|Ik#bZtI$LFST*akX#!=}B)>g*W2zjr+k;=rLtU!vK z;0wZi>~$TI%XYn)$np4^UJMZ}hw8>^lH`jKt_Jrc){)Hdg%jY6MfIoQcUL-{VZ{E- zJnQhmIlfHy-C2t`?$)nB{OHFlvwCnF9*!n8SgN}>N*5Co)aIJ2gE?#AxPM zj{;jnp~SWTt^Qc_f>`)XW1o2`JS4aRUr8PPu8-NW|FI7)K27z5=9y zq1}IV=J$NG#6~&~kqEuxoKyuS-uk1h-3Lxp>y#d&krSEdMOGVR5daJTwmpKWzYYyYR;vjg-QqW|gfxq(aw&zx?<>`O`oy5WN+^w-_!+`%aJ=Sy*C{N2VeGmm9@ z6Q$=b%f3N%0P;S3JrUN6j0THrCZJU4XBP?x-w{N5E1A3VG9iue=a@O9nw=BW$3`Ik zd17i1p+g;V9z+XO4O7lw{HcL7TqPe?Sg-Qw1la)JOATrSEmY_xuOLT~?{)iNGB)su zo8H9taONDa3AYa>Pp6$33pNpB=!ela?+!rRd@Ob7W5@-oP@|$y^|ynM_h4h~t1%CO z)kV(%@3;&|J2-=4wU-Q6X)GgyFxAi*611h*u(4Q|0gfCP89;6VqM;32pN zhv2Sf{(HZxYS*g0*4b~>sZ*!wg*WY@pYe$TLUQdl4k-vrG0uVJ@3g)=rP-=y_YVM;y#tDe(?l@ z(de+xg?wZ_&EevPtl)J^W@PC^T@k-p)-%P6@($H0#zi_)YhmMd1+Yd{17rwkiFH+e z+?zYZS#xw8vS8!KtD(PR-5=!YeC(qCrY@;@F~l4u5*gW0yR0^BHiDZ|o9di@tGSzc z2%XIj!{Z?Rx$ou3>$;;IniY8Sc?H!xz-huhiW9>X-@-eriNxYlxzH?yU;ttBO!Jy` z=9jRV-?;q?H>D08+a7GOLl5iGd1X-#B}gdEhtYZUcXsXDK6k9Kg|Vu6zXP~3=|D-U zy-&j2rEzR=Khj}j5@_~wdq=sv9^SF6QM?Pwi?7B|V7!=H-4>Sz(@Dg3M5}}P+F^9K z>L2%f9OC1nprP_8S45=NyyrfP`N+SAmGBAuEzVBgHeL8wu{V*dHxb}`{4Lt&nD8z3 z14qGwJjIgw#^vK9^suT$OHKP3Vc)&%IK?de+3Uo*#Gn=Wv+MIIDg|j|m<=!I=QhUE zZo@NK{uP=J3x18D@kd9B85el>Q15p26OQNT$4d#RtB%L@i{q1*wTm=}xQey{?)5^n zO;EiPZd%z^(mTg@>u82e)`8QZ#BUf^C_@>tfX%U*A^Wkmuv+X@-SXoWe76OXH{V)V zWX%bA_k7L=j1|XcSvW_-tr@^-labo(cRyqN=#QT`Cgkf#09tSA8`dqDWR zhT`iA*Fw`ZB1>8<>MzHuB$7H$4KErekY;Ju^L%4|;a|)PUka0`pOiS0_SfD%1q#2E zPXB}9g4!g;_{Eo6;3PSXpju1eedcHknaFI!-|NhH z?+A{cW6Gc6c+z3Y{I<9z=qf)9Nq_|2uL5>J z9D`J5D4t&yk3a!(E(A@HTWTMhytL$uDgg%HRStMu?hn{^ri*)zRpcNF8~@P=8|4RX zWhfp8OclmBe(8g%Ft|*aq)#b{)2G?M=mFs?#=-0*@bzF z?NRK+4CUJ`3&fSRmev;1K(7-?p)beW$J$W$j* zY1*KX0B*uCvgo0)F5qhcoX_+Lk3cNliSYDRxz=P|TRNsng-$A5?-wE-Re1DL5p$1c zLOu&V01bmzWaD)==ZCihtB%}x*I3ol#z%au62tiV`bW(ATrnJ8*p~UBeB6p3`D`lY zyaS?_T3P^{c;AG^>uk1yE$}^*TKt~6X-YCNp5$VKe?9ZL*WPhv6pYS`?4`V~r&_2D zV;73y!J|FNYSsBQ<;vS4G_E;4D3w2=kzGX{sgyW^ms*~$0%cE6#g}3#yimME7ul)E z2(iHxbNQ**2*YQtxOw*_dbZNqnoJ>P*9Y;_FECbL^G!du*#a?`fSpj;WwHAlBIZ`$2#!MAv!25tQJw;9cp|{g0)hIvBK`AkX=u>-x~x-CKkCNS^oG zQw5UN%AeiamAd<0L@2i~=ZqU46`CA>=rUIY2{;4iLf#jf72l>gR=#Qncw22K3?@ay zH#D~P>bgIu^JgwUA6w^b0T@()Dp0xan}SlDvdJGxh<)W0`YZ1&eh>Y^Y+u6)Ch8JH`lud5XnG(OIOtEk`s(tkg zs*{6wv0FD{%J9JKeE@3$RngC0uxQx1OCI>`>C3^w%2ehGPU$Jf;|%{=OKYdxPe~Bv zUm|4WlqQ_srp&PSz@K{e+Ro+{$rblsUgn|64CToq@`54~y65ejZKfcb44b5@18$4A z<2%KFtvB?tb|uz-~*T@g0|SqHEQqV8?G6;duy50TGeo7X{5#wwyA9CdH3moQGLm zrCj;nx|I4`>_V_~g6c+kL()Q9floi6H0MD>KdECHk}HN0@{Jp~F>70sZ&K+g6zBR2 zlnB0OxxC+LR+m7?56377euqI~ANeji$t%RAOg_)~rw#!HSxQJ+WG-V9+NuXfskBAB zPP$mqeEHl;XgxXMtPMUGJLT1t@pmAD9E5m->mq5UJU~_4EZ$9yhsiApiqe}#S0{ZM zg%Q7dBJ66?oqf@!@|m;@KYIXSRFsB2v_6>sRzxju>QfD#9+pI!k1Mgb+yCobcP^+vmG2A2(8JlP+!NUv%e!_*A>F zLBhYTK>4QhkT(L<{fjQ*zy zg_N&J1m=9Ri}H?FQ*j^oyY9laMP^TPXzco= zsq(IH^bePoE$)w=SxW_k=@fb5B)Yy3c{`Tj&XV1Q0QI3+t{t#Ops=5+`jxN^T)ebO zP|Kn3eZVaTL@uX5_Ia_X;g>aTL@uX5`Dhsvq{j_v)gg6iM#9{y!}|7Cms zWqbc+d;ev7|7CmsWqbdBpY82Gc~mC~kLmko{AcjMzyAIIpS$Hjz`vH7#wU~!Ah-$> z;`&0kX-a~ZR;D_M%$SyNuX8TzjaC!t5h3rQSFZ<;0PN;wI5?=X5N9Ma&2O>%=Nn0` zY1?mcX_CTzHqGRFCp}dHS|n~fedHe(%uHC$9QmpeT`4{a7W-%z`}&^#+`Krw+16cJ zi{pRFz%)ad<%3e0{Q%sdTnMwEhX40>{GoEuV}*X=H2-hVpa1KGQ^D5&|JN*)e@*!R zeByR-vW`?&Rm4IkM~A--OIb<&HT)U!&p<_nKbG3ME(5^dIsd<(bM495yL7lS;Ggkd z%=y3P53u+TaoMYX2=@OY`0wYPp!jd&1^YC{#}~5r`Lp;a1UbF{-iuhgJ|)^{B}$QO zqaZN8OeRDf6<>ZmC_X+OLWzpMtwc$W&t?>_o{wvR4NV;AteHuhO}iLXRU--CJuIm# z+1s7_da(sFWgjUm+xm6)wEwGYMzZZVU{TD*)41D^TvhZ|wZO0HD9pJLk$ibPThPHy z#NJ3c&EzNf^6V=b4?=QTES>^+AM#8kL!P$FPhl>N4~wogp3F?Xf{q5={4IZGxI)8p zU#}Z+`Pb4{J%G1-=Zmp$?aos~&di;mGikaPS_3gdW7hFO!LKBi1`f-8MVCno3!=LZG#NbOE z3PN6Z*T~r+xWkphe2sjHb%b<1mxU7swcncu6^{aX`ZlrZrUA)SU3uT|qtmtgN;Pgs z8VYm;Aq!WQH()^`T9H^oP+KhTxnar~Hj8%#HO=F;-1Lg^ScoT%h@4MNmn|PC^S40i z3ZT)ZZ@t^j)TOUR#qfHv>$+u}>vp65q!D2$uDQIu?ZtL5HjFu_HvKowLP513{2*Ha zY0yU3AB=u_v3+780n6>+g%OJ0Jw@p67V*(F-gcW%uM{Bbo{XS;dB7vO_ zFOwN~#L7si?1Z+pGRa8e*Qqej;yonAF_o67zutVwknj+U6QF9dG?&{lvALC$_M;>& zPPc$j5l8uivM8|Ml2yOiV~|4Jt1A)t#vrbVnm|#ftbcjG%^;3Z<@C?GnCLrHy>@3Z zvKP>Po3nz_x>CnL68%-??LfJgSKQA6YClEuq&KW| z@g0zgW9fGgi@8Gg*ey9R1}8!upx7&=vW|6tbW!Xfg*~;i4!WN>*xQ_ZR9}fB zV;kD~b&zjKs1S9oNyCs%`jepA3IAJWcp$hMn4|uAOfiucOGCFb%cly5af*17%;czX zjN9Mu*IxUC-gegFPGm-S=V4dJQ3P+tE)YQgH3Uv-lXGl7j<$4pJ;wN|rfQ`x>t6+f znX=hTYzcvw?wH|k&iwRaNf^fn)IcnX2JGNb|BBS-g37v`>~Q(lj{~Kbh_xkl8oVt5 z$+YM|Y!PJx8>CAYc&jV1frVLN62Dv@RDQiEhXx;An zfzCHkyO*2oMMg%fKR{W*kKgzv^-Iov%>;H&IKEK|nR2K9X(=MB^?TO8N4Sp*lE&;J zi<+RV(_J0+tYC>ln%*L1?s7@hUeNbrv%2#yyw^bb22#3*vl9q04k%q7#`1i2o-MbR z^V=@{c(?^_Wbzg9jxYvF6j{u2zl`PjZ6Kcpe1J*@Jt(BNph;9@XklG6?1m3p}~^l$=;2qJJ_sRn{t0?VV= z71qA+U2PHSN)woW`i{x%G3VC}wuuE0Ycr2MminA5v`cdZ<|!M0aU=4JrZBi?aiCGx zw{L_gn-Efw*Yos;+5QyqDrJ@p{-Mz_#sqr?bt&}4Xrh#TJ(%OzS&mu3;G&gJ)}c#X zd*=W`bRoTmCzBlBeYYn^8$T~DXU5G7t!{vHmgNGD1`tMsNOk|C@KNi#BdQRO4>-`XXK}LkGFL7oM=d!Ltq<53J955rPK>aY2i^OHs%BY)y-B}%4H`0W z!hJ{~nqD@tINN)>GT;c>GY^d|J^JCAJ@L?}^15sAc~@TdL`JV4~)UEJuXC(Blz@>`2(P$63N4w)LNN-|NU9T#y~Lpb?+c z!$+~=Fx3!J;ijdwJ7K|L>O~chm(Ghtg zx6vrP@iCBgTxVQ&L-F38p0Y~_aLHA*A934ce#$6fIdR>Z)YB+F1KkZ#9$)m)(KvMt zgHeH=5coTqJnxtc58;(Apsb)OUny%Ar2Y~Ck?@}#z(JFzip$+gdn33;?w|2r=;Zz# z#{k2>in^~WaGe}czqGd7(VwgqacK{s76)0CgB=j?%>}NCo-(fN#|~Uqv>@6}&PegED*eNwAFj^Z8e?&;uKpZ;UH+O$ zMsr9K)!yjcJbL55KUGr74_Azbq7$)e760cAN>s#U;wEkv*I^Hm-$%<*=quPr;3M=1 z7-aQz<XA|mQFQ}R#8u0`7=i49-5RZlruPBW16;J;0IrL~H-2SE z4(RX$$S|R5q;jxuU>d6wq$#%BtI`7;lX(ytuX@1tMOsIR zq!y2$J|x+}$ka&wDs^E$zkRfJS>RrNhEud=CJ|ghR#!CfJg@Er1ynCG6;-HuHiu~u z8!ep9f2@DyoNSr=jbGXo1iAw5K=hXj?@Iak#u@yslz^_OlfZjoqS}(%BROtKY#`Qg<`fv*X~_xHWN!AJT7G zAmJD=!PO9t#orq@iC=X$zIjUKj&+ze}F5(-%JN$-S zEKrY4R~J59|9nJh8Zt(_2Z{VLu>Iz_LO*0F{bQ_2koZ}U8|U=wc^fX8R}j+ZS4ikr z9EMY|sU1ksQD}rxAL>7)(44^%xGAz*q4M~s4P(3$;Sn?4o>NHVrXaD`v?m|`bo!g# z489oMbbSeKE<6ONUTT>QNr*lLcc#4$5&2L5k+OUQ`}0KDo~bU`2NWOxrCm0BjnQzF zJJaa7$hMGi@+emfOBU*?o~$tA`TACv9!o5gk!BJ3lUtQ+D7HW!sU<6^3LQy)5K}jY z-s3u-@RKJ&$99&SE19PgU$62tnFqls^|;>6Df-3DEvpxoo+F;(>q!|d+F~RIFrXP7 zAL1qhtgJeSi!5OG3B#f3Na&9Jie0NeL1h8@NIMoyan@b|=@o-`xbMhp>JDwJHWDoh zEkJMH%B&n96k+f z5Q7_w@lP6krEVV-;kO%{RLxct-a&t8fRVn}c}gaVwbWv31Kv2Tv@fBqJBE(665smY zx;4}?4hkLz;oapVqGhUlUU+BADF~!KE5cL3UwsC>+;w*!pZIRM-MeP;W4iU?4a$$Z zfOn|#avZ2MM*=wnZzR(;Qw{ z1&ApI3-$xQEO3JneKE!_LdAwOLQ$*x=yPyCAP7}Du13c>``uPuek&tJt4UlfPsrp$ z=&Uq=?>XrncY*S%1W-2yDlgIYh@7gg&$*(yEMo1);@Qx2i;qT zj@FoR3_E4>OaZbR#?M#Liz2y5XZbQ*Y?j8e{$Aqv9rhDvsh7cjzC{Ydp|cD6KohV! z;>FM?IuT^Yp1R_gyG1ye6mcKaC1Dk>)3BoEvzLZE$cGr8Y?jGad^78>tN#9*T7}II z&bvP&1xc3};_x3nXcS>8_LutycDA?jJi|_X9&&FKQ*PZMu|ICUSVZLlVJ*N+i8yPb z_=lbp5-Xxf0`IDeYUAis-3gU)jI}B`OZy|AM*&=>0UZZ>WBR-I=r;nV%HH@H6hr4;8) zXzeFz-eTCHCggret)W!CPD``5*| z<{4z&g+z-Lz_`RDG#M?LvsD!~UM-nP$lWCfjph>kA`31ziEp4U@;U8JJ^~j7me0x@ z7Fx-Kr}kFyJTH1ifO{?T`2%^-`@zVDY%=B!*KxIe#TD}p3e)XoMoKG*r~@;U z@6uIC`Z!`bz#7`Z3UG$;P!zt5PPS4~rutnP(d0qqwbrQ|O0)X2p_Wg-wL~zJ7|h5Z zJ_^R4SwmPmZ3+_9%C&g=gffdJ8i*vrCb&M< zll3+o9VPu6_#n!2D{-4aZe5lVP4kT+C>3(97RxuZUW)b*9;qz#@r13vM1N-`?m^)E z{q|vS-@t=qme3C{W%v%dC{gUYO9GXByS`n|_6|-cNPX`qa1K#r*4DixcteD!p{WLN zS{^XT5GUMl&iXk!^4K@xk%DA{U{hN)<+92;+(0hL@KG*SQ+(w~nky;j$OOVt_)iJ) zzb{IPVfw4Q@IKQ&<3Gbk;hoffOSymbA8n=)IK3YZAJtxxtgW@LF*zD4Pl(@Cnhi&c zfJ7k3`zra$-=olq(B?*Pu+Zmw4n$HsK@eYyY~!QJ!sKNm5M(1irX%*pI&cy?RP<*q zT^y>6eSmYl{%J7n!ogm%g7|kz6-$5OyjQkMt}49Cnsv?cVn8BKF=r|eC>}Bc7Q1?J z7`>f>d>P)vix4|@t!&;&vk=g;xgJ?w+K&*MKoT!cgg9DERJayj8b;ymnGik>Hb-P& z_FBC8o$=XvD2h#6d_`GMb#pgzdOV#JnOBXu#r9~vx zMsM+X>~ABs_%+wCfG8wCJtaUGGme2M+3_dQDlV)CsV12nmINTgs=&ESzI+3PVN`scWmv~1e}q+VZ3pFX2dq`-b-irYpmBO*oe$YSXkFz}rxqubt-zka(A#!zg6@!@H1 zBw>sfxL^@XJn_n|ET+666r21|P*<8kfJUj)1TCZ z&6x0v>JLDJ2-WO12GSQdK|Kf86XxW( z9!AZVoL3QxpGaI}eCI0##=HWZS1;4r@PvjE_v@frHykjX5L%|=$FeP2E`!vA_iiK% z?@7z3g=>Fpon?86b{GjGobZmUD4QLrVF!3?fIf>|5UV0mw;{{w$Zu_r+)1Fy zy!M5T2ZkXJGlq(Me3?;#sVqrsP8MuFtx9hDK0m#8)2Zv3oQA#|2JK-As+qX8ytyiM zFQh4gEBXi5l|cf~m=VsLQL;zW))P1$(|~XIGk0YD-9npC3Q+Q1o1T*&J!*28S^Cw+ z4dTu#HIR=Ku>oz;Fix1@);7D!6h&-IGeUN6K^XAq3J62#j(kam-o^L6+yR$tOuw`v%>0_z zrySZ`Ew}QqH_46?_T5G({=n>RfoMW>rQVhUs5b?=TYf3rzTxvw*{O9GT%l)u`52OY5P#?4+w9g7qP$dw8Gt}5=zG!$! zm=s03o_{rIl&MokS|*t&K@m-PV?-uVaK*J!rT*r-9mUlv=(1|ndh)Z7Z_oGg`&(y! zh)Qu;{;?JG8;x!&Z*vGM5v|l~@6dNwO9HA8+Nvp%t1!)T^#%)|f0_)NKG$2!5UPqh z73dSaawR2jmm_V%^z(BE%^x6Cfhc`HsC!e0ym#lb@k$8)xUo~M;8N5V#KyyrC2^#% z?0H@#daWYn=P`7fr#h3w4YRTerj8s zvTuXPFbi~T42I$=ohe4#WaY{XbNOI7k$uXRfZ=6z;eBev4(ma$2DfFHG=uMH*LaHn zM}eRpz*5@MUR+T*Z-aG^7Gl6o90UCy?W^{U<8c32U!nMEJrKFY&hkO*Bd$@Q@xzIA z#+ugn7S-z4m}m+K*T=}Av>0AmnU^t_f@0%&B&;!{zexSmEBs%-Qq7I^n5 zm3{%C9QK&u*DTx&=-Qr%7HZMBNyYQR?H&{@G>4P(c6jAT1;QAJeP0}&R~stJNfJPq z!8VFeffu>AnyequvzBl?eoC9>Ki}2vka9d@KYr*dL0&Ljd_EAR_)~2^w9^y$57UGh z&FeS<^~9>{16#F7@0=>Et4DVp%oQ1Ka+Nr+wpIjftNEq)+OJ-x`*-4Hr$^Bk7q+whT>MH{ibUhR6ER zRdhcVMFknt_;5HFjCoYLP3qg>4A!=48C|6`i7=RKVc7WNq}w_+%=&uQ-gYyBkooDJ zUlK46O#5}_hDD9mW3P4NuF`#SKEn^l3LW*0z7QJYEv*`RVOn!D#aw2sTV(JebijYi z*nRor6r5id6tD(@>Y??21Pu(i$Z703ojPI1 z6Y>5gt)@xrsXS%%_9>QST8&vNA8psYiaky4TJ!(<)g_1^eHHO3>zXHuSl>;+$)EGTuCo3+#QQ&0*1zKc_=|Y|i+KNw zc>jxd|BHD4i+KNwc>jxd|9=MYj*eMT^9Wy<`e*!SnAJZO%D*G3NA3NOM$o@_q}snE zYkx2G#?HKbK;=WkWo;m$XA0x!LZzp3T3ihaA!MvX-Go6ASxNHcT_BV)vO|FgD447R zS1wVXXydzHCR3dpdyjaxiSsXMQF;=4$!o79x}NL@ zjBXE@`sDvd7f9?U;Zl%>b5F5w?hX-rlaB+AtA@9MmV0t~puFH5q?&lk?vD;U3@bkd zuin+jgi$J6vf({9v&J8)NNXGqMb;}CLjcHreTQpKelP_ATEQh*WNU%krAPR=%|lE6 z<4cy|FlvaXh%QhEb@5X94T$7G-h(H;^>|0 zvo8ijF#o#Gh^AC0-L6_0y~3To2E{tWE|sfzojL$81yUgm3KpbP0{1 zq+)?LGw$?hv)I`r;)Ibskve&X{fC^1g6E&XbZNb4#O!po$isFBA5o2CXKd4$q{^r4 zXuok}qQUh5TQwjUYJP%~C`%A7f(uGEfyH7%?mK`KonAQIm=O4cJY0?;tpv9F3?GZ`MFyFVei+) z#fmOM$M8=EvG)w+7cg_UHQ;%OxeAU=G0(V!vO__tlreUGXBSQy+!I$9=pP2oyiZ@SQ!o(r z9TL=`&fAyih|d)_2vE4V3%a^ z*6wOjLMl!2kQd|g#%)Xb#wv0=hK`^QF0@+DDn?V|XG_9|v}!duyHCP$j%P?g&LB*W z@Wea8HS z@lM|m<|m!k>{efbQAv7kCd|@tpi+h~X%$NG4 zMSMor^CDtJxkCQJC+S^;T)&)>n|c35#)z1hkr4}8j}XAySKU!B{Vi~o;F@VRlba1= zo)idLfjQXWl6K{?XUZ78C9Xp-YXbd~L|~{pri-BeLY|Hsz^CP8z?cW^oRJ^9i?Ysj z%;X~DVOX+hgrb9vbGvQPhJMGp0|25l$}AiYlk?*D6&1#m5|Rq;{L6ICuk0$wuw#D6 z(c}9@NzDVjY_tO?xwheW6q>(pwF>7KOh{G-SooumMAJidy@3OUC0zmoMi9aqPKy>s zTKJ(uaR59&!0f}1;s-=!B9!6;Su8G~w3?C@mevyO%@t+}xd7A$360n28XN+8p|wF1s>h+JwZlN~zRmQ2Q8 zCbgVNsA9n{TI5QvnRotseYcsO`5j_xSU93hCbJ;OF%ch`isd1^+ftH3j- zztTsng^GgJFAjc+R^t%iUYs$FQ^SqS@%p>vb2vO%Q=B{YfbvL_|ty= z>cql#UabLjzY_S;6qTt6xpsf6qF?|MX+Hmmv^E11{H2lZcYE-mdlorl`&kgfH+IV* zEoK#sxI82vUF;sei96ry_h3v3H(xvWO~dGiVtcd#rUfD2-J5SP{Jk6 zFkYSD>S)o(7}5Zc5t3ejZ-yp~px4~A|edfcnQOR5dm~aWoc#QCVEzz-;zRO z4w_ap(b~JWpZQXG#-jNR?uC{;_?wU+>OPY|l0fnWd*bg%ym)^k z1-w2bc=tGhgw72n!8Ph}0qxZwmji8kdn+9*M}tqb_c;97kt%4ts>c6KTjzgqBapyf z_P>hb|0$Z_m5ug3Yx5Fd<0R^4nK^^AL7TN9_+mAVy{j(hQ+xeeDaiU<^X+!pFxSV#22tmG`ye zgn;D<(KcZqG|NCl`E^toM0^%j7szZfKJ7I>n)`H1gSC5`_)p0P4a!@KQu}6aZ>eda zEslgQfGC%nFRQGe6^%*`dTfo8J|Y-KL5zV`Q}_9W zu>1P6YtVj%$b-q0>`Y?3t5n-`i>Avo&g?`2gHe%W(bT)gI&Qks06ebr^9F(D8&}h_ z-G!GSljGX7uj^h8>#*Bnp5KK6xUX#HMtWY^-j?oAou6DR^kS+vK10C&8G>gaszWF# zbX)=kG!y_Ql=RY6F>F8^Wu!NgJTvJJu8dTt_OvMK{%ZhSJOKS1#ZcVnm@BZPJxs-c zwv0WM`8?_%%ME{6<3tB2+^xh%CNC>e3Q~Bf_68>MAziPox>gnX>PZBX^apMpYv3Q{ zFoj-K)s9@k`#D~i*sbT1HT~~Y5!C&5|BkokEg)Q^%>uJ(qUy&+w^nT&M3FnHo^EjR z@2~Tfuf?nan=6k^PIuat5RhWpur4X*gUi33iQ*Ey6>{9W8etIvw9Gtc-!V)-)`j`Z zDIlS5as-`$9$jg^xf1L_u>zmoXC3=SoD#9CH>DWssFmY4=PVs|<~!|Ny#l5|x#OeI zOX&r9f0-7HH4Jxzw@hm^vd3XZivIH3G*tWVQ%Cl1AKn0*bhNlly2fSrZZa_{&k0`g zRW_T^EVk_#5L9nzvH=Wo*)_xXA^KnV2S7}8v^EGKe&R`K9s(7Pr%*|>krx|&?o=_G zVf9>R$}W<^nG?=TGv6V^INbF6-OnS!ApS;9`^ym4Kwl;L)NV1$S2f$K)cdtx)uK4Q zZ=aIC0dm_V(ZpVb`_U}*-%FlFG()D4F7EaOq!u8Y%OTokGUL}O!M8s9UmtH;w&$+C z`AvCDRgBq6RqR}yxj_i?2)v1r8O=8YD3hgHkC;~tBw?djQBse5cospSJ;d4ign3>K6^x1N} zYDOqAu7D|bst!>F+ct3TbkoO+BL5~rii1Dpv-t!NQmW|c&vUk!KBt2S^Qz{D39!Cj z7O?3HRTnEPsYPE+<=Gw)dM}L1AWQ3ks)3I@H|qF;5iz(MM>9_KsU{wySw?IYskR~l z^aMU`e4Z6!SttB)KK5r$Lh}p8Gli3|e@@E=eT?y!(R`yaSH2U8TZqu90wp&7Dw+K3 zmLifzP&I9&8>nl-ELZTCUrpWsNpfRgrfq)GBYgW^odYC#9P|OrXmj6)Z^2PKI#GQT zOq+sW$(oQe+`Cn$FrnU-utPQkVp?ArkoB^;?8Jt#jTc))DgXFHmfA$ks()w28m>c~ zhV9HCE-9)%<%F<02AH(0?l2`R9_06hzKKB6j27~bwbBqwwvs}9d_84?2?-{E>{R$L zs6|}NB_s_0)Y?qxaqTg>dOub5#ab)>Sd1DHvEG|2)eA@{Q;3w%TUiHw&5?@%<$P0# zp+FY9Nb0PVS4+BB+4tOay=F7`5Ow>RYONJ@wc(F7G(JR@?~d(HR=Mm6cw)BbnxmW4PBrZW8YOp}ZNAmYto>mPk?S#sMX^5&o*<-S^ zDK-{)A!mHxFjM(KcJ2$({0I7XkvtUqpOSV~IwsWMP|DV<6o`pA3NWZ@R)7(8}+#AU?HtD{kXTTE2C9jgzz$#=NQ8g2dfwfFG zdH22Qs^#yPMBQeNrKxb!&ngoh5IP z0t=S1OLt8N**5Ag)r(spM1;S=?Mad-{+1kl#tCQOExF4BVhD^i;AKO5Ms3DawzXI5 zj^JJs00?*zd-m^pI+)CJ9_CHxnWDW`w0khvQs2{>R>L6cAG;c<02oFog?XF{3yzpl zPx42Qp;a~564>KX_Fj^i(D)xnXh6L`R{#5ToK#5!+y{>ewF*;;VSka-TXX4rze1`f zx@&y39vYvIpHB9sh&w=1&jPk3e2!KO@9O}jb)LSYyomIOVrsnU?t>^hyrIYr36yt{ zYSuyLo9fHe6|`kVy1Nw@fd9*AH66E-9re2MD+|Q?`o`&&Jio$`^*dsWn87y!h+jXc z7_Q_Q$TQ}Fo^tb}I1MhJi{jLc)oE^5z5e~p)rdTxXmVX<^$NCliju6~WZfzDt`AYv zOzx8Zp#%Jp%Xu!g1|r1c{O-?%J#N7LhcCoDalc0`4eKp@@p|KcWNhwl`^(1D6F&no z2cSwk4_WL{u`?Glj>OyI+hXNeW7GFzKi7+XH}l|QgqNJ3Q6WXDE zJYc~TP2+Iq95oI2EhfAiC2c3?^0~;<8(+9kyjilZNSzWTHAWIE8HY=A#nwx)3Y74W zX@nfktG%vs>lrR7*;aesM%(>Be zQJvLX+VY`GEX~=uut?$wS?X0;>og5ht!V2LcZ=%{^)V6*PqzAZCDlQz56j3Vv#d(t zbGA^Q5i5JE=))JnZW4(8Dv2zgZY|lr{=s-4ra^26Nyygppev3WIq+Roif$2axsYSm zaR27Gso_Vbr_N=LQ zG7J(iUu9~TJkG1PmwSSDLeF0U?J|5O>CM@>i6oW4~ zLqbB-0oMr5P=wcn(b-CjQgBR8Ia4DltkhIQ=7+ zF9a=_U{2rqX>Nb+>)c_bH|4FV+t{%8Ov^r!RlA0*w|(<|+Yvncv&y7uH7^EC8L%gU zfUB+{pzdI!%%VA|^J4Oak^$PTWfTUL9U&1C8RZ*AbzGtzG#Pwcr;w1g_+k>g3;M1Y z+(hyov|QP~{8;-VV-C;c<*$9BRDktTVJv{^#*o`G;_0#Gx_ABX3WRS~?2Vv)`QbCV98WtLE#K5|B{M$XDDww56H|kbX84PABD+-s~Ts360?*BgRcQ^;}VJ zqOGBlwxbM3&vrkrE467WnU-_qVd(Nf#0V{_8~y(BR#{yNgq}t2|GA{;#CK@TwRty=OvqsosHR8)Uib%) z^&-V?V*Ds(|H)G1%K!aTQt`HokUswCk0WW5sff{fyfX$Ln-XLG(&zd!`v_FUOp(`r zkXq4BM3#>G%M_u?X|-+HRsVA8<4 z;fdMuA4Fr_W@nEH!>D02zLb#=zi#^dxr69K3B@Zqtpuk1AiwTh4*iWmBjU)V#ugjh z+90LwqiY?b-woe^t`*R289XVvswaX-Y+JlZJNzquU8dtRFFQVrex}}bTfA*1&K5kp zWs!BnyF!H&zSG1aW?RXbu3@sp(!8@GY&gjmeUtV3#-b1j?M57Qzv{e}%Q7dQ;G>`t zE!(qR=sZxcTHTPXr*KD-3^VR)QqIz|HR)r2-496D~g zi_nyA=(m_NJ%5knxxS+t%O@#q?1SDkZq8uHOe<8^G_XdmNM0~IkZYd#*^_NgGN%}! z)bgTTpbCYVj``V_9^8Bov*4F0Tt*pflHt7UmT{|-NqU&6?b$_Pq{ao@fAgWz!w!#@ z`#oa>LQqV3D22IB{Kxm!4x12}>;@OdJffN821h3bp@OBZINHiYp1z&MohcDVZRiZt z$+<+aCUc7Fn`}HXqVijTh}z%0*!KMNI=rKw`8}&fntaOzXvCj|xQdubD+QlE^7Oo% zCh&eKIba7=IT}NSIAHrgW7RTpse1WH*vQ8;5sZFbv>#tt<#9Rci)Zclr(4=lPi8Tm zL@;h((|MK0Kd-1fCAS5jTPE4EFn!Jy(lL!CALD3 zO?*)y=HdAB9N&%aFQD)Gglpz5t$k-(ppSN07i!ZWZ^U#eEBgP;}mQL88`h3J$%plpjM?EnKlD{T9e(zX{R#2 zp;N(p+%8kiAr^&aVcN-0^~1L#ZcrpyRhQ<>J7-e>Dinth08oGVlChdoB_+>G_L+fj zl;pcCTbOP-X)&o_aL$Qg!ss-yf^)+8SfE44({8U?6xa6n}4LBxfkJ!9| zZL64xoZrX|ONkjSxFyvZMbKTelM4}K<95b{JU3a}zO$#PaJ`dmjCR{&KgM*dbO@ck zd{?I{@?v-_a2x2-8R%5R=6mmeOpto3f+J4N%Pl&C*Kwnr(f92oRmMKmp|5Xvovzcd ze?Ox1YX3#^$|0J1_K0v`7T6SshuDnNe-YzT*tdyxVJ}zu^TBXcJN2jk3+Hc&0VQhA z1=}gjPgwU6LfZ}E_iZgReZUG_+9t6XXGP!L(}|Y*HNr-W{tGH9Gs194X9zN$jLJ0a z!WhZO|Fy{W?%1$*UAme2s{4c|mrP3A8Q1u|VLs#g3u%+fe=Xi(O# zUSFSY{5_>g{Xq1Z%_u>{wHfbRu8<(|x@+?fJ<)hQ}nZ5;bBU;=QULr=(gZY6asxjaY#u@APeyS}L1)e7a!l>qKaKvT~ zu4qR#2Q_^DI$<*hXS}1Y#X!WEw+l9da6~-%QHcm+8ho)CgFEI~R~R}irj4(*4 z1&cwrV;%jbJcL2dd$AaVE7H*~nn4)zej2JV5I^CJcHAMvy#T90xFQ~R7K>Sl)gata zk2IBtnuMY^Vl@dzS(FX{l#P?w}3Re<9 z->!%-Xw5NHgMi_KGyZYsGocHZrr?Tv+{N^k8zVR5yG5vz!Nf1nl4B~NCDogz$Oy|gEA0a2i7$O-$6V8 D27VcM literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/bottom-bottom.png b/lessons/drawing/snake-tiles/bottom-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..241b23e577ba9f79321858a4f634eaaae229a756 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W%gaSW-L^Y+3;Pi6-J*NfJX zW&*Q4OuwbZhfP-FNx9i0zewX}$PSM8A_jLVkCyA39QgV3Omow^W&CI7&91$(=5ms) z?zPN~{j+V&YcqC9z4~}$y-A38ss1skp4$m=>YsCs)=w^!?lE0a9T;0v^Xc-_ub+NC z55N1c-}wJro&@$AMh&tFry0r`beV53Zlk}zTiJpLjfP1&i7CJ!VeoYIb6Mw<&;$S? C8hKOz literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/bottom-dead.png b/lessons/drawing/snake-tiles/bottom-dead.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd6daf09047ebebdab1b3066964b199009d3bcb GIT binary patch literal 2140 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 literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/bottom-left.png b/lessons/drawing/snake-tiles/bottom-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5bccfc616c71421d347dc4fed2e81586d47069ad GIT binary patch literal 2328 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 XN9%X(VIo>600000NkvXXu0mjf{n*#) literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/bottom-tongue.png b/lessons/drawing/snake-tiles/bottom-tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..200554af29bbc66c897f744efe6088cf21ead7cd GIT binary patch literal 2460 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 C8hKOz literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/left-bottom.png b/lessons/drawing/snake-tiles/left-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5bccfc616c71421d347dc4fed2e81586d47069ad GIT binary patch literal 2328 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 literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/left-head.png b/lessons/drawing/snake-tiles/left-head.png new file mode 100644 index 0000000000000000000000000000000000000000..701810101fa74ef0436942c9c36f47a58b70df5c GIT binary patch literal 2162 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 literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/left-left.png b/lessons/drawing/snake-tiles/left-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4699b5b623ecb4a9fc7c59a4a68bc0375be5ac GIT binary patch literal 277 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 XN9%X(VIo>600000NkvXXu0mjf{n*#) literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/right-dead.png b/lessons/drawing/snake-tiles/right-dead.png new file mode 100644 index 0000000000000000000000000000000000000000..19bc01e512f33b72b9568bf9507c9fedcf9fea30 GIT binary patch literal 2020 zcmVC@P9XQA$_kA+?)8AQgy51qg%+8`vSSDP6$AQUg+1 zA+e(DkZ4u$ECQNVDqSE7?2x)Z>ay9iP3HHIOfCVyO_SPfdM;ym< z9_6FJgTMnMVcr*R4FZIZfbk;G5(sEJo<{d-N81bmlvBk912R-wzHZ0n2m{9!L2BFaGLT&8;;xIUR#!=H+A|Io z0n0oHJP+KNO=tA)>(g840icouAHAkY5S8uMJ>cLF@FX81@G3Ch>-RYJkz=LfDup)M z95oY=*c{tP*g;Y^VX^jxA9IWWe+K4fj?b`kcB!f6HQ}R+L>p0?UIUfjUNFHRQju^y z91H>m{2Vylnd`9l;l;*kDT+!Z{FT37L4z`TZWig~&hVPD{>nOHgvEyzG2URrpsKr@ zf{et|R!v?yV z`+#|&`)HTgiTI(%Sc8dXnaVkDjyR?9doWyfktjJvt--XFcC49}}2N#H)WCFhH@zJN%Ur}Ts zc`;p4q%UM&&M;G^+z^S%SfT5h(4Gc(E&wvspTfAN@X@AF7dtrtS;TidF^g>eb~6dQ zB-pRnwEE8m^olZkeu#U_RXak)uX+KMc74DFfZkHC5$g+kFT8l@27H!;4=#WMIWE|* zT689nCSMnL4#-lpKq%F|j*^V)?~nEY%d7zXlMkQ7_H5IyH^;~1CTiAW*B%2SNP(=XK6ker9!l;L5goqu`4gsFC z0G%V9@wT7UHY-^opj>&W)cC!u^iF7p0O2eO*=)*WHMYBU`_4^m3W?<@Fnz~OK|2H} z_W)$mS?K`F@Rx6V)N0e-M~}ca32mJP?gX$Mn_i8a^UGbJY5s2#F1uX7X)-$uD{X6C*(2pTKv32t1{5N#RopM}Z!s9DfO=v4`I;Of(D%{8C{Z zcpCV0J}?oDCJ~_Mz6)JP`$pI@CQ5+9W5BP0Mc_r?JTM;(8vq(}Z@=G$U&F*qKvM*G znndyw0zauuZvoR9YwBOm2<;;#sR6$rdHbJ^2oErTN&_0$XLm430{%;i1W$~aTL*|C zj+xqDOw0rX9@=I4E#Tfb7$G3f;udDH*ZSU#psgtICP3H32h}rUIQ3h9RO7h zUt$v8_p6DR6b>g z(Pm-f72wg0D;udcSa|;+NdvG|NX&%|E--j@fO>5dMpy@ZP9X#H4b!Lx)-ldx+B*yh zF92-5v)R;u+y~g9O=HuNZD!aliyJ!dpl>PRnSiVdvM%T|ioU5ZBz=CEYf-K_#jxI1 zBme&PG{ABRk8Z4PNc1rkM+;v-Rof?4IRY=9-e>dD_&ZAYRY>QDqB#2b3^TZXakP%M z8zf!?&X>&*qvi2DJsz@JrKlSi#vxn3+d^0J{(uD``%3B(EkfvZ%i}rP?hp7GaQ^D$ zt7U^kJvm~cNl8+lJioOTb&655Z7*O$P38R_8zg9-fWH8*`wf3)?TxjnMW)ym=SKyD zNhDZB)`iWNHqli@<^?fAT#an~W{cTJW^s0pEiyUU?-NW-QZE>1IPr-SWvu{cG)oi( z)0Mxj;8#6n!7%-~)B%6(PuGa65x3~*pX*n<$-)xq_W`d0N2eC2Sh{~{Us`1k4gqk;o23gJ>UQ}8J3TOQVwS0;|Mv$b z>NvEI%#7mDJ~TBBhw`zx-Ee~sPPTBzw{aT>3I79WzZ@s9725v*0000B#=OW5L`Ko5Ql^%M4&K1J1Tfo11gC)N6*bbdh=dAmeD&~~u z_{Dsat7v`(d`6Ve|74#FAHRUeeP&*hyumE}>@gmx!J9mf<~P80*b5mxJzT$kJ0&X+ z6qw$da_6l(Om0p9h=vh6pWZ=5YHk`!WV0m3JPZ65xY+qfhv8Ghlegq`WTkjNy&g|u zZv62EdZr6Ws6a7#VT2cXwdvNuh*?p9F?+yuVAL6P7(P8bzR4%A8BAVKDG4C?eIxez ztv}!5@V|$(Nk$)y=zqRn$fJ;c4OVTUe*%o!gZA;rFCbVUJLi0~e>6Aw$^RzIq8X42 zRFT&ZBK1}rROt2O3yDRz?dF} z?*R;+9N>js(;F4@b8E3cEIq^&f0wT%@B5GVO#eBp%~Cz0tN?S|%SCF5%UZyE*`q_xr*uSisTx=OwzLMoW|qQ~sL8Rn=|qb*P`s>}tTRO`nc2aNH7zXOks zo*U5~wilCkYdWn#uSisTRs>g!S`oy6%G1iyy=&0F*XVa_Pau~C?@JzLYcb)v9;Vp> zgqJZq8gv8NgE{0&ew`8U9I~Fahp&s*RXy>n*4>6ME&LAfDkxNTO{0q>=ZH{7vjB## z0Ce}d^$C^=nboqN6L!BFFS%ECg*wuXD`n*7l%ZPeIitgs1;7eWYx*^&?vjp!I2XVX zqSn-<*mBQnz$(N}I0joRz?jE@D_-akUI;50XXI;$$3ct^lHY!e@ryq1`gO&`%S7+v z^kT69!ZR3X^;^}UX_a>$1i>mV_Eug1^M0cjUa7VsEA(8&cb z;>!dY(mPGh&sq~xs7B)|^XsV0zjN$D`wv4D(tO5QWo?(7_*Nq{a;jHx?= zokBnFHg=w=Hgx9{s^NYQKza5tlY9yyq+Ofm3}+t@^3W`RwSZE@r!a6)D@<33W)`Y1r@7Ij0Z)Kre45W zz|7>U?JoIPp=SA!&F#_P1dSf#ZtymMo+csav_?&0_OYO53UBJ=qrT)Jjm{cK5y6=A zDMFJA{0;0vL<&JF7T`@iybnD54}AN5>RGFZRlQrBBiCq}4Ze+m>46i3Oo#F&u>etp zpalkE6N9EO8A7mfH!XskGMZfAZGhRmS>d8!O**xL45@2qK>|T*J39K4 z!mR~Sp$}z9%;HzT8;ARcRRJ7J5S_I2Wh*#lP*g-}gQArcDc3R!m)92*{Uz|m!Hom9 zFK<^fGftZzf-=f>eOgeSLdP02TTfVAkm5>HiW&=XpFODnzXtv_J(zyt@aAECbl7bZ z$gRO>gT#XI3`!|Wdb);%k=q9I2ZMgsSr~cAE{tU5SaM-xIS(51ZQuv3ev7^5_ZB~U zpO?n;foAg431(6<@d$!%1jv@tv#e!l%nHy0-UTl1KC|1rK3EolqA8zbarEBr?lFC* zesR>l;uC%~Y-~ugdn~^?e3xr{2g8qV{`DrUeye$fxa1aTV6^6f4)jd5syR$p9YkSw%IEfQOf@Jc5vubs3 zS5H;_f7PivbxsxBmfP}%7P;9K7*T|$Y0zO2#Uhp^UPd3fv3a3ETzT9X(gKqR5*^z|%D8a13}52l@eE=b+D(r_dFR4m7F~Jy$g13CdF_ zt&(R^4wfiEL_pkgd>0W=Ajmcn(85DFhUHP;?x;tHp*d=@wqzxJnn zYP)Jwn^l5lkaX3XDVtk^XPBeI6Ih-kYHhFTQCqAry?dHUy|SsrZH8g(DJF_|cDw9VJpg`CTSvkK#`@d}fsynJQ-_%4^)xbPPC}vDK&Er_k0hOtp zQ|!2Z2g+A#{%oyUBw!_<9={JeA&z1yJ9iFG?>4;!BFlL^dlNOo1ZR=Qk+g<^d9gfK+o)-DFl|pEf{riirGQIY zzR>D@1LiK^1SnKezQGIxIZW0j;0*ie@gWgm?%-TG_)P00z`O{sXL8R)Qig%fs!{^3 z4AeN*;n)Q9_&DIz7HjB0=hKQ^J#Og;bm)gE0bZsD=n-1GU>^(wwn3|N6csoDFui-a zuiylH8E`)(AoRjq%V(#$>|mM8d(5u9UKvinS6QUX5z#_*A+xwC10Mkn{gAK{CM3iy z->2h}Z{f8pwyl!k1oU_qpxUfDKUyTofTuFxD6MK7UaI>!o!65O9#R561$2PVSomBf zy$R&k`59v;H_sQRIVl`v3C+?-TgB6;^=62PbhjF#<0}P(~r4Afcc_<=)#2 zArmgKA@n^U0KO^tsW3+XkOvASf8HtGSQa!v~@geC+-ZZU-5Mwqg-{lqSYJbpzN+AD3W zwaJQ5a9uhc2NH=@Bf5-n7NQs_T@LrHFkR-`D#Pu7FY<5TPd2o)FJ=M~@jz(P(O-2H zdR60fJiNAt-}dp^?pb#}8O0;?0&wKo@-?P*Or>va zr0W17D65j$L5yHRgM@#{8}M4kW~lL-e8SILN@>^t@;8ZSpo(T5xdcHfsv~g`=Z6Xk_n8w+XY6F zdJO9onY7V0sKvK|$Ad<|(%Y5>f47d%*ubz@u{S7-xn}76po47}x_AKo$9!ZyGqbD_ z8na@@AixDj{{rkAs0xFKAm5cY5*)q$;&r+&4+xIlr3pR|j22rMGc*QY;4&>v0>8NO zk1JK>DH?Y-27g~ri+HdS5v*B%c)WL^H?T-^!QkI;>bYikd~5;$TKtC7oWkAy-6+kn zx~Dq&7MUn*{bodqPXON`+9b7b-$LF-7)RDxA7p@posi|1miwGE%2(_sDwTDDR0P=jjo zjj&NND{lALH-Nq1!fA5{=O$yT>=2ZjyZAgyoie z;*QL`3wKT^e`Ll}RA!?iGqvc*%+%}q$jo4A(Lgwk}m(9|e$hQ0JSf^Zm{J2rQaTkhE0cp|iDqFE$l y5m-W4#4=C+!O0n*!e|F4xBryZZMiLzCI1IsAvDjNMq*?D0000_LfddB&D9HD4ijp9Z!b_GN@$h=hdc8X{-Blc_tGlYEdS=$UGdmIaR;BLgsj0`m z{@?OuTfDr~G4LZ{l-GWhX#Hcr-=oJ**f-);H%3y>6G2XQ|I~TbF07HS=13*SRNy{9i>&P2agIkDr>R@DJAcYbZ6s>C;;E%Np07g5b_RdUX2oo$= z2>oLbo_DD1kPDfG7B+G;p(hvzK=3*Sh7TsIK#-v+WrMC~9493w<|clhg4!J$X~MBp zRmK4@mI1?^VcM7bL6B~-1KQGW;cDPZ0tgqx`O#pU4}d;fz&}iBT=pcRssFl2=F7Ihv$ngjq=eh;wspS{U#yVWn7;v%kEMUG|p6B0#+b%fYb{kH&ncUu66 z;(n=R%>Y?6zIMzbESrdw3Rrm+CYW6!1n;||LuN|Rt_YwJ$^TUFbe|!UIG48 z>=o?ZZfC)mDmYtE0gw%|+Cu~&9HUK`4FJo6Zvt%pWqaZY5|%1V2_d4p(_F0Q$TM{1D*oTX$Qx%D`BN?7PNnkTu1rM3lF8wqf2t9FzfY znr{Pdj2@2I`t#Prs(#um_6jus`?l1c!iCUUrhzzOFdi*1|1Ou&yat>&bL9-H=T|3I zcSqQQQyrNOUSQ~4Q)c$+j=R*kJNJ9hBsqhG=ON_Lf8OV-z)yt~Y(Bf0e2EhG6u+}` zK$Lj|Km|?!gm)A!1_Pq>`vGQkIQ;tj7t&p~b`I51lYb+c!PXN}&519Q8OsDW`ApaE`y60x zKm;Jf%xIbE;Wy_mvd$i_0@w1@oXux8r-M-S?9(~04;2vg@wcpDfv*yEiNWyOPt4S3 z#L;9YzRw0jZUR@cUdHA#o72_74H9qQvH`~zD}288D^f+MjiWXe<~Oi_=c1pu5n{1Uh>q+sL8jj1j&kQ5O9q!N>z1VD-j z@eA9dPtaMz_!96uz}m$%PJit5_-T_#60O+SYDzP9AE;1VKjkt-@MsQV*r_hRh#9H4Z7q^P1)r6o2GP zzze_?03ijdo2#r|SY_q0m4%J$xZhI=zQgA+d>wd>DnFsRiWBcYL2skS%ITGZxzGa- zU|FQk69~S7;mg2B++!gG-N(B0&h+SQ^vGB9BOUef0MLk_&$9@g!|*xa8c^@9gc5Yt zJ9O4MCDlo1Cmr~WTl?>HYb@4yTOj=JPEr3$m&q6NSyXsk_ z&lv<)F+2r41$+W{66icibMHO?Qt}gW{>=pnE&>-2T*Pnz>aqr`0KMw!-@hmC$^Wzb Y4>O>NObNwKT>t<807*qoM6N<$f{~UlnE(I) literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/tail-bottom.png b/lessons/drawing/snake-tiles/tail-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..fa20ad753118eaeaa4fbbdf71016f2c92627dbf1 GIT binary patch literal 2113 zcmV-H2)_4;P)=uX3oqxd)V38=x)r%uIP$RZiFbP?2Sb5MpzLA31V(@vk(M7ayAAu zigy7o)Eg0m2>uCz7v6X!Vhnm^R*`6!%L27DR#_!4$f;LpG-z^|BcrzZ~!^ee!Wj{)BWz6AIH!V^TJh{4u? z!NveD@{qpFS|9;PW(mnj*5ad>fYDPR{C zEK{Q81%Ri4?ZI$BGK_NWaQS$p`oS>~(Kuo-964)kZU%0BbvIjU|&=@fFT{ zEw?h}&k7;6abhnnMNut8?z6_h1-AgN-~l%Q)^{AUpF3SCcm1>=uZMl{Hdy0$X-&`~ zs)ztRm1@M)e7>1;=_tT!d=9u6tOsgQu{x}`L~669&%C5IWUXULOC)%C32oT5VK5vJ ztOo!Wb1qi61xWckz}og&O&8-$&(j?4Fk7~9+l<+iQibn17aQu^xwdO4>G zTq*D*Ksa{He(qqU{M8n|V$WX|4dWMnIG}NO()QdXz!L!BW^?#gX2llziwI#>i4HrB zX)x#TgzdRYfL(xK=s4lkoHXA6OQGL!^*5n*gG!~@;>}P&*Ph*p{Bg-3{kBMQjxu5v{?u>F6{*f&ef+tK~l|32Zt6yPF~sQQfO&hS_$w7 zxFeuM-1WJuj|EVnDdjYqE+I57kC@NO0!%p%MADZC&+UC>e>VSK5v;aa)EmMR>YG87 zb1Yy+zz*R4wr_DrPXjgMeJp+zTWU<*mP(5j&^Ybr_sarEE&zCg`VSx0a1`yraS>F~ zPIOPZf>X{>p)5ekL#575FhX%9i=V}2#cm4}oN|r|W(sTr$gttG+(KN1;;Pqx;@VLN zjnj7Ne%V5{Ksdks72PZjuv+qkZOvAflq)!;^^4#pfbi=NL9%hu%6eey*9(lX%)HkZ zNaql9PNgqARsr%Yqk@tlRqi^z^z;tf0<0gkH|#(frxpTuEj}6QL{DS!v)MQOsDZ|* zR)7(>BLK8n*Jq#A7eR%6hs~y9NaHjr-8cGeLBkrLVCMe{iy(zkF=W|+>Y#Dj((juB zNTB{C*gAT*?!BO^i*rsT&h39AWI-kDPpK4k+FtesV!*T+cIIZ)59$^YFg!U<*a2lb%tWAwm>8GwH r)9m=PL1kO<^S;0+idyz99e2M6%+Yb%OBLn^00000NkvXXu0mjf>E;Ve literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/tail-dead.png b/lessons/drawing/snake-tiles/tail-dead.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1028e634b4b3c86249471e1930666783a7c281 GIT binary patch literal 2227 zcmV;k2u$~hP))pV`j)VkKHmg|j5wxek70Cw_#Mgl%peP5#0gVuFO9cD_ z2t))Z5?9E{f*Y2M97hUV5+4ZO%_??0wr8_5-Cf0@x~i+cXLdK?W9N}dGt)C$^*&F% z_14>O^}-TMEV0BAOPpGWkF@s@8^Ci2p2hGv;M2eca3TA}6WQwr+3S129`G)Lw=lc` z{EZQNAC-wGFTjW`;054$VCw|NFu*O~b>LM-+&X4|1)PikBP4>W7+wUf_|BD}KkT#e z_zJxz}3 z(F7QA4)_DGBZT1W#j^}A4jYLZOg@qbL?{U$?3eyp;d20^4ddHm9^8I_F$Ulo@MT8a zUzEz?0$B2Y2DVgRvA(^|%Gs6Lo*i)`YF@+9-A7{yS6&;0m_3-We{-L7nt~0KUszOx z#RRZ!|3_e_H|Vi`d7Y>qReG!tm&P`czamNkWQ2tl`K#_0BAF)a-`FRf!~oYg&zBZi z4ssy@?(q{~NA(r!&oz)224qHB8FZvcdnsuzCFv)&t=bl^#>A_!|LneZzt@q*C@UH= z7c@lFkGOF8g0p3Zd;EA2O7nYwjrP}s5OU+nM%C>z@_v?;K}(H^tO#1!=B|fJ!OgJL z5|IjIDs4+7A`$+&_YPC_gxP}`d)N0c#%N$?-rZq70Y*sR2CzN6H00dV=bFhYW64H& zOQRIs%LVXDB4Z)QUET{2OH`teiOgFn^WW8oaR2T5jNci9-6Ai~lP5%7KgcY+ieWoi zjTl}W)|1ajdD591r@f4PR1zR`=WzWy0V0WxH7ZspseH_kNw#WrH6{!%4w>AUkQ^r4 z2(ALZKN$gRhR5(yX{)Ot?}@KuEnCZ809g!>p#T^VIuk(I77C_>0-8k-QZT$UzJiShjhJT}{35{Gg|*^U=KS~U0>>g03rEs{noi_1tl?@5RGvq^sE5=bA5yo09zS{BMKn6 z42b@)=C00Vcu{etT*NPvUnu9S%PAs_?&*5ZDw`(#go%v95d|n=$+|RzVKV0(na#}1jsvtca9RY)QCu+ z(`?K{Bc-erz}sv~agFE-f}aA2R;xOB@}*XLvvVATfwE=HGJ^Y*r`o#j@_?rRR9{uT z2-l}?GGCLXoTobc5{R)?Lzh-efLDPY@XhL<7z{#)JcTZgDXL?sRc~{v09_t%9`>qb9e*N;3^}9gH=1;T{?DBxefaVfcXpjq7O*8NC z0`MzfAL|VQcprEYo3^yTP~0M0#m=X8wXM%C4_Jj}0ScsRGQ3)>0bd6`3Eah!Kc8JY z)BI_yAuDjVutwx}WMOf$2?y9E;AZ|w z;9hp^QS+Y_s>NA(tf@ExptUareAwJ;w*VhPvjE*G-^k=BcPuz%p*zTQQyI~A7v24J!~DI`SU)>JTbs)(i$Y8rS$ zX}t<9Y)!xBz3(dtX5IB!GyDF~)QPGMlf8-i*pXVzBft-N6S%Gu&183yUoQu#BwwG- zU@ycpFg!Tsk~(W)fD44I^b^j0!#Uw(cY=;Jz;#CLC2^SlXzUdXzZ<_ZE}joK^|Q3o zo!FGuu&y5}C8dYKU~%}Z%90sapkky$)TKh+OOIh^Xp7h literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/tail-head.png b/lessons/drawing/snake-tiles/tail-head.png new file mode 100644 index 0000000000000000000000000000000000000000..982c20883d67a75769451cd6aa79911efe06d98e GIT binary patch literal 2186 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 literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/tail-tongue.png b/lessons/drawing/snake-tiles/tail-tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..982c20883d67a75769451cd6aa79911efe06d98e GIT binary patch literal 2186 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 C8hKOz literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/top-dead.png b/lessons/drawing/snake-tiles/top-dead.png new file mode 100644 index 0000000000000000000000000000000000000000..b283030c112ffe6e4f60f802713626c7904a03b3 GIT binary patch literal 2156 zcmV-y2$T1TP)%H%**VV6Hui&GN0vvzpI0Fz+Q8Z9&Xh|ni(pE~+N=RA>>12uv9cmO61sNP- zM^F$I#0fzX5N?Eoy^yFE5%nU%jS!O>#0jE8#-xsG?_Dc+mfo4hIUN9J-KLHJ2z4W( zyUloa;c@Et{Y?Q9V5oWnQ15#y=kFHo)mC*~;&(R%umGx?TWQX=6cKelh1e!MPS)>l z3a|#C=@yy%FA(0Us}-j;zrQKKwjlYZxD902SH9skeS15#*%Y7);L;(BU{h%w(SJWN z%7-C7d7Qd_e^Y>sEg2RNk@9%oP`Dtn9Y1OuhYFx}^t7sIy{XniaW5mndjt!Dst))w z^3saarUEPi*x1rUX+Y}7B2pRlbA(++Q(zS>XMU(}4S1Xu{r;f>xVXLsl!F_^8HWq< zX0oRF=f2zyLTRtC@B5>s62gbaX;T4iLL&l%lDrzt(%m5YE{=1!8h(_i zxbb|-;c>d@j~O;>+yJl}l>kb9e;LIEj^zu>s4CMZr*Sj6@;yiTs}v%T@9k|ExL-J2 z;*f6(GAT$Tq}`OY^J|C*N1ixR?FGCE@i^V^$E!zx@F76bO^Uzk5fCcslyo_z^KJ(l zTWsHwyp^B}S|yo#u@DwxCZG#S@>YV~u-L@Xd8b3VoT4uG(T{+9K0Hnz`oq>E!0-VU z(r#L}okxHgW#-8l*3PftRvi7`^fPf*6*(%%^OCIvg~PiQ4CRoDJTLG|&_yNrbwWad z-crn*Vdlx1EMoH=see0`oD3h-Df_To1Cq3#qSjm3iiO80GA&F$GmShb=q=629~Oe| z2FL-~(_NvcAO~_=hXq~D?3+20`7|vV`KI4iN&6{4l5-p(K${e}2(WSIE;*4O=8pTf zD^vz-soUJJ$K_(qvBa>wz&`-uTk&At?F3y{x^H*UTZ+sHGMCMSeZwN_+3bt%JV*B- zRFNg?f_=lHD_P{pTo#Glx4URpvw}#&@Ay_+f~!ruY#y{)Eo7mj6O1)TAcS)vvnOYXOhgn!w4QBY<_!|&#@+6(1I4%!3T8eN zKQa-KM9iL?C7cV9AotN#5umBkU+Dw5oLha|q1M{`1$g4OG;T1FB^8zBI1~CLty=RTs>opu5mz z@zNr|UupC8rioGYfZqaiu6Jq?ATDzxhy#L+tc4q4R*;NyXKdv_L7=v9ZKD;}mbPtf zBQ~Yo!jB-XlP|{T-00LeZB>BRfNpQ8N3x#O9kD`?1_ViFG>Eg~Fb-=oB33ZYlrwm* z&A5E5G#@)LgmE}vKS+b}{x8H!))RV5J;-VRuWem`HY>pE0JpE+2C7i3&4$g4n>Y){ zFbT_)PsP+y;#AuMGrVQ@TMxlJ`pY>1H z0eS?S9c62DP4FeIBD@T+a%H7nCi7lW7@N&b5d}e9tqXn|)xVu{gE%M`Ka-kj<{RW) z>R7pwPq^?hFL8Ag&CwB%5j_ihC+Q|%Ui{}G^Iw~%dq8NtG}eYqBRrkUb4B zRQrUxpolV2PvE3l1N=8Y18;#8mM$$7o1aTLhfQqV4QDt`%HM#856mCn@RtrFL3LTJ zSQ2=(g1ktfLA_ctAYSRW)^4jZ%JMa&5W-(m$|prJhEb$|szPH?)O`)^+W zfHsc|dDzKG@bz~@Y0IQ02L%sx6>+jW(*T!;9e4l;9W1{0e4Ob}eh56}k7Xjm#K8%o znTTjQBA5sWCIifb!Gs18K}^;l+s_xxS%-^VR_=-|X)h(d6O(k3X1QL0_kf=P@6cwG zclx8TJKMH193$mv;A!9+z}&8kJBStF&j{}laE{Yl-|2vRQ@=XHBcwcr@EFRYz{7c) z2Mz#}z?5-J0XRdC?2S!K_74mP1Y(U|h7XjN|z5lPF@M2DUDQ~Lq;(q(J=TMkXcr_<%6;9>N=6$a!OzgLxdj^H~ zbE18P7rg!#@;+5~e?NWPQz%?exU6tu$Zsd|-!ANjZ)1!x#u#IaF~%5Uj4{R-V~jDz i7-Nhv#u#IK7Vuw6d*fs_VotdL0000vjVRG literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/top-head.png b/lessons/drawing/snake-tiles/top-head.png new file mode 100644 index 0000000000000000000000000000000000000000..07495282c3b9685b00eb14bee7aa9b81eef903a7 GIT binary patch literal 2352 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 Y4>O>NObNwKT>t<807*qoM6N<$f{~UlnE(I) literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/top-tongue.png b/lessons/drawing/snake-tiles/top-tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..98372b522c38749467e463ec1bffe519143bd6fd GIT binary patch literal 2510 zcmV;<2{HDGP)% zO^h5z6~}*7J+m`wud#PGahwRpgaZ}^DS}gkAShCNfMX8=t68mp&Bf<;SDV!$|boLIE5vrd3b|2Pa7%Mha|f$d3# zMa51|zoHcU*)YI5`gq-EBIBAk2QAoyj2ebIQt#M!vdD$ zncA*WI%R>nuJB&+=)K(o1&zH8_8i)SteNvU5EW)NZR+>UCpG|7V0R#LBi8=3hI`pX z1q$UWg7X3XaUZd96Y78sf&X)#@O+5!6)I4;mt9s*tP;AR-R{ApZs_+-0M-Gb(9VGN zKifopLAwj#3w8r$CE*`J@P_Y4enjUV9qV(N&FlL8VgM{5AP~4$U8@pxL5)mC6H79# zx?msNz3NΜx=K03$=7vdj{MS(r1(0VN?IXaj_OJC&PvG_7s&fISJ#O5}ZZ9gXFN zwJq~Wa6LDk(QhT!xj+^VE+Xs0Mu>($eq3(r-asgUd`Kdi!#ZS5vghC)>$90piYvM2 z@)}|QqP{%|I!%XtAKl0NJ@bgVK-2~G`|314+dwSdgjHZc(D+P)`g`k{{`tG-+4r%1 z)OXaa&uKob==bw=Kop}BdKLyGVdOL%mOi{hI2RH$2WNwkiUwO_F}r#oD|?e2pxh~G zJk*HK1Kk=<-$4d4-tt;hW(;u37|=)nC<%d_VJdG}c5u1PrLc$$y%i*z)UXVIC+Prg z6hwN~EHozPu=e|Qim9tA=qgm{GU(EZ6MZUXHdDX_fS?ypBqkk2l)th%U{>{jG2W0) zorM+7Ru!!&=K%a}`Nl8@L}G|OD>IjrVbK7Dsz-5tFZ1P`*;WL=d9X9UG$?c4 zG-$?!P&%fmvkKsvFXzoRb2kVhLLhetQ4$8(&TUF01cSp5Q;$ynvXBe9K|0t4v#p2$ z{{ry0MxTvjv^R{}j?0X;4Y44dVWSQKWtP%8mB@Pc#+T;=OrGTUuCi<3~! z0w9+IWGIoL%*E!kMbS{bk?0x90VU$!$U=E&_Q4LoDbT26ib>0o8Jf5rC|UbuD2G-a zn+|UyJ3TpB)NTXd&j4P#;OHfh-0Y;rg<^;WQ;Rl!j%86bmSsK&{!-Ll3_ybuK zjT;6!^_9V{L{F9V-|Kkkarh}(bc*_v9pStP;I{2&fRKbjGW#-=h+r6mNoC0SWbBk_ zqnPDh&ussrt&bf5!S4XNtKE_=MtQ2u(hw8I2!k}gj2d%PcxARHz7$Exn*>e(tNxa6 zUk(i#rYw+w%q6VsprT3`r2Qgti7y*7l9lM+ztK-Cz$?6;mu%|n0JI2zUjl5svt{j8 zG+U{`W-b_2v}9GC8T&e*6ClUKSc-PDI)l)G3a-{e)`Y~TiV5R76aqpNmhhMW6@qH&^OAhXM?F)VEA zUg@S~{Mp2Z2>}3w;0FL37dNb(a>+0W1IKr8dkI5om8z-fIh2*z>F?;#* zG$S(4=rO|p{f)_YL0Lq}+?7M9@E#X&K;wPir z8x6ph=^^+bK<8Y?s#uTT6a>e2aQg9;ITGeWBAxLpf%+P7{RD)-D1S?~zMZq3)Szd1 zyy!LRxBvh&coula>v(Kl+AQv)(O6#zQb%h2TINvdRMt-m8OP7}&8+|<&Kx%{Z>FX1 zC7SW1%?5z4vJN~B&^~KLb*dyJCt>eLp$0X{K*=RAAw-&_2&043rt#+9RpoQS9%5!S=(ifR$ciN8Dt za*0o8g7oE3-mtA8tEX4#t@QwYON&odb*bo3w5<1I1pKwP*1My9rp@B}77LBZVl)Jq zl1y9Qqgq5HqXGY-q>3zB_C`4mw9m9t=dV)Zv2k1)f2Y#oLE!hm-0}yOS-5AxI&#JY zIbcKfGyT5;j4f~3j9(&(q?k zjO-^2Ih!kXEY4ql<2pCqia%;YaFnNbdJ;FLJGwo_r%)URnvFdTmJcmc-)VVAuK|($ zo@=i5X36jRTzmamy4<-4j_?%EP3pq*XV)!0LcD8yw-ADb{R`}V&u*NCQ`|p$XHoz_ z+)yZCKV<#FI-75Arl&mr20l%zyw)EjvpKx~F1vC09`FUg5kj!zt{v>Wdne81CPGZ6 zMk$4R&1Gw4i|$G{bvy)qOp_;)`eZ7Z?F;=D9|XPuJVLU>3P;dfY%=$*Ip!ATa2gJ> zF5@ftvNH-IB0s)DFQmWOr@zt1ZM*t+3IXtI;9InKZB{04&le5fWcsT`@fa{ Y0L*yegXyHWM*si-07*qoM6N<$f;NAqW&i*H literal 0 HcmV?d00001 diff --git a/lessons/drawing/snake-tiles/top-top.png b/lessons/drawing/snake-tiles/top-top.png new file mode 100644 index 0000000000000000000000000000000000000000..241b23e577ba9f79321858a4f634eaaae229a756 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W%gaSW-L^Y+3;Pi6-J*NfJX zW&*Q4OuwbZhfP-FNx9i0zewX}$PSM8A_jLVkCyA39QgV3Omow^W&CI7&91$(=5ms) z?zPN~{j+V&YcqC9z4~}$y-A38ss1skp4$m=>YsCs)=w^!?lE0a9T;0v^Xc-_ub+NC z55N1c-}wJro&@$AMh&tFry0r`beV53Zlk}zTiJpLjfP1&i7CJ!VeoYIb6Mw<&;$S? C8hKOz literal 0 HcmV?d00001 diff --git a/lessons/exceptions/index.html b/lessons/exceptions/index.html new file mode 100644 index 00000000..c7575e4e --- /dev/null +++ b/lessons/exceptions/index.html @@ -0,0 +1,171 @@ +

    Výjimky

    +

    Pojďme si prohloubit znalosti o chybách, neboli odborně o výjimkách +(angl. exceptions).

    +

    Vezmi následující funkci:

    +
    def nacti_cislo():
    +    odpoved = input('Zadej číslo: ')
    +    return int(odpoved)
    +

    Když uživatel nezadá číslice, ale třeba text cokolada, +nastane výjimka jménem ValueError (chyba hodnoty) a Python vypíše +odpovídající chybovou hlášku.

    +
    Traceback (most recent call last):
    +  File "ukazka.py", line 3, in nacti_cislo
    +    cislo = int(odpoved)
    +ValueError: invalid literal for int() with base 10: 'cokolada'
    +

    Program volá funkci int() pro něco, co nedává smysl jako číslo. +Co s tím má chudák funkce int dělat? +Není žádná rozumná hodnota, kterou by mohla vrátit. +Převádění tohoto textu na celé číslo nedává smysl.

    +

    Až funkce nacti_cislo nejlíp „ví“, co se má stát, když uživatel nezadá +číslice. +Stačí se uživatele zeptat znovu! +Kdybys měl/a funkci, která zjistí jestli jsou v řetězci jen číslice, +mohlo by to fungovat nějak takhle:

    +
    def nacti_cislo():
    +    while True:
    +        odpoved = input('Zadej číslo: ')
    +        if obsahuje_jen_cislice(odpoved):
    +            return int(odpoved)  # máme výsledek, funkce končí
    +        else:
    +            print('To nebylo číslo!')
    +            # ... a zeptáme se znovu -- cyklus `while` pokračuje
    +

    Kde ale vzít funkci obsahuje_jen_cislice? +Nemá smysl ji psát znovu – funkce int sama nejlíp pozná, co se dá převést na +číslo a co ne. +A dokonce nám to dá vědět – chybou, kterou můžeš zachytit.

    +

    Ono „obsahuje_jen_cislice“ v Pythonu existuje. Dokonce několikrát. +Místo řešení problému to ale spíš ilustruje, v čem problém spočívá:

    +
      +
    • Řetězcová metoda isnumeric vrací True pokud řetězec obsahuje číslice: +'123'.isnumeric() je pravda; 'abc'.isnumeric() nepravda. +Problém je, že funkci int potřebuje jeden konkrétní druh číslic: +pro řetězce jako '½' nebo '௩三๓໓' (trojka v tamilském, japonském, +thajském nebo laoském písmu) platí isnumeric, ale int si na nich +vyláme zuby stejně jako na 'abc'.
    • +
    • Řetězcová metoda isdecimal vrací True pokud řetězec obsahuje arabské +číslice 0-9. To už je lepší, ale stejně to úplně nesedí: int si poradí +s mezerou na začátku, např. s ' 3', ale funkce isdecimal takový řetězec +odmítne.
    • +
    +

    Chceš-li zjistit jestli funkce int umí daný řetězec převést na číslo, +nejlepší je použít přímo funkci int.

    +

    Ošetření chyby

    +

    Pro zachycení chyby má Python příkaz try/except.

    +
    def nacti_cislo():
    +    while True:
    +        odpoved = input('Zadej číslo: ')
    +        try:
    +            return int(odpoved)
    +        except ValueError:
    +            print('To nebylo číslo!')
    +

    Jak to funguje? +Příkazy v bloku uvozeném příkazem try se normálně provádějí, ale když +nastane uvedená výjimka, Python přeskočí zbytek bloku try a provede všechno +v bloku except. +Pokud výjimka nenastala, přeskočí se celý blok except.

    +

    Druhy chyb

    +

    A co je to ValueError? To je typ chyby. +Podobných typů je spousta. +Všechny jsou popsané v dokumentaci; pro nás jsou (nebo budou) důležité tyto:

    +
    BaseException
    + ├── SystemExit                     vyvolána funkcí exit()
    + ├── KeyboardInterrupt              vyvolána po stisknutí Ctrl+C
    + ╰── Exception
    +      ├── ArithmeticError
    +      │    ╰── ZeroDivisionError    dělení nulou
    +      ├── AssertionError            nepovedený příkaz `assert`
    +      ├── AttributeError            neexistující atribut/metoda, např. 'abc'.len
    +      ├── ImportError               nepovedený import
    +      ├── LookupError
    +      │    ╰── IndexError           neexistující index, např. 'abc'[999]
    +      ├── NameError                 použití neexistujícího jména proměnné
    +      │    ╰── UnboundLocalError    použití proměnné, která ještě nebyla nastavená
    +      ├── SyntaxError               špatná syntaxe, program je nečitelný/nepoužitelný
    +      │    ╰── IndentationError     špatné odsazení
    +      │         ╰── TabError        kombinování mezer a tabulátorů v odsazení
    +      ├── TypeError                 špatný typ, např. len(9)
    +      ╰── ValueError                špatná hodnota, např. int('xyz')

    Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, +vždy najdeš v příslušné chybové hlášce.

    +

    Když odchytáváš obecnou výjimku, +chytnou se i všechny podřízené typy výjimek – +například except ArithmeticError: zachytí i ZeroDivisionError. +A except Exception: zachytí všechny výjimky, které běžně chceš zachytit.

    +

    Nechytej je všechny!

    +

    Většinu chyb není potřeba ošetřovat.

    +

    Nastane-li nečekaná situace, je téměř vždy +mnohem lepší program ukončit, než se snažit +pokračovat dál a počítat se špatnými hodnotami. +Navíc chybový výstup, který Python standardně +připraví, může hodně ulehčit hledání chyby.

    +

    Zachytávej tedy jenom ty chyby, které očekáváš – víš přesně, která chyba může +nastat a proč; máš možnost správně zareagovat.

    +

    V našem příkladu to platí pro ValueError z funkce int: víš že uživatel +nemusí vždy zadat číslo ve správném formátu a víš že správná +reakce na tuhle situaci je problém vysvětlit a zeptat se znovu.

    +

    Co ale dělat, kdyš uživatel chce ukončit program a zmáčkne +Ctrl+C? +Nebo když se mu porouchá klávesnice a selže funkce input? +Nejlepší reakce na takovou nečekanou situaci ukončit program a informovat +uživatele (nebo lépe, programátora), že (a kde) je něco špatně. +Neboli vypsat chybovou hlášku. +A to se stane normálně, bez try.

    +

    Další přílohy k try

    +

    Pro úplnost: kromě except existují dva jiné bloky, +které můžeš „přilepit“ k try, a to else a finally. +První se provede, když v try bloku +žádná chyba nenastane; druhý se provede vždy – ať +už chyba nastala nebo ne.

    +

    Můžeš taky použít více bloků except. Provede se vždy maximálně jeden: +ten první, který danou chybu umí ošetřit.

    +
    try:
    +    neco_udelej()
    +except ValueError:
    +    print('Tohle se provede, pokud nastane ValueError')
    +except NameError:
    +    print('Tohle se provede, pokud nastane NameError')
    +except Exception:
    +    print('Tohle se provede, pokud nastane jiná chyba')
    +    # (kromě SystemExit a KeyboardInterrupt, ty chytat nechceme)
    +except TypeError:
    +    print('Tohle se neprovede nikdy')
    +    # ("except Exception" výše ošetřuje i TypeError; sem se Python nedostane)
    +else:
    +    print('Tohle se provede, pokud chyba nenastane')
    +finally:
    +    print('Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`')
    +

    Vyvolání chyby

    +

    Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

    +

    Často se to stává když píšeš nějakou obecnou funkci. +Třeba funkci na výpočet obsahu čtverce. +Co se stane, když někdo zavolá obsah_ctverce(-5)?

    +
      +
    • Zadal-li ono -5 uživatel, je potřeba mu vynadat a zeptat se znovu.
    • +
    • Naměřil-li -5 nějaký robotický aparát, je potřeba ho líp zkalibrovat.
    • +
    • Vyšel-li čtverec se stranou -5 v nějakém výpočtu, je nejspíš potřeba opravit +chybu v tom výpočtu.
    • +
    +

    Samotná funkce obsah_ctverce ale „neví“, proč ji někdo volá. +Jejím úkolem je jen něco spočítat. +Měla by být použitelná ve všech případech výše – a v mnoha dalších.

    +

    Když někdo zavolá obsah_ctverce(-5), neexistuje správný výsledek, který by +funkce mohla vrátit. +Místo vrácení výsledku musí tato funkce signalizovat chybu. +S tou se pak může program, který obsah_ctverce(-5) zavolal, +vypořádat – vynadat uživateli, zkalibrovat měřák, nebo, pokud na chybu není +připravený, sám skončit s chybou (a upozornit tak programátora, že je něco +špatně).

    +

    Jak na to prakticky? +Chybu můžeš vyvolat pomocí příkazu raise. +Za příkaz dáš druh výjimky a pak do závorek nějaký popis toho, co je špatně.

    +
    def obsah_ctverce(strana):
    +    if strana > 0:
    +        return strana ** 2
    +    else:
    +        raise ValueError(f'Strana musí být kladná, číslo {strana} kladné není!')
    +

    Podobně jako return, i příkaz raise ukončí funkci. +A nejen tu – pokud na tuhle konkrétní chybu není program předem připravený, +ukončí se celý program.

    +

    Ze začátku není u raise příliš důležité dumat nad tím, který typ výjimky je +ten správný. +Klidně „střílej od boku“. +ValueError bývá často správná volba.

    \ No newline at end of file diff --git a/lessons/expressions/index.html b/lessons/expressions/index.html new file mode 100644 index 00000000..86368a94 --- /dev/null +++ b/lessons/expressions/index.html @@ -0,0 +1,71 @@ +

    Vyhodnocování výrazů

    +

    Už víš, že Python se dá použít jako kalkulačka: dokáže spočítat +hodnotu výrazu (angl. expression) jako 3 * (5 + 2). +Jak to ale vlastně dělá? +Jak se vyhodnocují výrazy?

    +

    Pro základní výrazy je to tak, jak to možná znáš ze školy. +U 3 * (5 + 2) nejdřív spočítáš to, co je v závorkách: (5 + 2) je 7. +Výsledek dosadíš do původního výrazu místo závorky: 3 * 7. +Stejně fungují výrazy v Pythonu.

    +

    Možná to zní jednoduše, ale protože budeme ten samý postup používat +i na složitější výrazy, hodí se ho umět „rozepsat“:

    +
    vysledek = 3 * (5 + 2)
    +#              ╰──┬──╯
    +vysledek = 3 *    7
    +#          ╰─┬────╯
    +vysledek =  21
    +

    Když Python potřebuje vyhodnotit proměnnou, dosadí její hodnotu. +Pokud je zrovna v proměnné a číslo 4, za a se dosadí 4:

    +
    a = 4
    +b = 5
    +
    +vysledek = (a + b) / a
    +#           |   |    |
    +vysledek = (4 + 5) / 4
    +#          ╰──┬──╯
    +vysledek =    9    / 4
    +#             ╰────┬─╯
    +vysledek =        2.25
    +

    Funguje to i u složitých výrazů. +Python se složitými výrazy nemá problém. +Jen člověk, který program čte či píše, se v nich může lehce ztratit. +Když opravdu potřebuješ napsat složitý výraz, je dobré jej rozdělit na několik +menších nebo vysvětlit pomocí komentáře.

    +

    Je ale dobré mít povědomí o tom, jak složité výrazy „fungují“, +aby ses jich nemusel/a bát. +Měl/a bys být schopný/á vysvětlit, co se stane, +když se Pythonu zeptáš, kolik je -b + (b² + +4ac)⁰·⁵ / (2a), abys pak věděl/a, co za +tebe Python dělá.

    +
    a = 2
    +b = 5
    +c = 3
    +
    +
    +x = -b + (b ** 2 + 4 * a * c) ** 0.5 / (2 * a)
    +#    |    |            |   |                |
    +x = -5 + (5 ** 2 + 4 * 2 * 3) ** 0.5 / (2 * 2)
    +#         ╰──┬─╯   ╰─┬─╯               ╰──┬──╯
    +x = -5 + (  25   +   8   * 3) ** 0.5 /    4
    +#                   ╰────┬─╯
    +x = -5 + (  25   +      24  ) ** 0.5 /    4
    +#        ╰───────┬──────────╯
    +x = -5 +         49           ** 0.5 /    4
    +#                ╰──────┬──────────╯
    +x = -5 +               7.0           /    4
    +#                      ╰─────────────┬────╯
    +x = -5 +                            1.75
    +#   ╰──────────────┬───────────────────╯
    +x =              -3.25
    +

    Výrazy se používají na více místech Pythonu než jen v přiřazování +do proměnných. +Třeba podmínka u if je taky výraz a vyhodnocuje se stejně jako ostatní +výrazy:

    +
    strana = -5
    +
    +if strana <= 0:
    +    print("Strana musí být kladná!")
    +
    if strana <= 0:
    +#  ╰──────┬──╯
    +if      True  :
    +
    \ No newline at end of file diff --git a/lessons/files/index.html b/lessons/files/index.html new file mode 100644 index 00000000..47b6cec5 --- /dev/null +++ b/lessons/files/index.html @@ -0,0 +1,126 @@ +

    Soubory

    +

    Dnes se podíváme na to, jak v Pythonu číst z +(a pak i zapisovat do) souborů.

    +

    Vytvoř si v editoru soubor basnicka.txt a napiš do něj libovolnou básničku. +Soubor ulož.

    +

    Na uložení souboru s básničkou doporučuji použít +stejný editor, jaký používáš na Pythonní programy.

    +

    Používáš-li jiný editor než Atom, dej si při ukládání pozor na kódování:

    +
      +
    • Nabízí-li ti editor při ukládání výběr kódování, vyber UTF-8.
    • +
    • Je-li k dispozici kódování „UTF-8 bez BOM”, použij to.
    • +
    • Pokud musíš použít Notepad, který výše uvedené možnosti nemá, pak v kódu +níže použij místo 'utf-8' nestandardní 'utf-8-sig'.
    • +
    +

    Ono utf-8 je název standardního kódování. +Zajišťuje, že se případné emoji nebo znaky s diakritikou do souboru uloží +tak, aby se daly přečíst i na jiném počítači či operačním systému. +🎉

    +

    Potom napiš tento program:

    +
    soubor = open('basnicka.txt', encoding='utf-8')
    +obsah = soubor.read()
    +soubor.close()
    +
    +print(obsah)
    +

    a spusť ho z adresáře, ve kterém je +basnicka.txt (jinými slovy, aktuální adresář musí být ten, který +obsahuje soubor s básničkou).

    +

    Obsah souboru se vypíše!

    +

    Co se tu děje? +Tak jako int() vrací čísla a input() řetězce, funkce +open() vrací hodnotu, která představuje otevřený soubor. +Tahle hodnota má vlastní metody. +Tady používáme metodu read(), která +najednou přečte celý obsah souboru a vrátí ho jako řetězec. +Nakonec metoda close() otevřený soubor zase zavře.

    +

    Automatické zavírání souborů

    +

    Soubory se dají přirovnat k ledničce: abys něco +mohl/a z ledničky vzít, nebo dát dovnitř, musíš +ji předtím otevřít a potom zavřít. +Bez zavření to sice na první pohled funguje taky, +ale pravděpodobně potom brzo něco zplesniví.

    +

    Stejně tak je docela důležité soubor zavřít po tom, +co s ním přestaneš pracovat. +Bez zavření to na první pohled funguje, ale složitější programy se můžou dostat +do problémů. +Operační systémy mají limity na počet +současně otevřených souborů, které se nezavíráním +dají snadno překročit. +Na Windows navíc nemůžeš soubor, který je stále +otevřený, otevřít znovu.

    +

    Na korektní zavření souboru ale programátoři často zapomenou. +Proto Python poskytuje příkaz with, který soubory zavírá automaticky. +Používá se takhle:

    +
    with open('basnicka.txt', encoding='utf-8') as soubor:
    +    obsah = soubor.read()
    +
    +print(obsah)
    +

    Příkaz with vezme otevřený soubor (který vrací funkce open) +a přiřadí ho do proměnné soubor. +Pak následuje odsazený blok kódu, kde se souborem můžeš pracovat – v tomhle +případě pomocí metody read přečíst obsah jako řetězec. +Když se Python dostane na konec odsazeného bloku, soubor automaticky zavře.

    +

    V naprosté většině případů je pro otevírání souborů nejlepší použít with.

    +

    Iterace nad soubory

    +

    Otevřené soubory se, jako např. řetězce či range, +dají použít s příkazem for. +Tak jako for i in range poskytuje za sebou jdoucí čísla a for c in 'abcd' +poskytuje jednotlivé znaky řetězce, for radek in soubor bude do proměnné +radek dávat jednotlivé řádky čtené ze souboru.

    +

    Například můžeš básničku odsadit, +aby se vyjímala v textu:

    +
    print('Slyšela jsem tuto básničku:')
    +print()
    +
    +with open('basnicka.txt', encoding='utf-8') as soubor:
    +    for radek in soubor:
    +        print('    ' + radek)
    +
    +print()
    +print('Jak se ti líbí?')
    +

    Když to zkusíš, zjistíš, že trochu nesedí +řádkování. Zkusíš vysvětlit, proč tomu tak je?

    +
    +

    Řešení

    + + +

    Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce +bílé znaky (mezery a nové řádky) pomocí metody rstrip:

    +
    print('Slyšela jsem tuto básničku:')
    +print()
    +
    +with open('basnicka.txt', encoding='utf-8') as soubor:
    +    for radek in soubor:
    +        radek = radek.rstrip()
    +        print('    ' + radek)
    +
    +print()
    +print('Jak se ti líbí?')
    +

    Psaní souborů

    +

    Pozor!

    +

    Pro Python není problém smazat obsah jakéhokoli souboru. +Psaní do souborů si zkoušej v adresáři, ve kterém nemáš uložené +důležité informace!

    +

    Soubory se v Pythonu dají i zapisovat. +Pro zápis soubor otevři s pojmenovaným +argumentem mode='w' (z angl. mode, mód a write, psát).

    +

    Pokud soubor už existuje, otevřením s mode='w' se veškerý jeho obsah smaže. +Po zavření tak v souboru bude jen to, co do něj ve svém programu zapíšeš.

    +

    Informace pak do souboru zapiš známou funkcí print, +a to s pojmenovaným argumentem file:

    +
    with open('druha-basnicka.txt', mode='w', encoding='utf-8') as soubor:
    +    print('Naše staré hodiny', file=soubor)
    +    print('Bijí', 2+2, 'hodiny', file=soubor)
    +
    \ No newline at end of file diff --git a/lessons/first-steps/index.html b/lessons/first-steps/index.html new file mode 100644 index 00000000..c6eed3da --- /dev/null +++ b/lessons/first-steps/index.html @@ -0,0 +1,83 @@ +

    Interaktivní režim Pythonu

    +

    Chceš-li si začít hrát s Pythonem, otevři příkazový řádek a aktivuj virtuální prostředí. +Zkontroluj si, že ti na začátku příkazové řádky svítí (venv).

    +

    Je-li tomu tak, nezbývá než – konečně – pustit Python. K tomu použij příkaz python:

    +
    $ python
    +Python 3.6.6 (...)
    +Type "help", "copyright", "credits" or "license" for more information.
    +>>>
    +

    Příkaz vypíše několik informací. Z prvního řádku se můžeš ujistit, že používáš Python 3. +(Verze by měla být 3.6 nebo vyšší. Vidíš-li číslo jako 2.7.11, něco je špatně – popros o radu kouče.) +Další řádek je informační: Python má k dispozici návody a informace sám o sobě, +ale jsou psané v angličtině a pro trochu pokročilejší publikum.

    +

    Třemi „zobáčky“ >>> pak Python poprosí o instrukce. +Je to jako v příkazové řádce, ale místo příkazů jako cd a mkdir sem budeš psát příkazy Pythonu.

    +

    Příkazy z příkazové řádky v Pythonu nefungují, +ačkoli okýnko vypadá skoro stejně. +Vyzkoušej si to. Za „zobáčky“ napiš whoami a zmáčkni Enter:

    +
    >>> whoami
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +NameError: name 'whoami' is not defined
    +

    Tohle je chybová hláška, která se objeví vždycky, +když Python nebude spokojený. +V průběhu kurzu jich uvidíš ještě spoustu, +takže si ji dobře prohlédni, ať ji příště poznáš.

    +

    První příkaz

    +

    Třemi „zobáčky“ >>> Python prosí o instrukce. +Pojď mu nějakou dát!

    +

    Ze začátku použij Pythonu jako kalkulačku. +Za tři zobáčky napiš třeba 2 + 3 a zmáčkni Enter.

    +
    >>> 2 + 3
    +5
    +

    Zobáčky >>> i odpověď vypisuje sám Python! +sám/sama zadej jen číslo a Enter.

    +

    Zobrazila se ti správná odpověď? +Pokud ano, gratuluji! První příkaz v Pythonu máš za sebou.

    +

    Zkusíš i odečítání?

    +

    A jak je to s násobením? +Na kalkulačce bys zadal/a 4 × 5, což se na klávesnici píše špatně. +Python proto používá symbol *.

    +
    >>> 4 * 5
    +20
    +

    Symboly jako + a * se odborně nazývají operátory.

    +

    Operátor pro dělení je / – jako u násobení, znak ÷ by se psal špatně.

    +

    Při dělení může vzniknout necelé číslo, třeba dva a půl. +Python používá desetinnou tečku, ukáže se tedy 2.5:

    +
    >>> 5 / 2
    +2.5
    +

    Z důvodů, do kterých teď nebudeme zabíhat, se při dělení desetinná tečka +objeví, i když vyjde číslo celé:

    +
    >>> 4 / 2
    +2.0
    +

    Občas se hodí použít dělení se zbytkem, kdy výsledek zůstane jako celé číslo. +Na to má Python operátory // (podíl) a % (zbytek):

    +
    >>> 5 // 2
    +2
    +>>> 5 % 2
    +1
    +

    Mezery mezi čísly a znamínkem nejsou nutné: 4*5 i 4 * 5 dělá +to samé co 4 * 5. +Je ale zvykem psát kolem operátoru jednu mezeru z každé strany – tak jako +v těchto materiálech. +Kód je pak čitelnější.

    +

    Ukončení

    +

    Pokud ses dostal/a až sem, gratuluji! +Python máš nejen nainstalovaný, ale taky ti funguje. +Stačí ho už jen zavřít a pak opustit i samotnou příkazovou řádku. +V Pythonu se to dělá pomocí quit(), s prázdnými závorkami na konci.

    +
    +>>> quit()
    +(venv)$
    +

    Zobáčky >>> se změnily na výzvu +příkazové řádky, která začíná (venv) a končí $ nebo >. +Teď fungují příkazy jako whoami a cd, ale příkazy Pythonu +jako 1 + 2 fungovat nebudou, dokud Python opět nepustíš pomocí +příkazu python.

    +

    Ukončit virtuální prostředí můžeš příkazem deactivate – +tentokrát bez závorek.

    +
    (venv)$ deactivate
    +

    Příkazovou řádku můžeš nakonec zavřít příkazem exit.

    +
    $ exit
    +

    Pro cvik si zkus Python znovu spustit – nejdřív otevři příkazovou řádku, +pak aktivuj virtuální prostředí, potom spusť Python samotný.

    \ No newline at end of file diff --git a/lessons/flask/index.html b/lessons/flask/index.html new file mode 100644 index 00000000..6acff63d --- /dev/null +++ b/lessons/flask/index.html @@ -0,0 +1,365 @@ +

    Webové aplikace: Flask

    +

    Python je víceúčelový jazyk. +Na minulém cvičení jsme tvořili aplikace pro příkazovou řádku, +nyní se podíváme na aplikace webové.

    +

    Webových frameworků pro Python je více, mezi nejznámější patří Django, +Flask nebo Pyramid.

    +

    Pro naše účely použijeme Flask, protože je nejrychlejší na pochopení a +nevyžaduje striktně použití MVC paradigmatu.

    +

    Flask

    +

    Flask opět můžete nainstalovat do virtualenvu, nejlépe použít projekt +z minulého cvičení:

    +
    $ cd project
    +$ . __venv__/bin/activate 
    +(__venv__) $ python -m pip install Flask
    +

    Základní použití Flasku je poměrně primitivní. +Do souboru hello.py napište:

    +
    from flask import Flask
    +app = Flask(__name__)
    +
    +@app.route('/')
    +def index():
    +    return 'MI-PYT je nejlepší předmět na FITu!'
    +

    Pak aplikaci spusťte pomocí následujících příkazů. +(Na Windows použijte místo export příkaz set.)

    +
    (__venv__) $ export FLASK_APP=hello.py
    +(__venv__) $ export FLASK_DEBUG=1
    +(__venv__) $ flask run
    + * Serving Flask app "hello"
    + * Forcing debug mode on
    + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    + * Restarting with stat
    + * Debugger is active!
    + * Debugger PIN: 189-972-345
    +

    Na zmíněné adrese byste měli v prohlížeči vidět použitý text.

    +

    Proměnná prostředí FLASK_APP říká Flasku, kde aplikaci najít. +V daném souboru Flask hledá automaticky proměnnou jménem app. +(Jde nastavit i jiná.) +Proměnná FLASK_DEBUG nastavuje ladícím režim, který si popíšeme za chvíli.

    +

    V programu jsme jako app vytvořili flaskovou aplikaci. +Argument __name__ je jméno modulu – Flask podle něj hledá soubory, +které k aplikaci patří (viz static a templates níže).

    +

    Pomocí dekorátoru @app.route jsme zaregistrovali takzvaný view (pohled) – +funkci, která vrací obsah pro danou cestu v URL. +Tomuto spojení cesty a pohledové funkce se říká route (nebo počeštěně „routa“). +My konkrétně říkáme, že na cestě / (tedy na „domovské stránce“) bude +k dispozici obsah, který vrátí funkce index.

    +

    Více různých adres lze obsloužit jednoduše přidáním dalších funkcí:

    +
    @app.route('/')
    +def index():
    +    return 'Index Page'
    +
    +@app.route('/hello/')
    +def hello():
    +    return 'Hello, World'
    +

    Na adrese http://127.0.0.1:5000/hello/ pak uvidíte druhou stránku.

    +

    Ladící režim

    +

    Proměnná FLASK_DEBUG říká, že se aplikace má spustit v ladícím režimu: +je zapnutý příjemnější výpis chyb a aplikace se automaticky restartuje +po změnách.

    +

    Zkuste ve funkci hello() vyvolat výjimku (například dělení nulou – 1/0) +a podívat se, jak chyba v ladícím režimu „vypadá“: +Flask ukáže traceback podobný tomu z příkazové řádky a navíc vám na každé +úrovni umožní pomocí malé ikonky spustit konzoli. +Bezpečnostní PIN k této konzoli najdete v terminálu, kde server běží.

    +

    Ladící režim je užitečný, ale nebezpečný – návštěvníkům stránky může +(po prolomení celkem jednoduchého „hesla“) umožnit spustit jakýkoli pythonní kód. +Navíc aplikaci zpomaluje. +Používejte ho proto pouze na svém počítači.

    +

    Dynamické routy

    +

    Když vytváříte dynamický web, ne vždy můžete všechna URL znát dopředu. +Budete například chctít zobrazit informace o uživatelích na adresách +jako /user/hroncok/, ale nemůžete při každé registraci nového uživatele +přidávat novou funkci do kódu. +Musíte použít dynamické routy:

    +
    @app.route('/user/<username>/')
    +def profile(username):
    +    return 'User {}'.format(username)
    +

    Proměnnou část cesty ohraničíte lomenými závorkami a použijte jako parametr +funkce. Pokud chcete, můžete specifikovat, na jaký obsah se pravidlo vztahuje. +Například číselný idenifikátor článku pro adresy jako /post/42/ můžete zadat +takto:

    +
    @app.route('/post/<int:post_id>/')
    +

    Můžete použít různá pravidla, např.:

    +
      +
    • string akceptuje jakýkoliv text bez lomítek (výchozí)
    • +
    • int akceptuje celá čísla (a pohledové funkci je předá jako int, ne text)
    • +
    • float akceptuje i desetinná čísla s tečkou (a předá je jako float)
    • +
    • path akceptuje text i s lomítky
    • +
    +

    Rout můžte definovat i víc pro jednu funkci. +Často se to používá s výchozí hodnotou argumentu:

    +
    @app.route('/hello/')
    +@app.route('/hello/<name>/')
    +def hello(name='world'):
    +    return 'Hello, {}!'.format(name)
    +

    Získání URL

    +

    Opačným způsobem jak k routám přistupovat je, když potřebujete získat URL +nějaké stránky, například protože potřebujete zobrazit odkaz. +K tomu se používá funkce url_for(), která jako první parametr bere jméno +routy (neboli jméno funkce, která routu obsluhuje), a pak pojmenované argumenty +pro pravidla v dynamické routě:

    +
    from flask import url_for
    +
    +...
    +
    +@app.route('/url/')
    +def show_url():
    +    return url_for('profile', username='hroncok')
    +

    Tuto funkci jde použít jen uvnitř pohledové funkce, +Pokud ji chcete vyzkoušet například v interaktivní konzoli, +můžete použít speciální kontext:

    +
    >>> with app.test_request_context():
    +...     print(url_for('profile', username='hroncok'))
    +... 
    +/user/hroncok/
    +

    Možná si říkáte, proč tu URL prostě nevytvořit ručně. +S takovým přístupem byste ale mohli narazit na problém, pokud cestu později +změníte – což se může stát např. i když web nasadíte na jiný server. +Generování URL vám také může zjednodušit nasazení statické verze stránek.

    +

    Pro URL v rámci vašich stránek proto doporučujeme url_for používat důsledně.

    +

    Šablony

    +

    Zatím jsou naše webové stránky poměrně nudné: obsahují jen prostý text, +nepoužívají HTML.

    +

    Předpokládáme, že víte co je to HTML a CSS. +Jestli ne, doporučujeme si projít základy těchto webových technologií +např. na stránkách MDN.

    +

    Klidně byste mohli udělat něco jako:

    +
    @app.route('/')
    +def hello():
    +    return '<html><head><title>...'
    +

    ...ale asi by to nebylo příliš příjemné. +Python je jazyk dělaný na popis algoritmů, procesů a logiky spíš než obsahu. +Lepší je HTML dát do zvláštního souboru a použít ho jako šablonu +(angl. template). +Z Flasku vypadá použití šablony takto:

    +
    from flask import render_template
    +
    +@app.route('/hello/')
    +@app.route('/hello/<name>/')
    +def hello(name=None):
    +    return render_template('hello.html', name=name)
    +

    Funkce render_template nejen vrátí HTML z daného souboru, ale umí do něj +i doplnit informace, které dostane v pojmenovaných argumentech.

    +

    Ukažme si to na příkladu: vedle souboru s kódem vytvořte složku templates +a v ní hello.html s tímto obsahem:

    +
    <!doctype html>
    +<html>
    +    <head>
    +        <title>Hello from Flask</title>
    +    </head>
    +    <body>
    +        {% if name %}
    +            <h1>Hello {{ name }}!</h1>
    +            <a href="{{ url_for('hello') }}">Go back home</a>
    +        {% else %}
    +            <h1>Hello, World!</h1>
    +        {% endif %}
    +    </body>
    +</html>
    +

    Šablony používají (jako výchozí variantu) šablonovací jazyk Jinja2, +který se s Flaskem a jinými frameworky pro Python používá často. +Kompletní popis jazyka najdete v dokumentaci, ale +pro většinu stránek se obejdete s doplněním hodnoty ({{ promenna }}) +a podmíněným obsahem ({% if %}) jako výše, +případně s cyklem: {% for %}/{% endfor %}. Ve větších +aplikacích se pak hodí použití {% include ... %}, {% extends ... %} +a případně také tvorba maker {% macro ... %}/{% endmacro %}.

    +

    Veškerý kontext (proměnné) do šablony musí přijít z volání render_template(). +Navíc můžete použít vybrané funkce, např. url_for(). +(Jiné funkce známé z Pythonu ale použít nejdou – ač jsou podobné, je Jinja2 +jiný jazyk než Python.)

    +

    Filtry

    +

    Není úplně elegantní vzít nějaká data (např. tweety z Twitter API) a ještě před +předáním šabloně do nich cpát svoje úpravy (např. převod na HTML). +Od toho jsou tu filtry. Filtr transformuje hodnotu na řetězec, +který pak ukážeme uživateli.

    +

    Zde je například filtr time, který načte čas v určitém formátu +a převede ho do jiného:

    +
    from datetime import datetime
    +
    +@app.template_filter('time')
    +def convert_time(text):
    +    """Convert the time format to a different one"""
    +    dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y')
    +    return dt.strftime('%c')
    +
    +@app.route('/date_example')
    +def date_example():
    +    return render_template(
    +        'date_example.html',
    +        created_at='Tue Mar 21 15:50:59 +0000 2017',
    +    )
    +

    V šabloně date_example.html se pak filtr použije pomocí svislítka:

    +
    {{ created_at|time }}
    +

    Pokud potřebujete velmi obecný filtr, je vhodné se podívat do seznamu těch vestavěných.

    +

    Escaping

    +

    V textu, který se vkládá do šablon, jsou automaticky nahrazeny znaky, které +mají v HTML speciální význam. +Zabraňuje se tak bezpečnostním rizikům, kdy se vstup od uživatele interpretuje +jako HTML.

    +

    Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, +bude výsledné HTML vypadat takto:

    +
    <!doctype html>
    +<title>Hello from Flask</title>
    +
    +  <h1>Hello &lt;script&gt;alert(&#34;Foo&#34;)!</h1>
    +

    Některé prohlížeče (či doplňky do nich) proti podobným útokům různým způsobem +chrání. Budete-li na své stránky zkoušet „zaútočit”, zkontrolujte v konzoli +URL, které vaše aplikace v požadavku reálně dostává. +Pro příklad výše to může být /hello/%3Cscript%3Ealert(%22Foo%22)/.

    +

    Někdy je ovšem potřeba do stránky opravdu vložit HTML. +To se dá zajistit dvěma způsoby. Nejjednodušší je vestavěný filtr safe:

    +
    {{ "<em>Text</em>" | safe }}
    +

    V Pythonu pak lze použít jinja2.Markup, +čímž se daný text označí jako „bezpečný”.

    +
    import jinja2
    +
    +@app.template_filter('time')
    +def convert_time(text):
    +    """Convert the time format to a different one"""
    +    dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y')
    +    result = dt.strftime('<strong>%c</strong>')
    +    return jinja2.Markup(result)
    +

    Při použití safe a Markup však vždycky myslete na to, aby nikdo +(ani nikdo mnohem chytřejší než vy) nemohl na vaší stránce provést něco +nekalého.

    +

    Statické soubory

    +

    Pokud budete potřebovat nějaké statické soubory (např. styly CSS nebo +obrázky), dejte je do adresáře static vedle souboru s kódem +a přistupujte k nim pomocí routy static:

    +
    url_for('static', filename='style.css')
    +

    V šabloně pak například:

    +
    <link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
    +

    Logování

    +

    Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím +HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného +formatu), ale také vypisovat různé chybové, informační či ladící hlášky na +straně serveru. Možností je použít například funkci print, ale ta není +dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní +s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování +logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření +samotné webové aplikace.

    +

    Řešením je použít standardní logovací modul logging, který řeší vše potřebné +(úrovně zpráv, filtry, formátování časového razítka a dalších meta-informací o +běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci +vaší webové aplikace pak nebudou z formátu výstupů zmatení). Protože používáme +Flask a ten také loguje tímto modulem, +stačí použít předpřipravený app.logger.

    +
    from flask import Flask
    +
    +app = Flask(__name__)
    +app.logger.debug("I've just initialized the Flask app")
    +
    +@app.route('/')
    +def index():
    +    app.logger.warning('Someone is accessing the index page!')
    +    return 'Index Page'
    +

    Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, +error, critical). Při spuštění aplikace v ladícím režimu se loguje vše +(navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody +setLevel, viz dokumentace modulu logging.

    +

    Větší Flask aplikace

    +

    Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze +použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet +aplikaci s databází a ORM modely, je nutné propojit Flask s dalšími knihovnami +(například flask-sqlalchemy, +nebo flask-pymongo).

    +

    Jiné frameworky postavené nad Model-View-Controller +paradigmatem mají tyto vlastnosti již zabudovány v sobě (například Django).

    +

    Následující sekce popisují některé zajímavé techniky, které se mohou u větších +a složitějších aplikací hodit.

    +

    create_app factory

    +

    Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí +funkce, tzv. application_factory, +standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se +neinicializuje hned při importu modulu, ale až při zavolání funkce. Voláním funkce +můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu +souboru). Díky tomu lze snadněji vytvářet Flask aplikace s různými konfiguracemi +pro testování nebo dokonce vytvářet více Flask aplikací v rámci jednoho Python skriptu.

    +
    def create_app(config=None):
    +    app = Flask(__name__)
    +
    +    app.config.from_pyfile(config or 'config.py')
    +    app.config['the_answer'] = 42
    +    app.secret_key = os.environ.get('MY_SECRET', None)
    +
    +    return app
    +

    Blueprint moduly

    +

    Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do +samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky +„modrotisk” nebo také „modrák”). +Výhodou je, že můžete vytvořit blueprint (instanci +třídy Blueprint) s několika views, vlastní templates složkou a dalším +nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový +blueprint pak můžete využívat i v několika různých aplikacích a snadno tak +dosáhnout znovupouželnosti.

    +
    from flask import Blueprint
    +
    +auth = Blueprint('auth', __name__, template_folder='templates')
    +
    +@auth.route('/login')
    +def login():
    +    ...
    +
    +@auth.route('/logout')
    +def logout():
    +    ...
    +
    +@auth.app_template_filter('userlink')
    +def user_link(username):
    +    ...
    +

    Blueprint pak stačí ve Flask aplikaci registrovat +a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo +jiné přidat i prefix pro všechny cesty v blueprintu.

    +
    from flask import Flask
    +from auth.views import auth
    +
    +app = Flask(__name__)
    +# this will create the /auth/login and /auth/logout endpoints
    +app.register_blueprint(auth, url_prefix='/auth')
    +

    V případě použití url_for je třeba cesty z blueprintu namespacovat, např.:

    +
    url_for('auth.login')
    +

    Vlastní podtřída Flask

    +

    Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat +výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které +budou použity pro HTTP požadavky a odpovědi, měnit výchozí konfiguraci flask a +spoustu dalšího. Nezapomeňte volat konstruktor nadtřídy.

    +
    from flask import current_app, Flask, Response
    +
    +class MIPYTResponse(Response):
    +    def __init__(self, *args, **kwargs):
    +        super().__init__(*args, **kwargs)
    +        self.set_cookie('MI-PYT', 'best')
    +
    +
    +class GreeterApp(Flask):
    +    response_class = MIPYTResponse
    +
    +    def __init__(self, *args, **kwargs):
    +        super().__init__(*args, **kwargs)
    +        self.greetings = 0
    +
    +    def greet(self):
    +        self.greetings += 1
    +        return 'Hello!'
    +
    +
    +app = GreeterApp(__name__)
    +
    +
    +@app.route('/')
    +def greet():
    +    return current_app.greet()
    +
    +
    +@app.route('/number/')
    +def greetings_number():
    +    return str(current_app.greetings)
    +

    A další

    +

    Flask umí i další věci – například zpracování formulářů, chybové stránky nebo +přesměrování. Také existuje i řada rozšíření, +které mohou ušetřit práci s běžnými úkony jako například správa uživatelů, + tvorba REST API nebo integrace s různými službami.

    +

    Všechno to najdete +v dokumentaci.

    \ No newline at end of file diff --git a/lessons/fstring/index.html b/lessons/fstring/index.html new file mode 100644 index 00000000..b786922e --- /dev/null +++ b/lessons/fstring/index.html @@ -0,0 +1,67 @@ +

    Šablony (formátovací řetězce)

    +

    Řekněme, že chceš uživateli vypsat určitou hodnotu s nějakou „omáčkou“ okolo. +Dá se na to použít print(), kterému můžeš předat „mix“ řetězců a čísel:

    +
    >>> soucet = 3 + 4
    +>>> print('Součet je', soucet)
    +

    Co ale když chceš celý tento výpis uložit do proměnné – jako jeden řetězec? +Čárka tu fungovat nebude, ta odděluje argumenty ve volání funkce. +Je potřeba soucet převést na řetězec a ten pak připojit k „omáčce“:

    +
    >>> hlaska = 'Součet je ' + str(soucet)
    +

    To ale není tak přehledné, jak by mohlo. +Lze to zpřehlednit použitím šablony.

    +

    Takovou šablonu si představ jako formulář s vynechanými místy:

    +
    Součet je __________.

    Složitější šablona by byla třeba tahle:

    +
    Mil[ý/á] _______,
    +Váš výsledek je __________.
    +
    +S pozdravem,
    +_________

    Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba +jednotlivá vynechaná místa ve formuláři nějak jednoznačně označit. +Použijme jména v „kudrnatých“ závorkách:

    +
    Součet je {soucet}.
    Mil{y_a} {osloveni},
    +Váš výsledek je {soucet}.
    +
    +S pozdravem,
    +{podpis}.

    Takovou šablonu můžeš použít jako formátovací řetězec +(angl. formatted string literal, +zkráceně f-string). +Jako jakýkoli jiný řetězec ji vlož do uvozovek. +A aby bylo jasné, že jde o šablonu, před první uvozovky přidej navíc značku f.

    +
    f"Součet je {soucet}."
    +

    Takový formátovací řetězec jde použít v Pythonu – jako jakýkoli jiný řetězec:

    +
    soucet = 3 + 4
    +hlaska = f'Součet je {soucet}'
    +print(hlaska)
    +
    y_a = 'á'
    +osloveni = 'Anežko'
    +soucet = 3 + 4
    +podpis = 'Váš Program'
    +
    +print(f"""
    +Mil{y_a} {osloveni},
    +Váš výsledek je {soucet}.
    +
    +S pozdravem,
    +{podpis}
    +""")
    +

    A nakonec – v šabloně můžeš použít nejen jména proměnných, ale jakékoli výrazy.

    +
    >>> hlaska = f'Součet je {3 + 4}'
    +

    Ale nepřežeň to! +Většinou je program přehlednější, když si každou vypisovanou hodnotu zvlášť +pojmenuješ – tedy uložíš do vhodně pojmenované proměnné.

    +

    Metoda format

    +

    Někdy se stane, že jednu šablonu potřebuješ použít vícekrát. +Pak formátovací řetězec použít nemůžeš, protože se do něj proměnné doplňují +automaticky a hned. +V takovém případě můžeš šablonu napsat do normálního řetězce (bez f na +začátku) a použít metodu format:

    +
    sablona = 'Ahoj {jmeno}! Tvoje číslo je {cislo}.'
    +print(sablona.format(cislo=7, jmeno='Hynku'))
    +print(sablona.format(cislo=42, jmeno='Viléme'))
    +print(sablona.format(cislo=3, jmeno='Jarmilo'))
    +

    Oproti formátovacím řetězcům umí format užitečnou zkratku: nepojmenované +argumenty dosadí postupně do nepojmenovaných míst v šabloně:

    +
    vypis = '{} krát {} je {}'.format(3, 4, 3 * 4)
    +print(vypis)
    +

    Výrazy jako f'Součet je {3 + 4}' ale format dosadit neumí. +Složitější dosazované hodnoty si proto vždycky pojmenuj.

    \ No newline at end of file diff --git a/lessons/functions/call-anatomy.svg b/lessons/functions/call-anatomy.svg new file mode 100644 index 00000000..49d71d91 --- /dev/null +++ b/lessons/functions/call-anatomy.svg @@ -0,0 +1,413 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delka = len('Ahoj') + Argument + Návratová hodnota + + Jméno funkce + + + (Vlevo jsou texty jsou převedené na křivky,aby se dobře zobrazily v prohlížeči.Originál je vpravo.Viz https://github.com/pyvec/naucse/issues/38 ) + + diff --git a/lessons/functions/index.html b/lessons/functions/index.html new file mode 100644 index 00000000..4151c719 --- /dev/null +++ b/lessons/functions/index.html @@ -0,0 +1,206 @@ +

    Funkce

    +

    Známe spoustu matematických operací, které se zapisují pomocí symbolů – třeba +plus a minus. +Python se snaží používat stejné symboly jako matematici:

    +
      +
    • 3 + 4
    • +
    • a - b
    • +
    +

    S násobením a dělením už je to složitější. +Matematický zápis se na běžné klávesnici nedá napsat:

    +
      +
    • 3 · 4
    • +
    • ¾
    • +
    +

    V Pythonu si ale pořád vystačíme se symbolem, byť trochu jiným – *, /.

    +

    Matematici ale píšou na papír, a tak si můžou dovolit vymýšlet stále +zajímavější klikyháky, které se pak na klávesnici píšou stále hůř:

    +
      +
    • x²
    • +
    • xy
    • +
    • sin θ
    • +
    • Γ(x)
    • +
    • x
    • +
    • |s|
    • +
    • x
    • +
    • ab
    • +
    • ab
    • +
    +

    Ne že by neexistovaly programovací jazyky, +na které je potřeba speciální klávesnice. +Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:

    +

    +
    ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

    Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, +aby se dal snadno naučit. +A tak používá symboly jen pro ty nejčastější operace. +Operátorů, které využívají symboly, je tak málo, že už jich zhruba půlku znáš!

    +

    Pro zajímavost, tady jsou všechny – i ty co ještě neznáš:

    +
    + == != + < > + <= >= + := + | ^ + & + << >> + + - + * @ / + // % + ~ + ** + [ ] ( ) + { } + . +

    Všechno ostatní vyjádříme slovně.

    +

    Délka řetězce

    +

    Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce. +Místo symbolu má název. +Jmenuje se len (z angl. length, délka), a používá se takto:

    +
    slovo = 'Ahoj'
    +delka = len(slovo)      # Vypočítání délky
    +print(delka)
    +

    To len je funkce (angl. function). +Jak se takové funkce používají?

    +

    K tomu, abys funkci mohl/a použít, potřebuješ znát její +jméno – tady len. +Za jméno funkce patří závorky, +do nichž uzavřeš argument (neboli vstup) funkce. +To je informace, se kterou bude funkce +pracovat – třeba len ze svého argumentu vypočítá délku.

    +

    Celému výrazu len(slovo) se říká volání funkce (angl. function call). +Jeho výsledek, takzvaná návratová hodnota +(angl. return value) se dá třeba přiřadit do proměnné.

    +

    Diagram volání funkce

    +

    Pro matematiky

    +

    Máš-li rád/a matematiku, dej pozor! +Funkce v Pythonu je něco jiného než funkce v matematice, +i když se stejně jmenují a podobně zapisují. +Pythonní funkce může např. mít pro stejný argument různé hodnoty.

    +

    Volání funkce jako výraz

    +

    Vzpomínáš si, jak Python vyhodnocuje výrazy?

    +
    vysledek = 3 * (5 + 2)
    +#              ╰──┬──╯
    +vysledek = 3 *    7
    +#          ╰─┬────╯
    +vysledek =  21
    +

    Volání funkce je taky výraz. +Stejně jako a + b je výraz, který něco udělá podle hodnot a a b +a výsledek dá k dispozici, len(slovo) je výraz, který něco udělá +podle hodnoty slovo a výsledek dá k dispozici.

    +

    Vždycky, když Python při vyhodnocování narazí na jméno funkce se závorkami, +funkci zavolá, zjistí výsledek a dosadí ho:

    +
    vysledek = len("Ahoj!")
    +#          ╰────┬─────╯
    +vysledek =      5
    +

    Volání funkce můžeš kombinovat s jinými výrazy, třeba se součtem:

    +
    delka = len('Ahoj') + len('!')
    +#        ╰──┬─────╯    ╰─┬───╯
    +delka =     4       +    1
    +#           ╰───────┬────╯
    +delka =             5
    +

    Nebo v podmínce ifu – třeba u:

    +
    if len('Ahoj!') <= 3:
    +    print('pozdrav je krátký')
    +

    … se za len('Ahoj!') <= 3 nakonec dosadí nepravda (False):

    +
       len('Ahoj!') <= 3
    +#  ╰─────┬────╯
    +         5      <= 3
    +#        ╰──────┬──╯
    +              False
    +

    Volání funkce můžeš použít i jako argument pro jinou funkci:

    +
    print(len('Ahoj'))
    +#     ╰────┬────╯
    +print(     4     )   # vypíše 4
    +

    Nebo to zkombinovat dohromady:

    +
    x = 5
    +print(len('Ahoj') + x)
    +#     ╰────┬────╯   |
    +print(     4      + 5)
    +#          ╰───┬────╯
    +print(         9     )
    +

    … a podobně.

    +

    Procedury

    +

    Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") +je taky volání funkce. +Stejně jako len dostává print v závorkách argument – hodnotu, se +kterou pracuje. +Liší se ale návratovou hodnotou.

    +

    Funkce print sice něco udělá – vypíše text +na obrazovku – ale nevrátí žádný smysluplný výsledek, který by zbytek programu +mohl dál zpracovat.

    +

    Funkcím, které nic nevrací (jen něco udělají) se občas říká procedury. +V Pythonu není hranice mezi „normální“ funkcí a procedurou příliš ostrá, +ale přesto se hodí tento koncept znát. +Pár příkladů:

    +
      +
    • Funkce, která vybere náhodné číslo, je „normální“. +Svůj výsledek vrátí; program s ním může dál pracovat.
    • +
    • Funkce, která vykreslí na obrazovku kolečko, je procedura. +Žádnou zajímavou hodnotu programu nevrací.
    • +
    • Funkce, která spočítá průměrný věk obyvatelstva podle informací ze sčítání +lidu je „normální“. Svůj výsledek vrátí a program s ním může dál pracovat.
    • +
    • Funkce, která přehraje písničku reproduktorem, je procedura. +Nic zajímavého programu nevrací.
    • +
    +

    Na rozdíl od ostatních termínů, které se tu učíš, není +„procedura“ v Pythonu zavedený pojem. +Je vypůjčený z jazyka Pascal. +Kdybys o něm diskutoval/a s nějakým zkušeným programátorem, +odkaž ho prosím na tyto materiály.

    +

    Argumenty

    +

    Argument je to, co funkci dáš k dispozici. Hodnota, se kterou funkce pracuje. +Chceš-li délku řetězce Ahoj!, použiješ funkci len která umí vypočítat +délku jakéhokoli řetězce a jako argument, v závorkách, jí dáš tu svoji +konkrétní hodnotu: len('Ahoj!').

    +

    Podobně funkce print umí vypsat jakoukoli hodnotu. +Tu, kterou má vypsat ve tvém konkrétním případě, jí předáš jako argument.

    +

    Některým funkcím můžeš předat i více argumentů. +Třeba zrovna funkci print, která všechny své argumenty vypíše na řádek. +Jednotlivé argumenty se oddělují čárkami:

    +
    print(1, 2, 3)
    +
    print("Jedna plus dva je", 1 + 2)
    +

    Některé funkce nepotřebují žádný argument. +Příkladem je zase print. +Je ale nutné použít závorky – i když jsou prázdné. +Hádej, co tohle volání udělá?

    +
    print()
    +
    +

    Řešení

    + + +

    Pojmenované argumenty

    +

    Některé funkce umí pracovat i s pojmenovanými argumenty. +Píšou se podobně jako přiřazení do proměnné, +s rovnítkem, ale uvnitř závorek.

    +

    Třeba funkce print při výpisu odděluje jednotlivé argumenty mezerou, +ale pomocí argumentu sep se dá použít i něco jiného.

    +
    print(1, 2, 3, 4, sep=', ')     # Místo mezery odděluj čárkou
    +

    Dá se změnit i to, co print udělá na konci výpisu. +Normálně přejde na nový řádek, ale argumentem end můžeš říct, co se má vypsat +místo toho.

    +

    Tenhle příklad je potřeba napsat do souboru; v interaktivní konzoli +nebude výstup vypadat tak, jak má.

    +
    print('1 + 2', end=' ')     # Místo přechodu na nový řádek jen napiš mezeru
    +print('=', end=' ')
    +print(1 + 2, end='!')
    +print()
    +

    Funkce je potřeba volat

    +

    Pozor na to, že když nenapíšeš závorky, funkce se nezavolá! +Výraz len(s) je volání funkce, ale len bez závorek označuje +funkci samotnou.

    +

    Výsledek len(s) je číslo; len je funkce.

    +

    Čísla můžeš sečítat, můžeš tedy napsat len(s) + 1. +Funkce ale sečítat nejde – len + 1 nedává smysl.

    +

    Často se ale stane, že závorky prostě zapomeneš. +Zkus si, co dělají následující příklady, a pozorně si přečti výsledky +a chybové hlášky, abys pak podobné chyby poznal/a:

    +
    print(len('a'))     # Volání funkce (a vypsání výsledku)
    +print(len)          # Vypsání samotné funkce
    +print(len + 1)      # Sečtení funkce a čísla
    +

    Přehled funkcí

    +

    A jaké funkce můžeš, kromě len a print, použít? +Přehled těch základních najdeš v následující lekci.

    \ No newline at end of file diff --git a/lessons/generators/index.html b/lessons/generators/index.html new file mode 100644 index 00000000..11ce43fc --- /dev/null +++ b/lessons/generators/index.html @@ -0,0 +1,239 @@ +

    Generátory

    +

    Dnes si popíšeme, jak v Pythonu fungují generátory, tedy funkce s příkazem yield. +Někteří z vás možná už nějaký jednoduchý generátor napsali, ale pojďme si je +vysvětlit od úplného začátku: od toho, jak se v Pythonu iteruje.

    +

    Iterace

    +

    Když je v Pythonu potřeba iterovat (např. příkazem for) přes nějakou kolekci +(seznam, řetězec, soubor, …), použije se iterační protokol, +který pracuje se dvěma druhy objektů: s iterovatelnými objekty a s iterátory.

    +

    Iterovatelné objekty (iterables) se vyznačují tím, že je na ně možné zavolat +funkci iter(). Ta vrátí příslušný iterátor:

    +
    >>> iter([1, 2, 3])
    +<list_iterator object at 0x...>
    +

    Na iterátor pak je možné opakovaně volat funkci next(), čímž dostáváme jednotlivé +prvky iterace. +Po vyčerpání iterátoru způsobuje next() výjimku StopIteration:

    +
    >>> it = iter([1, 2, 3])
    +>>> next(it)
    +1
    +>>> next(it)
    +2
    +>>> next(it)
    +3
    +>>> next(it)
    +Traceback (most recent call last):
    +  ...
    +StopIteration
    +>>> next(it)
    +Traceback (most recent call last):
    +  ...
    +StopIteration
    +

    Cyklus for x in collection: ... tedy dělá něco jako:

    +
    iterator = iter(collection)
    +while True:
    +    try:
    +        x = next(iterator)
    +    except StopIteration:
    +        break
    +
    +    ...  # tělo původního cyklu
    +

    Platí, že každý iterátor je iterovatelný: zavoláním iter() na iterátor +dostaneme ten stejný iterátor (nikoli jeho kopii) zpět. +Naopak to ale obecně neplatí: např. seznamy jsou iterovatelné, ale nejsou samy +o sobě iterátory. +Každé zavolání iter(seznam) vrací nový iterátor, který má svou vlastní +„aktuální pozici“ a iteruje od začátku.

    +

    Iterátor je ve většině případů „malý“ objekt, který si „pamatuje“ jen původní iterovatelný +objekt a aktuální pozici. Příklady jsou iterátory seznamů (iter([])), slovníků (iter({})), +n-tic nebo množin, iterátor pro range a podobně.

    +

    Iterátory ale můžou být i „větší“: třeba otevřený soubor je iterátor, z něhož next() +načítá jednotlivé řádky.

    +

    Generátory

    +

    Asi nejzajímavější druh iterátoru je tzv. generátor: funkce, která umí postupně +dávat k dispozici hodnoty. +Definuje se pomocí klíčového slova yield: každá funkce, která obsahuje yield, +je generátorová funkce (angl. generator function).

    +
    def generate2():
    +    """generates 2 numbers"""
    +    print('A')
    +    yield 0
    +    print('B')
    +    yield 1
    +    print('C')
    +

    Zavoláním takové funkce dostáváme generátorový iterátor (angl. generator iterator):

    +
    >>> generate2()
    +<generator object generate2 at 0x...>
    +

    Voláním next() se pak stane zajímavá věc: funkce se provede až po první yield, +tam se zastaví a hodnota yield-u se vrátí z next(). +Při dalším volání se začne provádět zbytek funkce od místa, kde byla naposled +zastavena.

    +
    >>> it = generate2()
    +>>> next(it)
    +A
    +0
    +>>> next(it)
    +B
    +1
    +>>> next(it)
    +C
    +Traceback (most recent call last):
    +  ...
    +StopIteration
    +

    Další použití generátorů

    +

    Vlastnost přerušit provádění funkce je velice užitečná nejen pro vytváření +sekvencí, ale má celou řadu dalších užití. +Existuje třeba dekorátor, který generátorovou funkci s jedním yield převede na context manager, +tedy objekt použitelný s příkazem with:

    +
    import contextlib
    +
    +@contextlib.contextmanager
    +def ctx_manager():
    +    print('Entering')
    +    yield 123
    +    print('Exiting')
    +
    +
    +with ctx_manager() as obj:
    +    print('Inside context, with', obj)
    +

    Vše před yield se provede při vstupu do kontextu, hodnota yield se předá +dál a vše po yield se provede na konci. +Můžeme si představit, že místo yield se „doplní“ obsah bloku with. +Funkce se tam na chvíli zastaví a může se tedy provádět něco jiného.

    +

    Vracení hodnot z generátorů

    +

    V rámci generátorové funkce můžeme použít i return, který funkci ukončí. +Vrácená hodnota se však při normální iteraci (např. ve for) nepoužije. +Objeví se pouze jako hodnota výjimky StopIteration, která signalizuje konec +iterace:

    +
    def generator(a, b):
    +    """Yield two numbers and return their sum"""
    +    yield a
    +    yield b
    +    return a + b
    +
    >>> it = generator(2, 3)
    +>>> next(it)
    +2
    +>>> next(it)
    +3
    +>>> next(it)
    +Traceback (most recent call last):
    +  File "<stdin>", line 1, in <module>
    +StopIteration: 5
    +

    Obousměrná komunikace

    +

    Oproti normálním iterátorům, které hodnoty jen poskytují, mají generátory metodu +send(), kterou je možné posílat hodnoty do běžícího generátoru. +Klíčové slovo yield totiž může fungovat jako výraz a tento výraz nabývá poslanou +hodnotu (nebo None, byl-li použit normální next()).

    +
    def running_sum():
    +    total = 0
    +    while True:
    +        num = (yield total)
    +        if num:
    +            total += num
    +
    +it = running_sum()
    +next(it)  # pro první iteraci nelze použít send() -- nečekáme zatím na yield-u
    +it.send(2)
    +it.send(3)
    +assert next(it) == 5
    +

    Upřímě řečeno, metoda send() není příliš užitečná. +(Když byste něco takového potřebovali, radši si napište třídu, která si bude +stav uchovávat v atributech, a měňte ji třeba metodami. Bude to pravděpodobně +přehlednější.) +Existuje ale příbuzná metoda, která už je užitečnější: throw(). +Ta do generátoru „vhodí“ výjimku. +Z pohledu generátorové funkce to vypadá, jako by výjimka nastala na příkazu +yield.

    +
    def report_exception():
    +    try:
    +        yield
    +    except BaseException as e:
    +        print('Death by', type(e).__name__)
    +    yield 123
    +
    >>> it = report_exception()
    +>>> next(it)  # opět – v první iteraci nelze throw() použít
    +>>> value = it.throw(ValueError())
    +Death by ValueError
    +>>> value
    +123
    +

    Podobná věc se děje, když generátorový iterátor zanikne: Python do generátoru +„vhodí“ výjimku GeneratorExit. +Ta dědí z BaseException, ale ne Exception, takže klasické except Exception: +ji nechytí (ale např. finally funguje jak má). +Pokud generátor tuto výjimku chytá, měl by se co nejdřív ukončit. +(Když to neudělá a provede další yield, Python ho ukončí „násilně“.)

    +
    >>> import gc
    +>>> it = report_exception()
    +>>> next(it)
    +>>> del it; gc.collect()  # zbavíme se objektu "it"
    +Death by GeneratorExit
    +Exception ignored in: <generator object report_exception at 0x...>
    +RuntimeError: generator ignored GeneratorExit
    +0
    +

    Delegace na podgenerátor – yield from

    +

    Máme následující generátor:

    +
    def dance():
    +    yield 'putting hands forward'
    +    yield 'putting hands down'
    +    yield 'turning around'
    +    yield 'jumping'
    +    yield 'putting hands forward'
    +    yield 'putting hands down'
    +
    +for action in dance():
    +    print(action)
    +

    Opakuje se v něm jistá sekvence, kterou bychom jako správní programátoři chtěli +vyčlenit do samostatné funkce. +Pomocí samotného yield to ale jde celkem těžko:

    +
    def dance_hands():
    +    yield 'putting hands forward'
    +    yield 'putting hands down'
    +
    +def dance():
    +    for action in dance_hands():
    +        yield action
    +    yield 'turning around'
    +    yield 'jumping'
    +    for action in dance_hands():
    +        yield action
    +
    +for action in dance():
    +    print(action)
    +

    Tohle počtu řádků příliš nepomohlo. Existuje lepší způsob – místo cyklu +můžeme použít yield from:

    +
    def dance_hands():
    +    yield 'putting hands forward'
    +    yield 'putting hands down'
    +
    +def dance():
    +    yield from dance_hands()
    +    yield 'turning around'
    +    yield 'jumping'
    +    yield from dance_hands()
    +
    +for action in dance():
    +    print(action)
    +

    Navíc lze yield from použít jako výraz, který nabývá hodnoty +kterou podgenerátor vrátil (t.j. hodnota výjimky StopIteration).

    +
    def fibonacci(limit):
    +    a = 0
    +    b = 1
    +    count = 0
    +    while b < limit:
    +        yield b
    +        count += 1
    +        a, b = b, a + b
    +    return count
    +
    +def fib_annotated():
    +    count = (yield from fibonacci(10))
    +    print('LOG: Generated {} numbers'.format(count))
    +
    +for value in fib_annotated():
    +    print('Got', value)
    +
    Got 1
    +Got 1
    +Got 2
    +Got 3
    +Got 5
    +Got 8
    +LOG: Generated 6 numbers

    Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

    \ No newline at end of file diff --git a/lessons/git-collaboration-2in1/diagram.png b/lessons/git-collaboration-2in1/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b04ef99767fd294644772ea1c5ee732c072c2d90 GIT binary patch literal 40629 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 z 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�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 lkY$%&>geeKH=Y0Ed^US4|0aXaxWO literal 0 HcmV?d00001 diff --git a/lessons/git-collaboration-2in1/gh-workflow-diagram.svg b/lessons/git-collaboration-2in1/gh-workflow-diagram.svg new file mode 100644 index 00000000..5a33a8d8 --- /dev/null +++ b/lessons/git-collaboration-2in1/gh-workflow-diagram.svg @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + „Hlavní” projektna Githubu + origin + ty + Tvůj projektna Githubu + + > + Lokální repozitář + + + + git pull + git push ty + pull request + + diff --git a/lessons/git-collaboration-2in1/index.html b/lessons/git-collaboration-2in1/index.html new file mode 100644 index 00000000..b2d4b933 --- /dev/null +++ b/lessons/git-collaboration-2in1/index.html @@ -0,0 +1,227 @@ +

    Spolupráce a Git

    +

    „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. +Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat +stejné části (soubory) programu?

    +

    Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. +Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

    +

    Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

    +

    Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. +Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

    +

    Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

    +

    Git a GitHub

    +

    Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. +Takové složce s kódem říkáme repozitář. +Git je program, který se stará o to, abyste ve složce mohli dělat různé experimenty a vrátit se třeba ke starým verzím. +Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

    +

    A co víc – Git vám dovoluje sdílet kód s ostatními programátory. +Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

    +

    Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. +Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). +Zkuste se po nich podívat, ušetříte práci sobě i autorům.

    +

    Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +(místo posílání mailů stačí zmáčknout tlačítko).

    +

    Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

    +

    Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +kam správce projektu dává aktuální „oficiální verzi”. +Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv +(nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). +A třetí kopii repozitáře máte u sebe na počítači.

    +

    Git workflow

    +

    Práce s lokálním repozitářem

    +

    Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

    +
      +
    1. Git bude sledovat změny, které ve složce uděláme.
    2. +
    3. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
    4. +
    5. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
    6. +
    +

    Pozor

    +

    Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. +Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

    +

    Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

    +
    $ git clone https://github.com/asgeirrr/prezencka
    +

    V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

    +

    Stav repozitáře (git status)

    +

    Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +nothing to commit, working tree clean
    +

    Git nám v tuto chvíli poskytl 3 informace:

    +
      +
    1. Že jsme na větvi master. Git umožňuje pracovat na více věcích současně pomocí tzv. větví mezi kterými můžeme přepínat. Pak se na na disku „objeví” verze souborů v dané větvi. My si dnes vystačíme s jednou hlavní větví, která se tradičně jmenuje master.
    2. +
    3. Že naše větev master je aktuální vůči větvi na vzdáleném repozitáři (origin) na GitHubu.
    4. +
    5. Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
    6. +
    +

    První revize (git commit)

    +

    Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. +Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

    +

    Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt +a do něj napište svoje současné povolání nebo cokoliv jiného. +Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +
    +      magdalena_rettigova.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)
    +

    U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

    +
    $ git add magdalena_rettigova.txt
    +

    a znovu zkontrolujte stav repozitáře:

    +
    $ git status
    +On branch master
    +Your branch is up-to-date with 'origin/master'.
    +Changes to be committed:
    +  (use "git reset HEAD <file>..." to unstage)
    +
    +        new file:   magdalena_rettigova.txt
    +

    To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

    +
    $ git commit
    +

    Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. +Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být +(nebo vymazat, podle chuti – Git je ignoruje). +Pak soubor uložíme a zavřeme editor.

    +
    $ git status
    +On branch master
    +Your branch is ahead of 'origin/master' by 1 commit.
    +  (use "git push" to publish your local commits)
    +nothing to commit, working tree clean
    +

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

    +

    Git workflow

    +

    Log (git log)

    +

    Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. +K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, +na které navazujeme.

    +
    $ git log
    +commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
    +Author: Magdalena Dobromila <magdalena@rettigova.cz>
    +Date:   Tue Mar 28 19:27:08 2017 +0200
    +
    +    Přidáno mé jméno a povolání
    +
    +commit 0f305972803131cb6c8637359fee8ede3005bba6
    +Merge: effa89b 175f4cc
    +Author: Oskar Hollmann <oskar@hollmann.me>
    +Date:   Tue Nov 8 20:17:00 2016 +0100
    +
    +    Merge pull request #1 from muzikovam/master
    +
    +    Tady mas jmeno
    +

    V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. +Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

    +

    Open-source a Free software

    +

    Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. +Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. +První kód vznikal v akademické sféře, kde byl zcela přirozeně sdílen, jako je to s poznatky mezi vědci běžné. +50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. +Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. +Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

    +

    Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +Richard Stallman GNU Manifesto, +kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. +To prosazuje 4 následujících svobody (převzato z Wikipedie):

    +
      +
    1. svoboda používat program za jakýmkoliv účelem,
    2. +
    3. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
    4. +
    5. svoboda redistribuovat kopie programu,
    6. +
    7. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    8. +
    +

    Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

    +

    Pozor

    +

    Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

    +

    Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +A bohužel, ne všechny projekty mají přátelské autory.

    +

    Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +ale každý může i zkontrolovat, jestli dělají to, co dělat mají. +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +a lidé časem začnou používat opravenou verzi.

    +

    Některé příklady populárních open-source projektů:

    +
      +
    • Mozilla Firefox, Chromium (prohlížeče)
    • +
    • Atom, gedit (textové editory)
    • +
    • CPython (jazyk Python)
    • +
    • Linux, Android (jádra operačních systémů)
    • +
    • Pytest (pythonní knihovna na testování)
    • +
    • Django, Flask, Requests (webové knihovny pro Python)
    • +
    • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
    • +
    • Materiály k tomuto kurzu
    • +
    +

    A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +všechno know-how je sdílené a budeme rádi, když se zapojíte.

    +

    Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

    +

    Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, +stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. +Licence projektu většinou najdete v souboru LICENCE. +Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

    +

    Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

    +

    Spolupráce na projektu

    +

    Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

    +

    Posílání změn (git push)

    +

    Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. +Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, +vizte obrázek na začátku.

    +

    Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, +kterou jste použili pro git clone. +Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: +adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

    +

    A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. +Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +

    Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

    +

    Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje +nebo svým uživatelským jménem na GitHubu, +aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

    +
    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    +

    Zkontrolujme, že se nám to povedlo:

    +
    $ git remote -v
    +origin  https://github.com/asgeirrr/prezencka (fetch)
    +origin  https://github.com/asgeirrr/prezencka (push)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
    +tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
    +

    Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

    +
    $ git push tvojejmeno master
    +

    což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

    +

    Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

    +

    Žádost o začlenění (pull request)

    +

    Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

    +

    Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

    +

    Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. +(Diskutovat se dá na stránce pull requestu nebo přes mail.)

    +

    Poznámka

    +

    Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. +To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

    +

    Aktualizace (git pull)

    +

    Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

    +
    $ git pull origin master
    +

    stáhne změny z větve „master” z adresy pod zkratkou „origin”. +Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

    +

    Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

    +

    Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, +ale nechme si to na pokračovací srazy nebo workshop.

    \ No newline at end of file diff --git a/lessons/github-api/index.html b/lessons/github-api/index.html new file mode 100644 index 00000000..299cba58 --- /dev/null +++ b/lessons/github-api/index.html @@ -0,0 +1,129 @@ +

    Webové API

    +

    Jak už bylo řečeno v lekci o JSON, +hlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc. +Pojďme toho využít!

    +

    Spousta webových služeb poskytuje takzvané +API (z application programming interface, +programátorské rozhraní), přes které je možné s danou +službou komunikovat programově. +Místo klikání na tlačítka a čtení stránek „očima” +dostaneme data ve formátu, kterým rozumí počítače – +a v dnešní době to bude většinou formát JSON.

    +

    Z minulých lekcí bys měl/a mít založený účet na github.com, +tak se zkusme zeptat Githubu, co o nás ví.

    +

    Autorizace

    +

    První, a mnohdy nejsložitější, krok k použití API +je přihlášení. Počítače se totiž přihlašují jinak +než lidi a problematika bezpečnosti a oprávnění by vydala na samostatný kurz. +My to uděláme co nejjednodušeji, ať se rychle dostaneme k jádru věci:

    +
      +
    • Přihlaš se na github.com.
    • +
    • Jdi na nastavení Personal Accesss Tokens.
    • +
    • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
    • +
    • Zkopíruj si heslo, které takto dostaneš, do souboru token.txt.
    • +
    +

    Pozor!

    +

    Vygenerovaný kód je heslo, které držitele +opravňuje pracovat s Githubem pod tvým jménem! +Drž ho v tajnosti. Kdyby se přece jen dostalo „ven”, na stránce +Personal Accesss Tokens ho deaktivuj.

    +

    Requests

    +

    K práci s internetovými stránkami použijeme knihovnu Requests. +V aktivovaném virtuálním prostředí si ji nainstaluj příkazem:

    +
    (venv)$ python -m pip install requests
    +

    A potom v Pythonu zkus stáhnout nějakou stránku:

    +
    import requests
    +
    +# stažení stránky
    +stranka = requests.get('https://github.com')
    +
    +# ověření, že dotaz proběhl v pořádku
    +stranka.raise_for_status()
    +
    +# vypsání obsahu
    +print(stranka.text)
    +

    Měl by se vypsat obsah stránky +https://github.com – +HTML kód, který se objeví když v prohlížeči dáš +„Ukázat zdroj” (View Page Source, většinou Ctrl+U) +a ze kterého prohlížeč umí vykreslit stránku.

    +

    Ale my nechceme obsah pro lidi. +Podívejme se, co Github zpřístupňuje počítačům.

    +

    Uživatelský účet

    +

    Zkus, co dělá tento kód:

    +
    import requests
    +
    +with open('token.txt') as soubor:
    +    token = soubor.read().strip()
    +
    +headers = {'Authorization': 'token ' + token}
    +
    +stranka = requests.get('https://api.github.com/user', headers=headers)
    +stranka.raise_for_status()
    +print(stranka.text)
    +

    Co se stalo? Tím, že jsi Githubu dal/a svůj token +(načtený ze souboru, předaný přes slovník headers), +poznal, že jde dotaz od tebe a vrátil nějaké informace +ve formátu JSON.

    +

    Zkus řetězec stranka.text převést z JSON na slovník +a vypsat trochu srozumitelněji:

    +
    data = json.loads(stranka.text)
    +
    +print(json.dumps(data, ensure_ascii=True, indent=2))
    +

    Teď už je lépe vidět celý tvůj profil +(možná včetně neveřejných informací – proto musíš svůj token +udržovat v tajnosti).

    +

    S profilem, který máš v proměnné data, +se dá pracovat jako s každým jiným slovníkem. +Třeba adresu svého obrázku můžeš vypsat pomocí:

    +
    print(data['avatar_url'])
    +

    API Githubu

    +

    API Githubu toho umí mnohem víc. Třeba na adrese +https://api.github.com/emojis na tebe čeká +slovník s adresami malých obrázků. +(Tenhle slovník funguje jako vyhledávací tabulka.) +Celé API je zdokumentováno na adrese +developer.github.com.

    +

    Interakce

    +

    Pomocí webových API se dají informace nejen číst, ale i měnit.

    +

    Na stránce +github.com/pyvec/naucse.python.cz/stargazers +je seznam lidí, kteří „ohvězdičkovali” tyto učební materiály. +Je jich zatím málo; pojďme se k nim pomocí webového API přidat.

    +

    Napřed svému tokenu (na Githubu v nastavení +Personal Accesss Tokens) +přidej právo public_repo. +Od teď token střež obzvlášť pečlivě, protože se pomocí +něj dají informace na Githubu i měnit.

    +

    Chceme-li měnit informace, musíme knihovně Requests +říct, aby použila jinou „HTTP metodu” než GET. +Co to přesně jsou HTTP metody je na trochu delší povídání +(viz Wikipedia), +ale stručně řečeno, pomocí GET se většinou stahuje +obsah, pomocí POST se přidává nový, +PUT mění něco, co už na webu existuje +a DELETE něco maže. +Jakou metodu poujeme závisí na tom, co chceme udělat; +většinou to bude POST, PUT nebo DELETE.

    +

    Podle dokumentace Githubu +se přidání hvězdičky dělá pomocí PUT +dotazu na adresu /user/starred/:owner/:repo. +Za :owner a :repo +dosadíš vlastníka a jméno repozitáře +(v našem případě pyvec a naucse.python.cz) +a PUT metodu zvolíš tak, že zavoláš místo get funkci put:

    +
    import requests
    +
    +with open('token.txt') as soubor:
    +    token = soubor.read().strip()
    +
    +headers = {'Authorization': 'token ' + token}
    +
    +stranka = requests.put('https://api.github.com/user/starred/pyvec/naucse.python.cz', headers=headers)
    +stranka.raise_for_status()
    +

    Tenhle dotaz nevrátí žádný text, ale na +github.com/pyvec/naucse.python.cz/stargazers +se můžeš přesvědčit, že to funguje.

    +

    Chceš-li hvězdičku zase odstranit, použij metodu +DELETE na stejnou adresu. +(Ale nezapomeň tam pak ★ zase vrátit! ☺)

    \ No newline at end of file diff --git a/lessons/hello-world/index.html b/lessons/hello-world/index.html new file mode 100644 index 00000000..cd31a597 --- /dev/null +++ b/lessons/hello-world/index.html @@ -0,0 +1,68 @@ +

    První program

    +
    >>> 3 + 4
    +7
    +

    Psaní příkazů přímo v Pythonu, interaktivně, +má jednu velkou nevýhodu: +to, co napíšeš, se ztratí, jakmile zavřeš okno příkazové řádky. +Na jednoduché výpočty to nevadí, ale až budou tvoje programy složitější, +budeš je potřebovat nějak uložit.

    +

    Otevři editor +(Ten bys měl/a mít nainstalovaný, jestli ne, instrukce jsou v předchozí +lekci.)

    +

    V něm vytvoř nový soubor, do kterého napiš následující text:

    +
    print("Ahoj světe!")
    +

    Pak soubor ulož jako ahoj.py:

    +
      +
    • V adresáři, kde máš soubory ke kurzům Pythonu, si založ adresář pojmenovaný +podle čísla lekce (např. 02). +Měl by být vedle tvého virtuálního prostředí.
    • +
    • Do něj pak soubor ulož pod jménem ahoj.py.
    • +
    +

    Pokud máš v ukládacím okýnku možnost zvolit kódování, zvol UTF-8. +Můžeš–li zvolit typ souboru, zvol .py nebo „všechny soubory“.

    +

    Spuštění

    +

    Otevři si příkazovou řádku. +Pomocí cd donaviguj do adresáře, kde máš soubory ke kurzům Pythonu.

    +

    S příkazovou řádkou jsme se seznámili +v minulé lekci, která popisuje i změnu aktuálního +adresáře pomocí příkazu cd.

    +

    Aktivuj si virtuální prostředí.

    +

    Příkaz k tomu jsme si ukázali na konci +návodu na tvorbu virtuálního prostředí; končí activate.

    +

    Pak a zadej tento příkaz:

    +
    (venv)$ python ahoj.py
    +

    Pokud se vypíše hláška Ahoj světe!, gratuluji! +Napsal/a jsi svůj první program v Pythonu!

    +

    Jestli to nefunguje, zkontroluj, že:

    +
      +
    • Máš zapnuté virtuální prostředí. +(Na příkazové řádce se musí ukazovat (venv); +pokud tam není, použij příkaz „activate“ z minula.)
    • +
    • Jsi ve správném adresáři. Zkus pwd (Unix) nebo cd (Windows). +Aktuální adresář musí být ten, do kterého jsi uložil/a +soubor s programem.
    • +
    • Soubor se opravdu jmenuje ahoj.py. +Pomocí ls (Unix) nebo dir (Windows) zkontroluj, že se soubor opravdu +jmenuje ahoj.py a ne třeba ahoj.py.txt. +Jestli ne, ulož ho znovu pod správným jménem.
    • +
    • Soubor ahoj.py obsahuje správný příkaz, včetně všech uvozovek a závorek.
    • +
    • Slovo (venv) ani znak $ nezadáváš – v materiálech jsou proto, aby bylo +poznat že jde o příkaz příkazové řádky. +Na $ (nebo, na Windows, >) končí dotaz, který vypíše sám počítač. +Příkaz, který zadáváš ty, je jen python ahoj.py.
    • +
    +

    A jestli to pořád nefunguje, zeptej se +zkušenějšího programátora.

    +

    Typografická vsuvka

    +

    V Pythonu je většinou jedno, kde napíšeš mezeru. Stejně jako náš příkaz +print("Ahoj světe!") by fungovalo třeba:

    +
    print      (   "Ahoj světe!"     )
    +

    Je ale zvykem dodržovat určitá pravidla. +Jako v češtině se po otvírací závorce a za +ozavírací závorkou nepíše mezera. +Na rozdíl od češtiny ale mezeru nepiš ani mezi print a závorkou. +„Správně“ je tedy:

    +
    print("Ahoj světe!")
    +

    V rámci uvozovek má pak každá mezera význam: když napíšeš +" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

    +
    \ No newline at end of file diff --git a/lessons/http/index.html b/lessons/http/index.html new file mode 100644 index 00000000..d8833769 --- /dev/null +++ b/lessons/http/index.html @@ -0,0 +1,132 @@ +

    HTTP – Jak funguje Internet

    +

    Než začneme pracovat s internetem – ať už tvorbou vlastních stránek, nebo +komunikací s existujícími službami, pojďme si přiblížit, co vlastně ten +internet je a jak funguje.

    +

    Internet je celosvětová síť počítačů. +Je to spousta laptopů, stolních počítačů, malých blikajících krabiček +i obrovských blikajících skříní, které jsou navzájem propojeny pomocí +kabelů (nebo i bezdrátově).

    +

    Samozřejmě není každé zařízení propojené s každým jiným zařízením – tolik +kabelů by se na Zemi těžko vešlo. +Spousta zařízení – hlavně tzv. routery a switche – ale umí přeposílat +zprávy mezi sebou tak, že každý počítač může komunikovat s každým +jiným počítačem. +(Aspoň teoreticky – reálně je komunikace omezená např. kvůli bezpečnosti.)

    +

    Funguje to podobně jako pošta: když pošlu balíček z Brna do Melbourne, +nedostane se tam přímo. +Balíček poputuje třeba vlakem do Prahy, pak letadlem do hlavní pošty +v Austrálii a odtud náklaďákem do Melbourne, kde ho doručovatel donese až +k domu příjemce. +A k naplánování celé téhle cesty stačí napsat na obálku krátkou adresu.

    +

    Podobně cestují informace v internetu: z laptopu přes Wi-Fi do routeru, +odtud kabelem k poskytovateli připojení, tlustším kabelem do české +„páteřní sítě“, podmořským kabelem třeba do Ameriky… a nakonec k počítači, +se kterým jsem chtěl komunikovat.

    +

    Většinou můj laptop takhle komunikuje se serverem, počítačem, který +se stará o sdělování informací. +Každou webovou stránku spravuje takový server.

    +

    +

    Webové adresy

    +

    Jak taková komunikace vypadá si ukážeme na příkladu – +co se stane, když do prohlížeče zadám tuhle adresu:

    +
    http://naucse.python.cz/lessons/fast-track/http/

    Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, +„jednotná adresa zdroje“) přesně určuje, jak se má prohlížeč dostat +k informacím, které má zobrazit.

    +

    http://naucse.python.cz/lessons/fast-track/http/

    +

    Začátek adresy, http://, je jméno protokolu (angl. protocol name). +Protokol určuje způsob, jak se k daným informacím dostat. +Protokolů existuje spousta, každý funguje trochu jinak a každý se používá +na něco jiného: +SMTP a POP pro e-mail, FTP pro přenos souborů, SSH pro ovládání počítačů. +My se teď ale zaměříme na HTTP, který se typicky používá pro webové stránky.

    +

    Další část adresy, naucse.python.cz, je jméno serveru (angl. server name). +Říká, kde prohlížeč najde dané informace.

    +

    Jméno serveru je jako poštovní adresa – existuje počítač, který se jmenuje +naucse.python.cz, a každý internetový „pošťák“ ví, komu přeposlat zprávu, +aby se k tomuto počítači nakonec dostala.

    +

    „Skutečná“ adresa počítače, tzv. IP adresa, je číselná – například +151.101.37.147 nebo 2a04:4e42:9::403. +Existuje ale systém, jak jméno serveru na takovou IP adresu přeložit. +Tenhle systém se jmenuje DNS a – abychom zůstali u přirovnání k poště – +funguje podobně jako seznamy poštovních směrovacích čísel.

    +

    Poslední část URL, /lessons/fast-track/http/, je cesta (angl. path). +Říká, co chceme od serveru dostat: jméno konkrétní webové stránky.

    +

    U jednodušších stránek to může být přímo jméno souboru, který má server +uložený na disku – proto spousta adres na Webu končí příponou .html.

    +

    Požadavek a odpověď

    +

    K získání požadované stránky prohlížeč vytvoří požadavek (angl. request) +– zprávu „Pošli mi prosím stránku /lessons/fast-track/http/“ – a pošle ho +serveru naucse.python.cz.

    +

    Server požadavek dostane a vrátí odpověď (angl. response) – zprávu +s obsahem dané stránky. +Obsah je často webová stránka v jazyce HTML, který popisuje co na stránce je, +kde jsou nadpisy a kde odstavce, jak má stránka vypadat, a tak dále. +Ale v odpovědi může být místo stránky i cokoli jiného – obrázek, video, nebo +jiná data.

    +

    Veškerá komunikace přes HTTP funguje právě takto: pošle se požadavek +a přijde na něj odpověď.

    +

    A jak tyhle zprávy vypadají? +Požadavek nějak takhle:

    +
    GET /lessons/fast-track/install/ HTTP/1.1
    +Accept: */*
    +Accept-Encoding: gzip, deflate
    +Connection: keep-alive
    +Host: naucse.python.cz
    +User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
    +

    První řádek říká serveru: prosím, pošli mi (GET) stránku +/lessons/fast-track/install/ s použitím protokolu HTTP verze 1.1. +Další řádky jsou hlavičky (angl. headers). +Říkají například kdo se ptá (User-Agent) a jaký obsah očekává (Accept). +Většina hlaviček je nepovinná.

    +

    Odpověď pak může vypadat takto:

    +
    HTTP/1.1 200 OK
    +Cache-Control: max-age=600
    +Connection: keep-alive
    +Content-Encoding: gzip
    +Content-Length: 3127
    +Content-Type: text/html; charset=utf-8
    +Date: Tue, 20 Feb 2018 15:51:24 GMT
    +Last-Modified: Tue, 20 Feb 2018 15:20:08 GMT
    +Server: GitHub.com
    +
    +<!doctype html>
    +  <html lang="cs">
    +    <head>
    +        <meta charset="utf-8">
    +        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    +        <title>
    +                Python a jeho knihovny: HTTP – Jak funguje Internet
    +…
    +

    První řádek říká: používáme protokol HTTP verze 1.1, +a všechno je v pořádku (200 OK). +Kromě 200 existují i další stavové kódy (angl. status codes). +Známý je např. 404 „nenalezeno“.

    +

    Následují opět hlavičky – např. kdo odpovídá (Server), kdy byla stránka +naposledy změněna (Last-Modified) a jak je odpověď zakódovaná: +Content-Type: text/html říká, že je to stránka v jazyce HTML.

    +

    Hlavičky jsou ukončené volným řádkem, po kterém následuje samotný obsah +odpovědi ve zmíněném jazyce HTML.

    +

    HTTP Metody

    +

    Komunikace ukázaná výše používala metodu GET, která slouží ke čtení +informací. +Když se takto prohlížeč na nějakou stránku zeptá, nic se na serveru nezmění. +Prohlížeč si takovou stránku – nebo třeba obrázek či video – může dočasně +uložit, a když bude potřeba znovu, použít uloženou verzi.

    +

    Některými požadavky ale stav serveru mění: například se přihlásí uživatel, +nakoupí zboží v e-shopu nebo odešle zpráva do diskuse. +Tyto požadavky používají místo GET jinou metodu (angl. method). +Co přesně která metoda na jaké adrese dělá, to záleží na autorovi stránek. +Často se používají tyto metody:

    +
      +
    • GET načte informace,
    • +
    • POST pošle na server informace, např. z formuláře, s cílem něco +změnit nebo nastavit,
    • +
    • PUT přidá novou stránku (nebo jiný objekt),
    • +
    • DELETE něco smaže.
    • +
    +

    Seznam všech metod je ve +specifikaci.

    +

    U složitějších požadavků se dají na server poslat i informace: +webové formuláře se odesílají požadavkem, který používá metodu POST +a vyplněné informace k dotazu „přilepí“ za hlavičky – stejným způsobem, jako se +v odpovědi posílá HTML stránka.

    \ No newline at end of file diff --git a/lessons/http/url-anatomy.svg b/lessons/http/url-anatomy.svg new file mode 100644 index 00000000..8682a706 --- /dev/null +++ b/lessons/http/url-anatomy.svg @@ -0,0 +1,461 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://naucse.python.cz/lessons/fast-track/http/ + + protokol + + server + cesta + + diff --git a/lessons/ignoring/index.html b/lessons/ignoring/index.html new file mode 100644 index 00000000..3ad90efb --- /dev/null +++ b/lessons/ignoring/index.html @@ -0,0 +1,203 @@ +

    Ignorování souborů

    +

    Často se stává, že některé soubory v repozitáři nechceš. +Takových souborů jsou tři hlavní druhy:

    +
    +
    Pomocné soubory nástrojů

    Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými +soubory, aby zrychlil importování modulů. +Některé počítače vytváří skryté soubory s názvy jako +.Thumbnails, .DS_Store nebo Thumbs.db. +Takové věci v repozitáři nemají co dělat – je +dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

    +
    Výstup programu a nastavení

    Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři +jen samotný program. +Obrázky si může pomocí programu každý vytvořit sám.

    +

    : Podobně fungují soubory s heslem: pokud program potřebuje heslo + např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně + k dispozici, musí si každý vytvořit soubor s heslem sám.

    +
    +
    Osobní soubory

    Občas se stane, že v adresáři s repozitářem máš soubor s osobními +poznámkami. +Zbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat +jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

    +
    Adresář s virtuálním prostředím

    Jistě už sis zvykl/a na virtuální prostředí. +Adresář s ním se může jmenovat různě, v začátečnickém kurzu používáme název venv. +Není dobré tento adresář dávat do Gitu, +protože je jednoduché jej vždy vytvořit znovu +a pokud na projektu spolupracuje více lidí +(nebo ty z více počítačů), mohlo by dělat neplechu, kdyby virtuální +prostředí nebylo vždy na úplně stejném místě. +Virtuální prostředí z adresáře /home/helena/projektABC/venv +nebude fungovat z adresáře C:\Users\Helena\projektABC\venv, +ale ani z /home/mirka/projektABC/venv.

    +

    My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby +git status neukazoval červeně, že ještě nejsou v repozitáři.

    +

    Příprava

    +

    Pojďme si to ukázat na příkladu. +Založ si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:

    +
      +
    • obrazek.py

      +
      from turtle import forward, left, right, getcanvas
      +
      +forward(50)
      +left(60)
      +forward(50)
      +right(60)
      +forward(50)
      +
      +getcanvas().postscript(file='obrazek.ps')
      +
    • +
    • poznamky.txt

      +
      Tohle je tajné!
    • +
    • Autofile.tmp

      +

      Do tohohle souboru napiš cokoliv. +Různé operační systémy a (jiné programy) vytváří různé soubory +podivných jmen; Autofile.tmp pro nás bude představovat takový +automaticky vzniklý soubor.

      +
    • +
    +

    Pythonní program spusť (pomocí python obrazek.py). +Mělo by se na chvíli ukázat okno s želvou a měl by vzniknout nový soubor +obrazek.ps.

    +

    Obrázek ve formátu PostScript (.ps) se dá otevřít ve většině programů, které +zvládají i PDF, případně v Inkscape.

    +

    Jak se na to dívá Git?

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp
    +    obrazek.ps
    +    obrazek.py
    +    poznamky.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    Spousta souborů, ale jen jeden z nich chceš v repozitáři. +Co s těmi ostatními?

    +

    Výstupy programu a pomocné soubory společných nástrojů

    +

    Nejjednodušší je vyrovnat se se souborem obrazek.ps. +V repozitáři ho nechceš (je to repozitář zdrojového kódu; výsledky bývá +lepší schraňovat jinde než v Gitu). +Zároveň víš, že každý, kdo s repozitářem bude pracovat, pravděpodobně +tenhle soubor vytvoří. +Bylo by tedy dobré říct všem lidem, kteří se k repozitáři dostanou, že tento +soubor do Gitu nepatří. +To se dělá záznamem ve speciálním souboru v repozitáři.

    +

    Udělej soubor s názvem .gitignore. +(Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává – +doporučuji soubor vytvořit v programátorském editoru.) +Do něj napiš:

    +
    obrazek.ps

    Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    .gitignore
    +    Autofile.tmp
    +    obrazek.py
    +    poznamky.txt
    +
    +nothing added to commit but untracked files present (use "git add" to track)

    Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

    +
    $ git add .gitignore obrazek.py
    +$ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp
    +    poznamky.txt

    Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou +.gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

    +

    Jak ignorovat zbylé dva soubory?

    +

    Osobní poznámky

    +

    Soubor poznamky.txt se taky dá zařadit do .gitignore, ale moc se tam nehodí. +Existuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří +soubor se stejným jménem.

    +

    Dej ho tedy do souboru, který se nebude šířit s repozitářem. +Tento soubor je .git/info/exclude. +(Může být trochu složité ho najít, protože adresář .git je skrytý. +Nevidíš–li ho, napiš v editoru do okýnka pro otevření souboru .git a dostaneš +se do něj.)

    +

    Soubory v adresáři .git bys neměl/a měnit, protože se tak dá přijít +o historii projektu. +Ale exclude je výjimka. Napiš na konec tohoto souboru:

    +
    poznamky.txt

    A po uložení budou poznámky ignorovány!

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py
    +
    +Untracked files:
    +  (use "git add <file>..." to include in what will be committed)
    +    Autofile.tmp

    Další haraburdí

    +

    Některé programy automaticky vytvářejí pomocné soubory. +Často to dělají správci souborů (často .Thumbnails na Linuxu, +.DS_Store na Macu nebo Thumbs.db na Windows). +Některé editory si taky nechávají na disku nastavení.

    +

    Podobné soubory se dají dát do .gitignore. +Je ale lepší si je dát do osobního nastavení, protože ostatní lidé, +kteří na projektu můžou spolupracovat, nemusí používat stejný systém +a programy.

    +

    Pokud si můžeš být jistý/á, že ostatní budou používat právě +ten program, který používáš ty, použij .gitignore. +Příklad je adresář __pycache__, který vytváří Python při importu modulu.

    +

    Soubor s osobním nastavením si můžeš pojmenovat, jak chceš, a můžeš ho uložit +kde budeš chtít. +Já doporučuji ho pojmenovat .gitignore_global a dát ho do tvého domovského +adresáře.

    +

    Do souboru zase napiš jméno ignorovaného souboru:

    +
    Autofile.tmp

    Potom řekni Gitu, kde tento soubor najít:

    +
    $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global

    A měl by být ignorován:

    +
    $ git status
    +On branch master
    +
    +No commits yet
    +
    +Changes to be committed:
    +  (use "git rm --cached <file>..." to unstage)
    +    new file:   .gitignore
    +    new file:   obrazek.py

    Formát ignorovacího souboru

    +

    Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: +každý na zvláštní řádek. +Kromě toho je možné použít několik vychytávek:

    +
      +
    • * ve jméně souboru nahradí část jména souboru. +Takže pokud chceš ignorovat všechny soubory s příponou .tmp, můžeš napsat:

      +
      *.tmp
    • +
    • / na konci jména značí adresář. Chceš-li tedy ignorovat adresáře +__pycache__ (což v Pythonním projektu chceš), napiš do .gitignore:

      +
      __pycache__/
    • +
    +

    Další detaily je možné najít v dokumentaci.

    +

    Automatické přidávání

    +

    Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo

    +
    $ git add soubor1 soubor2
    +$ git commit
    +

    můžeš napsat jen git commit s tečkou na konci:

    +
    $ git commit .
    +

    To automaticky přidá všechny neignorované soubory, které git status ukazuje +červeně. +Tečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá +do revize.

    +

    Doporučuji si před použitím téhle zkratky zkontrolovat git status, aby sis +ověřil/a, že nepřidáváš nic, co nechceš.

    +

    Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize, +ukazovala poznámka s tím, co vlastně v nové revizi bude. +Uvidíš tak něco jako git status vždy, když začneš psát popisek k revizi:

    +
    $ git config --global commit.verbose 1
    +
    \ No newline at end of file diff --git a/lessons/inheritance/index.html b/lessons/inheritance/index.html new file mode 100644 index 00000000..28e41827 --- /dev/null +++ b/lessons/inheritance/index.html @@ -0,0 +1,199 @@ +

    Dědičnost

    +

    Minule jsme probrali třídy. +Jako příklad jsme si ukázali třídu pro koťátka:

    +
    class Kotatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +

    Zkus si udělat podobnou třídu pro štěňátka:

    +
    class Stenatko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +    def zastekej(self):
    +        print(f"{self.jmeno}: Haf!")
    +

    Většina kódu je stejná! +Kdybys měla napsat i třídu pro kuřátka, kůzlátka, +slůňátka a háďátka, bez Ctrl+C by to bylo docela nudné. +A protože jsou programátoři líní psát stejný kód +několikrát (a hlavně ho potom udržovat), vymysleli +mechanismus, jak se toho vyvarovat.

    +

    Koťátka i štěňátka jsou zvířátka. +Můžeš si vytvořit třídu společnou pro všechna +zvířátka a do ní napsat všechno, co je společné. +Ve třídách pro jednotlivé druhy zvířat pak zbude jen to, co se liší. +V Pythonu se to dělá takto:

    +
    class Zviratko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +
    +class Kotatko(Zviratko):
    +    def zamnoukej(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +
    +class Stenatko(Zviratko):
    +    def zastekej(self):
    +        print(f"{self.jmeno}: Haf!")
    +
    +
    +micka = Kotatko('Micka')
    +azorek = Stenatko('Azorek')
    +micka.zamnoukej()
    +azorek.zastekej()
    +micka.snez('myš')
    +azorek.snez('kost')
    +

    Jak to funguje? +Příkazem class Kotatko(Zviratko): +říkáš Pythonu, že třída Kotatko +dědí ze třídy Zviratko +(angl. inherits from Zviratko). +Případně se můžeš setkat s jinými termíny: +„je odvozená” ze třídy Zviratko, +(angl. derived from), +nebo ji “rozšiřuje” (angl. extends). +A když už jsme u terminologie, odvozeným třídám se +říká taky podtřídy (angl. subclasses) +a Zviratko je tu nadtřída +(angl. superclass).

    +

    Když potom Python hledá nějakou metodu +(nebo jiný atribut), třeba micka.snez, +a nenajde ji přímo ve třídě daného objektu (u nás +Kotatko), podívá se do nadtřídy. +Takže všechno, co je definované pro +Zviratko, platí i pro koťátka – dokud to výslovně nezměníš.

    +

    Přepisování metod a super()

    +

    Když se ti nebude líbit chování některé metody +v nadtřídě, stačí dát metodu stejného jména do +podtřídy:

    +
    class Kotatko(Zviratko):
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi vůbec nechutná!")
    +
    +
    +micka = Kotatko('Micka')
    +micka.snez('granule')
    +

    Je to podobné jako když jsme minule přepisovali +atribut pomocí micka.zamnoukej = 12345. +Python atributy hledá napřed na samotném objektu, +potom na třídě toho objektu a pak na nadtřídě +(a případně dalších nadtřídách té nadtřídy).

    +

    Občas se může stát, že v takovéto přepsané metodě budeš +potřebovat použít původní funkčnost, jen budeš chtít udělat ještě něco navíc. +To umí zařídit speciální funkce super(), +která umožňuje volat metody z nadtřídy. +Třeba takhle:

    +
    class Kotatko(Zviratko):
    +    def snez(self, jidlo):
    +        print(f"({self.jmeno} na {jidlo} chvíli fascinovaně kouká)")
    +        super().snez(jidlo)
    +
    +
    +micka = Kotatko('Micka')
    +micka.snez('granule')
    +

    Pozor na to, že takhle volané metodě musíš dát všechny +argumenty, které potřebuje (kromě self, +který se jako obvykle doplní automaticky). +Toho se dá i využít – můžeš použít i jiné argumenty +než dostala původní funkce:

    +
    class Hadatko(Zviratko):
    +    def __init__(self, jmeno):
    +        jmeno = jmeno.replace('s', 'sss')
    +        jmeno = jmeno.replace('S', 'Sss')
    +        super().__init__(jmeno)
    +
    +
    +standa = Hadatko('Stanislav')
    +standa.snez('myš')
    +

    Jak je vidět, super() se dá bez problémů +kombinovat se speciálními metodami jako __init__. +Dokonce se to dělá poměrně často!

    +

    Polymorfismus

    +

    Programátoři nezavedli dědičnost jen proto, že jsou +líní a nechtějí psát dvakrát stejný kód. +To je sice dobrý důvod, ale nadtřídy mají jednu +důležitější vlastnost. Když víš, že každé +Kotatko nebo Stenatko +nebo jakákoli jiná podtřída je zvířátko, +můžeš si udělat seznam zvířátek s tím, +že pak bude jedno, jaká přesně zvířátka to jsou:

    +
    zviratka = [Kotatko('Micka'), Stenatko('Azorek')]
    +
    +for zviratko in zviratka:
    +    zviratko.snez('flákota')
    +

    Tohle je docela důležitá vlastnost podtříd: +když máš nějaké Kotatko, můžeš ho použít +kdekoliv kde program očekává Zviratko, +protože každé koťátko je zvířátko.

    +

    Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět +kterou třídu podědit z které. +Každé koťátko nebo štěňátko +je zvířátko, každá chata +nebo panelák je stavení. +V takových případech dává dědičnost smysl.

    +

    Někdy se ale stane, že tuhle pomůcku zkusíš použít a vyjde ti +nesmysl jako „každé auto je volant”. +V takovém případě dědičnost nepoužívej. +I když jak auto tak volant se dají „otočit doprava”, +u každého to znamená něco jiného – a určitě nejde auto +použít kdekoli, kde bys chtěl/a použít volant. +Takže v tomto případě je lepší si říct „každé auto + volant”, stejně jako „každé kotě + jméno”, udělat dvě nezávislé třídy a napsat něco jako:

    +
    class Auto:
    +    def __init__(self):
    +        self.volant = Volant()
    +

    (A až bude někdy nějaký vystudovaný informatik nespokojený +s tím, že porušuješ +Liskovové substituční princip, +jde o právě tento problém.)

    +

    Generalizace

    +

    Když se teď podíváš na funkce zamnoukej +a zastekej, možná tě napadne, že by se +daly pojmenovat lépe, aby se daly použít pro všechna +zvířata, podobně jako snez. +Bude nejlepší je přejmenovat:

    +
    class Zviratko:
    +    def __init__(self, jmeno):
    +        self.jmeno = jmeno
    +
    +    def snez(self, jidlo):
    +        print(f"{self.jmeno}: {jidlo} mi chutná!")
    +
    +
    +class Kotatko(Zviratko):
    +    def udelej_zvuk(self):
    +        print(f"{self.jmeno}: Mňau!")
    +
    +
    +class Stenatko(Zviratko):
    +    def udelej_zvuk(self):
    +        print(f"{self.jmeno}: Haf!")
    +
    +
    +zviratka = [Kotatko('Micka'), Stenatko('Azorek')]
    +
    +for zviratko in zviratka:
    +    zviratko.udelej_zvuk()
    +    zviratko.snez('flákota')
    +

    Jak tenhle příklad naznačuje, psát nadtřídy ze kterých se dobře dědí +není jednoduché. Zvlášť to platí, kdyby se z nich mělo dědit v jiném +programu, než kde je nadtřída. +I z toho důvodu je dobré dědičnost používat hlavně v rámci svého kódu: +nedoporučuji dědit od tříd, které napsali ostatní (jako bool nebo +pyglet.sprite.Sprite), pokud autor nadtřídy výslovně nezmíní, že (a jak) se +z ní dědit má.

    +

    A to je zatím o třídách vše. Už toho víš dost na to, +aby sis napsal/a vlastní zoo :)

    \ No newline at end of file diff --git a/lessons/install-editor/atom.html b/lessons/install-editor/atom.html new file mode 100644 index 00000000..e7a91754 --- /dev/null +++ b/lessons/install-editor/atom.html @@ -0,0 +1,73 @@ +

    Instalace Atomu

    +

    Editor Atom +si stáhni z jeho domovské stránky +a nainstaluj.

    +

    Nastavení

    +

    V Atomu se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

    +

    Odsazování a obarvování bude fungovat správně jen v souborech s koncovkou .py +(jako Python). +V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    +

    Proto jakmile v tomhle editoru vytvoříš nový soubor, +měl/a bys ho co nejdřív uložit pod správným jménem.

    +

    Kontrola stylu zdrojového kódu

    +

    Jedna věc nám v Atomu přeci jen chybí: plugin pro kontrolu správného +stylu zdrojového kódu.

    +

    Tak jako čeština má Python typografická pravidla. +Například za čárkou se píše mezera, ale před ní ne. +Jsou nepovinná, program bude fungovat i při jejich nedodržení, +ale pomáhají psát přehledný kód, tak je dobré je dodržovat už od začátku. +Pravidla pro Python jsou popsána v dokumentu +PEP8.

    +

    Aby sis je nemusel/a všechny pamatovat, nainstaluj si plugin, +který tě na jejich porušení upozorní.

    +

    Nejprve je potřeba si nainstalovat speciální knihovnu, která se o kontrolu +dokáže postarat. Do příkazové řádky zadej následující:

    +
    $ python -m pip install flake8
    +

    A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber +„Soubor > Nastavení/File > Settings“ a v nabídce +uprostřed okna vyber poslední položku +„Instalovat/Install“. Do vyhledávacího pole zadej +„linter-flake8“ a v seznamu nalezených pluginů klikni u položky stejného jména +na tlačítko „Instalovat/Install“. Bude ještě potřeba +schválit instalaci všech závislostí, na které se Atom postupně zeptá.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install-editor/gedit.html b/lessons/install-editor/gedit.html new file mode 100644 index 00000000..e92500c9 --- /dev/null +++ b/lessons/install-editor/gedit.html @@ -0,0 +1,66 @@ +

    Instalace Geditu

    +

    Na Linuxu se Gedit instaluje jako ostatní programy:

    +
    +
    Fedora
    $ sudo dnf install gedit
    +
    Ubuntu
    $ sudo apt-get install gedit
    +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +

    Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

    +

    Nastavení

    +

    Gedit se nastavuje v Předvolbách (Preferences).

    +

    +
    +
    Číslování řádků

    V sekci Zobrazit/View vyber +Zobrazovat čísla řádků/Display Line Numbers.

    +

    +
    Odsazování

    V sekci Editor vyber:

    +
      +
    • Šířka tabulátorů/Tab width: 4
    • +
    • Vkládat mezery místo tabulátorů/Insert spaces instead of tabs
    • +
    • Povolit automatické odsazování/Enable automatic indentation
    • +
    +

    +
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +koncovky souboru – např. .py pro Python.

    +

    Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co +nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install-editor/gedit_indent.png b/lessons/install-editor/gedit_indent.png new file mode 100644 index 0000000000000000000000000000000000000000..60c857afaf75544bd175d452b67541779391c1c4 GIT binary patch literal 21030 zcmb@u1z1&Iv^{z_9N-YrB}gNkl1ewyAPv&pNK1Evs0e~|h;)Z^BPrc2B_W}7yoJBt z{oeiGdtblLj}7j9&faIQwf3B2jxpwmR8f+7fJTA_fj}NSmz7k5KoEk!j|dzY?2#|+ zq6WW^P2^=HA$RxxGMhiY1A9=NWOZC15Oloz9|TCsCt|P@#r3(O6v`@;1RsY=g|Fon z0-=OFmlRX?oZCzD(8lj2?QQk=%`{dN#nU61gHr)xDS)4b&3M1wi_GtpG*!p1=pp2Z zBr}bPNSQJDrfiyB!914RKN|na38k)8WU3jeWxcd|<(2MRx_2}7*RHAT#C?kj>#y^{G5F$V#B&nka?ss4dOCgA1 z!%*)xV&bA;^9CDiuxVjn^Z(=S(Fl$_2FjR3d9B-yOU2ZL3vN6$#^6@APdTzwa9n5y z_V(=Oj4?+S7Z=a^MjB61e+3Mz@Q*r+W{oww(=^QT0nLs60glmx_(w2Ri30100>0a? zPMH2L`NL^YPP1Ol^UlBogYA|ay;Ov;Y_94JUgNR@YJq2f(^j(#;! z1Uj$~)wLhn5njJq!as<7xm_l!DBro^V%f%l5tk9sy=oXo zO+$lNT3SlX^$I2(ON>b#uQl{@rRC0T^^?KbRL`<nEdGzTPpU0wlM7 ze($qLs91e{ov(&p`ji_{@fN>CB##e&iZ0T%etwSpW&4ekC^sA<=XRk}#(Ad29FHwS z01?7}Iq&R4RDo=-Th~!R6Fyq!K{+K^(p$04DK{mpF(5JRZM)9i8=HD(>@x9;MW-4b zzrJ2!;uf;E0B&vVB+syOss~x*rW`LdoBC*FRbtlb<@Lp@*;m&dyS&18W~gzGX2MZd zjb|F~D9v-F`+MAMM+bXJQ6rz98?}qye@yb;-p=t(L{jQ$uyT5o9Sq2`dF`Q)-@m5o z<}T_iM?y+sWA{9Mv&$erxbl?(OJX0;#h`m@w%uk=vilyC#I`z)q$BC+>HXdvCxyIu zn?fz%ap=SiF!bS{!DJL+T6%gES}P{$CJKI~ptcy!?4;OVl70hUzRlIxEjxxWR3 zXb>UTyv~(lcVDb`bZ;iMmgdfP*Y*ZmMDzEUX%qVu(^(MaJyv&CRo6LMguDrP9hQO~ zIyNH;XT;aq&#g4qEp_d_eDRP-x_2Es=A25Ee&ugs$=@}Wd4@Yq;;SoeC@SYgy@q9(+l|$p0G!7iXO~UQN;{i|a zDVF=|ROCo!Tfabg#P3S{E`LPyMReXQj9|91=CHG6-&An1 z#|KBI)%N4aV4bur4P!$7Ue@SVyi3SW|JUsagrlOO7l(KzNiCQXzV_6}+8Q;?n36Es z+!rcHjNnBV6zc zgcPs|3b_x7lvMW{Svc7IKieH49n)`Kz|73dXaU|!LPbYM_Z2lzR$Z<_3L9pua+vNr z<-p~wrzfx&l35@t>#T$g8->{v&r-xwHKLt|@rbT4_sqpRKx-#*V%6MU{1Eczx`O_h-tnS+Zf zIIZM?!R|R);@ayUsKOao%<}T}jg8q2@mS|RwD(As7B~6hM+68hE-GyHDF-KKU{ZMaT#EKCzMRg!Fi!bP0d29>)mXL zz8gQ?Kzcm)*oO)T=m`$tt{mKidv0tbtsHEk8LM*M-fkfmmlS`mYRnjYJQgaSw@6k>vV zt}Ql7dCIoZlGGTw7Gh*s`4Lgw*U0_-14h=ysE+Jdp59)ovo!t3GXwkcRF8QcP$$5r zG^aej*xPbjo0O?{PE0SVYm*!iFG@@xwl zIXJ}C+Uu@be}E`gRZgM>7FKKgF_hkXA^7~cgpSwK;*yf@gY)QT zBbSl!pf6s$@bvmh^O%S1;YS^-rNJv5n57s~V)n;)A_YZ7^`+Dg>4D+SM~6-x64PvH zhqOEo;@8&Nw~kgeb`UH-=gTVMQMG1bySvw7n{7cLV6L1zT%^Rrs32|MzKw26u8hcQ zmGAa8Z%-T%uo&=TK@L0PMQm#@CwLy*I3Ea}lJmy|irsL$n!&z)wa4!#>;#8!P|E5U zy?vLlGN3FRl$e;P+O1>r`q>&eedfnHBCx1s#K-UiUw>-TOw2oHz zeK%PkM%Oc(PF7O-$fBl(Inr#z+pPZ?>JG{R7=ri(^C(r>!N# z_fe9NfKLm8kbt7-ON;DR6~quQN?D^6zUd`&XVo?v%m67DyipGr*=q0Tc;q8Y5vNFI z7MexX$@`$fWb0rv`$(5u+2u}5PL2eUX}|lSyqqIEG_=7$Q8DE>IjgJ8TH>{ZxizX5 zk);`GWkOO07Ki8;Ss0%dk+!aGVVQkmA_C<0>+6?0cVlX&Qno)=ARuvr!1v?FW>#e- zE}1}e@6fzQLTXYt$e@Q8KHP3j9DNE!UwlOb=!qcj=Tg#ajc0#sRvz$FSSr5o_IAG; zTWD&snSKVIJpBFkpU2S+4NtGEd;C5mCTTQ&VD@b22>4>m`lK}z0{IT$5#a~IdXGCQ zhsBm~@ElP+ef(h4!oq4cyJ7B%b#O>k(;)8n_*Lv$(MZ)KgK+vw8oaO%EuNp=M6}*D zpn_m2pr=>uuz}v2A9lg!oQMEos=PdU^|5{6=8%ugMt*?;Epw}x`Nzb(;WOKQ(=goD z{0C_&Lq1IjkNY$WV;O2A3%#F9nw!J7cgiYz%uG7MgC+2OY;4dxeN3RZx4-)1M+BYX zUcxmkl1T+jDNfPY#KdQu4gjk+=?Rg0pY#C&XPo4)6$jZr;W2im3PXtLcs@2-^!wt% zo&XRj<)o-1x=pmTwMAKQM6Q-AZw+W)aH(s4kYFL~>>MIkd&NmkPrJ5RBJjla!!FT_ z(4uHAwXv~;kB`4I5c7C}Fce;wgd!-kprWr9w9w>3OG~%D6dVrUo?R?pLit&OP`eys zJo9T~V}psQT$6!~(fA4_J+fL>U6X#5=l!|;;oFMHX0k^qGc;hbW}h~I^(?8$tTCVa zqm!4kyPIB|Izg1>10^_kx6t&s?6C-QUq}bFjzCdwRh)?_+cq-tA4JHW$fH;=_xSjP zCU>h=C19zb+JVe~H8dt7yYWNo|vv@vlQerHr_fNm+eUJEx|QzbUIFyiJJ% z4*~9Tq~jBGr`_RZT_HXDwe`)C#=R45z0Mt-&o!vaxuZV_Y?*B#0h9uyAm_=-DwG;{ z`A)q*Gs1MPvq(ooBS`Zj%x_?;?uXif9 z1T>~H2VJ48PVG06EI#7#Veq@y=O^?%Zg}gR6^tANaK!B{6Ptb$jGkUb0Ztl>aC6C< zlGNB;l^-xT$dYSr)-g5)wb!c)icd;1H~?!kt}BY_5EE-o*@@+^kN?G)4D4_=13@e-Eam%Rcao8fv3;`jF0`hG;PoZx z$eZ7TgE2PdzE;~Ry0#INaBsCLjvW44>%Ka#D(NGi{P$hp1Sv5}cY|IpO-{4^8%xH8iKGOSec(yaDm~0<*6qyhlHH)9pnHJu; z`QsaL;@yjJY%%OEbj-iS{r~3*|A9EYh`;Oc$!B~jc#xIRPrL9Z_Mzt`yVF1Ssg942 zD{S_4^>418MMXs!*_t9MD`V~5IV;y3PFnJV&um~trNUxF`t|#bMYjjP$0{^?N;1=% zPed>#y0ex{MCB(gI~@ki-SE1q5B39k*xb4GvY(`6DPqP*IEX#lWY__rCtDpobGkcU z*Xd0v&e{+F6bVc%BF$I$6rf5IX6t(O%l{Su;%c=_{^7$1&k|D^JA+oGyc#u)T#yqn zr77C8wyn&}ghRs{1v;eT#XV=VLEO*t{^0v3ucv&m#f4~>*RCt4H@oN&yQpLrrj?Tx=y`pQ~OZh90a zO9gy4F+kxSz25pLu&$2i1KS;8uZaowS9?cG6bLbwA5_@zk|&P*>Oq5-7gI^1-gFt` z&658%c8eZaAo=YrKOSlD!R=!Ct07%bT510(_r1O#0_azf3{=#iA6i<d3h@9&)ToHH>VR{k*Ky(tLS6k={QO(z;>%ymjh~KdnVG^&8$k#~WH;awWie(j!JLD1h|$2Xu&2@+H+kUb*NnXVxbZKy7W? zdXSymkrx(baFn3w>}J1t_b&L;f!6_UU?3a8I{-r0baMR&60V5+E6OAp_cUYA+Zl*v6j4K+=sj!nPAu)CmS1}lNhkVY5Mn<;z-&M$%P}@>PNbb4$ z2pd`S@M1MIAf%^@&ew`wor*TPi=J!-M57y-OC4Q8osP{EYAS`fU9CEYXei;?n4tl? z3~bD%=zf6#1YsTGQ*tZPC`X=l`xyfL1GB==10VCp-m%f>I>_uCfD14lG*MA)Cp5fF)bwK)5+D9^*hfX)p`fP**8pE?@1*WS&~R=6N5D9#2o7jifSfor%EqQm;B+ZqP8 zsy-kLaorOo9c`SP3Ce_3wH8}Q{LlKsLthO^6c!Ylm3`}ftB3Rn+es5S65&3VNE_j3 zYnOirNF`laZTEXc6NaA}RNn%X8py1CTZ8fH)em1J4Wa^7F zx`AP01|%i<>{CTb3deBMhm#rTs;b`jmChDq2N7TeiY`fZMLw`(CBV=5XTszPt65cl^7eOnF|&v@l8EcZq){7^DIqgM)+LD@^J28&6xqh@eUs#U(nN zD>fI2iF@q{NxizLQAkbM*iO_Pk%5KAdHP&9_hYOo0%!uyAog>fVKOyxb zLeqOMRNMVV2HyQr*PMK!vL^}va`=Z=Ly|ti^AyG=)ES?R9F!uJ?k8WYLkC&^L}k*P z4h?Na7_nO@j-WfBF?^S69T9Yd7|J?ksErAnR z>nGxZpIilV3hxuULmLk4b004*oN2AL$=?ma&{9O5m*9WJ z>bhuxzWusLN=ke1$0#V882o{Mxi=0`1qE$RCl9T3oc8t;0)E>5CGxpc9Cm9guJN z#Yz9C`DIK8MFV z%Gupnt&QcT70HlEhKoB6v<*Zr=2uFfWXcm|YA|Q&a9u1w9D+%ta8@KGsEv~<`i9Jr zs6;aCpR5tq()3YtxIeqN7~kZQTqi;#CB68rR$3M?lEki(ltf>Lh9Cavm8O{2(?$Xd z3%W+vP?bJ+I+vXAJ|;@4f&pE338MbXb4!No1Q5H~UVf$I;UU17?6Xn4d(#dH;G$RN zUaPyArFL6@aXKK9I#8H)$C+v{e~_cKYd6&Gj|y00`V2!Avqv{9OxPVsGW3h|Sn@*2 z@Hs}6Le9!CH?n0m3@-pf3ah81aM(~AW>Ue2DshL1Pd#B^F(YbN?+Rvt=5()I!qane zjaJtl!!bw#419w*?mD{}7#LK(ZW_6ABgYemF5RG*bQey7MbETI^5hja?z^{Ut^Uyo z)2C~AxE!t%+cr~x3~8@p)}rCCf`r99ij^3ZDb(RiyS^^c;pVKM=X}EQ=oX=w)2l}T zaPr%B2s;Cv;aJX>zpV!|L^57+s0P=iv;Puxn2Nb^ePv>ao|?*B_N)+I$6ce|uZx8X z5*Mo2O}W*#UO0sSp?_D;%I_mnCl@!diTokC=}!W8^zQb{QJq(3)ECdu+z*y=#!Au` z8`m@Z9U+iP7}Tfk8T4^p9wfluaY=IIV6kYi%5>TR;6<_Dfxa^hZs>j@-nA(NF1wdC zHiUz-CtDSaOt?gTBB6Y*PrLY-HK+6*vFg`j8~Weyuvj0lXXk^|f#Up*ZV$#OAaJow zp&0tC?qjSht>LlmWG;75N|;UOs;{^CGAj$qA;5x0X4>^*Jkdm~fcrp)tmK5AaC)qU zdwQQ1{}lh8BVeMOCOwlp%I|!PKgi1Bba^JiVbkSweez2Y1C>mDKOH1+V<2pNypktm z?b<#>)$P35dE4#e{t60^7!V2&B zehMSv;kk#E$39?2)70#L*NKlL=FA4=+k0OHtBynwBMfX=@IHi8E&F02h~12S8=(-o z`YqwE6gS3WU|>-BYiVf-8xCVy{0W2thvf!DNQ96Z+Op5l(>Stt1js^zH<4eNM~Qp9 zD5c7)<=$SI&rU8t7X_G`ft|gK&(>%tg=b|nT4sW9s-~`@QIQrDGOT1cy@LkTJ6lQ&7Qf|ze;_j-aa=6f_eJ+ z&EP}8HBhg_8l3y}Dt&4^q;CQhuf4s-KDm~b*5kABv9Ut!iIF-;i^~=!6bda2{gy0^ z`B0p-(T3O{LRDh2Fwo}$7iWRI&%z=F-A#$R-uz30_ZJg!La~?BxRFMtrig&D2Fi@d z&hf@%sSepgR55p6*zBx!4KHq1aM0w}=^`1dVuMCZ3Go?=%=X}*qs5=_-#_ppHj@t1t@G*an)Rtp(I1XMBK z!^y1-Dw}n>-`k5sRZD(EFB@IIxGQF~K@?K|(Dj5U2gKL$Stw@Yi^0Fr01`eJ8505l z+9CGShKB9goW}lLOXUn?c4g%l)Qo_gs%7yzKi|aRkx$Q%URVrg&vr?!m&5B*gxXH= zl2dHz;4CaN-h+dE)K;{_lH+eoWNbvs(&5{aFLtiaosB0;$@nZ{lpN}8=Lz{rZy#Un zZ_lXjcxc=W4GkU5zU@A@`(`rhZz>c2);B}Y8A_-8Df86N?QU{f5VaCHLRSa25W*3b zpo~3kf#VcCp|MXx`8VC0ZifCOEwI6HN*!<_45afEbT17w5kb&_^<)q*pn)p54qmT# z0J6pqU4hS&hp{Bo0D5HOXv6el(~W0p{a>;`xwuGpBtcq|%&CCaHz0o1g=r)uQAUH5 zPYI_1Z$~tmzpb$s_+o`~=xK&?FIpS_CPeUn9Ge&Lv=7k~6ufaXe-4HlKoxLU>Mt0o z(1Qt*+v03jev2_#hFFUIyBkLj_KCpAg02peTL(r*_bOU6DX$0>7b?zITwFZiP%c3% zOs&cY{*D=;UU4U1KV_TJtlBDuI7mPFbAM&G@T4RxhlO(#@G7Y=oT#?_`MQ;j4O25m z5krGiOX7VOc)d9-e{?_<19wcmB?R)17XYM^*H)3Jh*^rMwVv1fnA4>fge1&o6H$fX zS^+OS&`|hisHEXqD=sbw0LUp4BJlMW6h0RH=Rj;9wF*7SKLb4qXALS$>-^c3X%o&7 zi~G;q>A*C$@T{uf_%b93#P`!N8o`37h}4*^QgBHdLlT@K<8-v40bjhn7aU3n4Huu+VO4$R;IcV-verFmO2W5zfGi^2L^1%@PMY78-0#BBu}| zW3|m8o2T~v{rhcK@LTZtNJlWr8N=fY)Aq}3>;^x?%@MD=3&I6A#Yqb)H>9SoKt~M8 zWLr%MCKl?Uaa^px6S-|twtq2p!jfz79$Lv}+Y_d=uGl{iF7M&5Du}uY!jAK>GP})WM-4(rF0|GV#J8>H;RT`;sYx{$bwwSYoS+ zj?S0g8R|?@Kf+>PM~ecErK>BwtFPSY9OZY2Vp6%07MI}QkTVF$ zy3aFf_pcGCI;BDE6luA>B+Vlb7r3}sPcn=*URlZVEYb7O87hC5(b}V%O($}H!FRaI0d1q^j`A{F)OjK61y1;nhDLR%pj)*iKPfsW4n3g&R$#)L=(qLNOkb$evR(V3IsV>@bkr<lx{SlS$5sEC2ePeJNmutklKIx@fk=S= zZF3+{{(B;GWT?Ivq3cMo8MMSSH+rnLwwCp$$UD4j&9B&ze3t=nI=If5sqtmT{IwkY zgPw7w!8?9$A^R}}jnAI;H4bU;IG})rCXrNAc?X8?%C}?|>b>yh>+Cw(n?|)=uy<#TwYIii z0RTv>aq*m_=AWio4jcKcxm+Y*L^05z;yvYmp|8&(0E$qq2a4+Iuy+|5BR{sbxO$bl zo{%-Vzax_uzWVg-+c#t3n>FUVI~wX~&b+)l1$FfhIX(gR{rulT0`xMcdbGHle$7y` zRuoL~{yhPwH{X0Nt5XCzdqX&Zf1q+1qz;9{@5XWtz?D$=M~^J!dT*wN^xd0ehAXm+ zH*FZ?oN^_4fEXAI_)b;1EFm3d0&E>cO`7v3R%lwj-4%uBV}wff&K#ay40-%Mk0{DG zUy6sv7rQr`e6p2)@p7!mhPWoLO4vG!&xErxHoD5X01@ zgTtrgnuF7rn2RgS*~uswlZ@En*eq=JYohV(RlIRj6tOguIlNOwLkBB>v-}1=Ln5<6 zD#U5mXLL>I0)=3E|KtXUB)IxF#%v;9XYcA_okdPllY-@RTG}VGWmZ;JRRaUIt7bM6 zp4$C|$X|880zi}@WY?wKB_8Y>>^kH$?$1|GRK+_uaCj|JLMMXIHZUN6x;Q^i3JnxJ zy;=%J(XKP5As2oP%PKF>O|Gnj9UiGRn|`RhpYzLz^^}kodXL~RXdb^h5yhj~+1bfb zt(cRPOxBpWu?AjiRdzyz2c-7ziOno4)S0?_DcC|je*9ScP*xQtjY%4Iw&Yi(~zs@cz(QV&hO1c2w7P@h+`$qUfEgA%KDP{`KYeN4=VclHL~tyt>>u_ z8So!fxG@X%l!uHmaY`Hh)V>sne?tzvVvg=}4*>s??& zf#4zZ2Sq);YQs*;kkLAY3TWg2DD1YF1)Hki-gy-HGHhmKiBfZAL1833b&=^ z31g@Aq|}rymiizX0Q@e@)5TJOhVf$tYWL^r~~wH}@cYXw3vUtQQE z@BnFZZ23ak5^`EiX5O>|J`__Jvwih^66uw7FOMrM#q*9X`~c{$ingQ zNEEEno8zCYHg===EQcnxmj=JQ;4t50!6zX2vd=N~gC6o56{D?M$1%IUp12(m#c1lc zb)}1;@9jfs>giP=R0l>^0RvP@1lQK^z_4wZZwlp5*K5P>?*Ea7qc=+uKV3zKbwpBNLNsSKz_`rZ5!TNXZ@l zFyl7~377%`-g3r4-y2D^%^d>RrZtr-0jqD7CM9b`VHj}c*3!3Qc! zlsZ${tcwdO{ub)Ci4=n_+FxQq+6sq37a>1?&k?(s=&)Ez~0#(+;L{MBJ z{N4zXn=AQQf+=zB`D;SJ+sQCmn<2fDSehnY&mLxhmP%tmHa5P-ldNsxs!)JR>178G z%1+gvA5&xkN9!Y36TFYzj!(3_RE)2DI#tJY8>l8XZE;)O9um2M@`J}4QeJK5ziWcS zuq00yIBNP`Popr{nD}2PMy#s2Sm zogDS98|>g*`x%YF)uD)~zBmsnFiJ1*8hcGau;JW}FDs^`7-j z|2iiYI%El%Sg|?-gk(Wey0>rNxuJdj>crqzR$SbbUoy{Owe1AX(%rsom1Z+BH>O0L zuri-mgaZH`Na;OUOczpmudQAgF1k$evbjE|P#n>xi4G_lMGOcHU3jK~5-;Nm7Th0J zm>OV;&&XLW_FR03Z~_6T$`OOFX8m}|ekOuO#y@e9%WEw}_rmM++RH8~sw;F^c{Mg& z=x8V^5hSS(J~4+CrbjY%7)lf($iR{zX+Kx&de?B`Z!&#a!r$c2{x&1mXzM_T>1MX^ z4sv^OhV1Us`j9@3JTy0m6*8F>y*yW(c`uCVNX~ogON*P}p5D}xUir@j*PnX=*rKyfObmF1a&$TDpF}UV2)NV3`=TXCs_G3dHZ; ze`2{xdzU%@!y?Ofxh^=?n>?|3M)AxiSIv{6w^s|@5g4V^d?utGS)*;eNytg=Jvw^U z9Vl$g=h;1k)JiIvW z>WERjtMH&==Rqx*IHRk0#?jIO1Z~Z0Y8Q@0B zySADm1MDQ}I^+G)?}3SGud%L<4+agC^MCS$3*5Oj!GM0VSbp^K<=eEh5_|&+iVT}o zH+OfT^Cs4MI1FLJg<@!0}_c&PJ75liu4S|(-Zz3}U>=eGOl0N(8Ao&%m-mU^ zq&VpL>f~NH{7D+??nc_#*{NLq^5u(7r=FH`*SH#geM18k4^PeT_%JvRqy5;}m`x)2 zWNN>c8#&RR1YzAPIKCF;#wL!{E)55l=@s0{f)fy+zyEjiCHfo#V)VaYFZTZmoSNo% zifCx4`i8@ReWYkgn%Y&RT&}L;f5K$yrmgdJj`2bwze0h><+U_&%Y}RBnAblzjroQM zR}h<-W{O&#QWW5-L{QVwdKxwNBosO^Jn`AaF4iUsto{vb)SD(3{Tgm>-S0WDaSKJW zlCd17!t|nAXH|-woGPid^=~qW))Ezt0gdUG_X%{4dL<6j@+`?GEeaT64<5z>4irT$E)*0lB=7G-e~8GvexgGE0j$lj>5<=B*wIir*3HZgP-z# zH&s~<2b4LY-{YordS$7i53HQFJ->DHKGr%FqJ>l611wuI0h69oN7IE|MyvU+ZfQUA zX2(Cb4~*jh5N33_SNFZua9KA`Mnhdl%YHpucua;qI-u7y^>w{Y&)g{u2T!6NY=K?} zCj9`*&XN;~xWV4v9leEv`y^KkvC{8`1kklQ8&Bos+O@vY-ki*3 zNtH(@wjHdEk(-C0RR+~6EzeL+hlpo2^^6c4F3@pnY6jHteQ)48>>(9BI}k0>42X@r zjQxcgy!zu?@;^?M&IBbgHhraB6suKP5<+IhvmG-m(M z1|Yp^n@QxfXKwlLY2m(-ndR7heGs)5fxlffG34YoI>n#b1~6YY1f`EyT2kt1_gNCV z++f^`9Tino5?jM%>v>5A(s^t&M3Cg<}Lt&38tC<5xAVds}otTDFh)03kbM)fuA0k+lr>afoPT!W@jHrrwFmN zy^ucr2k050=H`844V5<*HNJUOBn}71po~XN>5*P0y|hV zMGCaV9Q$lKGZbqNeZ4_2g=@7)Vl@>b`InXs4w+Y{qnBxM?Yg---puR}Uwjt!6zA~N zB0RL^l1V_JT9MQS^PVm3FiMb{jom~?n-Ldz97^{1{o9UHylrY|)Q}iCx!q94E*|AS zvmang+`yxv4L7r_f`at|ju);-2BdQCZT7@ru1N-5{&Vk8s=tO3ZK}ROGbBoZ)EewA zlZ&2{6cz-BO5$mH(6&(wKRxqG~DV5pui2y+Z3Sra;piLDRFOwrj#`(Qv^jlWza40CY?rXu%c;{bbJwFRBQ z_Q2*iyuc)b>`^hv8&m`>*~07=^x>u^pJLrcLan=&xa@4|nYo#^@o~f}{{@LJ3fyd* zE4&GgV=$*zCP^XSS?dYg=Yq`C1V4JDodxD_AKhv(WuF3!{Lgvn@9NvrNt8ZSYXYAd zoe)%QslPX;Qjqs_8_&m4ko=y7XN!fjO#pw+`(IT025dxudv=-taoDrHdi7QhaVVui zQ7k>37Akpz9>}H{{1uvLObi_9#HSR3A%MNAZ)~6vv}5UsefS_fjP(dK6i`4!!%z2( zt*s-cpSgE!{@E>jc{bj11G;xmfcY1=_eTXNA?RBpQc_Y#$RU`4Kz*g4kL#SBeF%Az zmKGc+5!Nv{hyj#RN)D?4weyCpi_3wLqmz~!+2@K9Cl*78-`22>bbI5T_{Rh5naIIn z^k*I5&o6#R7Z$!=RrcX+J@zGfU?eIt49Mto$B=p0kF}0rM(pU>J3IRgdAY{=@}QMH zg)3C-NsfBoO-zalBtv$?KzIB3H3d5iWZ0k1D2*cLAKPUlzpCo05Fs%SMG!LBZ%Aa~ zZ-5aU7^f58zhBwTLacwiqwI5dAi#gTTc+LWjF&PqZ|c-X30V2APlAsdg*SgZ2Y+Lr zqKe^pd)M3=-fbCPm;dqhx!9ri#3u^R8~89VOcov4t~Kxh^qk?fO39dZ&eiZc|HR)A z&JJ_juM&omlGg6@j=x)!uea9&ivG%<>DinY^eZ*fGk1E`Mxg)$j$?AC8`eMrjdD3+xXQScy@!}B{O zr0u_Y?EYwj7eYi+r%G0)|G4RcK^64*4aYzP+I(iJp%x$x<#O&opPgMuN~J23hW74b zRv|J7=*eKb8W|Xfenp|mXVUiP;miyJJGZ3`lZb+XRgPD-acCxQJ-+}AaGQaJ*9T}~ zAklZvjON^51cL%EOf5my{UAqKSW4Q0j#si&3`p@*gz^C2QRInxcho!A-;T8M`%x1P zRuM&2;oC&jB@qFC!67#@`jC$g1hO;I6-a5bsF2HV7%(ufaHx9F7#knUi>+SFvYXtlx|by80l%@HUwI3_Qru@khp{6?8U25Tl;=-&Ur_ za><3w;7rU+N9#+z#DXUHDOcx4`ZL7$7Q!0$RLa6gsMvO@{eN`IX`OEUgDyi%K9ff( z%eDctfYoTz(>N)LY&aD>d+F(aP;vO`WcHLx8GIDL#rz;aHU#t)mYcZ2AomO<{!`FJ zr)4$TfNZibQxOp}7ZC333_7I5uH5&r8(tG!{@GDXkN};)?a`wD2*>ZJK_6Xka7q}k z_5NQs)vbkgWNzZsv5 zT8v)g?)Cg}rSKxJro&=G@JNe(6nF#@on1~^^|Y^dEP+R~Fs-cYytt%sEJO1DiST|D4;&*Co=auByT^02IQXS= z>E8-icq^@bcVu3|@jcMSWiTdy^*`#PV{@?eJNng5q!S}Y%WyElGZnUcC07y?QE%Vk zCa0zr2^s3^V{p;TQ)tg~;h5ooHs8*PZI#{+_Vb*6`o#GPDRAI^oSB(f`7@kWVeb20 zZU5#!34I?a?Lq&jcv!5csEWVO#UDOwMmw(y+Q&%fL{*y7Wi4XKcdI7&`1lMuh`^(h z$bx9^pegl^;^%*5t8gQS4>UA2O~$9}?@ho#$f0XSuGMlP2O^#kw^W zPQnvb#FWxO^*=FJ^sV`=7lcYTx8ZLMKPqQXGnjDzUwl!h#5=>EWA#5zT(%}(ewJ^k zcfWboqnHxp;0QA@o8bo>!pn8R%x~-(Bf0WEyH^M5QsXCI2C9Jb_cazgOhr5Qhb9Pe zE$zXS_=Fk*!T-%>#E|!=@|Pwxa3tM(n1E`@{z=2pNSv}{G>iA$jV~EhJ7UeH_tCNW z-eNQQ-Hk5+q}<~U0T^!{?4A2@DLoQGdyb^X@64im%-PW!*G*Bu$?tnj44kXjHP%&c zpT7p6Vvlh?6DX72YI*DIeXoc2$`mzzUD{j7HN{2vjQt!VPAjDVXpyxK@l#)%D z9H@Fz-^xJcX}TLnCa1Xt*iTMQpGS7~_Wv=4HdQbWgBM((wLVARhzyNSV|MCY4=|=m zbt9vb*r)kRc`ovPesqm=^j%IXw0bS<=2aWnECjN&#P87@IR~VxU}Hx|t)Yzn zL1g{>2dnYT#|wNJ%)Q=&{duR`k!bc@jkc~Ha?AVv1{u3O=lrZlVDmpdIk9z>l#(iN zt*Y|J$}eux&uImcrRkF=PZDoQh3R6R%PD=h8U8k89u$uGVprPPnUjmsHR3H8!f8c& zzk=6sAzhNQzW|?V0Sv#-8u`qAFl;*eH0jozQ9K)jg<@D7EH!HFe=6LyC1F!sg_8-Z zeJcSZmz;z3iS6}!>%qu(pNYealK~g20338Nvb2R2hI7Y>`TV0ih8T|o-_LriP`GUo^#-DA#ni7-yU3So3|D1d;B_rxxQMNng1;6Ev< z@6)+B8K0jDP;si-UXm~u_P>V21n$eUO?@;0;Ed@1|(%J9v&|)(-J;Lu9|kd zSELVZ4*gGD*OL?V`K8Xegq9k9B@h9DikP-I(2v^&98@LqBKwQs#=#P!s~bsw zlu#5`3#0O#%q%UL8#VyXHN>juHqW2D z>gsCg7zM~lvmSt$0Bjty$mh?W`}uuTIWC7y6wf_QI(I~djW(;lkd&=!%pT5z275hT z$@cM1;C}ia1=geP? zIU^_516A*O!c7Ni_u=Fm5O1tUZJ(n>3ROw!>+2~2h-qQ{aU`AA9a~U!p2lZsx*QmM z--Kd@3S(eoYzN<;u)6s4ggcDJZjgcH(?O?h8H!`gssk(^SZ{{lj zz|Hv+2MaB}-g_5b_f+2)*OSAcI_BSKS{mG;H2+ogESW;d{l*TyD?(@dv+$WBC0iQ|fxR%soiRrCrKCCHP%-??`#_z{O=<8KZeJ%_%><85( z@)+1mmr7e>0}2o)LA7sqSj^oWQ&XmtCOVT-2L^Cix$l6*y`rM$u@_QZiEBS!JNni5 z`n;Uu(94JA+=}x_hOiW~p<&Zg+x)%jdrA*b;OB?y$}4MoF<;)%tqnGuRGx5sR%(C$ zu}Vc@T z+%sIF$8nYBp{k=A2z1!4EeiIYv5n=ma3PV7@lGFc=$k<|bZ_)ia!e5=?iIW!-=>NbyMpZjFw zNM8K>(e`e5{?_;gSu(fqqvhgr%+wqk1J9B4r-((=Q%35Z{Cjr$93V&Ew%m@OKZZ3~ zrgg(H_L#3u*1AvNs1L_75p-Jp9`wX#=+hkWdpfai4(h-=4z2n&7+sHShl8ZxsN~x0 zHQw3I*k}CYCxpHcGo~`6i&bfY4_}lNV?7|V;a8M!cRvLkUyx1?0L(^rjEIpRKHMp< zs`|VjZ&kt}NpVB4^Y9^@{CfsC-n9%7%=Q=vh(s0x3bF_T0c4RSgn(>{tfHdCg*C!pKtT{uf`CXcLL@rKA_js)U?40a zi^wJj!y?K63c;{M!V-}{4Etu7p7&#_=GA-e)~)KUy4AP4y6^4&&iT%Fj*AdsIy%AF z0rmekAZ&uo2lcv}Jk%bUNmbczwRTVb5!YrT-El}{uYT@5>xcO7-@9K_SAUw#1sb0A z_HBs3K~Z?!1_&DFFCPY*%wR2+GsQkJVzx&_uq8e_3A_-hh?E5Lt)ZcTR05@qjWF*^ ztEH2p9FPDh_}pGCE^Xn0CXZ~Tk>B&1bVSwv0VLKCWQ7UTjj58cG!bc{X=${T^*_@8SDlV z@1GoAUt`AcxNmk?pzQ3;vCtk6dntz9%%8;tvEKRY+|9|+>$vyeudFy>({Y|PB_?YW zRuL-_XqIS0rAPbn+?OS!T1!lV0lExeS9rZiy_Qy(H?r>zOuqp4vVSeEyG_3ew9B_;_u0RH4+XX3t)IpNyOf)l-;6l2XbMe@xisx*?FQ zsbD__0%34xd|oWUD%wL^(jnG7x$lcFAp8BeeBpIAbKfxUM<5vyE&FS-QwXEpwdh5# zQDn_)+U%|Ck+kw$E^E4HxB<79zqJJqJV8k1TAzoAB13uKg`i&y#o zi9?Mq(wr4eWpXd(q`v`~VVZd!ra*V15C;H-mI5D^C2^% zjXFcnC&@v)TwN=s0T7b+d(>|$rV2M!ghG|niN~nYwqn$NEf2$`#IrORTQS2Zo6q>OhmY2_Fbms?}_7fLPNzuF2AqKESDs}R-sEHtu-!SYUKpNz;~!6 z3-L}KA@tr5R9V?g@29#BFc^$_CNts6Pn+Z_(WelRA#&H1!?3W$Wd+%sZFx+(llBkF zH>|G9Da_{q4-|VUkxeG|F&Oa3)TEAMX)%26E~uHAnTMw*hD_Qm@C9sau)~4GYAb`5 z0~WQhlBy!H{Atgax>(^uWJ_UzE_B-cPqHTAW^C&T4sm8iKCzdqG2dXYpvM_|bpYz; zhlu9Dth&$|WvA;KFrj?6v_-UC=*Fstvh&in(2d*>l38G){|Otx8w-39x>H=|W@IqM zk+};3d7G}|nRlvKKmeQ!Vi3s7;@0mm{gqVpWn+2=m^w_wUv9FF(^5;T0I?qF*bg8(b_()6lvH;zF&-9I{z zPyr!f5@SS!wto~vR!YpM2e)Z@1i||mjAURLv&Q6Rf0VC{FU}XEGG+qi7tH}i*3gDh zZeJ5|{?r{79v-cE+sw*J8N^NY1sQ`Iz#e;le>MHz=dFD@q=R!K8r8qrOz>pTwbvbA z-96KK$BuA6^(|vip^H%`eorbcwbCi-HyIh;WC7**l|gYH!Lul@xY#k9bFS2_Bh_nz zaN)6lfY|P*_{UQRFH^Fil*JmrPZ?5|~Cf73~2QM^RrgsiB<{sO)WaNP2 zPUEw_7HwH=##L~TJKRQTM_~8>3sciI`=B0e5S#kzjl6%ak~wYp%5@icOb5}dpxrt1 zkZnP-a^Jhrn&5pbmi&tLO<8&6qvsir)#DcFwJ0U9Hfaq;5pr@lir<^B>e)@0rIhi4 zf(%|wSnI%%g8`)^A{k>5B?7@qTu17Sj-|s)-#4}yDL&}K(w@23y}-}A<8T(u8w&?Z zYR=mye(=Xj+TOi&)mN+XiS-vYn>0sv?jIQNKdI6e#8045j$9a!!n@=oRXS;eznVf% z&ugoRCj6p{K#0uG&ui&4+%MEzva&04uWO;xcel2xhB#WZhyD!RRcQ@!hDh&OG!hc> zZl^ks-ZMG@z6gI!<_60^cj2x36eJP9fts!rT0_lWMMX_bR7mabN`rc45AVei?vU}< zuPeJ%GJDQJC4rKXJv)o1c{=COkN5^izEyEQAH6F#*SnM$tJnco!I{QxO9=2=rhDE* zZdFk(HAF>#hoq5*Ffqa==q>A^ literal 0 HcmV?d00001 diff --git a/lessons/install-editor/gedit_linenums.png b/lessons/install-editor/gedit_linenums.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6e6c5a54c5e0e6f165f821f8981b82b6c957ad GIT binary patch literal 28001 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 literal 0 HcmV?d00001 diff --git a/lessons/install-editor/gedit_prefs.png b/lessons/install-editor/gedit_prefs.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ea8b5c9a5243013b1833219559c7fe19ee5074 GIT binary patch literal 87034 zcmZsD1yEdDmo;%DNN@=df_rd>;KALc3GM`UNP-6o5Zr>hyLJff?(Xic{U6@@re>!8 zsT7sscK7Xb&fT*1+G`UeFDs6Wh>r*d2Zt>2NkkD2?&&!AF@b*xuBexlV1fT$>Pv}> zz`-8>{cg&M0#^{eeA2LogG0i2{CNVGkc0~^zH*R|5q-7%6dw}_gQ_1Z3l8oboP>y= zvdhfgyt50Y3eKP9#q1~|N$#J|KM5UP!);Tkh;ToB>i_lSi|3hnRO<4XKFV*Nzd>rE zk&If1&=r=T{3*mu-LObZA{A391BpE4ALK9PVR1f4qISR77|?!^s|-)#izWn5a?%f{ zH<+S>j_{vf(<~+@McC&l;UzqgRc z_oGq`Kqdb5?w{Wy&Hudwh`}aphMMW~)>$-P%xJzqm z(&PEX+;}EdyOh4#q$kb?SJ(3tymw4NK|$@B0vH$=dwYBKg%DFys*8&YJ2a%nuMT7E z?dpQpbG4TccH^&K1>Ce(U9@3RRbDEZU1-;0-Rh=uVqoBxw{PDLkJ2s( zWYR`U3JD9Z&0$9>Bc&mI|Niv UTdnw2J6@@XV0qTf^0a82#nFYL37)sZ0;?B^Il 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 editoru +

    Editor, program na úpravu textu, je základní pomůcka +každého programátora, +takže je dobré do něj investovat trochu času.

    +

    Je víceméně jedno, který programátorský editor budeš používat. +Pokud už nějaký oblíbený máš, stačí ho jen nastavit; +jestli ne, nějaký ti doporučíme. +Pokud ale používáš Poznámkový blok (Notepad) z Windows, +nebo TextEdit (editor předinstalovaný v macOS), +nebude ti stačit. +Stejně tak nejsou vhodné programy jako Word či Writer.

    +

    Co programátorský editor umí

    +

    Editor pro programátory nám umožňuje upravovat prostý text – písmenka. +Na rozdíl od programů jako Word, Writer či Pages neumožňuje text formátovat, +tedy dělat nadpisy, obarvovat, zvětšovat font, vkládat obrázky a podobně.

    +

    Pomocí editoru budeme zadávat počítači příkazy, takže formátování nepotřebujeme. +Porovnej sám/sama, jaký je rozdíl mezi následujícími příkazy +pro někoho, kdo se jimi má řídit:

    +
      +
    • Nakresli mi beránka!
    • +
    • Nakresli mi beránka!
    • +
    +

    To, že neumí formátování, neznamená že jsou naše editory úplně „hloupé“ +nástroje. +Aby se nám programy upravovaly pohodlněji, mají několik vychytávek:

    +
    +
    Podpora více souborů

    Větší projekty sestávají z více souborů, které můžeš mít v editoru +otevřené všechny najednou.

    +
    Číslování řádků

    Před každým řádkem se ukazuje číslo. +To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.

    +
    Odsazování

    V Pythonu je důležité, kolika mezerami řádek začíná. +Správně nastavený editor nám odsazování značně zjednoduší.

    +
    Obarvování

    Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám +obarvením může napovědět, jak našim instrukcím bude počítač rozumět. +Ale je to jenom nápověda: +programátor s jinak nastaveným editorem může mít stejný soubor obarvený +docela jinak.

    +

    Pro ilustraci, takhle může v editoru vypadat kousek kódu:

    +
        1  @app.route('/courses/<course:course>/')
    +    2  def course_page(course):
    +    3      try:
    +    4          return render_template(
    +    5              'course.html',
    +    6              course=course,
    +    7              plan=course.sessions,
    +    8          )
    +    9      except TemplateNotFound:
    +   10          abort(404)
    +

    Volba a nastavení editoru

    +

    Vybereš-li editor, klikni na jeho jméno a dostaneš se na instrukce ke stažení +a nastavení. +(Na tuhle stránku se pak už nemusíš vracet.)

    +
      +
    • Visual Studio Code – doporučený editor pro +Windows a macOS (a vhodný i pro Linux). +V poslední době je to asi nejpopulárnější editor kódu. +Nabízí mnoho funkcí a má velkou základnu uživatelů a vývojářů, +takže se neustále vylepšuje.
    • +
    +

    Na Linuxu budeš mít pravděpodobně už nainstalovaný Gedit nebo Kate. +Zkus se podívat do systémové nabídky, jestli jeden z nich máš (případně je +spusť z příkazové řádky jako gedit, resp. kate). +Pokud ano, klikni na odkaz níže a editor si nastav. +Nemáš-li ani jeden, vyber Visual Studio Code (viz výše).

    +
      +
    • Gedit – bývá na systémech s prostředím GNOME.
    • +
    • Kate – bývá na systémech s prostředím KDE.
    • +
    +

    Existují i jiné editory, na které máme návody +nebo jsme je doporučovali ve starších verzích těchto materiálů. +Pokud se jeden z nich rozhodneš použít, neuděláš chybu:

    +
      +
    • Atom – kvalitní editor s jednoduchým designem
    • +
    • Notepad++ – nenáročný editor +pro Windows vhodný pro pomalejší počítače
    • +
    +

    Máš-li už svůj oblíbený editor – Vim, Emacs, Geany, apod., použij ten:

    +
      +
    • Ostatní – máš-li jiný editor, zkontroluj +si že je správně nastaven.
    • +
    +

    IDE

    +

    Existují i složitější a mocnější editory, takzvané IDE (angl. Integrated +Development Environment, integrované vývojové prostředí), +třeba PyCharm, Eclipse nebo KDevelop. +Umí spoustu pokročilých funkcí, které programátorům pomáhají: +našeptávání, přejmenovávání, spouštění programů, správu virtuálních prostředí +a podobně. +Na začátek ale nejsou moc vhodné.

    +

    Chceš-li takový editor přesto použít, měl/a bys ho už poměrně dobře znát: +vědět, co za tebe dělá editor a jak to spravit, až něco udělá špatně.

    \ No newline at end of file diff --git a/lessons/install-editor/kate.html b/lessons/install-editor/kate.html new file mode 100644 index 00000000..4cef500a --- /dev/null +++ b/lessons/install-editor/kate.html @@ -0,0 +1,68 @@ +

    Instalace Kate

    +

    Na Linuxu se Kate instaluje jako ostatní programy:

    +
    +
    Fedora
    $ sudo dnf install kate
    +
    Ubuntu
    $ sudo apt-get install kate
    +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +

    Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

    +

    Nastavení

    +
    +
    Číslování řádků

    V menu Pohled/View vyber +Ukazovat čísla řádek/Show Line Numbers.

    +
    Odsazování

    V Menu Nastavení/Settings vyber +Nastavit 'Kate'/Configure Kate.

    +

    Tam v Úpravy/Editing vyber +Odsazování/Indentation.

    +

    Tam nastav:

    +
      +
    • Výchozí režim odsazení/Default indentation mode: Python
    • +
    • Odsazovat pomocí/Indent using: Mezer/Spaces
    • +
    • Šířka tabulátoru/Tab Width: 4 znaky
    • +
    • Odsadit pomocí/Indentation width: 4 znaky
    • +
    • Klávesa Backspace zpětně odsazuje v úvodních mezerách/Backspace key in leading blank space unindents
    • +
    +
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +koncovky souboru – např. .py pro Python.

    +

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co +nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install-editor/notepad-plus-plus.html b/lessons/install-editor/notepad-plus-plus.html new file mode 100644 index 00000000..2198bbf9 --- /dev/null +++ b/lessons/install-editor/notepad-plus-plus.html @@ -0,0 +1,55 @@ +

    Instalace Notepadu++

    +

    Notepad++ je k dispozici pouze pro Windows.

    +

    Stáhni jej z jeho domovské stránky +a nainstaluj.

    +

    Nastavení

    +
    +
    Odsazování

    V menu Nastavení zvol Předvolby a pak nastav +„Nastavení tabulátoru/Tab Settings“ na +„Zaměnit za mezery/Replace by Space“.

    +

    Obarvování bude fungovat automaticky v souborech s koncovkou .py +(jako Python). +V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    +

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, +měl/a bys ho co nejdřív uložit pod správným jménem.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install-editor/others.html b/lessons/install-editor/others.html new file mode 100644 index 00000000..cad7e3fc --- /dev/null +++ b/lessons/install-editor/others.html @@ -0,0 +1,77 @@ +

    Instalace editoru

    +

    Používáš-li editor, pro který nemáme instrukce, budeš ho muset nastavit +sám/sama. +Tady je pár tipů, na co si dát pozor.

    +

    Nastavení

    +

    Číslování řádků

    +

    Ujisti se, že ti editor čísluje řádky. +Pokud ne, podívej se do nastavení a zjisti, jak se to zapíná.

    +

    Obarvování

    +

    Ulož soubor s koncovkou .py – například zkouska.py – a zkopíruj do něj +následující program:

    +
    def foo():
    +    return "abc" * 2
    +

    Jestli se text automaticky obarví (klidně jinými barvami než tady), +je tvůj editor nastavený správně. +Jinak se podívej do nastavení a zjisti, jak se to zapíná.

    +

    Odsazování

    +

    Stisknutím klávesy Tab na začatku řádku se vloží 4 mezery. +Pro psaní a sdílení kódu v Pythonu je důležité, +aby byly čtyři a aby to byly opravdu mezery.

    +

    Jestli to jsou mezery, se dá zjistit tak, že odsazení na začátku vybereš myší. +Jde-li vybírat po jednotlivých mezerách, je všechno v pořádku.

    +

    Nejde-li vybírat po jednotlivých mezerách, nebo pokud se jich po stisknutí +Tab vloží jiný počet než 4, podívej se do nastavení po možnostech +jako „velikost odsazení“ nebo „nahrazovat tabulátory za mezery”.

    +

    Kontrola stylu zdrojového kódu

    +

    Editory často podporují instalaci pluginů, které mohou psaní kódu usnadnit +a pomoci s jeho kontrolou. +Jeden z neužitečnějších je plugin pro kontrolu správného stylu zdrojového kódu.

    +

    Tak jako čeština má Python typografická providla. +Například za čárkou se píše mezera, ale před ní ne. +Jsou nepovinná, program bude fungovat i při jejich nedodržení, +ale pomáhají psát přehledný kód, tak je dobré je dodržovat už od začátku. +Tato pravidla jsou popsána +v dokumentu PEP8.

    +

    Zkus takový plugin pro svůj editor najít a nainstalovat.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install-editor/vscode.html b/lessons/install-editor/vscode.html new file mode 100644 index 00000000..5fba1304 --- /dev/null +++ b/lessons/install-editor/vscode.html @@ -0,0 +1,57 @@ +

    Instalace Visual Studio Code

    +

    Stažení a instalace

    +

    Editor si můžeš stáhnout z jeho domovské stránky. +Vyber na ní zelené tlačítko Download a vyber instalátor pro svůj systém. +Dále se řiď instrukcemi instalátoru jako u každého jiného programu.

    +

    Nastavení

    +

    Ve Visual Studio Code se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

    +

    Odesílání telemetrických dat

    +

    Tento textový editor ale odesílá data o tvém používání (nejspíš včetně např. +obsahu otevřených souborů). +Pokud si nepřeješ aby se data odesílala, můžeš odesílání zrušit:

    +
      +
    • Otevři File > Preferences > Settings (macOS: Code > Preferences > Settings).
    • +
    • Vyhledej telemetry.enableTelemetry a odškrtni tento záznam.
    • +
    +

    Viz též původni postup v angličtině.

    +

    Nácvik odsazování

    +

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. +Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. +Pojďme si ukázat, jak na to.

    +

    Zkopíruj si do editoru tento text:

    +
    Ofelie:
    +Ach princi!
    +Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +Mám od vás, princi, stále ještě dárky,
    +Jež dávno toužím vrátit. Prosím vás,
    +račte je přijmout teď.
    +Hamlet:
    +Kdo? Já? Já nikdy
    +vám nedal nic.
    +Ofelie:
    +Dal, Výsosti. A spolu s dárky slova
    +tak rozmilá, že každý z nich
    +měl jejich vůni. Ta teď vyvanula,
    +a tak je vracím. Dary nejbohatší
    +se mění v trety, když se dárce mračí.
    +Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    +
    Ofelie:
    +    Ach princi!
    +    Jak má se Vaše Výsost už tak dlouho?
    +Hamlet:
    +    Děkují poníženě: skvěle, skvěle, skvěle.
    +Ofelie:
    +    Mám od vás, princi, stále ještě dárky,
    +    Jež dávno toužím vrátit. Prosím vás,
    +    račte je přijmout teď.
    +atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +klávesu Tab. +Každým stisknutím řádek odsadíš o 4 mezery.

    +

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    +

    Chceš-li odsadit víc řádků najednou, všechny je vyber a stiskni Tab. +I výběr můžeš „od-odsadit“ pomocí Shift+Tab.

    +

    A to je vše! Teď máš nejen nastavený editor, ale umíš ho i používat.

    \ No newline at end of file diff --git a/lessons/install/index.1.html b/lessons/install/index.1.html new file mode 100644 index 00000000..370b9b47 --- /dev/null +++ b/lessons/install/index.1.html @@ -0,0 +1,60 @@ +

    V tomto kurzu budeme používat virtuální prostředí. +Jedná se o oddělené prostředí pro Python, kam se dají instalovat jednotlivé +knihovny, které jsou potom aktivní jen uvnitř. +Použití prostředí má dvě hlavní výhody:

    +
      +
    • Je-li prostředí aktivované, +příkaz python spustí verzi Pythonu, se kterou bylo prostředí nainstalováno. +Takže pak např. v materiálech nemusíme mít speciální instrukce pro +Linux (python3) a Windows (py -3).

      +
    • +
    • Instalace knihoven nezasahuje do systémového nastavení, ani do jiných +virtuálních prostředí. +Můžeš tak oddělit jednotlivé projekty; v každém prostředí můžou být +nainstalované jiné verze knihoven. +A když se něco pokazí, adresář s virtuálním prostředím můžeš prostě smazat +a vytvořit znovu.

      +
    • +
    +

    Následují zrychlené instrukce; předpokládám, že Python (3.6 a vyšší) +už máš nainstalovaný a že znáš základy práce +s příkazovou řádkou.

    +

    Podrobný postup instalace Pythonu a vytvoření prostředí je je popsán +v příslušné lekci pro začátečníky. +Modul venv je součást standardní knihovny.

    +

    Unix (Linux, macOS)

    +

    Zkontroluj, že máš modul ensurepip:

    +
    $ python3.7 -m ensurepip --version
    +pip 18.0 (nebo i jiná verze)
    +

    Jestli ne, postupuj podle lekce pro začátečníky – +jsou tam podrobnější instrukce. +Jinak použij:

    +
    $ mkdir project
    +$ cd project
    +$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
    +$ . __venv__/bin/activate  # aktivace
    +(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    +(__venv__)$ ...  # práce "uvnitř"
    +(__venv__)$ deactivate  # vypnutí virtualenvu
    +

    Windows

    +
    > mkdir project
    +> cd project
    +> py -3 -m venv __venv__
    +> __venv__\Scripts\activate
    +(__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
    +(__venv__)> ...  # práce "uvnitř"
    +(__venv__)> deactivate  # vypnutí virtualenvu
    +

    Poznámky

    +

    Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu +pracovat.

    +

    Ono __venv__ je jen jméno adresáře. Můžeš si ho pojmenovat jak chceš; dokonce +nemusí být v rámci adresáře s projektem. +Někteří lidé mají všechny virtuální prostředí na jednom místě; dokonce existuje +nástroj virtualenvwrapper na správu takového řešení, případně pipenv, +který Python Packaging Authority doporučuje pro vývoj aplikací (my ale +budeme vyvíjet i knihovny).

    +

    Autoři tohoto textu tedy doporučují __venv__ v adresáři s projektem. +Při použití v kombinaci s Gitem nezapomeň tento adresář přidat do souboru +.gitignore.

    +

    Příkaz python -m pip install nainstaluje danou knihovnu – může to být i jiná +než requests jako výše.

    \ No newline at end of file diff --git a/lessons/install/index.2.html b/lessons/install/index.2.html new file mode 100644 index 00000000..26e25898 --- /dev/null +++ b/lessons/install/index.2.html @@ -0,0 +1,80 @@ +

    Git

    +

    Další program, který budeme později potřebovat, +nám později umožní (mimojiné) spolupracovat +na vznikajících programech s ostatními. +Jmenuje se Git. +Pojďme si ho nainstalovat a nastavit.

    +

    Instalace je různá pro různé operační systémy, vyber ten svůj.

    +

    Linux

    +

    Instalaci na Linux zvládneme jedním příkazem:

    +

    Fedora, RHEL:

    +
    $ sudo dnf install git gitk git-gui nano
    +

    Ubuntu, Debian:

    +
    $ sudo apt-get install git gitk git-gui nano
    +

    U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, +gitk, git gui a nano.

    +

    Jestli máš nainstalováno, ještě nastav Gitu editor. +Pokud nemáš rád/a Vim (nebo nevíš co to je), +zadej tento příkaz:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením níže.

    +

    Windows

    +

    Jdi na stránku git-scm.org, stáhni si +Git a nainstaluj si ho.

    +

    Při instalaci se ujisti, že jsou vybrány tyto volby:

    +
      +
    • Adjusting your PATH enviroment: Git from the command line and also from 3rd-party software
    • +
    • Configuring the line ending conversions: Checkout Windows-style, commit Unix-style line endings
    • +
    +

    Ostatní možnosti neměň.

    +

    Potom Gitu nastav editor. +Máš-li otevřenou příkazovou řádku, zavři ji a otevři novou. +(Instalace mění systémové nastavení, které se musí načíst znovu.) +V nové příkazové řádce zadej:

    +
    > git config --global core.editor notepad
    +> git config --global format.commitMessageColumns 80
    +> git config --global gui.encoding utf-8
    +

    A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

    +

    macOS

    +

    Spusť v příkazové řádce git. +Je-li už nainstalovaný, dozvíš se, jak ho používat +(výpis začíná usage). +Jinak ho nainstaluj pomocí Homebrew:

    +
    $ brew install git git-gui
    +

    Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, +i když sis v rámci instalace editoru nainstaloval/a např. Atom). +Dělá se to tímto příkazem:

    +
    $ git config --global core.editor nano
    +

    Dál pokračuj obecným nastavením:

    +

    +

    Nastavení

    +

    Na projektu, který bude uložen v Gitu, může +spolupracovat více lidí. +Aby šlo dohledat, kdo udělal kterou změnu, je Gitu +potřeba říct jméno a e-mail. +Do příkazové řádky zadej následující příkazy, změň v nich ale +jméno a adresu:

    +
    $ git config --global user.name "Adéla Novotná"
    +$ git config --global user.email adela.novotna@example.cz
    +

    Můžeš samozřejmě použít i přezdívku, nebo dokonce +falešný e-mail, ale v takovém případě bude složitější se +zapojit do týmových projektů. +Každopádně, jméno i e-mail jdou kdykoli změnit +tím, že konfigurační příkazy zadáš znovu.

    +

    Pokud se bojíš spamu, neboj: nezačneš ho dostávat víc +než při normálním používání e-mailu. +Adresa se zobrazí jen lidem, kteří si stáhnou projekt, +do kterého jsi přispíval/a. +Spammeři se většinou zaměřují na méně technicky zdatné +lidi, než jsou uživatelé Gitu. :)

    +

    Dále si můžeš nastavit barevné výpisy – pokud si tedy +(jako někteří autoři Gitu) nemyslíš, že příkazová +řádka má být černobílá:

    +
    $ git config --global color.ui true
    +

    Spuštění git config nevypíše žádnou hlášku, že se operace povedla. +To je normální; stejně se chová spousta dalších příkazů, např. cd.

    +

    Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

    +
    $ git config --global --list
    +user.name=Adéla Novotná
    +user.email=adela.novotna@example.cz
    +

    A to je vše! Git máš nainstalovaný. Gratuluji!

    \ No newline at end of file diff --git a/lessons/install/index.html b/lessons/install/index.html new file mode 100644 index 00000000..01ca2f59 --- /dev/null +++ b/lessons/install/index.html @@ -0,0 +1,12 @@ +

    Instalace Pythonu

    +

    V této sekci nainstalujeme Python.

    +

    To se na každém druhu operačního systému dělá trošku jinak. +Vyber si stránku podle svého systému:

    + +

    Pokud máš jiný systém než Linux, Windows nebo macOS, +nebo pokud ke svému počítači neznáš administrátorské heslo, +napiš nám prosím e-mail.

    \ No newline at end of file diff --git a/lessons/install/linux.html b/lessons/install/linux.html new file mode 100644 index 00000000..50ff62ff --- /dev/null +++ b/lessons/install/linux.html @@ -0,0 +1,63 @@ +

    Instalace Pythonu na Linux

    +

    Nainstalovat Pyhon na Linux je většinou jednoduché. +Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, +tak jsou tyhle instrukce trochu delší. +Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

    +

    Instalace Pythonu 3

    +

    Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť +v příkazové řádce příkaz:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Přejdi na další sekci, kontrolu tkinter.

    +

    Objeví-li se „Python“ a verze 3.5 nebo nižší, +aktualizuj systém (nebo se poraď s někým, kdo to umí) a zkus to znovu.

    +

    Objeví-li se bash: python3: command not found nebo podobná chyba, +doinstaluj Python. +Konkrétní příkaz záleží na distribuci:

    +
      +
    • Fedora:
      $ sudo dnf install python3
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    +

    Kontrola Tkinter

    +

    Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti +Pythonu. +Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) +často musíme nainstalovat zvlášť. +Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

    +
    $ python3 -m tkinter
    +

    Objeví-li se okýnko, je všechno v pořádku. +Zavři ho a přejdi na doinstalování virtualenv.

    +

    Jestli ne, modul tkinter ještě nainstaluj:

    +
      +
    • Fedora:
      $ sudo dnf install python3-tkinter
      +
    • +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      +
    • +
    +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    +

    +

    Doinstalování Virtualenv

    +

    Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. +Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu +vyřadily). +Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

    +

    Spusť v příkazové řádce příkaz:

    +
    $ python3 -m ensurepip --version
    +

    Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. +Zbytek této sekce můžeš přeskočit!

    +

    Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat +alternativu, Virtualenv:

    + + +
      +
    • Ubuntu:
      $ sudo apt-get install python-virtualenv
      +
    • +
    +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    +

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později +při vytváření virtuálního prostředí.

    \ No newline at end of file diff --git a/lessons/install/macos.html b/lessons/install/macos.html new file mode 100644 index 00000000..75171382 --- /dev/null +++ b/lessons/install/macos.html @@ -0,0 +1,15 @@ +

    Instalace Pythonu pro macOS

    +

    Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje +instalaci aplikací a knihoven, které budeme potřebovat pro programování. +Jak na to?

    +

    Spusť v příkazové řádce příkaz:

    +
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +

    Pak zadej následující příkaz a Python bude nainstalovaný:

    +
    $ brew install python3
    +

    Zkontroluj si, že máš verzi 3.6 nebo vyšší:

    +
    $ python3 --version
    +

    Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) +a verze je 3.6 nebo vyšší, máš nainstalováno. +Jinak je něco špatně; +zkus instalaci znovu. +Když to nevyjde, poraď se s někým zkušenějším.

    \ No newline at end of file diff --git a/lessons/install/windows.html b/lessons/install/windows.html new file mode 100644 index 00000000..de9dbcff --- /dev/null +++ b/lessons/install/windows.html @@ -0,0 +1,26 @@ +

    Instalace Pythonu pro Windows

    +

    Běž na stahovací stránku Pythonu +a stáhni si instalátor nejnovější stabilní verze Pythonu. +Ověř si že je to verze 3.6.0 nebo novější – +verze 3.6.0 má jistá vylepšení, která budeme v tomto kurzu používat.

    +

    Jak poznat, který instalátor je ten pravý? +Pokud má tvůj počítač 64bitovou verzi Windows, +stáhni si Windows x86-64 executable installer. +Pokud máš starší počítač s 32bitovými Windows, +stáhni si Windows x86 executable installer. +(Rozdíl je v x86-64 versus x86.)

    +

    Kde zjistíš, zda máš 32bitové nebo 64bitové Windows? Otevři nabídku +Start, vyhledat „Systém“ a otevřít Systémové informace. +Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

    +

    Screenshot zjišťování verze systému

    +

    Stažený instalátor spusť. +Na začátku instalace zaškrtni Install launcher for all users +a také Add Python to PATH. +Tyto volby ti zjednoduší vytvoření virtuálního prostředí.

    +

    (Jestli nemáš administrátorské oprávnění, volbu +Install launcher for all users nezaškrtávej.)

    +

    Screenshot instalace Pythonu

    +

    Pak zmáčkni Install now a dále se drž instrukcí.

    +

    Máš-li otevřenou příkazovou řádku, po instalaci Pythonu ji zavři a otevři +novou. +Instalace mění systémové nastavení, které se musí načíst znovu.

    \ No newline at end of file diff --git a/lessons/install/windows_32v64-bit.png b/lessons/install/windows_32v64-bit.png new file mode 100644 index 0000000000000000000000000000000000000000..70550e8422832fcc3cb696ab40b29d5a5b141d5a GIT binary patch literal 36230 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

    x-X)=B8Ao1rrt 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 literal 0 HcmV?d00001 diff --git a/lessons/installing-naucse/index.html b/lessons/installing-naucse/index.html new file mode 100644 index 00000000..7b9e8656 --- /dev/null +++ b/lessons/installing-naucse/index.html @@ -0,0 +1,40 @@ +

    Lokální instalace Nauč se python

    +

    K přidání kurzu nejdřív člověk potřebuje vlastní, lokální instalaci webové aplikace Nauč se Python.

    +

    Příprava

    +

    První věc, kterou budeš potřebovat, je Python, a to alespoň ve verzi 3.6. +Pokud zrovna danou verzi Pythonu nainstalovanou nemáš, můžeš postupovat podle návodu na instalaci Pythonu.

    +

    Druhá věc, kterou budeš potřebovat, je Git – pokud nemáš ten, můžeš postupovat podle návodu na instalaci Gitu.

    +

    Poslední věc, kterou potřebuješ, už není žádný program, ale pár schopností. +Je potřeba, aby jsi uměl/a pracovat s příkazovou řádkou (terminálem) a s Gitem. +Vše potřebné si můžeš připomenout v návodu na používání terminálu, respektive v návodu na používání Gitu.

    +

    Instalace

    +

    Nauč se Python používá k definici závislostí Pipenv, který si nejspíš budeš muset doinstalovat. +Postupovat můžeš podle návodu na instalaci Pipenvu.

    +

    Po instalaci si musíš naklonovat repozitář, ze kterého se Nauč se Python vykresluje. +To uděláš tímto příkazem:

    +
    $ git clone https://github.com/pyvec/naucse.python.cz
    +

    Poté přepni adresář do naklonovaného repozitáře:

    +
    $ cd naucse.python.cz
    +

    Zbývá už jen nainstalovat závislosti, to uděláš pomocí následujícího příkazu, který za tebe zároveň i vytvoří virtuální prostředí.

    +
    $ pipenv install
    +

    +

    Spuštění

    +

    Nauč se Python jde pustit ve dvou režimech. +První režim vykresluje každou stránku pokaždé znova – hodí se na vývoj, aby byly všechny změny okamžitě vidět. +Pustí se následovně:

    +
    $ pipenv run naucse serve
    + * Running on http://0.0.0.0:8003/ (Press CTRL+C to quit)
    + * Restarting with stat
    + * Debugger is active!
    + * Debugger PIN: 256-270-314
    +

    V ukázce vidíš rovnou i příklad toho, co to vypíše – zajímá tě jen adresa, zde http://0.0.0.0:8003/ (u tebe se může lišit). +Když si ji zkopíruješ a otevřeš ve webovém prohlížeči, uvidíš vlastní běžící Nauč se Python.

    +

    Druhý režim nejdříve vykreslí všechny stránky a až poté ti je zobrazí – hodí se spíše na kontrolu toho, že se při vývoji nic nepokazilo. +Pustí se následovně (pozor, nějakou chvíli to trvá):

    +
    $ pipenv run naucse freeze --serve
    +Generating HTML...
    + * Running on http://127.0.0.1:8003/ (Press CTRL+C to quit)
    +

    Když odnaviguješ například do seznamu kurzů, je možné, že tam nebudou všechny. +To jsou kurzy, které se vykreslují z jiných forků, které jsou na lokálním prostředí +automaticky vypnuté.

    +
    \ No newline at end of file diff --git a/lessons/json/index.html b/lessons/json/index.html new file mode 100644 index 00000000..33749afa --- /dev/null +++ b/lessons/json/index.html @@ -0,0 +1,102 @@ +

    JSON

    +

    Existují i jiné programovací jazyky než Python.

    +

    Ostatní jazyky neumí pracovat s pythonními hodnotami. +Budeš-li se chtít s takovými programy „domluvit” – +předat jim nějaké informace ke zpracování +nebo od nich dostat výsledky – +musíš informace předávat v nějaké zjednodušené podobě.

    +

    Typy

    +

    Většina programovacích jazyků má nějaká čísla, nějaký druh seznamů, +nějakou odrůdu řetězců a nějakou variaci na slovníky +(nebo několik způsobů jak slovníky vytvořit). +Dále má spousta jazyků způsob, jak zapsat +True, False a None.

    +

    Tyhle základní typy většinou stačí na předání +jakékoli informace v rozumně čitelné podobě, +i když ne ve všech jazycích mají přesné ekvivalenty +(třeba Python má dva základní druhy čísel – int a float). +Často se proto v komunikaci omezíme na ně.

    +

    Kódování dat

    +

    Další problém je přenos dat: +abys mohl/a informace zapsat na disk nebo přenést +přes Internet, musíš je převést na sekvenci bytů (čísel od 0 do 255). +Zjednodušeně řečeno, musíš je převést na řetězec.

    +

    Existuje spousta způsobů, jak zakódovat data do textu. +Každý způsob se snaží najít vhodnou rovnováhu mezi +čitelností pro lidi/počítače, délkou zápisu, +bezpečností, možnostmi a rozšiřitelností. +My už známe syntaxi Pythonu:

    +
    {
    +    'jméno': 'Anna',
    +    'město': 'Brno',
    +    'jazyky': ['čeština', 'angličtina', 'Python'],
    +    'věk': 26,
    +}
    +

    Jiný způsob zápisu dat je YAML:

    +
    jméno: Anna
    +město: Brno
    +jazyky:
    +  - čeština
    +  - angličtina
    +  - Python
    +věk: 26
    +

    Nebo třeba Bencode:

    +
    d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

    Existují i netextové formáty, jako +Pickle 3:

    +
    }q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X       ÄeÅ¡tinaqX
    +                                                          angliÄtinaXPythonq       eXvÄq
    +K▒u.

    A nakonec uvedu JSON +(z angl. Javascript Object Notation „zápis Javascriptových objektů”), +který se pro svou jednoduchost rozšířil na Internetu nejvíc:

    +
    {
    +  "jméno": "Anna",
    +  "město": "Brno",
    +  "jazyky": ["čeština", "angličtina", "Python"],
    +  "věk": 26
    +}
    +

    Pozor na to, že ačkoli JSON vypadá podobně jako zápis +v Pythonu, je to jiný formát s vlastními pravidly. +Nezaměňuj je!

    +

    Aspoň ze začátku nedoporučuji JSON psát ručně; +nech na počítači, aby dal na správné místo správné +čárky a uvozovky.

    +

    JSON v Pythonu

    +

    Kódování objektů v JSONu je jednoduché: existuje modul json, +jehož metoda loads načte data z řetězce:

    +
    import json
    +
    +json_retezec = """
    +    {
    +      "jméno": "Anna",
    +      "město": "Brno",
    +      "jazyky": ["čeština", "angličtina", "Python"],
    +      "věk": 26
    +    }
    +"""
    +
    +data = json.loads(json_retezec)
    +print(data)
    +print(data['město'])
    +

    A pak tu je metoda dumps, která naopak daná data zakóduje +a vrátí řetězec:

    +
    >>> print(json.dumps(data))
    +{"v\u011bk": 26, "jm\u00e9no": "Anna", "jazyky": ["\u010de\u0161tina", "angli\u010dtina", "Python"], "m\u011bsto": "Brno"}
    +

    To, co vrátí jednoduché zavolání dumps(data) je vhodné pro počítačové +zpracování; +má-li výsledná data číst člověk, nastav +ensure_ascii=False (aby se písmenka s diakritikou nekódovala pomocí \) +a indent=2 (odsazení dvěma mezerami).

    +
    >>> print(json.dumps(data, ensure_ascii=False, indent=2))
    +{
    +  "věk": 26,
    +  "jméno": "Anna",
    +  "jazyky": [
    +    "čeština",
    +    "angličtina",
    +    "Python"
    +  ],
    +  "město": "Brno"
    +}
    +

    Kompletní popis modulu json – +včetně funkcí na zápis/čtení přímo do/ze souborů – +je v příslušné dokumentaci.

    \ No newline at end of file diff --git a/lessons/list/index.html b/lessons/list/index.html new file mode 100644 index 00000000..f571bf52 --- /dev/null +++ b/lessons/list/index.html @@ -0,0 +1,414 @@ +

    Tahle kapitola je plná nových věcí. +Doufám, že vydržíš až do konce. A kdyby něco +zatím nedávalo úplně smysl, nevěš hlavu: +věci, které si teď vysvětlíme, se opravdu naučíš +až v dalších lekcích, kde je budeme využívat +prakticky.

    +

    Encyklopedické informace z této stránky shrnuje +Tahák na seznamy, +který si doporučuji vytisknout.

    +

    Každý příklad v tomto textu si vyzkoušej; +to, co Python vypíše, je důležitá součást lekce, +i když v materiálech není přímo napsaná.

    +

    Seznamy

    +

    Dnes si ukážeme, jak pracovat se seznamy (angl. lists). +Doufám, že víš, kde máš na klávesnici hranaté +závorky, protože právě těmi se seznamy vytváří:

    +
    cisla = [1, 1, 2, 3, 5, 8, 13]
    +print(cisla)
    +

    Nemůžeš najít hranaté závorky? +Na české klávesnici zkus pravý Alt + F a G.

    +

    Seznam je hodnota, která může obsahovat spoustu dalších hodnot. +Tak jako řetězec obsahuje sekvenci znaků, +seznam obsahuje sekvenci... čehokoliv. Třeba čísel. +A tak jako můžeme pomocí cyklu for +procházet řetězec po znacích, +seznam můžeme procházet po jednotlivých prvcích:

    +
    for cislo in cisla:
    +    print(cislo)
    +

    Seznamy se v programech vyskytují velice často: +soubor se dá načíst jako seznam řetězců +s jednotlivými řádky, +seznam řetězců jako '7♥' +a 'K♣' může posloužit jako balíček karet, +matematika je plná číselných řad, +každá online služba má seznam uživatelů.

    +

    Hodnoty v seznamu můžou být jakéhokoli typu, +dokonce můžeme různé typy míchat v jednom seznamu +(i když s takovými namixovanými seznamy se +příliš často nesetkáme – více se používají v +n-ticích, o kterých si povíme později):

    +
    seznam = [1, 'abc', True, None, range(10), len]
    +print(seznam)
    +

    Vybírání ze seznamů

    +

    Nejzákladnější operaci se seznamy, +cyklus for, už jsme si ukázali. +Druhá nejdůležitější operace je vybírání +jednotlivých prvků. +To funguje jako u řetězců: do hranatých závorek +se dá číslo prvku. Čísluje se, jako u řetězců, +od nuly; záporná čísla označují prvky od konce.

    +
    print(cisla[2])
    +

    Hranatými závorkami můžeme získávat podseznamy. +Diagram z materiálů k řetězcům +ukazuje, jak u takového „sekání” číslovat: +funguje to stejně, jen místo menšího řetězce +dostaneme menší seznam.

    +
    print(cisla[2:-3])
    +

    Měnění seznamů

    +

    Důležitá vlastnost seznamů, kterou nemají ani čísla, ani řetězce +(a True/False/None už vůbec ne), je, +že seznamy se dají měnit.

    +

    Čísla měnit nejdou – máš-li a = 3 a +napíšeš a = a + 1, číslo 3 se nezmění. +Vypočítá se nové číslo 4 a proměnná a +se nastaví na toto nové číslo.

    +

    Oproti tomu seznamy se dají měnit bez nastavování proměnné. +Základní způsob, jak změnit seznam, je přidání +prvku na konec pomocí metody append. +Ta nic nevrací (resp. vrací None), +ale „na místě” (angl. in place) změní +seznam, na kterém pracuje. Vyzkoušej si to:

    +
    prvocisla = [2, 3, 5, 7, 11, 13, 17]
    +print(prvocisla)
    +prvocisla.append(19)
    +print(prvocisla)
    +

    Takové měnění hodnoty může být občas překvapující, +protože stejnou hodnotu může mít více proměnných. +Protože se mění hodnota samotná, může to vypadat, +že se proměnná „mění aniž na ni sáhneme”:

    +
    a = [1, 2, 3]   # vytvoření seznamu
    +b = a           # tady se nový seznam nevytváří
    +
    +# seznam vytvořený v prvním řádku má teď dvě jména: "a" a "b",
    +# ale stále pracujeme jenom s jedním seznamem
    +
    +print(b)
    +a.append(4)
    +print(b)
    +

    Další způsoby, jak měnit seznamy

    +

    Kromě metody append, která přidává +jediný prvek, existuje metoda extend, +která umí přidávat prvků víc. +Prvky k přidání jí předáme ve formě seznamu:

    +
    dalsi_prvocisla = [23, 29, 31]
    +prvocisla.extend(dalsi_prvocisla)
    +print(prvocisla)
    +

    Metoda extend umí pracovat i s jinými +typy než se seznamy – ráda zpracuje cokoli, přes +co umí cyklit for: např. +jednotlivé znaky řetězců, řádky souborů, nebo čísla z range().

    +
    seznam = []
    +seznam.extend('abcdef')
    +seznam.extend(range(10))
    +print(seznam)
    +

    Měnění prvků

    +

    Ale dost přidávání. +Seznamům se dají i měnit jednotlivé prvky +a to jednoduše tak, že do prvku přiřadíme, +jako by to byla proměnná:

    +
    cisla = [1, 0, 3, 4]
    +cisla[1] = 2
    +print(cisla)
    +

    Přiřazovat se dá i do podseznamu – v tomto případě +se podseznam nahradí jednotlivými prvky z toho, +co přiřazujeme. +Jako u extend můžeš do podseznamu opět přiřadit cokoli, co umí +zpracovat for – seznam, řetězec, range() apod.

    +
    cisla = [1, 2, 3, 4]
    +cisla[1:-1] = [6, 5]
    +print(cisla)
    +

    Mazání prvků

    +

    Přiřazením do podseznamu se dá i změnit délka +seznamu, nebo některé prvky úplně odstranit:

    +
    cisla = [1, 2, 3, 4]
    +cisla[1:-1] = [0, 0, 0, 0, 0, 0]
    +print(cisla)
    +cisla[1:-1] = []
    +print(cisla)
    +

    Tenhle zápis pro mazání prvků je ale docela +nepřehledný, a proto na to máme zvláštní příkaz +jménem del. +Jak už jeho název (z angl. delete, smazat) +napovídá, smaže, co mu přijde pod ruku – jednotlivé +prvky seznamů, podseznamy, … a dokonce i proměnné!

    +
    cisla = [1, 2, 3, 4, 5, 6]
    +del cisla[-1]
    +print(cisla)
    +del cisla[3:5]
    +print(cisla)
    +del cisla
    +print(cisla)
    +

    Další mazací metody jsou:

    +
      +
    • pop, která odstraní a vrátí poslední prvek v seznamu – například pokud +mám seznam karet v balíčku, jde takhle jednoduše „líznout” kartu,
    • +
    • remove, která najde v seznamu daný prvek a odstraní ho,
    • +
    • clear, která vyprázdní celý seznam.
    • +
    +
    cisla = [1, 2, 3, 'abc', 4, 5, 6, 12]
    +posledni = cisla.pop()
    +print(posledni)
    +print(cisla)
    +
    +cisla.remove('abc')
    +print(cisla)
    +
    +cisla.clear()
    +print(cisla)
    +

    Řazení

    +

    A taky tu máme metodu sort, která prvky seznamu seřadí.

    +
    seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
    +seznam.sort()
    +print(seznam)
    +

    Aby se daly seřadit, musí být prvky seznamu vzájemně +porovnatelné – konktrétně na ně musí fungovat +operátor <. +Seznam s mixem čísel a řetězců tedy seřadit nepůjde. +Operátor < definuje i +jak přesně se řadí (např. čísla podle velikosti; +řetězce podle speciální „abecedy” která řadí +velká písmena za malá, česká až za anglická, atd.).

    +

    Metoda sort zná pojmenovaný argument +reverse. Pokud ho nastavíš na True, řadí se „naopak”.

    +
    seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
    +seznam.sort(reverse=True)
    +print(seznam)
    +

    Známé operace se seznamy

    +

    Spousta toho, co můžeme dělat s řetězci, má stejný +účinek i u seznamů. +Třeba sečítání a násobení číslem:

    +
    melodie = ['C', 'E', 'G'] * 2 + ['E', 'E', 'D', 'E', 'F', 'D'] * 2 + ['E', 'D', 'C']
    +print(melodie)
    +

    Stejně jako u řetězců, sečítat jde jen seznam +se seznamem – ne třeba seznam s řetězcem.

    +

    Další staří známí jsou funkce len, +metody count a index, a operátor in.

    +
    print(len(melodie))         # Délka seznamu
    +print(melodie.count('D'))   # Počet 'D' v seznamu
    +print(melodie.index('D'))   # Číslo prvního 'D'
    +print('D' in melodie)       # Je 'D' v seznamu?
    +

    Poslední tři se ale přece jen chovají kapku jinak: +u řetězců pracují s podřetězci, +u seznamů jen s jednotlivými prvky. +Takže ačkoliv naše melodie obsahuje prvky +'D' a 'E' vedle sebe, 'DE' v seznamu není:

    +
    print('DE' in melodie)
    +print(melodie.count('DE'))
    +print(melodie.index('DE'))
    +

    Seznam jako podmínka

    +

    Seznam se dá použít v příkazu if (nebo while) jako podmínka, +která platí, když v tom seznamu něco je. +Jinými slovy, seznam je tu „zkratka“ pro len(seznam) > 0.

    +
    if seznam:
    +    print('V seznamu něco je!')
    +else:
    +    print('Seznam je prázdný!')
    +

    Podobně se dají v podmínce použít i řetězce. +A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.

    +

    Tvoření seznamů

    +

    Tak jako funkce int převádí na +celá čísla a str na řetězce, +funkce list (angl. seznam) převádí na seznam. +Jako argument jí předáme jakoukoli hodnotu, +kterou umí zpracovat příkaz for. +Z řetězců udělá seznam znaků, z otevřeného souboru +udělá seznam řádků, z range udělá +seznam čísel.

    +
    abeceda = list('abcdefghijklmnopqrstuvwxyz')
    +cisla = list(range(100))
    +print(abeceda)
    +print(cisla)
    +

    I ze seznamu udělá funkce list seznam. +To může znít zbytečně, ale není – vytvoří se +totiž nový seznam. +Bude mít sice stejné prvky ve stejném pořadí, +ale nebude to ten samý seznam: +měnit se bude nezávisle na tom starém.

    +
    a = [1, 2, 3]
    +b = list(a)
    +
    +print(b)
    +a.append(4)
    +print(b)
    +

    Další způsob, jak tvořit seznamy +(zvláště složitější), je nejdřív udělat prázdný +seznam a pak ho postupně naplnit pomocí funkce append. +Třeba pokud z nějakého důvodu chceš seznam +mocnin dvou, projdi čísla, kterými chceme mocnit, +cyklem for a pro každé z nich +do seznamu přidej příslušnou mocninu:

    +
    mocniny_dvou = []
    +for cislo in range(10):
    +    mocniny_dvou.append(2 ** cislo)
    +print(mocniny_dvou)
    +

    Chceš-li seznam, který reprezentuje balíček karet, +zavolej append pro všechny kombinace barev a hodnot.

    +
    balicek = []
    +for barva in '♠', '♥', '♦', '♣':  # (Na Windows použij textová jména)
    +    for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
    +        balicek.append(str(hodnota) + barva)
    +print(balicek)
    +

    Seznamy a řetězce

    +

    Seznamy a řetězce jsou druhy „sekvencí”, +takže snad nepřekvapí, že se dá různě převádět +z jednoho typu na druhý. +Funkce list vytvoří z řetězce +seznam znaků. +Když chceme dostat seznam slov, použijeme +na řetězci metodu split (angl. rozdělit):

    +
    slova = 'Tato věta je složitá, rozdělme ji na slova!'.split()
    +print(slova)
    +

    Metoda split umí brát i argument. +Pokud ho předáme, místo mezer (a nových řádků) +se řetězec „rozseká” daným oddělovačem. +Takže když máme nějaká data oddělená čárkami, +není nic jednoduššího než použít split s čárkou:

    +
    zaznamy = '3A,8B,2E,9D'.split(',')
    +print(zaznamy)
    +

    Chceme-li spojit seznam řetězců zase dohromady +do jediného řetězce, použijeme metodu +join (angl. spojit). +Pozor, tahle metoda se volá na oddělovači, +tedy řetězci, kterým se jednotlivé kousky „slepí” +dohromady; a jako argument bere seznam jednotlivých +řetězců.

    +
    veta = ' '.join(slova)
    +print(veta)
    +

    Úkol

    +

    Představ si, že ti uživatelé zadávají jména a příjmení a ty si je ukládáš do +seznamu pro další použití např. v evidenci studentů. Ne všichni jsou ale pořádní, +a tak se v seznamu sem tam objeví i jméno s nesprávně zadanými velkými písmeny. +Například:

    +
    zaznamy = ['pepa novák', 'Jiří Sládek', 'Ivo navrátil', 'jan Poledník']
    +

    Úkolem je:

    +
      +
    • Napsat funkci, která vybere jen ty správně zadané záznamy, které mají správně +jméno i příjmení s velkým počátečním písmenem.
    • +
    • Napsat funkci, která vybere naopak jen ty nesprávně zadané záznamy.
    • +
    • (Nepovinný) – Napsat funkci, která vrátí seznam s opravenými záznamy.
    • +
    +

    Výsledné funkce by měly fungovat takto:

    +
    zaznamy = ['pepa novák', 'Jiří Sládek', 'Ivo navrátil', 'jan Poledník']
    +
    +chybne_zaznamy = vyber_chybne(zaznamy)
    +print(chybne_zaznamy) # → ['pepa novák', 'Ivo navrátil', 'jan Poledník']
    +
    +spravne_zaznamy = vyber_spravne(zaznamy)
    +print(spravne_zaznamy) # → ['Jiří Sládek']
    +
    +opravene_zaznamy = oprav_zaznamy(zaznamy)
    +print(opravene_zaznamy) # → ['Pepa Novák', 'Jiří Sládek', 'Ivo Navrátil', 'Jan Poledník']
    +

    Snadný způsob jak zjistit, zda je řetězec složen jen z malých písmen, +je metoda islower(), která vrací True, pokud řetězec obsahuje jen malá +písmena, jinak vrací False. Například 'abc'.islower() == True ale +'aBc'.islower() == False.

    +

    Snadný způsob jak převést první písmenko na velké je metoda capitalize(): +např. 'abc'.capitalize() == 'Abc'

    +
    +

    Řešení

    + + +

    Seznamy a náhoda

    +

    Modul random obsahuje dvě funkce, které se hodí k seznamům. +Jako random.randrange, obě mají něco +společného s náhodou.

    +

    Funkce shuffle seznam „zamíchá” – všechny prvky náhodně popřehází. +Jako metoda sort i funkce shuffle nic nevrací.

    +
    import random
    +
    +balicek = []
    +for barva in '♠', '♥', '♦', '♣':
    +    for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
    +        balicek.append(str(hodnota) + barva)
    +print(balicek)
    +
    +random.shuffle(balicek)
    +print(balicek)
    +

    A funkce choice ze seznamu vybere jeden náhodný prvek. +S použitím seznamu tak můžeme výrazně zjednodušit +úvodní část naší staré hry kámen/nůžky/papír:

    +
    import random
    +mozne_tahy = ['kámen', 'nůžky', 'papír']
    +tah_pocitace = random.choice(mozne_tahy)
    +

    Vnořené seznamy

    +

    A perlička na konec! +Na začátku tohoto textu je napsáno, že seznam +může obsahovat jakýkoli typ hodnot. +Může třeba obsahovat i další seznamy:

    +
    seznam_seznamu = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    +

    Takový seznam se chová docela normálně – jdou +z něj třeba brát jednotlivé prvky +(které jsou ovšem taky seznamy):

    +
    prvni_seznam = seznam_seznamu[0]
    +print(prvni_seznam)
    +

    A protože jsou prvky samy seznamy, +můžeme mluvit o věcech jako „první prvek druhého seznamu”:

    +
    druhy_seznam = seznam_seznamu[1]
    +prvni_prvek_druheho_seznamu = druhy_seznam[0]
    +print(prvni_prvek_druheho_seznamu)
    +

    A protože výraz seznam_seznamu[1] +označuje seznam, můžeme brát prvky přímo z něj:

    +
    prvni_prvek_druheho_seznamu = (seznam_seznamu[1])[0]
    +

    Neboli:

    +
    prvni_prvek_druheho_seznamu = seznam_seznamu[1][0]
    +

    A má tahle věc nějaké použití, ptáš se? +Stejně jako vnořené cykly for +nám umožnily vypsat tabulku, vnořené seznamy +nám umožní si tabulku „zapamatovat”.

    +
    def vytvor_tabulku(velikost=11):
    +    seznam_radku = []
    +    for a in range(velikost):
    +        radek = []
    +        for b in range(velikost):
    +            radek.append(a * b)
    +        seznam_radku.append(radek)
    +    return seznam_radku
    +
    +nasobilka = vytvor_tabulku()
    +
    +print(nasobilka[2][3])  # dva krát tři
    +print(nasobilka[5][2])  # pět krát dva
    +print(nasobilka[8][7])  # osm krát sedm
    +
    +# Vypsání celé tabulky
    +for radek in nasobilka:
    +    for cislo in radek:
    +        print(cislo, end=' ')
    +    print()
    +

    Co s takovou „zapamatovanou” tabulkou? +Můžeš si do ní uložit třeba pozice +figurek na šachovnici nebo křížků a koleček +ve 2D piškvorkách.

    \ No newline at end of file diff --git a/lessons/local-run/index.html b/lessons/local-run/index.html new file mode 100644 index 00000000..a67ecd83 --- /dev/null +++ b/lessons/local-run/index.html @@ -0,0 +1,224 @@ +

    Vytvoření lokálního kurzu

    +

    Teď, když už máš lokální instalaci aplikace Nauč se Python, můžeš začít vytvářet vlastní kurz.

    +

    První věc, kterou musíš udělat, je vybrat si identifikátor kurzu, pod kterým bude kurz uložený. +Tento identifikátor také bude ve všech adresách, které se budou týkat tohoto kurzu. +Identifikátor se může skládat pouze z malých alfanumerických znaků a spojovníků (-) a musí být uníkátní, alespoň v daném roce. +Jak zjistit, jestli už identifikátor existuje? Podívej se do složky runs a pak dále do složky, která odpovídá roku, ve kterém tvůj kurz začíná.

    +

    Jak vybrat identifikátor?

    +

    Ze správného identifikátoru (v kombinaci s rokem) by mělo být jasné, o který kurz se jedná. +Dobrý příklad je třeba 2017/mi-pyt, identifikátor pro předmět MI-PYT, který začal v roce 2017. +Pro jiné kurzy může být problém přijít na unikátní identifikátor. +Například kurzy PyLadies se organizují ve více městech několikrát ročně. +Poté se do identifikátoru přidává i město a označení, který je to kurz v daném roce – například 2018/pyladies-ostrava-jaro. +Třeba v Praze ale zároveň běží i více kurzů najednou, tak se používá 2018/pyladies-praha-jaro-cznic a 2018/pyladies-praha-jaro-ntk, poslední část zde říká, kde se kurz koná.

    +


    +Takže doporučení jsou následovné:

    +
      +
    • Když víš, že kurz se stejným názvem bude v daném roce jediný, identifikátor by měl být název, bez diakritiky a se spojovníky místo mezer.
    • +
    • Když se stejně pojmenovaný kurz koná ve více městech, přidej název města.
    • +
    • Když se kurz koná vícekrát za rok, přidej označení v daném roce (například roční období).
    • +
    • Když se koná více kurzů se stejným názvem ve stejném městě najednou, přidej lokaci nebo den, pokud se konají na jiných místech nebo v jiné dny.
    • +
    +

    Když už máš vymyšlený identifikátor, vytvoř ve složce s rokem složku, která se bude jmenovat podle tvého identifikátoru. +Pokud ještě složka pro daný rok neexistuje, musíš ji vytvořit také.

    +

    Definice kurzu

    +

    Kurz se definuje pomocí souboru info.yml, který se umisťuje právě do složky, kterou jsi výše vytvořil/a. +Tento soubor obsahuje všechny informace o kurzu – název, popisek, kde a kdy se koná a pak samozřejmě plán jednotlivých lekcí. +Soubor je formátu YAML, který si teď trochu ukážeme.

    +

    O formátu YAML

    +

    Formát se skládá z několika stavebních bloků, které se dají poté skládat dohromady. +Prvním je seznam hodnot (podobně jako v Pythonu). +Seznam se ve formátu YAML zapisuje následovně:

    +
    - První položka
    +- Druhá položka
    +- 3
    +- Položka může být i něco jiného než text!
    +

    Druhým stavebním blokem je slovník (zase podobně jako v Pythonu), který se skládá z klíčů a hodnot, nezáleží v ní tedy na pořadí, protože se k informaci vždy člověk dostance pomocí klíče. +Slovník se ve formátu YAML zapisuje následovně:

    +
    klic1: Hodnota klíče klic1.
    +klic2: 2
    +klic3: I hodnoty ve slovníku mohou být něco jiného než text.
    +klic4: |
    +    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
    +
    +    Tento text budou dva separátní odstavce v rámci jednoho klíče.
    +klic5:
    +klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
    +

    Seznamy a slovníky jde samozřejmě i skládat dohromady:

    +
    klic1: Hodnota klíče
    +klic2:
    +- Tohle je seznam, které patří pod klíč klic2
    +- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
    +- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
    +klic3:
    +  vnorenyklic: Slovník může obsahovat další slovník i takto.
    +

    Povinné informace

    +

    Teď, když už se vyznáš ve formátu YAML, můžeš začít vytvářet soubor info.yml. +Celá definice kurzu je jeden velký slovník, který si postupně popíšeme a vyplníme. +Pro potřeby kurzu je připravena šablona, kterou můžeš použít.

    +

    Nejdřív prvních pár základních povinných údajů:

    +
      +
    • title slouží pro název kurzu (nepovinně lze dodefinovat pomocí subtitle)
    • +
    • description slouží pro krátký popis kurzu (který se zobrazí v seznamu kurzů)
    • +
    • long_description slouží pro dlouhý popis kurzu, který se zobrazí na stránce kurzu
    • +
    +

    A teď už jen nepovinné údaje:

    +
      +
    • place slouží pro označení místa
    • +
    • time slouží pro informaci o času (není nutný žádný specifický formát)
    • +
    +

    Jestli chceš, aby pro kurz šel vygenerovat iCal soubor s plánem lekcí, musíš dále poté vyplnit údaj default_time. +Tato hodnota musí být slovník, který obsahuje dva klíče start a end, kde bude čas lekcí. +Čas musí být ve formátu HH:MM a musí být obalen uvozovkami nebo apostrofy (kvůli té dvojtečce, aby si YAML nemyslel, že je to další slovník), takže třeba takhle:

    +
    default_time:
    +  start: '18:00'
    +  end: '20:00'
    +

    Poslední nepovinná hodnota, než se dostaneme k obsahu kurzu, jsou proměné, které se definují klíčem vars a musí být také slovníkem. +Proměné mohou upravovat obsah lekcí a stránek kurzu, a pokud budeš vytvářet nebo upravovat materiály, můžeš si i definovat vlastní.

    +

    První proměnou, kterou můžeš použít, je coach-present. +Pokud je tvůj kurz s lektorem nebo koučem, nastav tuto proměnou na hodnotu true.

    +

    Druhou proměnou, kterou můžeš použít je user-gender. +Pokud víš, že na tvém kurzu budou lidé jen jednoho pohlaví, můžeš nastavit materiály (které tak byly napsány), aby vykreslily správně formátovaný obsah. +Nastavíš to pomocí písmenka f pro ženy, m pro muže. +Pokud proměnou nevyplníš, materiály vykreslí obě varianty.

    +

    Další proměnou, kterou můžeš použít, je pyladies. +Tu využij (nastavenín na hodnotu true), pokud organizuješ kurz PyLadies. +Tato proměná aktivuje v materiálech nějaké popisky navíc, například o tahácích, nebo také sjednotí názvy složek na pyladies.

    +

    Plán na základě kanonických materiálů

    +

    Pro vytvoření obsahu máš dvě základní možnosti. +Buď využiješ plán existujícího kanonického kurzu, nebo si nadefinuješ svůj vlastní. +Zde je popsán postup odvozování.

    +

    Nejdřív si vyber kanonický kurz, ze kterého chceš svůj kurz odvodit. +Kanonické kurzy najdeš ve složce courses. +Vybraný kanonický kurz nastav v souboru info.yml klíčem derives – napiš do něj název složky kurzu (např. pyladies nebo mi-pyt).

    +

    A teď už zbývá poslední věc, a to je sestavení programu kurzu. +Kurz se skládá z jednotlivých lekcí a každá lekce se skládá z jednotlivých materiálů. +Lekce nadefinuješ klíčem plan v souboru info.yml. +Ten musí být seznam dalších slovníků.

    +

    Máš dvě možnosti, jak nadefinovat jednotlivé lekce. +Buď můžeš převzít lekci z kanonického kurzu, nebo si nadefinovat vlastní.

    +

    Nicméně, co je společné, je definování data a času kurzu. +Datum nastavíš klíčem date, ve formátu YYYY-MM-DD. +Čas nastavovat nemusíš, použije se čas z default_time, ale můžeš ho přenastavit pomocí klíče time, který bude mít jako hodnotu další slovník s hodnotami start a/nebo end (ve formátu HH:MM obalené uvozovkami).

    +

    Definice vlastní lekce

    +

    Nejdříve si ukážeme, jak se definují vlastní lekce – přebírání pak už bude jednoduché. +Nejdřív si budeš muset zase vymyslet pro lekci identifikátor, který napiš do klíče slug. +Identifikátor musí být zase unikántní, nicméně tentorkát jen v rámci kurzu. +Identifikátor lekce bude v adrese na tu specifickou lekci. +Dalším povinným údajem je title – název lekce.

    +

    Kromě definování data a času už pak při definici lekce zbývá jen seznam materiálů. +Ty se nastavují pomocí klíče materials. +I když nechceš žádné materiály pro lekci definovat, musíš klíč nadefinovat, a to s hodnotou [] (prázdný seznam). +Základní definice lekce tedy vypadá následovně:

    +
    plan:
    +- slug: first-lesson
    +  title: Název první lekce
    +  date: 2018-03-07
    +  materials: []
    +

    Existují tři druhy materiálů. První druh jsou interní materiály, druhý druh jsou odkazy mimo Nauč se Python a třetí jsou jen záznam bez odkazu. +Materiály se dále pak rozdělují na několik typů, které určují ikonku, která se použije v seznamu materiálů vedle názvu.

    +

    Podporované typy jsou následující:

    +
      +
    • page – výchozí typ pro druh interní materiály
    • +
    • url – výchozí typ pro odkazy
    • +
    • cheatsheet – pro taháky
    • +
    • homework – pro domácí úkoly
    • +
    • special – pro všechno ostatní
    • +
    +

    A teď už k definování. +Interní materiály se definují pomocí klíče lesson, do kterého patří identifikátor interního materiálu. +Interní materiály jsou definovány ve složce lessons. +V té složce jsou tzv. kolekce materiálů, které pak obsahují jednotlivé materiály. +Identifikátor materiálu je <název kolekce>/<název materiálu z kolekce>, takže například beginners/install. +Následovně by se použil materiál v seznamu materiálů:

    +
    plan:
    +- slug: first-lesson
    +  title: Název první lekce
    +  date: 2018-03-07
    +  materials:
    +  - lesson: beginners/install
    +

    Druhý druh se definuje pomocí klíčů url a title. +Do url patří kompletní odkaz na materiál, do title patří název odkazu. +Nepovinně se pak může změnit typ pomocí klíče type. +Příklad použítí:

    +
    plan:
    +- slug: first-lesson
    +  title: Název první lekce
    +  date: 2018-03-07
    +  materials:
    +  - title: Úvodní prezentace
    +    url: https://example.com/uvod.pdf
    +  - title: Tahák na příkazovou řádku
    +    url: https://example.com/tahak.pdf
    +    type: cheatsheet
    +  - title: Domácí projekty (PDF)
    +    url: https://example.com/ukol.pdf
    +    type: homework
    +

    Třetí druh se definuje stejně jako druhý, jen se do klíče url dá hodnota null.

    +

    Poslední věc, která jde definovat u materiálů, jsou proměné, pomocí klíče vars. +Definují se stejně jako u celého kurzu, ale mají účinek jen pro specifický materiál. +Například takhle:

    +
    plan:
    +- slug: first-lesson
    +  title: Název první lekce
    +  date: 2018-03-07
    +  materials:
    +  - lesson: beginners/install
    +    vars:
    +      bonus: true
    +

    Převzetí lekce

    +

    Lekci převezmeš nastavením klíče base na identifikátor (slug) lekce z kanonického kurzu (viz soubor info.yml ve složce toho kurzu). +Takto převzaná lekce si vezme z kanonického kurzu název i materiály. +Lze to třeba i jen takto:

    +
    plan:
    +- base: install
    +  date: 2018-03-07
    +- base: hello
    +  date: 2018-03-14
    +  time:
    +    start: '18:00'
    +    end: '20:00'
    +

    Nicméně můžeš ale i u převzatých kurzů změnit seznam materiálů, pomocí seznamu hodnot materials. +Můžeš si nadefinovat úplně nový seznam materiálů (stejně jako výše) nebo můžeš použít hodnotu +merge, které na dané místo v seznamu materiálů vloží všechny materiály z odvozované lekce. +To se hodí, pokud třeba jen potřebuješ přidat něco před nebo za materiály z kanonického kurzu. +Použití vypadá následovně:

    +
    plan:
    +- base: install
    +  date: 2018-03-07
    +  materials:
    +  - title: Úvodní prezentace
    +    url: https://example.com/uvod.pdf
    +  - +merge
    +  - title: Domácí projekty (PDF)
    +    url: https://example.com/ukol.pdf
    +    type: homework
    +

    Úplně nový plán

    +

    Pokud chceš vytvořit úplně nový plán, můžeš se řídit stejným postupem jako výše, jen nevyplňuj klíč derives a nevyužívej způsob definování přes lekci base.

    +

    Otestování vlastního kurzu

    +

    Po vytvoření souboru info.yml s povinnými položkami se můžeš konečně podívat na to, jak tvůj kurz bude vypadat. +Podle instrukcí z předchozí části manuálu si spusť Nauč se v Python režimu serve. +Otevři si adresu, kterou ti příkaz napíše, a odnaviguj se do části s kurzy.

    +

    Pokud se stránka s kurzy nevykreslí, tak uvidíš Python vyjímku, která ti může pomoct, ale také může být pěkne matoucí. +Nejprve si zkontroluj, jeslti jsi vážně vyplnil/a všechny povinné údaje. +Jestli si myslíš, že ano, tak se nám ozvi přes issues na našem GitHubu a my ti rádi pomůžeme. +V opačném případě si rozklikni svůj kurz. +Pokud se ti nevykreslí detail kurzu, nejspíš jsi udělal/a nějakou chybu v definici lekcí nebo materiálů – zkontroluj si, jestli například nemáš dvě lekce se stejným identifikátorem, jestli není překlep v nějakém klíčí a jestli například neodkazuješ na materiál, který neexistuje.

    +

    Dále si pak můžeš proklikat všechny jednotlivé materiály, jestli vše funguje a vypadá jak má. +Jako další test může posloužit druhý režim spuštění Nauč se Python (freeze), který projde všechny stránky, jestli fungují.

    +

    Upravování a vytváření materiálů

    +

    Na závěr této části ještě trochu k materiálům. +Jak bylo zmíněno výše, obsah materiálů je definován ve složce lessons. +Kromě toho, že si můžeš sestavit vlastní kurz, můžeš si i upravit materiály, které využíváš, nebo si napsat úplně nové.

    +

    Většina materiálů je napsaná v formátu Markdown a pár je napsaných v Jupyter Noteboocích. +Upravování je jednoduché, stačí se podívat do složky s daným specifický materiálem a upravit, co je potřeba, v souboru s obsahem.

    +

    Vytváření je trošku složitější v tom, že člověk musí vybrat správnou kolekci a název lekce a pak vytvořit ve složce kromě obsahu i soubor informacích o materiálech. +Soubor se znovu jmenuje info.yml a má povinné tři údaje, title, style a license:

    +
      +
    • title nastavuje název,
    • +
    • style může být md nebo ipynb podle toho, jaký formát bude mít text,
    • +
    • license nastavuje licenci, pod kterou materiály píšeš – identifikátor ze složky licenses: doporučujeme použít cc-by-sa-40.
    • +
    +

    Dále má soubor nepovinné položky, první attributions – buď jednoduchý text, nebo seznam textů s informacemi o tom, kdo a proč materiál napsal. +Nakonec lze použít jinou licenci na ukázky kódu pomocí license_code: doporučujeme použít cc0.

    +

    Obecně je dobrý nápad se při psaní materiálů inspirovat již existujícími řešeními v ostatních materiálech a přebírat jejich styl a způsoby formátování.

    +
    \ No newline at end of file diff --git a/lessons/local-run/info.yml b/lessons/local-run/info.yml new file mode 100644 index 00000000..08e7db8c --- /dev/null +++ b/lessons/local-run/info.yml @@ -0,0 +1,35 @@ +title: +subtitle: +time: 18:00–20:00 +default_time: + start: '18:00' + end: '20:00' +place: +description: +long_description: | + Delší popisek +derives: pyladies +vars: + pyladies: true + coach-present: true +plan: +- base: install + date: 2018-03-07 + materials: + - title: Úvodní prezentace + url: http://example.com/prezentace.pdf + - +merge + - title: Domácí úkoly + url: http://example.com/domaci_ukol.pdf + type: homework +- title: Procvičování a soubory + date: 2018-03-14 + slug: exercises + time: + start: '19:00' + end: '21:00' + materials: + - title: Procvičíme si vše, co jsme se naučily + url: null + type: special + - lesson: beginners/files diff --git a/lessons/local-variables/index.html b/lessons/local-variables/index.html new file mode 100644 index 00000000..2e9539cd --- /dev/null +++ b/lessons/local-variables/index.html @@ -0,0 +1,150 @@ +

    Lokální proměnné

    +

    Už umíš definovat vlastní funkce. +Zbývá ale ještě dovysvětlit, jak v nich fungují proměnné.

    +

    Funkce může používat proměnné „zvnějšku“. +Následující program přiřadí do proměnné pi a všechny další funkce +mají k pi přístup:

    +
    pi = 3.1415926
    +
    +def obsah_kruhu(polomer):
    +    return pi * polomer ** 2
    +
    +print(obsah_kruhu(100))
    +

    Jinak je tomu ale v případě, kdy proměnnou nastavíš uvnitř funkce.

    +

    Všechny parametry a všechny proměnné, do kterých funkce přiřazuje, +jsou úplně nové proměnné, které nemají nic +společného s tím, co je „venku“ kolem funkce.

    +

    Těmto proměnným se říká lokální proměnné (angl. local variables), +protože existují jen místně, v rámci volání jedné jediné funkce.

    +

    Proměnné, které nejsou lokální, jsou globální – ty existují v celém programu.

    +

    Pro příklad:

    +
    def nastav_x(hodnota):
    +    x = hodnota  # Přiřazení do lokální proměnné!
    +
    +nastav_x(40)
    +print('x =', x)
    +

    Program skončí s chybou! +Funkce nastav_x si hraje na vlastním písečku; proměnná x je jen +pro ni. +Když funkce nastav_x skončí, proměnná x přestane existovat.

    +

    Skrývání detailů

    +

    Podobně skončí s chybou i složitější program:

    +
    def zamen(slovo, pozice, novy_znak):
    +    """V daném slově zamění znak na dané pozici za daný nový znak"""
    +    zacatek = slovo[:pozice]
    +    konec = slovo[pozice + 1:]
    +    nove_slovo = zacatek + novy_znak + konec
    +    return nove_slovo
    +
    +print(zamen('kočka', 1, 'a'))
    +print(zamen('kačka', 2, 'p'))
    +
    +print(zacatek)  # NameError
    +

    Funkce zamen jsi napsal/a proto, abys nemusel/a pořád opakovat detaily +záměny písmenka. +Jakmile je jednu nadefinovaná, stačí ji zavolat. Důležité jsou jen jméno +funkce, parametry a návratová hodnota; na detaily kódu uvnitř můžeš zapomenout. +A to i díky lokálním proměnným, které detaily ve vnitřku funkce trochu líp +izolují od zbytku programu.

    +

    Ještě lépe je to vidět u funkcí, které jsi nenapsal/a sám/sama. +Jak divné by bylo, kdyby po každém zavolání print byla najednou nastavená +proměnná i, kterou print náhodou používá při procházení svých parametrů!

    +

    Přiřazení

    +

    To, co dělá lokální proměnnou, je přiřazení. +Porovnej nastav_x s příkladem na obsah_kruhu výše: rozdíl mezi pi a x +je v tom, že do x se v rámci funkce přiřazuje.

    +

    Co je to přiřazení? Všechno, co nastavuje nějakou proměnnou. Například:

    +
      +
    • Klasika je přiřazovat pomocí =, např. a = 3.
    • +
    • Parametry funkce: funkce def nastav_x(hodnota) přiřadí do hodnota,
    • +
    • Cyklus for x in ...: přiřazuje do proměnné x.
    • +
    • Pro úplnost, příkazy def x(...):, import x a from ... import x taky +přiřazují do x – ale ve funkcích se moc nepoužívají.
    • +
    +

    A další

    +

    K těmto materiálům se možná budeš vracet, tak pro úplnost přidám další +způsoby, které postupně poznáš. Není jich mnoho:

    +
      +
    • Příkazy with ... as x, del x, except ... as x přiřazují do x.
    • +
    • Přiřazují i speciální přiřazovací operátory jako +=, *=, :=.
    • +
    +

    Zakrývání jména

    +

    Jak to funguje, když ve funkci přiřadíš do proměnné, která existuje i globálně? +Pak tu máme problém.

    +

    Vytvoří se úplně nová lokální proměnná, která má stejné jméno jako +ta globální. +Jméno označuje lokální proměnnou, a ta globální pak „není vidět“.

    +

    Tento příklad tedy nebude fungovat tak, jak se zdá:

    +
    x = 0
    +
    +def nastav_x(hodnota):
    +    x = hodnota  # Přiřazení do lokální proměnné!
    +    print('Ve funkci nastav_x: x =', x)
    +
    +nastav_x(40)
    +print('Venku: x =', x)
    +

    V tomto programu existují dvě proměnné jménem x. +Jedna je globální. Jedna je lokální pro funkci nastav_x. +Jmenují se stejně, ale jsou to dvě různé proměnné.

    +

    Lokální nebo globální?

    +

    Pojďme si to ukázat. +Než spustíš tenhle program, zkus předpovědět co bude dělat. +Pak ho pusť, a pokud dělal něco jiného, zkus vysvětlit proč. +Pozor na chytáky!

    +
    from math import pi
    +obsah = 0
    +a = 30
    +
    +def obsah_elipsy(a, b):
    +    obsah = pi * a * b  # Přiřazení do `obsah`
    +    a = a + 3  # Přiřazení do `a`
    +    return obsah
    +
    +print(obsah_elipsy(a, 20))
    +print(obsah)
    +print(a)
    +

    Zkus odpovědět na tyto otázky:

    +
      +
    • Je proměnná pi lokální, nebo globální?
    • +
    • Je proměnná obsah lokální, nebo globální?
    • +
    • Je proměnná a lokální, nebo globální?
    • +
    • Je proměnná b lokální, nebo globální?
    • +
    • Je proměnná obsah_elipsy lokální, nebo globální?
    • +
    +
    +

    Řešení

    + + +

    Rada na závěr

    +

    Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších +věcí v Pythonu. +Jsou ale přínosná – umožňují některé užitečné techniky, např. rekurzi.

    +

    Jestli ti to celé připadá složité, dá se tomu zatím vyhnout dodržováním jednoho +pravidla: +nepřiřazuj ve funkcích do proměnných, které existují i vně funkce. +(Parametr funkce se počítá jako přiřazení.)

    \ No newline at end of file diff --git a/lessons/logic/index.html b/lessons/logic/index.html new file mode 100644 index 00000000..3b259a69 --- /dev/null +++ b/lessons/logic/index.html @@ -0,0 +1,814 @@ +

    Logika hry

    +

    Už umíš vykreslit „fotku“ hada. +Hadí videohra ale nebude jen statický obrázek. +Had se bude hýbat!

    + + +

    Rozhýbejme hada

    +

    Tak, ale teď už k samotné hře!

    +

    Tvůj program teď, doufám, vypadá nějak takhle:

    +
    from pathlib import Path
    +
    +import pyglet
    +
    +TILE_SIZE = 64
    +TILES_DIRECTORY = Path('snake-tiles')
    +
    +snake = [(1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (4, 5)]
    +food = [(2, 0), (5, 1), (1, 4)]
    +
    +red_image = pyglet.image.load('apple.png')
    +snake_tiles = {}
    +for path in TILES_DIRECTORY.glob('*.png'):
    +    snake_tiles[path.stem] = pyglet.image.load(path)
    +
    +window = pyglet.window.Window()
    +
    +@window.event
    +def on_draw():
    +    window.clear()
    +    pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
    +    pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
    +    for x, y in snake:
    +        source = 'tail'     # (Tady případně je nějaké
    +        dest = 'head'       #  složitější vybírání políčka)
    +        snake_tiles[source + '-' + dest].blit(
    +            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)
    +    for x, y in food:
    +        red_image.blit(
    +            x * TILE_SIZE, y * TILE_SIZE, width=TILE_SIZE, height=TILE_SIZE)
    +
    +pyglet.app.run()
    +

    Zkus těsně nad řádek pyglet.app.run doplnit funkci, +která se bude volat každou šestinu vteřiny, +a přidá hadovi políčko navíc:

    +
    def move(dt):
    +    x, y = snake[-1]
    +    new_head = x+1, y
    +    snake.append(new_head)
    +
    +pyglet.clock.schedule_interval(move, 1/6)

    Funguje? +Tak do téhle funkce ještě přidej del snake[0], aby had nerostl donekonečna. +Víš co tenhle příkaz dělá? Jestli ne, koukni znovu na poznámky k seznamům!

    +

    A had se hýbe… Jen ho ještě nejde ovládat.

    +

    Ven se stavem

    +

    Než uděláme interaktivního hada, zkusíme trošku uklidit. +Program se nám rozrůstá, a za chvíli bude složité se v něm vyznat. +Můžeme tomu trochu pomoct tím, že ho rozdělíme do dvou souborů: +jeden pro logiku hry a druhý na vykreslování (a později ovládání) +přes Pyglet.

    +

    Udělej si nový soubor pojmenovaný had.py. +V něm budeme mít třídu, která spravuje (a obsahuje) celý stav hry.

    +

    Všechno, co je potřeba o hře vědět – v našem případně zatím souřadnice hada +a jídla – bude tato třída obsahovat jako atributy.

    +

    Třída bude obsahovat dvě metody – funkce, které se dají zavolat na objekty +této třídy. +Speciální metoda __init__ (která se automaticky volá při vytvoření objektu +této třídy) bude tyto atributy nastavovat. +Metoda move, kterou budeme volat při každém „tahu“ hry, je pak bude +měnit.

    +

    Pro funkčnost, kterou zatím náš had umí, bude had.py vypadat takto:

    +
    class State:
    +    def __init__(self):
    +        self.food = [(2, 0), (5, 1), (1, 4)]
    +        self.snake = [(0, 0), (1, 0)]  # (kratší než v kódu na vykreslování)
    +
    +    def move(self):
    +        old_x, old_y = self.snake[-1]
    +        new_x = old_x + 1
    +        new_y = old_y
    +        new_head = new_x, new_y
    +        self.snake.append(new_head)
    +        del self.snake[0]
    +

    Pužij prosím pro třídu jméno State a i atributy pojmenuj podle +materiálů – snake, food, a později i další, které budeme přidávat. +Bude se ti to hodit.

    +

    Všimni si, že metody berou argument self. +To označuje konkrétní objekt, stav hry se kterým metoda pracuje nebo +který mění. +Ke všem atributúm přistupují pomocí tečky – +self.jméno_atributu.

    +

    Tak, máme třídu se stavem. +No jo, ale jak ji teď použít? +Je v jiném souboru než naše hra (ui.py).

    +

    Pythonní soubory (ty s příponou .py) jsou zároveň moduly, které se dají +importovat. +Na začátku ui.py tak můžeš napsat:

    +
    from had import State
    +

    … a třída se stavem bude k dispozici!

    +

    Pak potřebuješ ještě několik změn:

    +
      +
    • Nastavování seznamů snake a food zruš; místo nich nastav jedinou +proměnnou state na nový stav:

      +
      state = State()
      +
    • +
    • Místo snake a food ve funkci on_draw použij state.snake +a state.food – atributy našeho stavu.

      +

      Všimni si že tady nepoužíváme self – tohle jméno je pro metody v rámci +třídy. Jinde musíme pojmenovat konkrétní objekt, se kterým pracujeme.

      +
    • +
    • Funkci move přepiš tak, aby jen volala metodu state.move:

      +
      def move(dt):
      +    state.move()
      +

      Všimni si že ani tady nepoužíváme self. +Ten se doplní automaticky – jde o objekt, jehož metodu voláme.

      +
    • +
    +

    Povedlo se? Funguje to jako předtím? +Pro kontrolu můžeš svůj program porovnat s mým (ale nejde o jediné správné +řešení):

    +
    +

    Řešení

    + + +

    Ovládání

    +

    Nyní k onomu slíbenému ovládání. Respektive nejdřív k změnám směru.

    +

    Had ze hry se plazí stále stejným směrem, dokud hráč nezmáckne klávesu. +Had z naší ukázky se plazí doprava; dokážeš zařídit, aby se místo toho +plazil nahoru?

    +
    +

    Řešení

    + + +

    A co dolů?

    +
    +

    Řešení

    + + +

    Aby si had „pamatoval“ kam se zrovna plazí, je potřeba mít směr součástí stavu +hry. +Uložme ho tedy do atrubutu jménem snake_direction.

    +

    Co tam ale přesně uložit? +Jak reprezentovat směr v Pythonu – pomocít čísel, n-tic a tak?

    +

    Asi nejpříhodnější řešení je uložit si o kolik políček se had posune, +a to zvlášť v x-ovém a zvlášť v y-ovém směru. +Čili jako dvojici:

    +
      +
    • (1, 0) = doprava (o jedno políčko v kladném x-ovém směru)
    • +
    • (-1, 0) = doleva (o jedno políčko v záporném x-ovém směru)
    • +
    • (0, 1) = nahoru (+y)
    • +
    • (0, -1) = dolů (-y)
    • +
    +

    Nový atribut přidej do metody __init__ ve stavu:

    +
            self.snake_direction = 0, 1
    +

    A v metodě move změň nastavování new_x a new_y podle nového atributu:

    +
            dir_x, dir_y = self.snake_direction
    +        new_x = old_x + dir_x
    +        new_y = old_y + dir_y
    +

    Směr hada teď můžeš měnit změnou snake_direction__init__. +Funguje to? (Jestli ne, oprav to – a jestli to nejde, zavolej někoho na pomoc!)

    +

    Nyní zbývá jen atribut snake_direction měnit, když uživatel něco stiskne na +klávesnici. +To už je doména Pygletu. +Opusť na chvíli abstraktní stav v had.py a koukni na hru v ui.py. +Sem je potřeba přidat funkci, která reaguje na stisk klávesy.

    +

    Aby Pyglet tuhle funkci našel a uměl zavolat, musí se jmenovat on_key_press, +musí mít dekorátor @window.event, a musí brát dva argumenty: +číslo klávesy, která byla zmáčknutá, a informace o modifikátorech +(Shift, Ctrl, a tak podobně):

    +
    @window.event
    +def on_key_press(symbol, mod):
    +    ...
    +

    Druhý argument nepoužijeme. +Podle prvního ale nastav aktuální směr hada. +Čísla kláves jsou definována v modulu pyglet.window.key jako konstanty se +jmény LEFT, ENTER, Q či AMPERSAND . +My použijeme šipky:

    +
    @window.event
    +def on_key_press(symbol, mod):
    +    if symbol == pyglet.window.key.LEFT:
    +        state.snake_direction = -1, 0
    +    if symbol == pyglet.window.key.RIGHT:
    +        state.snake_direction = 1, 0
    +    if symbol == pyglet.window.key.DOWN:
    +        state.snake_direction = 0, -1
    +    if symbol == pyglet.window.key.UP:
    +        state.snake_direction = 0, 1
    +

    Tuhle funkci je potřeba dát někam za nastavení window (aby byl k dispozici +window.event) a před pyglet.app.run() (protože nastavovat ovládání až +potom, co hra proběhne, je zbytečné). +Nejlepší je ji dát vedle jiné funkce s dekorátorem @window.event, +aby byly pěkně pohromadě.

    +

    Funguje to? +Můžeš ovládat směr hada? +To je skvělé! +Určitě ale při zkoušení narazíš na pár věcí, které je potřeba dodělat:

    +
      +
    • Had by neměl mít možnost vylézt ven z okýnka.
    • +
    • Had by měl jíst jídlo a růst.
    • +
    • Hra by měla skončit, když had narazí sám do sebe.
    • +
    +

    Pojďme je vyřešit, jednu po druhé.

    +

    Zatím dobrý, teď ale narazíme

    +

    „Hadí“ hry jako ta naše mají dvě varianty: buď je kolem hřiště „zeď“ +a hráč při nárazu do okraje prohraje, nebo je hřiště „nekonečné“ – had okrajem +proleze a objeví se na druhé straně.

    +

    My nakonec naprogramujeme druhou variantu, která je zajímavější. +Začneme ale s tou první, která je jednodušší.

    +

    Vrať se k souboru se stavem – had.py. +Budeme pracovat na chování, na logice hry; ne na vykreslování a ovládání.

    +

    Abys zjistil/a, jestli had „vylezl“ z levého okraje okna ven, +je potřeba zkontrolovat, jestli x-ová souřadnice hlavy +je menší než 0. +To je dobré udělat hned poté, co nové souřadnice hlavy získáš – konkrétně +hned před řádkem new_head = new_x, new_y v metodě move.

    +

    A co při takovém nárazu udělat? +Nejjednodušší bude hru ukončit. +Na to má Python funkci exit(), která funguje podobně jako když v programu +nastane chyba. +Jen místo chybového výpisu ukáže daný text.

    +

    Ukončení programu není příliš příjemný způsob, jak říct hráčovi že prohrál. +Za chvíli ale tuhle část předěláme, tak prozatím tenhle jednoduchý způsob postačí.

    +
        def move(self):
    +        old_x, old_y = self.snake[-1]
    +        dir_x, dir_y = self.snake_direction
    +        new_x = old_x + dir_x
    +        new_y = old_y + dir_y
    +
    +        # Nový kód – kontrola vylezení z hrací plochy
    +        if new_x < 0:
    +            exit('GAME OVER')
    +
    +        new_head = new_x, new_y
    +        self.snake.append(new_head)
    +        del self.snake[0]
    +

    Věřím, že zvládneš udělat stejnou kontrolu pro vylezení ze spodního okraje.

    +

    Jak ale ošetřit ty zbylé okraje – pravý a horní? +Na to je potřeba znát velikost okýnka. +A tu zná Pyglet; třída se stavem k okýnku nemá přístup!

    +

    Na velikosti herní plochy závisí chování hry. +Tahle informace tedy bude tedy muset být součást stavu. +Pro začátek nějakou velikost – třeba 10×10 – nastav v __init__:

    +
            self.width = 10
    +        self.height = 10
    +

    A pak zařiď, aby po nárazu na neviditelnou stěnu kolem hřiště velkého +10×10 políček hra skončila. +Vyzkoušej všechny varianty – severní, jižní, východní i západní zeď. +(Had je virtuální, nemusíš se bát že mu z toho vyroste boule.)

    +
    +

    Řešení

    + + +

    A pak nastav opravdovou velikost herní plochy. Jak? +V souboru se hrou (ui.py), hned po tom co vytvoříš stav (state) +a okýnko (window) velikost nastav. +Použij celočíselné dělení (se zbytkem), aby velikost byla v celých číslech:

    +
    state.width = window.width // TILE_SIZE
    +state.height = window.height // TILE_SIZE
    +

    Nekonečná magická klec

    +

    Teď místo konce hry při naražení necháme hada „projít“ a objevit se na druhé +straně.

    +

    Nemělo by to být tak složité udělat – stačí místo exit() vždy správně +nastavit příslušnou hodnotu. +Je ale potřeba si dát pozor kde použít new_x a kde new_y, kde width a kde +height, a kde přičíst nebo odečíst jedničku, aby při číslování od nuly +všechno sedělo. +Zkus to!

    +

    Jestli už vykresluješ hada místo housenky, možná teď narazíš na problém +s vybíráním správných dílků – okraj herní plochy hada vizuálně rozdělí +na dva menší. +Zatím to ignoruj, ale ve volné chvilce se pokus problém opravit. +Doporučuji se vrátit k „abstraktní“ funkci, která jen vypisuje souřadnice +a směry:

    +
    1 2 tail right
    +2 2 left right
    +3 2 left top
    +3 3 bottom top
    +3 4 bottom top
    +3 5 bottom right
    +4 5 left head

    Jdeš-li podle návodu, tuhle funkci máš uloženou v souboru smery.py +Oprav nejdřív tu, a řešení „transplantuj“ do hry.

    +
    +

    Řešení

    + + +

    Jde to jednodušeji? Jde! +Matematikové vymysleli operaci, která se jmenuje zbytek po dělení. +Ta dělá přesně to, co potřebujeme – zbytek po dělení nové souřadnice velikostí +hřiště dá souřadnici, která leží v hřišti. +Když byla předchozí souřadnice o jedna větší než maximum, +zbytek po dělení bude nula; když byla -1, dostaneme maximum.

    +

    Celý kód pro kontrolu a ošetření vylézání z hrací plochy tak jde +nahradit tímhle:

    +
            new_x = new_x % self.width
    +        new_y = new_y % self.height
    +

    Podobné matematické „zkratky“ umí programátorům často usnadnit život – ale +přijít na ně nebývá jednoduché. +Ale nevěš hlavu: neláká-li tě studovat informatiku na škole, věz, že to jde +i bez „zkratek“. Jen občas trochu krkoloměji.

    +

    Ale jestli tě matematika baví, je tu poznámka pro tebe!

    +

    To, že existuje přesně operace kterou potřebujeme, není až tak úplně náhoda. +Ona matematická jednoduchost je spíš důvod, proč se hrací plocha +u spousty starých her chová právě takhle. +Odborně se tomu „takhle“ říká +toroidální topologie.

    +

    Zkušení matematici si teď možná stěžují na nutnost definovat zbytek po +dělení záporných čísel. Proto dodám, že ho Python schválně +definuje +vhodně pro tento účel; a % b má vždy stejné znaménko jako b.

    +

    Krmení

    +

    Tak. Had je v pasti, už nemůže vylézt. +Co dál?

    +

    Teď se musíme o hada postarat: pravidelně ho krmit. +Ale ještě předtím je potřeba ho naučit, jak se vůbec jí – na naši potravu +ještě není zvyklý. +Když to zvládneme, poroste jako z vody!

    +

    Konkrétně musíme hlavně zajistit, aby když se had připlazí na políčko +s jídlem, tak jídlo zmizelo. +K tomu se dá použít operátor in, který zjišťuje jestli něco (třeba +souřadnice) je v nějakém seznamu (třeba seznamu souřadnic jídla), +a metoda remove, která ze seznamu odstraní daný prvek (podle hodnoty prvku, +na rozdíl od del, který maže podle pozice).

    +

    Nebudu napínat, kód je následující. +Rozumíš mu? +Víš, kam je ho potřeba dát?

    +
            if new_head in self.food:
    +            self.food.remove(new_head)
    +
    +

    Řešení

    + + +

    Vyzkoušej, jestli to funguje. Had by měl jíst jídlo.

    +

    Ještě ale zbývá zařídit, aby po každém soustu trochu povyrostl. +Ale jak? Kterým směrem má růst?

    +

    Tady je dobré se podívat na existující kód a uvědomit si, co dělá.

    +

    Náš had se plazí tak, že napřed vepředu povyroste (pomocí append) +a potom se vzadu zmenší (pomocí del self.snake[0]).

    +

    Aby tedy po snězení jídla vyrostl, stačí přeskočit ono zmenšování! +Ono přeskočit znamená podmínit, pomocí if. +Logika jezení a zmenšování hada tedy bude:

    +
      +
    • Když had sní jídlo, jídlo zmizí. Had se nezmenší.
    • +
    • Jinak (tedy když had nesní jídlo) se had zmenší (a tudíž neroste).
    • +
    +

    Neboli přeloženo do Pythonu:

    +
            if new_head in self.food:
    +            self.food.remove(new_head)
    +        else:
    +            del self.snake[0]
    +

    Pro ty, co se začínají ztrácet, dám k dispozici celou metodu move. +Běda ale těm, kdo opisují kód bez toho aby mu rozuměli!

    +
    +

    Řešení

    + + +

    Nové jídlo

    +

    Když už had umí jíst, je potřeba mu zajistit pravidelný přísun jídla. +Nejlépe tak, že se každé snězené jídlo nahradí novým.

    +

    Přidej do třídy State následující novou metodu, která umí přidat jídlo:

    +
        def add_food(self):
    +        x = 0
    +        y = 0
    +        position = x, y
    +        self.food.append(position)
    +

    Pak tuhle metodu zavolej – najdi v programu kód, který se provádí když +je potřeba přidat nové jídlo, a přidej tam následující řádek:

    +
                self.add_food()
    +

    Tahle metoda přidává jídlo na pozici (0, 0), tedy stále do stejného rohu. +Bylo by ale fajn, kdyby se nové jídlo objevilo vždycky jinde, +na náhodném místě. +Na to můžeme použít funkci random.randrange, která vrací náhodná celá čísla. +Vyzkoušej si ji (z jiného souboru, třeba `experiment.py):

    +
    import random
    +
    +print('Na kostce padlo:', random.randrange(6))
    +

    Čím se liší random.randrange od klasické hrací kostky? +Uměl/a bys program upravit tak, aby padalo 1 až 6?

    +

    Je tahle změna užitečná pro naši hru? Jaký rozsah čísel potřebujeme pro hadí jídlo?

    +

    Až na to přijdeš, zkus přidat náhodu do programu: jídlo by se mělo objevit +na úplně náhjodném políčku na herní ploše. +Nezapomeň na import random – to patří na úplný začátek souboru. +Další změny už dělej v metodě add_food.

    +
    +

    Řešení

    + + +

    Až to budeš testovat, asi zjistíš, že úplně náhodné políčko není ideální. +Občas se totiž jídlo objeví na políčku s hadem, nebo dokonce na jiném jídle. +Je proto dobré tuhle situaci zkontrolovat, a když volba padne na plné políčko, +jídlo nepřidávat:

    +
            if (position not in self.snake) and (position not in self.food):
    +            self.food.append(position)
    +

    Když ale zkusíš tohle, zjistíš, že občas se nové jídlo vůbec nepřidá. +To taky není vhodná varianta – had by tak měl hlad. +Co s tím?

    +

    Překvapivě dobré (i když ne úplně ideální) řešení je zkusit políčko vybrat +několikrát. +Když padne prázdné políčko, šup tam s jídlem; když padne plné, tak to +prostě zkusit znovu.

    +

    Je ale potřeba počet pokusů omezit, aby v situaci, kdy je pole úplně plné, +počítač nevybíral donekonečna. +Řekněme že když se na 100 pokusů nepodaří prázdné políčko vybrat, +vzdáme to.

    +

    Metoda add_food po všech úpravách bude vypadat takhle:

    +
        def add_food(self):
    +        for try_number in range(100):
    +            x = random.randrange(self.width)
    +            y = random.randrange(self.height)
    +            position = x, y
    +            if (position not in self.snake) and (position not in self.food):
    +                self.food.append(position)
    +                # Ukončení funkce ("vyskočí" i z cyklu for)
    +                return
    +

    Jestli ti to funguje, ještě zařiď, aby na začátku hry bylo jídlo na náhodných +pozicích.

    +
    +

    Řešení

    + + +

    Konec

    +

    Had teď může narůst do obrovských rozměrů – a hru stále nelze prohrát. +Zařídíme tedy, aby hra skončila, když had narazí sám do sebe.

    +

    Na rozdíl od 0/1, které jsme použili výše, buďme trochu opatrnější. +Není dobré ukončit celý program; to by se hráčům moc nelíbilo. +Ostatně, zkus si, jak to působí – následující kód dej na správné místo +a zkus, jak se hra hraje, když skončí hned po nárazu:

    +
            # Kontrola, jestli had narazil
    +        if new_head in self.snake:
    +            exit('GAME OVER')
    +
    +

    Řešení

    + + +

    Lepší je hru „zapauzovat“ – ukázat hráči situaci, do které nešťastného hada +dostal, aby se z ní mohl pro příště poučit.

    +

    Aby to bylo možné, dáme do stavu hry další atribut: snake_alive. +Ten bude nastavený na True, dokud bude had žít. +Když had narazí, nastaví se na False, a od té doby se už nebude pohybovat. +Je dobré i graficky ukázat, že hadovi není dobře – hráč pak spíš bude +zpytovat svědomí.

    +

    Zkus zapřemýšlet, kam v kódu (a i do kterých souborů) patří následující +kousky kódu, které prohru implementují:

    +
            # Prvotní nastavení atributu
    +        self.snake_alive = True
    +
            # Kontrola, jestli had narazil
    +        if new_head in self.snake:
    +            self.snake_alive = False
    +
            # Zabránění pohybu
    +        if not self.snake_alive:
    +            return
    +
            # Grafická indikace
    +        if dest == 'head' and not state.snake_alive:
    +            dest = 'dead'
    +
    +

    Řešení

    + + +

    Vylepšení ovládání

    +

    Poslední úprava kódu!

    +

    Možná si všimneš – zvlášť jestli jsi už nějakou verzi hada hrál/a, +že ovládání tvé nové hry je trošku frustrující. +A možná není úplně jednoduché přijít na to, proč.

    +

    Můžou za to (hlavně) dva důvody.

    +

    První problém: když zmáčkneš dvě šipky rychle za sebou, v dalším „tahu“ +hada se projeví jen ta druhá. +Z pohledu programu je to chování (snad) jasné – po stisknutí šipky se uloží +její směr, a při „tahu“ hada se použije poslední uložený směr. +S tímhle chováním je ale složité hada rychle otáčet: hráč se musí „trefovat“ +do tahů hada. +Lepší by bylo, kdyby se ukládaly všechny stisknuté klávesy, a had by +v každém tahu reagoval maximálně jednu – další by si „schoval“ na další tahy.

    +

    Takovou „frontu“ stisků kláves lze uchovávat v seznamu. +Přidej si na to do stavu hry seznam (v metodě __init__):

    +
            self.queued_directions = []
    +

    Tuhle frontu plň v ui.py po každém stisku klávesy, metodou append. +Je potřeba změnit většinu funkce on_key_press:

    +
    @window.event
    +def on_key_press(symbol, mod):
    +    if symbol == pyglet.window.key.LEFT:
    +        new_direction = -1, 0
    +    if symbol == pyglet.window.key.RIGHT:
    +        new_direction = 1, 0
    +    if symbol == pyglet.window.key.DOWN:
    +        new_direction = 0, -1
    +    if symbol == pyglet.window.key.UP:
    +        new_direction = 0, 1
    +    state.queued_directions.append(new_direction)
    +

    A zpátky k logice, v had.py v metodě move místo +dir_x, dir_y = self.snake_direction z fronty vyber první nepoužitý prvek +(a nezapomeň ho z fronty smazat, ať se dostane i na další!):

    +
            if self.queued_directions:
    +            new_direction = self.queued_directions[0]
    +            del self.queued_directions[0]
    +            self.snake_direction = new_direction
    +

    Zkontroluj, že to funguje.

    +

    Druhý problém: když se had plazí doleva a hráč zmáčkne šipku doprava, +had se otočí a hlavou si narazí do krku. +Z pohledu programu to dává smysl: políčko napravo od hlavy je plné, +hra tedy končí. +Z pohledu hry (a biologie už vůbec!) ale narážení do krku moc smyslu nedává. +Lepší by bylo obrácení směru úplně ignorovat.

    +

    A jak poznat opačný směr? +Když se had plazí doprava – (1, 0) – tak je opačný směr doleva – (-1, 0). +Když se plazí dolů – (0, -1) – tak naopak je nahoru – (0, 1). +Obecně, k (x, y) je opačný směr +(-x, -y).

    +

    Zatím ale pracujeme s celými n-ticemi, je potřeba obě +na x a y „rozbalit“. +Kód tedy bude vypadat takto:

    +
                old_x, old_y = self.snake_direction
    +            new_x, new_y = new_direction
    +            if (old_x, old_y) != (-new_x, -new_y):
    +                self.snake_direction = new_direction
    +

    A to je vše?

    +

    Gratuluji, máš funkční a hratelnou hru! +Doufám že jsi na sebe hrdý/á!

    +

    Dej si něco sladkého, zasloužíš si to.

    +
    +

    Tady je moje řešení. +To se touhle dobou od toho tvého může dost lišit – to je úplně normální. +(A nedívej se sem dokud hada nenaprogramuješ sám/sama, +Chybami (a neustálým zkoušením) se člověk učí – a programátor zvlášť. +Čtením už vyřešeného se učí hůř.)

    +
    +

    Řešení

    + + +

    Najdeš ještě nějaké další vylepšení, které by se dalo udělat?

    +

    Zkus třeba následující rozšíření:

    +
      +
    • Každých 30 vteřin hry přibude samo od sebe nové jídlo, +takže jich pak bude na hrací ploše víc.

      +
    • +
    • Hra se bude postupně zrychlovat.
      +(Na to je nejlepší předělat funkci moveui.py, aby sama +naplánovala, kdy se má příště zavolat. Volání schedule_interval tak už +nebude potřeba.)

      +
    • +
    • Hadi budou dva; druhý se ovládá klávesami +W A S D.
      +(Na to je nejlepší udělat novou třídu, Snake, a všechen stav hada +přesunout ze State do ní. Ve State pak měj seznam hadů. +Téhle změně je potřeba přizpůsobit celý zytek programu.)

      +
    • +
    \ No newline at end of file diff --git a/lessons/magic/index.html b/lessons/magic/index.html new file mode 100644 index 00000000..b419151d --- /dev/null +++ b/lessons/magic/index.html @@ -0,0 +1,577 @@ +

    Magie

    +

    Co z Pythonu dělá tak užitečný jazyk? +Z velké části je to zaměření na čitelnost kódu. Pythonu se někdy říká „spustitelný pseudokód“: syntaxe je inspirovaná zápisem abstraktních algoritmů v matematice, používá se málo speciálních znaků jako $, <<, &&, ?. +Čitelnosti je podřízena expresivita (proto v Pythonu nenajdeme makra jako v Lispu) i délka zápisu (některé věci se nedají napsat na jeden řádek).

    +

    Návrh jazyka (a knihoven pro něj) se řídí mimo jiné poučkou „There should be one– and preferably only one –obvious way to do it.“ +Existuje ideálně jeden zjevně nejlepší způsob, jak dosáhnout určité funkčnosti. +Úkolem programátora je tento způsob najít a použít. Náš cíl by měl být kód, který ostatní programátoři pochopí na první pohled. A pokud je to možné, měli by ho pochopit i neprogramátoři. Není mezi nimi pevná hranice – váš kód můžou číst lidi, kteří programovací jazyk v životě neviděli; programátoři silní v jiných jazycích; průměrní Pythonisté; nebo ostřílení veteráni. Čím víc jich dokáže kód pochopit, tím bude váš kód udržovatelnější.

    +

    S tím souvisí koncept „magie“. Magie je něco, co funguje, ačkoli tomu nerozumíme. Pro každého čtenáře kódu může být magie něco jiného: pro začátečníka bude nepochopitelný zápis zip(*args), matematik nemusí chápat princip dědičnosti tříd, ostřílený Pythonista nemusí chápat maticovou matematiku, neprogramátor netuší, jak funguje mobil nebo webová aplikace. Je to tedy subjektivní pojem, ale lze ho zobjektivnit: čím méně lidí váš kód pochopí, tím je kód magičtější.

    +

    Magie, která funguje, nevadí. Věci které nechápu, můžu stále používat – jen nevím jak fungují, a tudíž je neumím opravit. Problém nastane až v momentě, kdy se něco pokazí.

    +

    Přehlednost a udržitelnost kódu je samozřejmě potřeba vyvážit s ostatními aspekty. Kód musí být například dostatečně rychlý a optimalizace ho často znepřehlední. Proto je dobré optimalizovat až potom, co vím, že je kód správný a řeší opravdu problém, který potřebuji vyřešit. V ten moment napíšu testy a potom, když je potřeba, můžu optimalizovat – trochu přehlednosti vyměnit za rychlost.

    +

    Na jiný důvod, proč použít méně pochopitelné techniky, narazíme při psaní knihoven a frameworků. To je kód, který používá hodně programátorů – a často jsou to programátoři s méně zkušenostmi, než mají autoři knihovny. Tady proto bývá dobré občas použít nějakou tu magii – znepřehlednit kód knihovny, aby kód který knihovnu používá, mohl být přehlednější.

    +

    Typický příklad jsou dekorátory ve Flasku. Napsat dekorátor není úplně triviální, ale velice to zjednodušuje práci všem, co ve Flasku píšou web. Konstrukce @app.route je pro většinu lidí magická – nevíme přesně, co to dělá, ale to nám nebrání ji použít.

    +

    Velká moc a velká zodpovědnost

    +

    Druhý možný význam slova magie je něco, co neodpovídá „normálnímu“ chování podobných věcí.

    +

    Jazyk Python standardizuje syntaxi relativně malého počtu operací (operátory, volání funkcí, atributy, ...), způsobů řízení toku programu (cykly, with, ...) a strukturování kódu (moduly, def, class). +To, že je jich relativně málo, má dvě výhody: zaprvé fungují s ostatními části jazyka a zadruhé nebývá problém rozhodnout, který způsob je pro daný problém nejlepší.

    +

    Téměř všechno v Pythonu ale jde předefinovat. Operátor / nemusí jen dělit: můžu si napsat třídu pro jméno souboru, která umí pomocí / oddělovat adresáře *. +Cyklus for nemusí iterovat přes předem danou sekvenci prvků; iterovatelný objekt může poskytovat jakékoli hodnoty podle jakýchkoli pravidel. +Příkaz class dokonce vůbec nemusí vytvořit třídu, jak uvidíme později.

    +

    Ačkoliv si ale můžeme dovolit téměř cokoli, je dobré mít na paměti, že odchylky od „normálního“ chování jsou magické. Jakmile někdo použije divnou třídu, která předefinovává dělení, ve svém kódu, musí každý čtenář toho kódu nejen opustit představu o tom, co operátor / dělá, ale hlavně si předtím uvědomit, že / může dělat něco divného. To samé platí u „divných“ iterovatelných objektů nebo tříd. Odchylka od normálního chování, je-li nezbytná, by měla být dobře promyšlená a zdokumentovaná.

    +

    Nadefinujeme-li vlastní nestandardní – „magické“ – chování některých objektů, často se stane, že nebudou fungovat s ostatními prvky jazyka tak dobře, jako to co je zabudované. Předefinujeme-li < tak, že nebude mít nic společného s porovnáváním, bude se funkce sorted chovat podivně. Když u svých objektů předefinuji přístup k atributům, musím si dávat zvlášť pozor na to, aby fungovala funkce dir().

    +

    Následující principy (kromě jiných) je proto dobré při psaní knihoven používat jen po pečlivém zvážení, jestli by to nešlo i bez magie.

    +

    * Taková třída dokonce existuje ve standardní knihovně.

    +

    Speciální metody

    +

    Základní způsob, jak přizpůsobit chování objektů, jsou speciální metody. +Asi už víte, že všechny atributy, které začínají a končí dvojitým podtržítkem, jsou rezervované pro samotný Python, který je používá podle svých pravidel – například danou metodu volá, když je potřeba sečíst dvě čísla.

    +

    Speciální metody jsou popsané v dokumentaci. Zde uvedu jen přehled, který pokročilý Pythonista nosí v hlavě, aby věděl co je všechno možné. +Doporučuji si předtím, než nějakou naimplementujete, dokumentaci přečíst.

    +

    Metody pro předefinování aritmetických operátorů: +__add__, __sub__, __mul__, __div__, __floordiv__, __pow__, __matmul__, __lshift__, __rshift__, __or__, __xor__ a varianty s r a i (__radd__, __iadd__, atd.); +__neg__, __pos__, __abs__, __invert__.

    +

    Metody pro předefinování porovnávání: +__eq__, __ne__, __lt__, __gt__, __le__, __ge__, __hash__.

    +

    Metoda pro zavolání objektu jako funkce: +__call__.

    +

    Metody pro funkčnost sekvencí a kontejnerů: +__len__, __iter__, __next__, __reversed__; __contains__ pro operátor in.

    +

    Metody pro „hranaté závorky“: +__getitem__, __setitem__, __delitem__.

    +

    Převádění na řetězce: +__repr__, __str__, __format__.

    +

    Převádění na čísla: +__complex__, __float__, __index__, __round__, __floor__, __ceil__.

    +

    Převádění na bool (např. i v if): +__bool__.

    +

    Vytváření a rušení objektů: +__new__ (konstruktor – vytvoří objekt dané třídy), __init__ (inicializuje objekt dané třídy), __del__ (zavoláno před zrušením objektu).

    +

    Předefinování přístupu k atributům: +__getattr__ (zavolá se, pokud se atribut nenajde), __getattribute__ (zavolá se pro každý přístup k atributu), __setattr__, __delattr__, __dir__.

    +

    Implementace context manageru (pro with): +__enter__, __exit__.

    +

    Implementace deskriptoru (viz níže): +__get__, __set__, __delete__.

    +

    Implementace asynchronní funkcionality: +__await__, __aiter__, __anext__, __aenter__, __aexit__.

    +

    Předefinování hierarchie dědičnosti: +__instancecheck__, __subclasscheck__.

    +

    Dekorátory

    +

    Další věc, na kterou se podíváme, jsou dekorátory – způsob, jak si +přizpůsobovat funkce.

    +

    Nejjednodušší použití dekorátorů je registrace: +k funkci přidáme dekorátor a funkce se někam zaregistruje, uloží, +aby se dala zavolat později. +Typický příklad je @app.route ve Flasku.

    +

    My si pro příklad budeme chtít udělat dekorátor pro kalkulačku, +@register_operator, aby fungoval tento kód:

    +
    operators = {}
    +
    +@register_operator
    +def add(a, b):
    +    return a + b
    +
    +@register_operator
    +def mul(a, b):
    +    return a * b
    +
    +a = int(input('First number: '))
    +operator_name = input('Operation: ')
    +b = int(input('Second number: '))
    +
    +func = operators[operator_name]
    +print(func(a, b))
    +

    Bez použití dekorátorů by se to dalo napsat takto:

    +
    def register_operator(func):
    +    operators[func.__name__] = func
    +
    +def add(a, b):
    +    return a + b
    +
    +register_operator(add)
    +

    S použitím dekorátoru je funkce register_operator téměř stejná, +jen použijeme speciální syntaxi se zavináčem.

    +
    def register_operator(func):
    +    operators[func.__name__] = func
    +    return func
    +
    +@register_operator
    +def add(a, b):
    +    return a + b
    +

    Použití dekorátoru je jen zkrácený zápis pro volání dekorátoru jako +funkce – poslední tři řádky předchozího příkladu jsou ekvivalentní tomuto:

    +
    def add(a, b):
    +    return a + b
    +
    +add = register_operator(add)
    +

    Chování samotného @ je tedy celkem triviální. +Magie (složitost) spočívá v tom, že dekorátor je většinou funkce vyššího řádu: +bere jinou funkci jako argument a taky jinou funkci vrací. +V případě registrace vrací stejnou funkci jako dostala – ale to není povinné.

    +

    Často se setkáme s dekorátory, které dekorovanou funkci nějak modifikují. +Například můžeme napsat dekorátor, který v naší kalkulačce převede vstup +na reálná čísla. +Dělá to tak, že definuje novou funkci, která volá tu původní – ale před nebo +po tomto volání může dělat i něco jiného.

    +
    def to_floats(func):
    +    def outer_function(a, b):
    +        a = float(a)
    +        b = float(b)
    +        return func(a, b)
    +    return outer_function
    +
    +@to_floats
    +def add(a, b):
    +    """Adds two numbers"""
    +    return a + b
    +
    +print(add(1, '2'))
    +

    Takto funguje většina dekorátorů, které mění chování dekorované funkce. +Naráží s tím ale na jeden problém: nově nadefinovaná funkce má vlastní jméno +(a dokumentační řetězec a podobné informace), což kazí iluzi, že jsme +původní funkci jen trošku změnili:

    +
    print(add)
    +help(add)
    +

    Řešení je jednoduché – zkopírovat jméno, dokumentační řetězec atd. z jedné +funkce na druhou. +Na to ve standardní knihovně existuje dekorátor jménem functools.wraps:

    +
    import functools
    +
    +def to_floats(func):
    +    @functools.wraps(func)
    +    def outer_function(a, b):
    +        a = float(a)
    +        b = float(b)
    +        return func(a, b)
    +    return outer_function
    +

    S wraps bude help(add) fungovat správně – ukáže původní jméno +a dokumentační řetězec.

    +

    Z volání wraps(func) je vidět, že jako dekorátor můžeme použít i volání +funkce, ne jen funkci samotnou. +Budeme-li chtít napsat dekorátor, který tohle umí, potřebujeme napsat +funkci ještě vyššího řádu – totiž funkci, která po zavolání vrátí dekorátor:

    +
    operators = {}
    +
    +def register_operator(name):
    +    def decorator(func):
    +        operators[name] = func
    +        return func
    +    return decorator
    +
    +@register_operator('+')
    +def add(a, b):
    +    return a + b
    +
    +@register_operator('*')
    +def mul(a, b):
    +    return a * b
    +
    +a = int(input('First number: '))
    +operator_name = input('Operation: ')
    +b = int(input('Second number: '))
    +
    +func = operators[operator_name]
    +print(func(a, b))
    +

    Řádek @register_operator('+') dělá (jak už víme) to stejné, jako bychom hned +za funkcí napsali add = register_operator('+')(add).

    +

    Budete-li chtít napsat dekorátor, který bere argumenty, a přitom ještě +„mění“ dekorovanou funkci, dostanete se na tři funkce zanořené v sobě:

    +
    import functools
    +operators = {}
    +
    +def register_operator(name):
    +    def to_floats(func):
    +
    +        @functools.wraps(func)
    +        def outer_function(a, b):
    +            a = float(a)
    +            b = float(b)
    +            return func(a, b)
    +
    +        operators[name] = outer_function
    +        return outer_function
    +
    +    return to_floats
    +
    +@register_operator('+')
    +def add(a, b):
    +    return a + b
    +
    +func = operators['+']
    +print(func(1, '2'))
    +

    Dekorátorů se na jedné funkci dá použít víc:

    +
    @register_operator('×')
    +@register_operator('*')
    +def mul(a, b):
    +    return a * b
    +

    Úplně stejně jako funkce se dají dekorovat i třídy. +Dekorátor dostane třídu jako první argument a třída se nahradí tím, +co dekorátor vrátí.

    +

    Deskriptory

    +

    Jeden z nejmagičtějších operátorů v Pythonu je ., tečka. +Je magický v obou významech – většina lidí ho používá, ačkoli nemá tušení, co přesně dělá, a dá se předefinovat tolika různými způsoby, že to vydá na celou přednášku.

    +

    Pomocí tečky zapisujeme tři operace: čtení atributu (print(foo.bar)), zapisování (foo.bar = 3) a mazání (del foo.bar). +Tady se zaměříme hlavně na nejmagičtější z nich, čtení.

    +

    Kdykoli atribut čteme pomocí tečky, hledá se na několika místech:

    +
      +
    • na samotné instanci objektu,
    • +
    • pokud se tam nenajde, tak na třídě,
    • +
    • pokud se nenajde ani tam, tak na rodičovských třídách (v případě vícenásobné dědičnosti podle MRO),
    • +
    • a pokud stále není k nalezení, vyhodí se AttributeError.
    • +
    +

    To je trochu zjednodušený, ale užitečný model.

    +

    Speciální metody, které se nevolají pomocí tečky, přeskakují první krok: metoda __add__ tedy musí být definována na třídě, aby se zavolala pro a + b.

    +

    (Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

    +
    +

    Podívejme se teď na získávání atributu trošku podrobněji. Je to poměrně komplikovaný proces a existuje několik způsobů, jak ho přizpůsobit. Nejjednodušší je dvojice speciálních metod:

    +
      +
    • __getattribute__, která kompletně předefinuje funkci . pro čtení atributu, a
    • +
    • __getattr__, která se zavolá, až když se atribut nenajde normálním způsobem.
    • +
    +

    První z nich nedoporučuji používat, protože je příliš obecná (pokusy se z ní dostat ke stavu objektu končívají nekonečnou rekurzí). +Příklad druhé:

    +
    class Palette:
    +    red = 255, 0, 0
    +    green = 0, 255, 0
    +
    +    def __getattr__(self, attr_name):
    +        prefix, sep, suffix = attr_name.partition('_')
    +        if prefix == 'dark':
    +            original_color = getattr(self, suffix)
    +            return tuple(c//2 for c in original_color)
    +        else:
    +            raise AttributeError(attr_name)
    +
    +palette = Palette()
    +print(palette.dark_red)
    +

    (Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

    +

    Metoda __getattr__ je většinou tak trochu kanón na vrabce: ve většině případů nepotřebujeme nastavit chování všech neexistujících atributů, ale jenom jednoho nebo několika konkrétních. +Například máme třídu pro 2D bod s atributy x a y a potřebujeme i atribut pro dvojici (x, y). +Toto se často dělá pomocí dekorátoru property:

    +
    class Point:
    +    def __init__(self, x, y):
    +        self.x = x
    +        self.y = y
    +
    +    @property
    +    def pos(self):
    +        return self.x, self.y
    +
    +point = Point(41, 8)
    +print(point.pos)
    +

    Jak to ale funguje? Dekorátor property je třída, jakou můžete teoreticky napsat sami v Pythonu. +Je to deskriptor, objekt, který v rámci nějaké třídy popisuje jak přistupovat k nějakému atributu.

    +

    Nejlépe se deskriptory vysvětlí na příkladu:

    +
    # (Omluvte prosím češtinu v kódu)
    +
    +class Descriptor2D:
    +    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
    +
    +    def __init__(self, name1, name2):
    +        self.name1 = name1
    +        self.name2 = name2
    +
    +    def __get__(self, instance, cls=None):
    +        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
    +        """
    +
    +        if instance is not None:
    +            # Je-li instance nastavena, čteme atribut z ní.
    +            return getattr(instance, self.name1), getattr(instance, self.name2)
    +        else:
    +            # Je-li instance None, čteme atribut přímo ze třídy `cls`;
    +            # v tomto případě slušné deskriptory většinou vrací deskriptor samotný.
    +            return self
    +
    +class Rect:
    +    def __init__(self, x, y, w, h):
    +        self.x = x
    +        self.y = y
    +        self.w = w
    +        self.h = h
    +
    +    pos = Descriptor2D('x', 'y')
    +    size = Descriptor2D('w', 'h')
    +
    +rect = Rect(1, 2, 3, 4)
    +print(rect.pos)
    +print(rect.size)
    +
    +# Čtení atributu přímo ze třídy:
    +print(Rect.pos)
    +

    Deskriptory jsou tedy součást třídy – atributy s nějakým jménem. Popisují, jak se bude přistupovat k atributu daného jména.

    +

    Existují dva druhy deskriptorů: data descriptor a non-data descriptor. +Liší se v tom, jestli popisují jen, jak se daný atribut čte, nebo i jak se do něj zapisuje. +Výše uvedený deskriptor je non-data: ovládá jen čtení. Zápis funguje jako u normálních atributů: +přepíše aktuální hodnotu – a nová hodnota se pak použije místo volání deskriptoru:

    +
    rect.pos = 'haha'
    +print(rect.pos)
    +

    Abychom tomu zabránili, můžeme na deskriptoru nadefinovat speciální metodu __set__ (nebo __delete__), která popisuje, +jak se atribut nastavuje (resp. maže). +Tím vznikne data descriptor:

    +
    class Descriptor2D:
    +    def __init__(self, name1, name2):
    +        self.name1 = name1
    +        self.name2 = name2
    +
    +    def __get__(self, instance, cls=None):
    +        if instance is not None:
    +            return getattr(instance, self.name1), getattr(instance, self.name2)
    +        else:
    +            return self
    +
    +    def __set__(self, instance, new_value):
    +        a, b = new_value
    +        setattr(instance, self.name1, a)
    +        setattr(instance, self.name2, b)
    +
    +    def __delete__(self, instance):
    +        delattr(instance, self.name1)
    +        delattr(instance, self.name2)
    +
    +class Rect:
    +    # jako předtím
    +
    +rect = Rect(1, 2, 3, 4)
    +rect.pos = 123, 456
    +print(rect.pos)
    +

    Už zmíněný vestavěný deskriptor property je data descriptor. +Popisuje jak čtení, tak zápis atributu. Pokud mu nenastavíme funkci pro zápis, vyhodí ze své metody __set__ výjimku AttributeError se zprávou, že do atributu se zapisovat nedá. (To je trochu magická odchylka od normálního chování Pythonu, kdy atributy zapisovat jdou.)

    +

    Nejčastější příklad non-data deskriptoru je obyčejná funkce. +Každá funkce totiž funguje jako deskriptor: má speciální metodu __get__, která zajišťuje, že pokud je nastavena na třídě, daným atributem nedostaneme funkci, ale metodu (s „předvyplněným“ parametrem self).

    +
    def foo(self):
    +    return 4
    +
    +class C:
    +    foo = foo
    +
    +c = C()
    +
    +# Obyčejná funkce
    +print(C.foo)
    +print(foo)
    +
    +# Metoda
    +print(C().foo)
    +print(foo.__get__(c))
    +

    Protože je to non-data deskriptor, můžeme v jednotlivých instancích třídy +daný atribut přepsat něčím jiným, čímž metodu znepřístupníme.

    +

    Jako zajímavost uvedu non-data deskriptor, který přepisuje svůj vlastní atribut. +Funguje podobně jako @property, jen se výsledek vypočítá pouze jednou a uloží se jako normální atribut. +Při dalším přístupu k atributu už se použije uložená hodnota.

    +
    class reify:
    +    def __init__(self, func):
    +        self.func = func
    +
    +    def __get__(self, instance, cls=None):
    +        if instance is None:
    +            return self
    +        val = self.func(instance)
    +        setattr(instance, self.func.__name__, val)
    +        return val
    +
    +class Vector:
    +    def __init__(self, x, y):
    +        self.x = x
    +        self.y = y
    +
    +    @reify
    +    def length(self):
    +        print('Running expensive computation...')
    +        return (self.x ** 2 + self.y ** 2) ** 0.5
    +
    +vect = Vector(3, 4)
    +print(vect.length)
    +print(vect.length)
    +print(vect.length)
    +

    Kompletní implementace je např. ve frameworku Pyramid jako pyramid.decorator.reify.

    +

    Konstruktor

    +

    Třídy v Pythonu můžou mít konstruktor – funkci, která se zavolá, aby +vytvořila objekt daného typu. +Toto není známá metoda __init__ – ta objekt nevytváří, ta dostane už +předpřipravený self, který jen naplní atributy. +Opravdový konstruktor se jmenuje __new__ a chová se jako classmethod: +místo self bere třídu, jejíž instanci má vytvořit.

    +

    Opravdový konstruktor se „hodí“ pro vytváření singletonů, tříd, které mají jen +jednu instanci:

    +
    class Singleton:
    +    def __new__(cls):
    +        try:
    +            return cls._instance
    +        except AttributeError:
    +            cls._instance = super().__new__(cls)
    +            return cls._instance
    +
    +assert Singleton() is Singleton()
    +

    Podobný trik lze použít pro třídu podobnou bool, která má pouze dvě instance: +bool(1) is bool(2).

    +

    Metoda __new__ se hodí, když chceme dědit z neměnitelné (immutable) +třídy jako tuple. +Metoda __init__ sice dostane self, ale cokoli z nadtřídy už nemůže měnit. +Je ale možné předefinovat __new__.

    +

    Normálně bere tuple jediný argument, tuple([1, 2]). +Chceme-li brát dva, dá se to udělat takto:

    +
    class Point(tuple):
    +    def __new__(cls, x, y):
    +        return super().__new__(cls, (x, y))
    +
    +print(Point(3, 4))
    +

    Metatřídy

    +

    Poslední věc, na kterou se podíváme, jsou metatřídy.

    +

    Začneme zlehka: pokud při definici třídy zadáme nějakou funkci jako pojmenovaný +parametr metaclass, funkce se zavolá s informacemi potřebnými pro vytvoření +třídy. +Ty můžeme použít, nebo úplně ignorovat a vrátit něco jiného:

    +
    def fake_metaclass(name, bases, namespace):
    +    return 42
    +
    +class NotAClass(metaclass=fake_metaclass):
    +    pass
    +
    +print(NotAClass)
    +

    Argumenty, které „metatřída” dostane, jsou tři: jméno třídy, n-tice +nadtříd a jmenný prostor – slovník s proměnnými, které vznikly vykonáním +těla příkazu class. +(Ve jmenném prostoru jsou implicitně nastavené záznamy __module__ +a __qualname__, které přidává samotný příkaz class.)

    +
    def fake_metaclass(name, bases, namespace):
    +    print('name:', name)
    +    print('bases:', bases)
    +    print('namespace:', namespace)
    +    return 42
    +
    +class NotAClass(int, metaclass=fake_metaclass):
    +    foo = 123
    +    def inc(self):
    +        return self + 1
    +

    Když metaclass nezadáme, použije se výchozí metatřída, tedy třída třídy. +V Pythonu je to type. +Pokud ji zavoláme s vhodnými argumenty, dostaneme normální třídu:

    +
    MyInt = type('MyInt', (int, ), {'foo': 123, 'inc': lambda self: self + 1})
    +
    +three = MyInt(3)
    +print(three.inc())
    +

    Kromě toho se type dá zavolat i s jedním argumentem; v tom případě vrátí +typ (třídu) daného argumentu. +(Tohle chování – funkce, která dělá úplně různé věci v závislosti na počtu +argumentů – v Pythonu často nevidíme. +Je to nešťastná výjimka, která přežívá z historických důvodů.)

    +

    Pojďme se podívat na třídy několika základních objektů:

    +
    # Třída základních objektů
    +print(type(1))
    +print(type("abc"))
    +
    +# Třída třídy – metatřída.
    +# Třída většiny tříd v Pythonu je `type`
    +print(type(int))
    +print(type(type(1)))
    +
    +# Třída třídy třídy
    +# Samotná `type` je jedna z té většiny tříd; její třída je `type`
    +print(type(type))
    +print(type(type(type(1))))
    +

    Objekty třídy type (tedy třídy) se normálně tvoří příkazem class. +Explicitně to můžeme napsat takto:

    +
    class NormalClass(metaclass=type):
    +    foo = 123
    +

    Když budeme chtít chování třídy změnit, budeme postupovat podobně jako +u jiných objektů. +Kdybych chtěl celé číslo, přes které jde iterovat, podědím z int +a předefinuji __iter__. +Pokud chci třídu, přes kterou jde iterovat (tedy ne přes objekty dané +třídy – přes třídu samotnou!), podědím z type a předefinuji __iter__:

    +
    class IterableMeta(type):
    +    def __init__(cls, name, bases, namespace):
    +        cls.items = sorted(n for n in namespace
    +                           if not n.startswith('__'))
    +        super().__init__(name, bases, namespace)
    +
    +    def __iter__(cls):
    +        return iter(cls.items)
    +
    +class SimpleEnum(metaclass=IterableMeta):
    +    a = 1
    +    b = 2
    +    c = 3
    +    d = 4
    +
    +print(SimpleEnum.a)
    +print(list(SimpleEnum))
    +

    (V metatřídě se většinou používá cls místo self, aby bylo jasné, že +instance, se kterou pracujeme, je třída – ale to je jen konvence.)

    +

    Metatřídy se dědí. +Pokud v příkazu class nezadám explicitně metaclass, použije +se metatřída nadtřídy:

    +
    class AnotherEnum(SimpleEnum):
    +    x = 10
    +    y = 20
    +    z = 30
    +
    +print(AnotherEnum.a)
    +print(list(AnotherEnum))
    +

    Tímto způsobem lze vnuknout třídám magické schopnosti bez toho, aby +uživatel naší knihovny musel použít metaclass – stačí mu podědit z námi +připravené třídy.

    +

    Další věc, kterou metatřídy umí, je připravit počáteční jmenný prostor. +Metoda __init__ (nebo __new__) v metatřídě normálně dostane slovník, +což nemusí být vždy to, co potřebuji. +Můžu si chtít třeba „zapamatovat” pořadí, v jakém byly jednotlivé atributy +vytvořeny – a slovník toto pořadí neuchovává (alespoň v některých verzích Pythonu).

    +

    Na to existuje speciální metoda __prepare__, která se, když na metatřídě +existuje, zavolá pro vytvoření jmenného prostoru:

    +
    from collections import OrderedDict
    +
    +class OrderRememberingMeta(type):
    +    def __prepare__(cls, name):
    +        return OrderedDict()
    +
    +    def __init__(cls, name, bases, namespace):
    +        cls.items = list(namespace)
    +        super().__init__(name, bases, namespace)
    +
    +    def __iter__(cls):
    +        return iter(cls.items)
    +
    +class OrderedEnum(metaclass=OrderRememberingMeta):
    +    first = 1
    +    second = 2
    +    third = 3
    +    fourth = 4
    +    fifth = 5
    +
    +print(list(OrderedEnum))
    +

    Toho se dá využít třeba v mapování objektů na databázi (např. v Django Models +nebo SQLAlchemy), kdy chceme, aby pořadí sloupců tabulky odpovídalo +tomu, jak jsou sloupce/atributy nadefinovány ve třídě.

    +

    A další

    +

    Další (bohužel?) oblíbený trik je vnuknutí magických schopností modulu.

    +

    Naimportované moduly Python ukládá do slovníku sys.modules, aby při dalším +importu nemusel načítat znovu – sys.modules tedy slouží jako cache. +A tuto cache můžeme změnit (tzv. cache poisoning) – přidat si do ní +vlastní „modul“, který ovšem vůbec nemusí být modul, a tudíž může umět věci, +které moduly normálně neumí:

    +
    import sys
    +
    +sys.modules['fake'] = 'a string'
    +
    +...
    +
    +import fake
    +
    +print(fake[2])
    +

    Když toto uděláme přímo z modulu, uživatel naší knihovny dostane podstrčený +objekt hned při prvním importu. +K tomu se hodí proměnná __name__, jméno aktuálního modulu:

    +
    sys.modules[__name__] = ReplacementModule()
    +

    Jiný trik je registrace „built-in“ („superglobální”) proměnné:

    +
    import builtins
    +builtins.ANSWER = 42
    +
    +...
    +
    +# Třeba v jiném modulu
    +print(ANSWER)

    Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy +užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

    +

    Úkol

    +

    Úkol není!

    +

    Budete-li chtít některé techniky z této lekce ve svém kódu (včetně semestrálky) použít, zamyslete se, jestli se problém nedá vyřešit jednodušeji, čitelněji, přehledněji, udržovatelněji. +Dobrý mág ví, kdy magii nepoužít.

    \ No newline at end of file diff --git a/lessons/micropython/circuits/led.fzz b/lessons/micropython/circuits/led.fzz new file mode 100644 index 0000000000000000000000000000000000000000..2bbd3e36cf19b71c6462dc0db3b29d6728add797 GIT binary patch literal 32066 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⪼*P2tV^X)-jyjnaO0h9u3lm^^o96F`F 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 literal 0 HcmV?d00001 diff --git a/lessons/micropython/circuits/led_bb.svg b/lessons/micropython/circuits/led_bb.svg new file mode 100644 index 00000000..48d1d957 --- /dev/null +++ b/lessons/micropython/circuits/led_bb.svg @@ -0,0 +1,4537 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0 + D1 + D2 + D3 + D4 + 3V + G + D5 + D6 + D7 + D8 + RX + TX + G + 3V + Vin + G + RST + EN + 3V + G + SK + S0 + SC + S1 + S2 + S3 + VU + G + A0 + + + + + + FLASH + RST + + + + + + + + + + + + + + + + + + + + NodeMCU + + . + + + + + + diff --git a/lessons/micropython/circuits/led_bb_off.svg b/lessons/micropython/circuits/led_bb_off.svg new file mode 100644 index 00000000..b1f7ff6c --- /dev/null +++ b/lessons/micropython/circuits/led_bb_off.svg @@ -0,0 +1,4528 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + D0 + D1 + D2 + D3 + D4 + 3V + G + D5 + D6 + D7 + D8 + RX + TX + G + 3V + Vin + G + RST + EN + 3V + G + SK + S0 + SC + S1 + S2 + S3 + VU + G + A0 + + + + + + FLASH + RST + + + + + + + + + + + + + + + + + + + + NodeMCU + + . + + + + + diff --git a/lessons/micropython/index.1.html b/lessons/micropython/index.1.html new file mode 100644 index 00000000..312628f0 --- /dev/null +++ b/lessons/micropython/index.1.html @@ -0,0 +1,194 @@ +

    MicroPython (na ESP8266/NodeMCU)

    +

    (Tato lekce bohužel, na rozdíl od předchozích, nejde jen tak vyzkoušet z domu – je potřeba speciální hardware.)

    +

    Dnes si ukážeme, jak lze Python použít na malých/vestavěných zařízeních.

    +

    Před sebou byste měli mít:

    +
      +
    • vývojovou desku NodeMCU,
    • +
    • modrou LED,
    • +
    • pásek s RGB LED moduly,
    • +
    • několik drátků,
    • +
    • malé nepájivé pole.
    • +
    +

    Přichystejte si MicroUSB kabel. Pokud nemáte vlastní, několik jich můžeme zapůjčit.

    +

    Obsah lekce vychází z tutoriálů pro PyLadies (a, b), na které se můžete podívat, pokud tu bude něco vysvětleno příliš rychle.

    +

    Popis desky

    +

    V posledních letech se dá za relativně málo peněz pořídit počítač dost „velký” na to, aby se na něm dal spustit MicroPython – speciální implementace Pythonu pro prostředí s omezenou pamětí. +NodeMCU, které budeme používat my, obsahuje čip ESP8266, čip navržený jako ovladač WiFi k vestavěným systémům (např. k Arduinu). +Kromě samotného čipu a flash paměti, které se skrývají v oplechované krabičce, je na desce převodník napětí z 5 V (USB) na 3,3 V a datový převodník z USB na sériový protokol a jednotlivé piny procesoru jsou vyvedeny na „nožičky” desky.

    +

    V paměti je už nahraný firmware MicroPython; pojďme se k němu připojit.

    +

    Drivery a připojení

    +

    Postup připojení je jiný pro každý systém:

    +
      +
    • Linux: Driver už je nainstalovaný; nainstalujte picocom, přidejte se do skupiny jako dialout (Fedora, nové Ubuntu) nebo uucp (Arch, některý Debian) (správnou skupinu zjistíte pomocí ls -l /dev/ttyUSB0) a zadejte picocom -b 115200 --flow n /dev/ttyUSB0.
    • +
    • Windows: Připojte se pomocí PuTTY (putty.exe). Nastavení:
        +
      • Session:Connection Type: Serial
      • +
      • Serial/Serial line: COM port (najdeš ve správci zařízení)
      • +
      • Serial/Speed: 115200
      • +
      • Serial/Flow Control: None
      • +
      +
    • +
    • Mac: screen /dev/tty.wchusbserial1420 115200
    • +
    +

    Kdyby byly pro Windows či Mac potřeba ovladače, dají se najít na stránkách výrobce.

    +

    Po připojení stiskněte tlačítko RST na desce. Měla by se objevit hlavička a nakonec známý pythonní prompt >>>.

    +

    MicroPython

    +

    Implementace MicroPython se chová téměř stejně jako CPython. Vyzkoušejte si ale některé rozdíly (porovnejte výstup MicroPythonu a Pythonu 3 na počítači):

    +
    >>> print
    +>>> import math
    +>>> math.pi
    +>>> import random
    +>>> random.randrange()
    +

    Hlavní omezení MicroPythonu je to, že chybí většina standardní knihovny. +Některé části (např math) jsou k dispozici, spousta ne. +Několik funkcí je na nestandardních místech se změněným rozhraním, např. generátor náhodných čísel:

    +
    >>> from os import urandom
    +>>> urandom(1)[0]
    +61
    +

    Vstup a výstup

    +

    Co má MicroPython navíc je přístup k hardwaru. +Zkusme zjistit hodnotu pinu 0, který je na NodeMCU normálně HIGH (3,3 V) a je spojen se zemí přes tlačítko FLASH.

    +
    from machine import Pin
    +pin = Pin(0, Pin.IN)
    +print(pin.value())
    +

    API MicroPythonu často používá metody tam, kde bychom čekali atributy, proto ne pin.value ale pin.value().

    +

    Konstanta Pin.IN konfiguruje daný pin pro čtení. +Zkusme si i zápis: zapojte stranu desky s piny D0-D8 do nepájivého pole a mezi piny D5 a G zapojte diodu. +Následující kód diodu rozsvítí:

    +
    from machine import Pin
    +pin = Pin(14, Pin.OUT)
    +pin.value(1)
    +

    Pro zhasnutí zadejte pin.value(0). (Opět jde o volání metody, není to pin.value = 0.)

    +

    Pin(14) odpovídá pinu označenému D5 – číslování, které používá procesor (a MicroPython), se bohužel liší od toho, které používá deska. +Odpovídající si označení lze zjistit z taháku.

    +

    Zkuste zajistit, aby dioda svítila, právě pokud je stisknuté tlačítko FLASH.

    +

    Ovládání konzole

    +

    Pravděpodobně jste si všimli, že konzole MicroPythonu automaticky odsazuje. +To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit.

    +

    Proto má konzole MicroPythonu speciální vkládací mód, který automatické odsazování vypíná. +Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D.

    +

    Existuje ale i nástroj jménem ampy, který umožňuje pustit předpřipravený skript. +Instaluje se jako adafruit-ampy:

    +
    $ python -m pip install adafruit-ampy
    +

    Po nainstalování vypněte existující připojení k desce (picocom/screen/PuTTY), +napište skript a spusťte ho pomocí příkazu run:

    +
    $ ampy -p PORT run script.py
    +

    Kde PORT je stejný port jako výše – např. /dev/ttyUSB0 na Linuxu, COM3 na Windows. +Pro více informací můžete nepřekvapivě použít příkaz ampy --help.

    +

    Od teď doporučuji psát kód vedle do editoru a spouštět jej pomocí ampy run.

    +

    Zkuste pomocí funkce time.sleep (která v MicroPythonu k dispozici je) diodou blikat v pravidelných intervalech.

    +

    Blikání

    +

    Na pravidelné blikání, technicky řečeno pulzně-šířkovou modulaci (angl. Pulse Width Modulation) +má MicroPython třídu PWM, které se dá nastavit frekvence (freq) v Hz a střída (duty) od 0 do 1024:

    +
    from machine import Pin, PWM
    +from time import sleep
    +
    +led_pin = Pin(14, Pin.OUT)
    +pwm = PWM(led_pin, freq=50, duty=512)
    +

    Výsledný signál – čtvercová vlna – lze použít pro ovládání +LED (střída určuje intenzitu světla), bzučáků (frekvence určuje výšku tónu), +servomotorků (délka signálu určuje úhel otočení), atd.

    +

    LED pásek WS2812

    +

    Na destičku se dá připojit spousta různých komponent. Jen je vždy potřeba ověřit v dokumentaci, že existuje knihovna pro daný protokol na MicroPython pro ESP8266. +Časté protokoly jsou I2C, OneWire, či SPI.

    +

    My připojíme pásek s moduly WS2812. +Každý modul obsahuje tři LED a čip, který umožňuje celý pásek ovládat jedním datovým pinem. +Používá vlastní protokol, který je v MicroPythonu pro ESP8266 implementován pod jménem NeoPixel.

    +

    Zapojení:

    +
      +
    • GND - G
    • +
    • DI (data in) - D4
    • +
    • +5V - VU
    • +
    +

    Kód:

    +
    from machine import Pin
    +from neopixel import NeoPixel
    +
    +NUM_LEDS = 8
    +pin = Pin(2, Pin.OUT)
    +np = NeoPixel(pin, NUM_LEDS)
    +np[0] = (255, 255, 255)
    +np.write()
    +

    Co znamenají čísla 0 a 255 na posledním řádku, jistě zjistíte experimentálně.

    +

    Flashování

    +

    Na našich destičkách je MicroPython už nahraný, ale kdybyste si koupili vlastní NodeMCU nebo chtěli firmware aktualizovat, budete ho potřebovat umět nahrát.

    +

    K tomu je potřeba nástroj esptool, který se dá nainstalovat pomocí:

    +
    $ python -m pip install esptool
    +

    Po instalaci esptool si stáhněte nejnovější stabilní firmware pro ESP8266 z micropython.org/download a zadejte:

    +
    $ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
    +

    Hodnotu pro --port opět doplňte podle svého systému – např. /dev/tty.wchusbserial1420 na Macu, COM3 na Windows.

    +

    Destiček s čipem ESP8266 se vyrábí celá řada různých typů a některé mohou +potřebovat odlišné nastavení při flashování. +Popis všech možností nastavení je k nalezení v dokumentaci k esptool.

    +

    Je-li na desce nahraný MicroPython, tento příkaz by měl fungovat. U jiného firmware, (případně u poškozeného MicroPythonu), je potřeba při zapojování destičky do USB držet tlačítko FLASH.

    +

    Souborový systém

    +

    MicroPython pro ESP8266 obsahuje souborový systém nad flash pamětí, +se kterým pracují standardní pythonní funkce jako open a os.listdir. +Nahrajete-li soubor s příponou .py, lze jej pak v kódu importovat.

    +

    Existuje-li soubor main.py, naimportuje se automaticky po zapnutí (či resetu) +zařízení. +Není ho pak potřeba připojovat k počítači – stačí powerbanka nebo 3,3V zdroj.

    +

    Pro nahrání souborů do zařízení můžete použít příkaz ampy put:

    +
    $ ampy -p PORT put main.py
    +

    WebREPL

    +

    ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. +Dokonce se přes WiFi dá i ovládat.

    +

    Otevřete si stránku micropython.org/webrepl, přes kterou budete po připojení s destičkou komunikovat.

    +

    Poté se buď připojte k existující WiFi síti (Eduroam fungovat nebude) nebo použijte destičku jako samostatný access point:

    +
    # Existující síť:
    +
    +ESSID = ...
    +PASSWORD = ...
    +
    +import network
    +wlan = network.WLAN(network.STA_IF)
    +wlan.active(True)
    +if not wlan.isconnected():
    +    print('connecting to network...')
    +    wlan.connect(ESSID, PASSWORD)
    +    while not wlan.isconnected():
    +        pass
    +print('network config:', wlan.ifconfig())
    +
    +# AP:
    +
    +ESSID = ...
    +PASSWORD = ...
    +CHANNEL = 3
    +
    +import network
    +ap_if = network.WLAN(network.AP_IF)
    +ap_if.active(True)
    +ap_if.config(essid=ESSID, password=PASSWORD, authmode=network.AUTH_WEP, channel=CHANNEL)
    +print('network config:', ap_if.ifconfig())
    +

    Nastavení WebREPL spusťte z interaktivní konzole:

    +
    >>> import webrepl_setup
    +

    S počítačem se připojte na stejnou síť a na stránce webrepl otevřené výše se připojte k IP vypsané z ifconfig(). +Měli byste dostat konzoli, jako přes USB. +Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat soubory.

    +

    Komunikace

    +

    Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu socket, +nebo protokol pro „internet of things“ (jako MQTT), ale +MicroPython pro ESP8266 má zabudouvanou i knihovnu pro HTTP: +ořezanou verzi známých Requests. +Následující kód stáhne data ze stránky +api.thingspeak.com/channels/1417/field/2/last.txt, +kde se objevuje poslední barva tweetnutá s hashtagem #cheerlights.

    +

    Výslednou hodnotu lze použít jako barvu modul v LED pásku.

    +
    import urequests
    +
    +url = 'http://api.thingspeak.com/channels/1417/field/2/last.txt'
    +
    +def download_color():
    +    response = urequests.get(url)
    +    text = response.text
    +
    +    if text and text[0] == '#':
    +        color = text[1:7]
    +
    +        red = int(color[0:2], 16)
    +        green = int(color[2:4], 16)
    +        blue = int(color[4:6], 16)
    +
    +        return red, green, blue
    +    return 0, 0, 0
    +

    Opravdové projekty používají lehčí protokoly než HTTP, například MQTT.

    \ No newline at end of file diff --git a/lessons/micropython/index.html b/lessons/micropython/index.html new file mode 100644 index 00000000..f313d30b --- /dev/null +++ b/lessons/micropython/index.html @@ -0,0 +1,619 @@ +

    MicroPython na malém zařízení

    +

    Tahle sekce bohužel nejde jednoduše projít z domu.

    +

    Využíváme speciální vybavení, které je potřeba nejdřív +sehnat. Máš-li možnost se dostat na sraz, nebo +aspoň kontaktovat organizátory, doporučujeme shánět +spíš tímto způsobem. +Případně jde případný hardware objednat přes Internet, +typicky z čínských e-shopů.

    +

    Materiály byly připraveny pro celodenní workshop; +na kratší lekcích může být něco vynecháno.

    +

    LoLin NodeMCU v3 – Vývojová deska s čipem ESP8266

    +

    Dnes budeme programovat malé zařízení – +tak malé, že ho pohodlně schováš v ruce. +Konkrétně budeme používat „chytrou destičku”, modul zvaný +NodeMCU Devkit, která by měla ležet před tebou. +Než ji vyndáš z obalu, měla by ses vybít: +dotkni se něčeho kovového, co je spojeno se zemí, +třeba radiátoru nebo kovové části schránky nějakého +spotřebiče, který je zapojený do zásuvky. +Tím se zbavíš statické elektřiny, která by mohla +malinké zařízení poškodit. +Pak přístroj vyndej z obalu. Snaž se ho držet za +hrany a příliš se nedotýkat elektroniky a kovových +částí.

    +

    Obal bude nejspíš roztržený, protože organizátoři +na destičku před začátkem kurzu nainstalovali +MicroPython.

    +

    Teď, když destičku držíš v ruce, si +pojďme projít její základní součásti.

    +


    +

    Obrázek desky NodeMCU DevKit

    +

    Nejdůležitější část vývojové desky je v oplechované +krabičce s logem "Wi-Fi" a "FCC": +mikroprocesor ESP8266. +To je „mozek” celého zařízení, který – když je +správně naprogramován – umí provádět pythonní +příkazy a programy. +Procesor sedí na malé destičce, na které je ještě +anténa, kterou +přístroj může komunikovat s okolím.

    +

    Tahle malá destička se dá použít i samostatně; +všechno ostatní, co kolem ní zabírá tolik místa, +nám jen ulehčí hraní a umožní se zařízením +jednoduše komunikovat a krmit ho elektřinou.

    +

    Komunikace a „krmení” se děje přes +μUSB konektor, +do kterého zapojíš kabel ze svého počítače. +Když je modul naprogramovaný, stačí ho místo do +počítače zapojit do nabíječky či externího zdroje +(powerbanky) a bude fungovat samostatně.

    +

    Kolem USB konektoru jsou dvě tlačítka: +RST, kterým se destička restartuje +(skoro jako kdybys ho odpojila a zase zapojila, což +se hodí, když něco uděláš špatně a modul „zamrzne”), +a FLASH, o kterém si povíme později.

    +

    Po stranách modulu jsou dvě řady +„nožiček”, na které +se dá napojit celá řada nejrůznějších hraček. +Zkontroluj si, jestli jsou všechny nožičky rovné; +kdyby byla některá ohnutá, tak ji (nejlépe s pomocí +kouče) narovnej nebo si vezmi jinou destičku.

    +


    +

    Instalace

    +

    Bohužel se dnes neobejdeme bez instalace. Musíš naučit +svůj počítač, aby si s destičkou povídal.

    +

    Nejdřív si do virtuálního prostředí nainstaluj program Ampy od Adafruitu. +Ten budeme později používat na nahrávání kódu:

    +
    (env)$ python -m pip install adafruit-ampy
    +

    Pak propoj modul s počítačem přes USB kabel, +jako kdybys připojoval/a třeba mobil.

    +

    Je potřeba použít kvalitní datový kabel. +Nekvalitní kabely (např. spousta kabelů k +nabíječkám) jsou často nepoužitelné.

    +

    Dál postupuj podle operačního systému na svém počítači. +Kdyby něco nefungovalo, poraď se s koučem. +Původní (anglický) návod k této části je na +stránkách MicroPythonu.

    +

    Linux

    +

    Na správně nastaveném počítači stačí zadat:

    +
    $ picocom -b 115200 --flow n /dev/ttyUSB0
    +

    Pokud příkaz neskončí s chybou, stiskni tlačítko RST na modulu. +Měly by se nakonec objevit tři zobáčky, >>>.

    +

    Většina počítačů ale na komunikaci s malými zařízeními nastavená není. +Skončí-li příkaz picocom s chybou, +oprav ji podle následujícího návodu a zkus to znova. +(Možná bude potřeba vyřešit víc než jednu chybu.)

    +
      +
    • Nemáš-li příkaz picocom nainstalovaný, +je potřeba ho nainstalovat (např. +sudo dnf install picocom nebo +sudo apt-get install picocom).
    • +
    • Pokud picocom skončil s chybou +No such file or directory, pravděpodobně +je potřeba k zařízení přistupovat přes jiný soubor. +Použij příkaz dmesg | tail, který vypíše něco jako:
    • +
    +
      $ dmesg | tail
    +  [703169.886296] ch341 1-1.1:1.0: device disconnected
    +  [703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
    +  [703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
    +  [703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
    +  [703177.059457] usb 1-1.1: Product: USB2.0-Serial
    +  [703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected
    +  [703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0
    +

    Máš-li místo ttyUSB0 něco jiného, v příkazu picocom to použij místo + ttyUSB0.

    +
      +
    • Pokud picocom skončil s chybou Permission denied, potřebuješ získat +přístup k souboru zařízení. +To znamená přidat se do příslušné skupiny:

      +
      $ sudo usermod -a -G dialout $(whoami)
      +

      Poté je potřeba se znovu přihlásit, třeba příkazem:

      +
      $ su - $(whoami)
      +

      Pro ověření spusť příkaz groups; v jeho výstupu by mělo být dialout. +Například:

      +
      $ groups
      +kristyna lp wheel dialout mock
      +

      Kdyby to nefungovalo, na srazu ti může pomoci nějaký kouč. +Jestli procházíš materiály z domu a nepovedlo +se ti přidat do skupiny, dá se to obejít tak, +že místo picocom použiješ sudo picocom.

      +
    • +
    +

    Windows

    +

    MicroPython se přihlásí jako COM port. Otevři +správce zařízení a zjisti, který COM port to je (kouč s tím pomůže).

    +

    Nebylo-li zařízení nalezeno, je potřeba nainstalovat +driver, který je ke stažení třeba +z tohoto blogu, +případně z materiálů pro Arduino workshop.

    +

    Pak si nainstaluj si program +PuTTY +(putty.exe) a spusť ho. +V konfiguračním okýnku zaškrtni Connection Type: Serial a +do Serial line: zadej svůj COM port. +Pak přepni v seznamu vlevo na Serial a nastav Speed na 115200 +a Flow Control na None:

    +

    Obrázek nastavení PuTTY

    +

    Potom zpátky v kategorii Session můžeš nastavení uložit pro příště: +do políčka Saved Sessions zadej MicroPython a klikni OK.

    +

    Nakonec klikni Open. Mělo by se otevřít +okýnko podobné konzoli, kde se, když zmáčkneš +na modulu RST, objeví nakonec tři zobáčky: >>>.

    +

    macOS

    +

    V příkazové řádce zadej:

    +
    $ screen /dev/tty.usbmodem* 115200
    +

    a stiskni Enter. +Pak na modulu zmáčkni RST. +Měly by se nakonec objevit tři zobáčky, >>>.

    +

    Nejde-li to, je možná potřeba nainstalovat driver. Ten se dá stáhnout +z tohoto blogu.

    +

    MicroPython – taky Python

    +

    Tak jako máš na počítači nainstalovaný operační +systém, na vývojové desce je takzvaný firmware, +program, který ovládá všechny ty drátky, +čipy a světýlka, co v ní jsou. +My používáme firmware zvaný MicroPython, +který navíc rozumí jazyku Python a umí provádět pythonní příkazy. Zkus si to! +Tři zobáčky, které vyskočily v minulém kroku, přišly +ze zařízení, které teď netrpělivě čeká na příkaz.

    +
    >>> 1+1
    +2
    +>>> print('Hello World')
    +Hello World
    +

    Téměř vše, co používáš v Pythonu na počítači, +umí MicroPython taky: čísla, řetězce, seznamy, třídy, +výjimky, moduly a tak dál. +Některé detaily ale jsou trochu osekané, aby se všechno +vešlo do extrémně malého prostoru. +Zkus si, jak se liší efekt následujících příkazů +od „velkého” Pythonu:

    +
    >>> print
    +>>> import math
    +>>> math.pi
    +

    Nejdůležitější věc, která je osekaná, je standardní +knihovna – většina modulů, které na +počítači můžeš naimportovat, v MicroPythonu chybí. +U modulů jako turtle je to pochopitelné, +ale v rámci šetření místem chybí i moduly jako random. +Většinou to příliš nevadí – malá zařízení se používají +na jiné věci než ty velké – ale je potřeba si na to +dát pozor.

    +

    Některé věci ze standardní knihovny se dají najít +ve zjednodušené formě na jiných místech. +Například ačkoliv modul random chybí, +náhodné číslo od 0 do 255 se dá získat pomocí:

    +
    >>> from os import urandom
    +>>> urandom(1)[0]
    +61
    +

    Vstup

    +

    MicroPython na malé destičce obsahuje některé +moduly, které jinde nenajdeš. Ten hlavní se jmenuje +machine a zpřístupňuje základní funkce zařízení. Zkus si:

    +
    from machine import Pin
    +pin = Pin(0, Pin.IN)
    +print(pin.value())
    +

    Zmáčkni a drž tlačítko FLASH vedle USB konektoru. +Přitom pusť print(pin.value()) znovu. +Jak se hodnota změní?

    +

    Jak tomuhle kódu rozumět? +Třída Pin ti umožňuje ovládat jednotlivé +„nožičky”, kterými zařízení komunikuje s vnějším +světem: buď na nich nastavovat napětí, nebo zkoumat +jestli na nich nějaké napětí je.

    +

    Pin(0, Pin.IN) vytvoří objekt třídy Pin, +který bude načítat data z „nožičky” číslo 0. +(IN znamená načítání – informace jdou do procesoru). +Funkce pin.value() změří napětí na dané +„nožičce” a vrátí buď 1 nebo 0 podle toho, jestli nějaké naměřila.

    +

    No a „nožička” číslo 0 je připojená k tlačítku FLASH, +kterým se tak dá ono napětí ovládat. +Informace o tom, která nožička je kam připojená, +máš na taháku – +můžeš si zkontrolovat, že Pin(0) u sebe má poznámku FLASH.

    +

    Obvod

    +

    Teď na chvíli necháme programování a postavíme si elektrický obvod. +Vezmi si modrou svítivou diodu (LED, „světýlko”) a +nepájivé pole („hloupou destičku”). +Zkusíme světýlko rozsvítit.

    +

    LED rozsvítíš tak, že ji připojíš ke zdroji napětí, například k baterce.

    +

    Jako zdroj napětí můžeme použít i náš modul. +Ten bere elektřinu přes USB a dává nám ji k dispozici +na některých svých „nožičkách”: +konkrétně plus na nožičce označené 3V +a mínus na nožičce označené G. +Na tyhle nožičky musíš zapojit diodu.

    +

    Připojování diody má jeden háček: +musíš ji zapojit správným směrem – plus na plus, mínus na mínus. +Opačně dioda svítit nebude. Dobrá zpráva je, že +když diodu otočíš špatně, nic se jí nestane.

    +

    Základní vlastnost diody je ta, že pustí +elektrický proud jen jedním směrem. Svítící dioda +– angl. Light Emitting Diode, LED – ještě k +tomu navíc svítí.

    +

    Je potřeba rozpoznat rozdíl mezi nožičkami diody. +Katoda (-) je ta kratší nožička. +Pouzdro diody je u katody trochu seříznuté +a vevnitř v pouzdře, když se pozorně podíváš, uvidíš +u katody větší plíšek. +Té druhé nožičce se říká anoda (+).

    +

    Tak, teď víš, kam diodu zapojit: katodu (kratší nožičku) +na G a anodu na 3V.

    +

    Držení nožiček diody u nožiček modulu by ti nejspíš +zaměstnalo obě ruce. Aby sis je uvolnila, použij +nepájivé pole (angl. breadboard). +Je v něm spousta dírek, do kterých se dají strkat dráty. +V rámci každé poloviny destičky je každá řada dírek – +tedy každá pětice – spojená dohromady. +Když zapojíš drátky do stejné řady, spojíš je tím.

    +

    Zasuň modul do nepájivého pole. Pak připoj katodu +do dírky ve stejné řadě, kde je nožička +3V modulu, a podobně anodu k G. +Mělo by to vypadat jako na tomto obrázku:

    +

    diagram zapojení

    +

    Potom zapoj USB kabel. Dioda by se měla rozsvítit!

    +

    Zkus si, co se stane, když obě nožičky diody zapojíš ke G.

    +

    diagram zapojení

    +

    Aby dioda svítila, musí být připojená na dvě místa, +mezi kterými je takzvaný potenciálový rozdíl — napětí. +Na nožičce G je 0 voltů; na nožičce +3V jsou 3,3 volty – je tedy mezi nimi rozdíl 3,3 V, přesně tolik, +kolik modrá LED potřebuje ke svícení.

    +

    Samotná hodnota napětí nedává smysl – například +říct, že je na jednom místě 3,3 V je nepřesné. +Hodnota ve voltech se vždycky musí k něčemu vztahovat; +vyjadřuje rozdíl mezi dvěma místy. +V elektronice používáme rozdíl oproti „zemi” – napětí +na nožičce G. Stanovíme si, že tam je +0 voltů a ostatní napětí počítáme vzhledem k ní. +Na nožičce 3V je tedy napětí 3,3 V vzhledem k zemi.

    +

    Výstup

    +

    Proč jsme diodu na to, aby se rozsvítila, +připojili k modulu a ne jen k baterce? +Ten modul je trošku složitější zařízení než baterka a jedna důležitá věc, +kterou umí navíc, je nastavovat napětí na různých nožičkách. +Umí zařídit, aby se nožička chovala jednou jako 3V a jindy jako G. +Když připojíš diodu mezi G a takovou +přepínatelnou nožičku, můžeš nastavit, kdy svítí a kdy ne.

    +

    Přepoj anodu diody z 3V3 na D5. Katodu nech na G.

    +

    Máš-li zapojeno, znovu se připoj k MicroPythonu a zadej následující kód:

    +
    from machine import Pin
    +pin = Pin(14, Pin.OUT)
    +pin.value(0)
    +pin.value(1)
    +

    Když objekt Pin vytvoříš s Pin.OUT, MicroPython na něm bude nastavovat +napětí – buď 3,3 V (value(1)) nebo 0 V (value(0)). +A tak se dá s diodou blikat.

    +

    Číslování nožiček je bohužel dvojí – nožička +označená jako D5 má v procesoru přiřazené číslo 14. +Třída Pin v MicroPythonu používá číslování procesoru. +Naštěstí máš tahák, +kde snadno dohledáš že D5 a Pin(14) jsou dvě jména stejné nožičky.

    +

    Zvládneš napsat program, který zařídí, aby dioda +svítila když je zmáčknuté tlačítko FLASH, jinak ne?

    +

    Nápověda: Můžeš pořád dokola zjišťovat stav tlačítka +a nastavovat podle něj stav LED.

    +
    +

    Řešení

    + + +

    Pouštění kódu ze souboru

    +

    Jak začneš psát trochu složitější programy, +mohlo by se stát, že tě konzole MicroPythonu začne trochu štvát. +Špatně se v ní opravují chyby a automatické odsazování funguje jen většinou. +Pojďme se podívat, jak naštvání předejít.

    +

    Doporučuji si větší kousky kódu – a určitě takové, +ve kterých je nějaký cyklus, podmínka či funkce – +psát v textovém editoru a do modulu pak posílat celý soubor.

    +

    Zkus si to. Do souboru led_podle_tlacitka.py dej následující kód:

    +
    from machine import Pin
    +from time import sleep
    +pin_diody = Pin(14, Pin.OUT)
    +while True:
    +    pin_diody.value(0)
    +    sleep(1/2)
    +    pin_diody.value(1)
    +    sleep(1/2)
    +

    Potom zavři konzoli (picocom, PuTTY nebo screen).

    +

    K pouštění programu použijeme ampy, který jsi nainstaloval/a dříve. +Ke spuštění budeš potřebovat znát port:

    +
      +
    • Linux: port používáš v příkazu picocom, např. /dev/ttyUSB0
    • +
    • Windows: port používáš v PuTTY, např. COM13
    • +
    • macOS: port používáš v příkazu screen, např. /dev/tty.usbmodem*
    • +
    +

    ampy spusť následujícím příkazem, jen za PORT doplň svůj port:

    +
    (venv)$ ampy -p PORT run led_podle_tlacitka.py
    +

    Program by měl blikat diodou. +Využívá k tomu funkci time.sleep(), která počká daný počet vteřin – +tedy time.sleep(1/2) zastaví program na půl sekundy.

    +

    Velice rychle blikat

    +

    Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých +nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. +Dioda tak buď svítí, nebo nesvítí – nedá se +nastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat.

    +

    Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů. +Ten první je, že diodám – na rozdíl od žárovek nebo +zářivek – nevadí časté vypínání a zapínání. +Opotřebovávají se spíš svícením a časem. +Druhý je, že lidské oko nestačí zaznamenat pohyby a +změny, které probíhají rychleji než zhruba za +setinu vteřiny.

    +

    Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky!

    +
    from machine import Pin
    +from time import sleep
    +pin_diody = Pin(14, Pin.OUT)
    +while True:
    +    pin_diody.value(0)  # vypnout LED
    +    sleep(2/100)  # počkat dvě setiny vteřiny
    +    pin_diody.value(1)  # zapnout LED
    +    sleep(1/100)  # počkat jednu setinu vteřiny
    +

    Zkus si pohrát s hodnotami pro time.sleep.

    +

    Takhle fungují prakticky všechna stmívatelná LED +světla – rychlé blikání je ekonomičtější a přesnější +než např. nastavování nižšího napětí.

    +

    Dokážeš napsat program, který diodu postupně, plynule rozsvítí?

    + + +

    Protože je takovéhle rychlé blikání užitečné ve spoustě +různých situací, obsahuje MicroPython speciální funkci: umí blikat samostatně. +Nastavíš, jak rychle má blikat a jak dlouho má trvat +každé bliknutí, a MicroPython pak bude blikat automaticky, +zatímco tvůj program se může věnovat něčemu jinému.

    +

    Téhle funkci se říká pulzně šířková modulace – +angl. Pulse Width Modulation, neboli PWM. +Z MicroPythonu jde tahle funkce ovládat pomocí třídy +machine.PWM. +Každý objekt téhle třídy umí ovládat jednu nožičku +a dají se u něj nastavit dva parametry:

    +
      +
    • freq – frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne a
    • +
    • duty – anglicky duty cycle, česky střída, nastavuje „šířku pulzu”, +tedy jak dlouho bude dioda při každém bliknutí svítit. +Hodnota duty může být od 0, kdy LED +nesvítí vůbec, do 1023, kdy svítí celou dobu. +Nastavíš-li duty=512, bude dioda +svítit s poloviční intenzitou (512 = 1024/2).
    • +
    +

    Nastavíš-li PWM(freq=50, duty=512), dioda bude blikat 50× za sekundu. +Vždycky jednu setinu vteřiny bude svítit a na jednu +setinu vteřiny zhasne.

    +
    from machine import Pin, PWM
    +from time import sleep
    +
    +pin_diody = Pin(14, Pin.OUT)
    +pwm = PWM(pin_diody, freq=50, duty=512)
    +

    Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo!

    +

    PWM se dá zrušit metodou pwm.deinit(). +Jako s otvíráním souborů, je dobré po sobě uklidit – +i když zatím můžeš jednoduše restartovat celé zařízení.

    +

    Tóny a melodie

    +

    Vezmi si další součástku – piezobudič, neboli „bzučítko”.

    +

    Tahle malá věc obsahuje speciální materiál, který se, +když ho připojíš ke zdroji napětí, trošku roztáhne. +Roztažením zatlačí na okolní vzduch a vytvoří tlakovou +vlnu, která může doputovat až k tvým uším.

    +

    Zkus si to – když bzučítko připojíš na 3V +a G (tentokrát je jedno kterým směrem), uslyšíš tiché lupnutí. +A podobné lupnutí uslyšíš když součástku zase odpojíš.

    +

    Co se stane, když budeš napětí připojovat a odpojovat, řekněme, 32× za vteřinu?

    +

    Nebo 65×?

    +

    Nebo některou z těchto frekvencí? +Hz – Hertz – je jednotka frekvence; +„49 Hz“ znamená „49× za sekundu“.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nota Frekvence
    C132,70 Hz
    D36,71 Hz
    E41,20 Hz
    F43,65 Hz
    G49,00 Hz
    A55,00 Hz
    H61,74 Hz
    C265,41 Hz
    +

    Naprogramuj písničku! Potřebuješ-li víc not, pusť si program, +který vypočítá další frekvence.

    +

    Další ovládání

    +

    Teď si vezmi dvě tlačítka a připoj je k modulu: +GND vždycky na G, VCC vždycky na 3V a +OUT u jednoho tlačítka na D1 a u druhého na D2.

    +

    Tlačítko funguje tak, že OUT spojí buď s VCC (5V) +nebo GND, podle toho, jestli je tlačítko stisknuté. +(A navíc to taky teda svítí, ale to je teď vedlejší.)

    +

    Zkus si, jestli se zvládneš MicroPythonu zeptat, jestli je tlačítko zapnuté. +Mělo by to být podobné jako u příkladu s tlačítkem FLASH.

    +

    Zvládneš napsat program, který bude bzučet bzučítkem +a přitom se jedním tlačítkem bude dát zvyšovat tón a druhým snižovat?

    +

    Program si (na svém počítači) ulož, ať se k němu můžeš vrátit.

    +

    Rotace

    +

    Čas na další součástku! Tentokrát to bude servomotor.

    +

    Servomotor je součástka, která má v sobě zabudovaný +ovladač, se kterým si naše zařízení může povídat +jednoduchým „elektronickým jazykem” – protokolem. +Motorku můžeš posílat impulzy a podle délky impulzu +se servomotor natočí. +Při krátkých impulzech se natočí víc na jednu stranu, +při dlouhých na druhou. +Impulzy musíš posílat neustále, jinak se servomotor +vypne.

    +

    Na rozdíl od bzučítka, kde o výšce tónu rozhodovala +frekvence (freq) – kolikrát za vteřinu +se ozve lupnutí – a LED, kde o intenzitě rozhodovala +střída (duty) – poměr mezi dobou kdy +dioda svítí a kdy nesvítí, u servomotoru rozhoduje +tzv. šířka pulzu: jak dlouho se napětí udrží +na 3,3 V, než se přepne zpátky na 0 V. +

    +

    V praxi to znamená, že můžeš nastavit freq +na 50 Hz, a duty měnit cca od 35 +(úplně vlevo) přes 77 (uprostřed) po 120 (úplně vpravo).

    +

    Dost ale teorie, pojďme si to vyzkoušet! Napřed musíš motorek zapojit:

    +
      +
    • hnědý drát (zem) na G,
    • +
    • červený drát (napájení) na 3V a
    • +
    • oranžový drát (data) na D4.
    • +
    +

    Nožička D4 odpovídá Pin(2), takže kód k otáčení motorku je:

    +
    from machine import Pin, PWM
    +from time import sleep
    +
    +pin_motorku = Pin(2, Pin.OUT)
    +pwm = PWM(pin_motorku, freq=50, duty=77)
    +pwm.duty(35)
    +

    Zkus motorkem otáčet nastavováním duty na 35 do 120. +Kdyby se náhodou stalo, že se modul restartuje a +konzole přestane fungovat, zkus ho odpojit a znovu +připojit. Kdyby to nepomohlo, motorek ti dneska +nebude fungovat. Za chvíli si řekneme proč; zatím (jsi-li na kurzu) +se přidej do dvojice k někomu, komu to funguje.

    +

    Poznámka o napájení a napětí

    +

    K tomu, aby se otočil motor, je potřeba mnohem víc +energie, než k rozsvícení světýlka. +Z USB z počítače té energie dostaneš docela málo, +proto můžou být s motorkem problémy.

    +

    Jak to řešit, až si přestaneš hrát a budeš chtít motorkem otáčet „doopravdy”?

    +

    Elektronika, která je na našem modulu mimo +malou destičku s „mozkem” má dva hlavní úkoly:

    +
      +
    • Převádět komunikaci z USB, která je +celkem složitě zakódovaná, na něco čemu +malé zařízení rozumí +(konkrétně protokol UART přes nožičky TX a RX).
    • +
    • Převádět napětí 5 V, které poskytuje USB, +na 3,3 V které potřebuje modul.
    • +
    +

    Když energie z USB přestane stačit, dá se koupit +zařízení, které zvládne převádět komunikaci +a napájení vyřešit z jiného zdroje 5 V. +Kdybys to někdy zkoušela, příslušné zařízení +koupíš pod názvem USB-TTL adapter a vypadá +nejčastěji takhle:

    +

    USB-TTL adapter

    +

    K modulu pak tento převodník a zdroj napětí připojíš takto:

    +

    +
      +
    • GND na převodníku – G na desce
    • +
    • RX na převodníku – TX (!) na desce
    • +
    • TX na převodníku – RX (!) na desce
    • +
    • +5V na zdroji napětí na VIN na desce
    • +
    • Zem na zdroji napětí na G na desce
    • +
    +

    Pozor, 5V nepřipojuj jinam než na VIN!

    +

    Napětí

    +

    Další důvod, proč ti servomotor někdy nefunguje dobře, +je to, že je stavěný na 5 voltů, ne na 3,3 které +poskytuje modul.

    +

    Když připojíš zařízení k menšímu napětí, než +potřebuje, většinou buď nebude fungovat, nebo bude +dělat „míň” než by mělo: LED bude míň svítit, +reproduktor bude tišší, motorek se bude točit pomaleji nebo s menší silou.

    +

    Když naopak připojíš zařízení k většímu napětí, +než na jaké je stavěno, nejspíš ho nadobro zničíš. +Když připojíš červenou LED přímo na 3,3 V, přestane fungovat; +když připojíš malý servomotorek na zdroj 24 V, může začít hořet. +A ačkoli lidem malá napětí jako 5 V nevadí, +když připojíš do zásuvky s 230 V sám/sama sebe, můžeš umřít. +Takže na velká napětí pozor!

    +

    My motorek připojujeme na malé napětí a zmenšený +výkon nám příliš nevadí – dokud se to +otáčí, víc rychlosti ani síly nepotřebujeme.

    +

    Až to ale potřebovat budeš – například až budeš +servomotorkem pohánět ruku robota, která bude zvedat +těžké náklady, budeš potřebovat dvě věci:

    +
      +
    • Externí napájení – jako předtím bude motorek potřebovat zvláštní zdroj 5V.
    • +
    • Na datový signál je potřeba použít převodník úrovní +(angl. logic level converter), +který převede třívoltový signál na pětivoltový.
    • +
    +

    Kdybys to někdy potřebovala, ozvi se koučům – i po +workshopu ti určitě rádi poradí nebo ti aspoň řeknou +koho se zeptat!

    +

    Barevná světýlka

    +

    Tak, dost teorie; vezmi si novou hračku! +Tentokrát to bude LED pásek.

    +

    Na pásku máš 8 malých čtverečků. +Každý z nich obsahuje docela hodně elektroniky: +tři barevné LED (červenou, zelenou a modrou) +a čip, který je umí ovládat pomocí informací, +které dostane přes jediný drátek z modulu.

    +

    Takové pásky se prodávají po metrech a dají se +nastříhat – mezi jednotlivými světýlky si všimni čárky, +která naznačuje, kde máš střihnout. +Energie z USB stačí zhruba na osm světýlek, proto jsi jich dostal/a tolik.

    +

    Tenhle LED pásek je, podobně jako servomotorek, stavěný +na pět voltů. Na rozdíl od motorku, který se s 3,3 V +trochu roztočil, se ale s nižším napětím ani nerozsvítí. +Naštěstí ale potřebuje 5 V jen na napájení; +řídící signál s informacemi o barvičkách může mít 3,3 V.

    +

    Pojďme pásek zapojit:

    +
      +
    • GND pásku (bílý drátek) připoj na G
    • +
    • DI (data in – zelený drátek) připoj na D4
    • +
    • +5V (červený drátek) připoj:
        +
      • na VU, má-li tvoje destička tuhle nožičku,
      • +
      • jinak na VIN.
      • +
      +
    • +
    +

    Nožička VU/VIN poskytuje 5 voltů. +Pozor na ni: nepřipojuj na ni zařízení, které se s pěti volty nevyrovnají.

    +

    Máš-li zapojeno, můžeš začít programovat. +„Jazyk”, kterým „mluví” tenhle LED pásek je trošku +složitější než signál PWM, ale MicroPython obsahuje +speciální knihovnu, která s páskem komunikovat umí. +Vypadá to nějak takhle:

    +
    +from machine import Pin
    +from neopixel import NeoPixel
    +
    +POCET_LED = 8
    +pin = Pin(2, Pin.OUT)
    +np = NeoPixel(pin, POCET_LED)
    +np[0] = (255, 255, 255)
    +np.write()
    +

    Co znamenají ta čísla (0 a 255), na to už jistě přijdeš sama. +Jen při experimentování nezapomeň zavolat +np.write(), tím se informace pošlou do LED pásku.

    +

    Zvládneš naprogramovat semafor?

    \ No newline at end of file diff --git a/lessons/micropython/nodemcu-devkit.jpg b/lessons/micropython/nodemcu-devkit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9342a91e73e9d46cacf40e065deb518e1291ec6 GIT binary patch literal 39363 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

    ?-a+vEV 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 X + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/lessons/micropython/noty.py b/lessons/micropython/noty.py new file mode 100644 index 00000000..92fd3093 --- /dev/null +++ b/lessons/micropython/noty.py @@ -0,0 +1,8 @@ +nazvy = 'A', 'A#', 'H', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#' + +for i in range(88): + frekvence = 27.5 * 2.**(i/12.) + oktava = (i+9) // 12 + nota = '{:2} {}'.format(nazvy[i%12], oktava) + if __name__ == '__main__': + print("{}: {:7.2f}".format(nota, frekvence)) diff --git a/lessons/micropython/putty-config.jpg b/lessons/micropython/putty-config.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dbf3f8fa241bdd70b25fc291209841f435dfa36 GIT binary patch literal 38324 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 literal 0 HcmV?d00001 diff --git a/lessons/micropython/usb-ttl.png b/lessons/micropython/usb-ttl.png new file mode 100644 index 0000000000000000000000000000000000000000..657ebb81ac9d5d640773abff963644556dd1c38b GIT binary patch literal 374407 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�=9pa{k(s6lz{F8-B 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

    hsUcl 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�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 UhgOL7v8hF_I23ULB0RaI4f==!( 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%0DhpdGT&0Q!JZP)C@`lMgNukH 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

    Tento workshop nejde projít jen tak z domu – je potřeba speciální příprava. +Pokyny pro organizátory najdeš +na podstránce.

    +

    Vítej na workshopu MicroPythonu! +Dnes si ukážeme, jak programovat – jak říkat počítači, co má dělat. +Aktivita je určena lidem, kteří nikdy předtím neprogramovali.

    +

    K programování použijeme programovací jazyk. +To je způsob, jak počítačům zadávat příkazy – jazyk, kterému +rozumí jak počítače, tak lidé (programátoři).

    +

    Konkrétně dnes použijeme MicroPython – variantu jazyka Python přizpůsobenou na +ovládání malých zařízení.

    +

    Laptop použijeme vlastně jen kvůli klávesnici a monitoru; všechno zajímavé +se bude dít na té malé destičce, kterou vidíš vedle sebe a ze které vede +spousta drátů. +(Pro úplnost: je to deska NodeMCU s mikroprocesorem ESP8266.)

    +

    Dost povídání, pojďme na to!

    +

    Otevření příkazové řádky

    +

    +

    Klikni na Activities; potom vyber z levého panelu Terminal (ikonka +černého okýnka).

    +

    Objeví se příkazová řádka – černé okýnko s bílým textem, +kam můžeš zadávat příkazy.

    +

    Otevření komunikačního kanálu

    +

    V příkazové řádce by měl být řádek končící dolarem. +Za ten dolar napiš:

    +
    picocom -b 115200 /dev/ttyUSB0
    +

    Opisuj opatrně, každé písmenko má smysl! +Pak zmáčkni Enter. +Měl by se objevit následující výpis:

    +
    picocom v1.7
    +
    +port is        : /dev/ttyUSB0
    +flowcontrol    : none
    +baudrate is    : 115200
    +parity is      : none
    +databits are   : 8
    +escape is      : C-a
    +local echo is  : no
    +noinit is      : no
    +noreset is     : no
    +nolock is      : no
    +send_cmd is    : sz -vv
    +receive_cmd is : rz -vv
    +imap is        : 
    +omap is        : 
    +emap is        : crcrlf,delbs,
    +
    +Terminal ready

    Pak stiskni Enter. +Měly by se objevit tři zobáčky, kterými MicroPython prosí o instrukce:

    +
    >>>

    Kalkulačka

    +

    Za tři zobáčky můžeš zadat nějaký matematický příklad. MicroPython ho spočítá. +Zkus třeba tyhle (zobáčky nepiš, ty vypíše sám MicroPython:

    +
    >>> 1 + 1
    +
    +>>> 1 - 5
    +
    +>>> 3 * 3
    +
    +>>> 1 / 4
    +
    +>>> (84 + 5) * 100
    +

    Poznáš co dělá hvězdička nebo lomítko? +Tipneš si, proč programátoři používají tyhle symboly, a ne třeba +3 × 3 nebo ¼?

    +

    Věděl/a jsi, že v Americe používají desetinnou tečku místo čárky? +Většina programovacích jazyků ji používá taky.

    +

    Světýlko

    +

    MicroPython na našich destičkách má připravený objekt led, jehož metodou +value jde ovládat svítící dioda. +Stačí jen zadat správné příkazy:

    +
    >>> led.value(1)
    +>>> led.value(0)
    +

    Tlačítko

    +

    K destičce je připojeno i tlačítko. +Metodou btn.value() se zeptáš, jestli je právě zmáčknuté, nebo ne.

    +
    >>> btn.value()
    +

    Zkus tenhle příkaz zadat, zatímco tlačítko držíš.

    +

    Výrazy

    +

    Informace o tom, jestli je tlačítko zmáčknuté – btn.value() – je číslo: +buď 0, nebo 1. +Výraz btn.value() můžeš použít kdekoliv, kde se objevuje číslo +0, nebo 1 – třeba pro rozsvícení nebo zhasnutí diody:

    +
    >>> led.value(btn.value())
    +

    Cyklus

    +

    Existuje způsob, jak nechat MicroPython něco opakovat stále dokola: +takzvaný nekonečný cyklus. +Na jeden řádek napiš while True: (s velkým T a dvojtečkou na konci) +a potom tělo cyklu – příkaz, který se má provést. +MicroPython tělo cyklu automaticky odsadí – přidá na začátek řádku +mezery. Ty mezery nemaž.

    +

    Nakonec několikrát stiskni Enter, dokud se program nespustí.

    +
    >>> while True:
    +...     led.value(btn.value())
    +...
    +...
    +

    Nekonečný cyklus se opakuje donekonečna. +Je ale způsob jak ho přerušit, až tě omrzí: zmáčkni +Ctrl+C.

    +

    Motorek

    +

    Další objekt, který můžeš použít, je servo. +Ten ovládá servomotor, který můžeš nastavit na konkrétní úhel. Třeba:

    +
    >>> servo.duty(120)
    +>>> servo.duty(40)
    +

    ... nebo něco mezi tím.

    +

    Nepoužívej prosím čísla menší než 40 nebo větší než 120, motorek se tím může +ničit.

    +

    Matematika

    +

    Před chvílí jsme si ukázali tento kód:

    +
    >>> led.value(btn.value())
    +

    Hodnota btn.value() může být buď 1, nebo 0. +Pojďme ji použít pro motorek: chceme, aby se natočil buď na 40 nebo na +120, podle toho, jestli je tlačítko zmáčknuté.

    +

    Na to, abys z 0 nebo 1 udělal/a 40 nebo 120, je potřeba znát +trochu matematiky:

    +
      +
    • X + 0 × Y = 40
    • +
    • X + 1 × Y = 120
    • +
    +

    Jistě zvládneš vypočítat, že X = 40 a Y = 80. +Tyhle hodnoty doplnit do kódu:

    +
    >>> servo.duty(40 + btn.value() * 80)
    +

    Změníš program tak, aby se natáčel na 50 nebo 90?

    +

    Dokážeš výsledek dát do cyklu, aby program na zmáčknutí či puštění tlačítka +reagoval automaticky?

    +

    Barvy

    +

    Poslední věc připojená k destičce je LED pásek s několika světýlky. +Každé z nich se dá nastavit na nějakou barvu. +Zkus si to:

    +
    >>> strip[0] = RED
    +>>> strip[1] = GREEN
    +>>> strip[2] = BLUE
    +>>> strip.write()
    +

    První tři příkazy připravují jednotlivé barvy a poslední všechno připravené +pošle do LED pásku. +Až budeš experimentovat, nezapomeň na strip.write() – bez toho +se barvy neukážou.

    +

    Program

    +

    +

    Teď si přestaneme jen tak hrát a začneme psát program.

    +

    Spusť editor: Klikni na Activities; potom vyber z levého panelu +Text Editor (ikonka zápisníku s tužkou).

    +

    Objeví se bílé okýnko, do kterého napiš:

    +
    strip[0] = WHITE
    +strip[1] = OFF
    +strip[2] = OFF
    +strip.write()
    +

    Soubor ulož (Save) pod jménem main.py.

    +

    Potom se vrať k příkazové řádce a ukonči picocom: +stiskni Ctrl+A a pak Ctrl+Q. +Měl by se objevit řádek končící dolarem.

    +

    Za dolar napiš:

    +
    ampy -p /dev/ttyUSB0 run main.py
    +

    ... a stiskni Enter. +Tento příkaz soubor s programem do zařízení nahraje a rovnou spustí.

    +

    Zkus v editoru nastavit jiné barvy a program znovu uložit +(Ctrl+S).

    +

    Potom v příkazové řádce zmáčkni šipku nahoru . +Tím se vrátíš k předchozímu příkazu (ampy) a můžeš znovu stisknout +Enter a program spustit.

    +

    Blikání

    +

    Tady je program, který rozbliká LED pásek. +Ukazuje větší cyklus, a navíc funkci sleep, která MicroPython na chvíli +zdrží: sleep(1/4) čeká čtvrtinu sekundy.

    +

    Při přepisování dávej pozor na odsazení – řádky vevnitř v cyklu musí být +všechny odsazené o čtyři mezery.

    +
    strip[0] = OFF
    +strip[1] = OFF
    +strip[2] = OFF
    +
    +while True:
    +    strip[0] = RED
    +    strip[1] = OFF
    +    strip.write()
    +    sleep(1/4)
    +
    +    strip[0] = OFF
    +    strip[1] = RED
    +    strip.write()
    +    sleep(1/4)
    +

    Semafor

    +

    +

    Dokážeš naprogramovat semafor?

    +

    Se závorou?

    +

    Cyklus s podmínkou

    +

    Cykly nemusí být jen nekonečné. +Tady je cyklus, který čeká dokud není stisknuté tlačítko.

    +

    Potom se rozsvítí světlo – všimni si, že příkaz led.value(1) už není +odsazený. Není součást cyklu.

    +
    led.value(0)
    +
    +while btn.value():
    +    sleep(1/100)
    +
    +led.value(1)
    +

    Alarm

    +

    Polož na tlačítko nějaký těžší předmět (třeba myš) tak, aby bylo zmáčknuté. +Když někdo předmět vezme, tlačítko přestane být zmáčknuté.

    +

    Napiš program, který na to bude čekat a jakmile někdo myš ukradne, +LED pásek začne zuřivě blikat.

    +

    Konec?

    +

    Tím dnešní krátká exkurze do světa MicroPythonu končí. +Jestli tě programování zaujalo a chceš v něm pokračovat, dej nám vědět!

    +

    Nebo pak z klidu domova napiš Petrovi na pviktori@redhat.com.

    \ No newline at end of file diff --git a/lessons/mini-workshop/module_detail.jpg b/lessons/mini-workshop/module_detail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..637f89c466773988b03034c05b93bec4f1854fc3 GIT binary patch literal 222134 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 cNEbTHtPIKroZK)y<5O7)2f8gUpr2Q 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 literal 0 HcmV?d00001 diff --git a/lessons/mini-workshop/module_full.jpg b/lessons/mini-workshop/module_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..100e38c6cc01eaf6629275046f10e06cfced19c0 GIT binary patch literal 111593 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íKI+j>%l{N?uVv@97$nCDQS`F}U9C7ld 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 literal 0 HcmV?d00001 diff --git a/lessons/mini-workshop/organizers.html b/lessons/mini-workshop/organizers.html new file mode 100644 index 00000000..450148ce --- /dev/null +++ b/lessons/mini-workshop/organizers.html @@ -0,0 +1,142 @@ +

    Pokyny pro organizátory

    +

    Tento motivační wokshop s MicroPythonem potřebuje speciální hardware. +Tady je popsáno, jak jsme všechno připravili.

    +

    Nákupní seznam

    +
    +
    NodeMCU Devkit v2

    Dá se koupit z Číny, např. +z Aliexpressu.

    +
    Malé nepájivé pole (Mini Breadboard)

    Dá se koupit z Číny, např. +z Aliexpressu.

    +
    Modul s tlačítkem

    Dá se koupit z Číny, např. +z Aliexpressu.

    +
    Modrá LED (Uf=3,3V)

    Dá se koupit z Číny, nebo např. +v GME.

    +
    Pásek s 8 LED moduly WS2812 s konektorem

    Dá se koupit po metrech z Číny, např. +v Aliexpressu, +rozstříhat, a napájet na konektory – opět např. +z Aliexpressu.

    +
    Malý servomotor, např. TowerPro SG92R

    Dá se koupit z Číny, např. +v Aliexpressu.

    +
    Spojovací drátky

    Opět se dají koupit z Číny, např. +v Aliexpressu. +
    +Jsou potřeba takové, aby se jimi dal připojit LED pásek a motorek +k nepájivému poli.

    +
    MicroUSB kabel

    Jak pro mobil. Doporučuji koupit kvalitní datový kabel. +Případně si můžou účastníci donést vlastní, je ale dobré jich mít pár +v zásobě, kdyby si přinesli nedatový kabel od nabíječky.

    +
    Počítač

    Je potřeba i „velký“ počítač – hlavně kvůli obrazovce a klávesnici. +Viz nastavení níže.

    +

    Příprava hardwaru

    +

    NodeMCU zasuň do nepájivého pole, aby na každé delší straně zbyla řada dírek. +Do nich zapoj komponenty:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pin– Součástka
    D1– Anoda LED (delší nožička)
    D2– Katoda LED (kratší nožička)
    3V3VCC tlačítka
    GNDGND tlačítka
    D5OUT tlačítka
    D6DI LED pásku
    D8Data servomotoru
    GNDGND servomotoru
    3V3VCC servomotoru
    GNDGND LED pásku
    Vin+5V LED pásku
    +

    Nejsou-li vstupy servomotorku označené, bývá červený VCC, hnědý GND, +zbylý Data.

    +

    Fotografie modulu s veškerým příslušenstvím

    +

    Detailní záběr na osazené nepájivé pole

    +

    Příprava počítače

    +

    Na workshop doporučujeme použít počítače s Fedorou Workstation 25. +Pár věcí je potřeba nastavit:

    +
      +
    • Uživatel musí být členem skupiny dialout:

      +
      $ sudo usermod -a -G dialout $(whoami)
      +$ su - $(whoami)
      +

      (Po tomto nastavení je potřeba se přihlásit a znovu odhlásit, +případně v každém terminálu zadat su - $(whoami).)

      +
    • +
    • Musí být nainstalované balíčky picocom a ampy:

      +
      $ sudo dnf install picocom ampy
      +

      (Na jiných systémech nemusí být ampy v systémových repozitářích. +V takovém případě se dá nainstalovat pomocí +python3 -m pip install --user adafruit-ampy.)

      +
    • +
    • Aplikace Terminal (gnome-terminal) a Textový editor (gedit) +jsme dali do oblíbených položek v GNOME. +(Klávesa Super – na klávesnici napsat Terminal – přetáhnout ikonku do levého +proužku. Zopakovat pro Gedit.)

      +
    • +
    • Textový editor jsme nastavili pro Python: odsazování čtyřmi mezerami, +ukazování čísel řádků. +Podrobněji viz náš návod pro začátečníky.

      +
    • +
    • Nastavili jsme možnost výběru české/anglické klávesnice. +(Ikonka v pravém horním rohu obrazovky – ikonka s klíčem a šroubovákem – +Regional Settings)

      +
    • +
    +

    Firmware

    +

    K flashování je potřeba stáhnout +binární obraz MicroPythonu pro ESP8266 a +náš předpřipravený začátečnický soubor boot.py.

    +

    Potřebné nástroje, esptool a ampy, můžeme na Fedoře nainstalovat z balíčků:

    +
    $ sudo dnf install esptool ampy
    +

    Na systémech, kde tyto nástroje v systémových balíčcích nejsou, +se dají nainstalovat do virtuálního prostředí:

    +
    $ python3 -m venv venv
    +$ . venv/bin/activate
    +(venv)$ python -m pip install esptool adafruit-ampy
    +

    Připojíme NodeMCU přes USB a pomocí esptool ho naflashujeme:

    +
    (venv)$ esptool.py --port /dev/ttyUSB0 erase_flash
    +(venv)$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
    +

    (Kdyby neexistovalo zařízení /dev/ttyUSB0, ve výstupu dmesg | tail se dá +dohledat, kam se NodeMCU připojilo. V takovém případě ale bude potřeba změnit +instrukce k workshopu.)

    +

    Nakonec na NodeMCU stiskneme tlačítko RST, pustíme a pak nahrajeme boot.py:

    +
    (venv)$ ampy -p /dev/ttyUSB0 put boot.py
    +

    Soubor boot.py obsahuje testovací režim pro kontrolu, že je vše nahráno +správně. +Podržíme-li tlačítko na modulu stisknuté, po resetu (tlačítkem RST nebo +přpojením USB kabelu) se motorek otočí a modrá LED i LED pásek zablikají.

    \ No newline at end of file diff --git a/lessons/mini-workshop/semafor.gif b/lessons/mini-workshop/semafor.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ef9e45d7c0561a7c781262454975e51c466c264 GIT binary patch literal 20996 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 +

    Modul je v Pythonu něco, z čeho můžeme importovat. +Třeba z modulu math můžeš importovat funkci sqrt:

    +
    from math import sqrt
    +
    +print(sqrt(2))
    +

    Kromě importování jednotlivých proměnných z modulu +můžeš importovat i celý modul najednou. +K tomu, co modul nabízí, se pak dostaneš pomocí +tečky – podobně jako se pomocí 'Ahoj'.upper dostaneš k metodě, kterou nabízí +řetězec.

    +

    Například:

    +
    import turtle
    +
    +turtle.left(90)
    +turtle.color('red')
    +turtle.forward(100)
    +turtle.exitonclick()
    +
    import math
    +
    +print(math.cos(math.pi))
    +

    Hvězdičky nechceme

    +

    Možná jsi v dokumentaci nebo na jiném kurzu viděl/a příkaz import +s hvězdičkou (*). +Pokud ano, v rámci tohoto kurzu na hvězdičku prosím +zapomeň a importuj místo toho radši celý modul. +Až začneš psát větší programy, zjednoduší ti +to práci.

    +

    Vlastní moduly

    +

    A teď to hlavní! +Můžeš vytvořit vlastní importovatelný modul +a to jen tak, že uděláš pythonní soubor. +Funkce, které v něm nadefinuješ, a globální proměnné, +které v něm nastavíš, pak budou k dispozici tam, kde modul naimportuješ.

    +

    Zkus si to! +Vytvoř soubor louka.py a do něj napiš:

    +
    barva_travy = 'zelená'
    +pocet_kotatek = 28
    +
    +def popis_stav():
    +    return 'Tráva je {barva}. Prohání se po ní {pocet} koťátek'.format(
    +        barva=barva_travy, pocet=pocet_kotatek)
    +

    A pak v dalším souboru, třeba vypis.py, napiš:

    +
    import louka
    +
    +print(louka.popis_stav())
    +

    a pak spusť:

    +
    $ python vypis.py
    +

    Příkaz import hledá soubory (mimo jiné) v adresáři, +ve kterém je „hlavní modul” programu – tedy soubor, +který spouštíš (u nás vypis.py). +Oba soubory by proto měly být ve stejném adresáři.

    +

    Vedlejší efekty

    +

    Co přesně dělá příkaz import louka?

    +

    Python najde příslušný soubor (louka.py) a provede v něm všechny příkazy, +odshora dolů, jako v normálním Pythonním programu. +Všechny globální proměnné (včetně nadefinovaných funkcí) pak dá k dispozici +kódu, který „louku“ importoval.

    +

    Když pak stejný modul importuješ podruhé, už se neprovádí všechno +znovu – stejná sada proměnných se použije znovu.

    +

    Zkus si to – na konci louka.py dopiš:

    +
    print('Louka je zelená!')
    +

    Spusť python (máš-li ho už spuštěný, ukonči a spusť znovu) +a zadej v něm:

    +
    >>> print('První import:')
    +>>> import louka
    +>>> print('Druhý import:')
    +>>> import louka
    +

    Výpis se objeví jen poprvé.

    +

    Když takhle modul při importu „dělá“ něco víc, než jen nastavuje proměnné +a funkce, říká se, že má vedlejší efekt (angl. side effect). +Vedlejší efekt může být vypsání něčeho na obrazovku nebo do souboru, +vykreslení okýnka na obrazovku, otázka na uživatele pomocí input, atp.

    +

    V modulech připravených na importování se vedlejším efektům vyhýbáme: +úloha takového modulu je dát k dispozici funkce, které něco dělají, +ne to udělat přímo. +Všimni si například, že import turtle neukáže okýnko – to se objeví až po +zavolání turtle.forward().

    +

    Příkaz print proto radši z modulu zase smaž.

    +

    Adresář pro každý projekt

    +

    Od teď budeš občas psát větší projekty, +které budou obsahovat více souvisejících souborů. +Pro každý takový projekt si udělej zvláštní adresář. +Lépe se pak vyznáš v tom, ke kterému projektu který soubor patří.

    \ No newline at end of file diff --git a/lessons/mypy/index.html b/lessons/mypy/index.html new file mode 100644 index 00000000..22fa35e5 --- /dev/null +++ b/lessons/mypy/index.html @@ -0,0 +1,267 @@ +

    Mypy

    +

    Dnes se společně podíváme na knihovnu mypy, která nám do Pythonu přidá +možnost kontroly typů, jenž je jinak dostupná jen v jiných programovacích +jazycích.

    +

    Statická a dynamická typová kontrola

    +

    Statická typová kontrola v programovacím jazyce počítá s tím, že pro každou +proměnnou či parametr je uveden datový typ. Proměnná definovaná s konkrétním +typem pak nemůže obsahovat hodnotu jiného datového typu a pokus o to vyvolá +výjimku. Jako např. tento kód v Javě:

    +
    String name = "John";
    +name = 5;
    +

    První řádek definuje proměnnou name jako řetězec. Na druhém řádku se +pokoušíme do této proměnné přiřadit celé číslo, což není povoleno +a kompilace takového kódu skončí chybou.

    +

    Naproti tomu Python je typickým představitelem jazyků s dynamickou typovou +kontrolou. Program jako je ten následující bude fungovat naprosto +bez problémů:

    +
    name = "John"
    +name = 5
    +name = ["John", "Peter", "Alice"]
    +

    Python obecně spoléhá na to, že si sám tvůrce dá pozor, aby proměnná +obsahovala v tom správném čase ten správný obsah a v případě nesrovnalostí +se s tím program za běhu nějak popasuje.

    +

    Oba přístupy mají své výhody a nevýhody. Statická typová kontrola by možná +pro začátečníky ubrala na čitelnosti kódu, zbytečně prodloužila krátké +jednoúčelové programy a nejspíše by ani nenadchla vědce či matematiky, kteří +v Pythonu tvoří většinu času prototypy a svůj kód zpravidla automaticky netestují. +Na druhou stranu může přispět k lepší čitelnosti složitějšího kódu, +editory a IDE mohou díky ní lépe napovídat programátorům a typová kontrola +může odhalit chyby ještě před spuštěním aplikace či jejich testů.

    +

    Pokud výhody statické typové kontroly znějí slibně, je tady pro vás mypy.

    +

    Instalace a spuštění

    +

    mypy se instaluje standardním způsobem:

    +
    $ python -m pip install mypy
    +

    A spouští se pak stejnojmenným příkazem:

    +
    $ mypy program.py 
    +Success: no issues found in 1 source file
    +

    První spuštění nejspíše nezahlásí žádný problém, protože program neobsahuje +informace o typech proměnných a tak nemá mypy co kontrolovat.

    +
    def hello(name):
    +    return "Hello {}!".format(name)
    +
    +print(hello("World"))
    +

    Pokud budeme chtít do budoucna zařídit, aby mypy nepřeskakovala funkce bez +definovaných typů, dá se to zařídit přepínačem --disallow-untyped-defs.

    +
    $ mypy --disallow-untyped-defs program.py 
    +program.py:1: error: Function is missing a type annotation
    +Found 1 error in 1 file (checked 1 source file)
    +

    Jakmile aplikace používá definice typů, je dobré je kontrolovat +v rámci testů. Např. pro pytest existuje doplněk pytest-mypy, který +se o to postará.

    +

    Definice typů a jejich kontrola

    +

    Python sám o sobě sice statickou typovou kontrolu neobsahuje, ale od verze 3 +je pro ni v jazyce připravena podpora. Náš moderní program +s definovanými typy bude vypadat následovně:

    +
    def hello(name: str) -> str:
    +    return "Hello {}!".format(name)
    +
    +print(hello("World"))
    +

    Úpravou jsme definovali, že funkce hello bere jako první a jediný argument +řetězec a vrací taktéž řetězec.

    +

    Tato úprava nemá na běh programu vůbec žádný vliv, protože Python samotný +definice typů ignoruje.

    +
    $ python program.py                      
    +Hello World!
    +

    mypy nám ovšem potvrdí, že je vše v pořádku.

    +
    $ mypy --disallow-untyped-defs program.py
    +Success: no issues found in 1 source file
    +

    Co když se teď naši vylepšenou funkci pokusíme zavolat znovu s nesprávným +typem argumentu?

    +
    def hello(name: str) -> str:
    +    return "Hello {}!".format(name)
    +
    +print(hello("World"))
    +print(hello(5))
    +
    $ python program.py                      
    +Hello World!
    +Hello 5!
    +

    Funguje to, protože řetězcová metoda .format() si poradí i s argumenty +jiných typů. Ovšem, co na to mypy a typová kontrola?

    +
    $ mypy --disallow-untyped-defs program.py
    +program.py:5: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
    +Found 1 error in 1 file (checked 1 source file)
    +

    Té se to právem nelíbí, protože v definici jsme si stanovili, že funkce má +brát jako argument řetězec a místo toho jí na posledním řádku voláme +s celočíselným argumentem.

    +

    Vlastní datové typy

    +

    V Pythonu často používáme vlastní třídy a jejich instance si všemi možnými +způsoby předáváme do/z funkcí. I s tím si umí mypy poradit.

    +
    class Animal:
    +    def __init__(self, name: str):
    +        self.name = name
    +
    +
    +class Person:
    +    def __init__(self, name: str):
    +        self.name = name
    +
    +
    +def hello(pet: Animal) -> None:
    +    print('Hi, I am {}, your pet.'.format(pet.name))
    +
    +
    +rooster = Animal("Kokrhac")
    +guest = Person("Tichoslapek")
    +
    +hello(rooster)
    +hello(guest)
    +

    Když se program pokusíme spustit, bude bez problémů fungovat:

    +
    $ python program.py
    +Hi, I am Kokrhac, your pet.
    +Hi, I am Tichoslapek, your pet.
    +

    mypy nás ovšem upozorní, že funkci hello v druhém případě nepoužíváme správně:

    +
    $ mypy program.py
    +program.py:19: error: Argument 1 to "hello" has incompatible type "Person"; expected "Animal"
    +Found 1 error in 1 file (checked 1 source file)
    +

    Alternativní způsoby definice

    +

    Jak už bylo zmíněno, Python samotný definice typů ignoruje. I přes to ale +bylo potřeba na ně jazyk připravit, aby dvojtečka za parametrem a šipka za +definicí funkce nezpůsobily syntaktické chyby. Tyto možnosti však nejsou +v Pythonu 2, kde je nutné dávat definice typů do komentářů:

    +
    def hello(name):  # type: (str) -> str
    +    return "Hello {}!".format(name)
    +
    +print hello("World")
    +print hello(5)
    +

    A říci mypy, že kontroluje kód pro starší verzi Pythonu:

    +
    $ mypy --py2 program.py                  
    +program.py:5: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
    +Found 1 error in 1 file (checked 1 source file)
    +

    Poslední možností definice typů je využití tzv. „stub“ souborů. Takový soubor +má příponu .pyi, stejné jméno jako modul, ke kterému patří, a obsahuje +jen definice funkcí s definovanými typy. Například takto:

    +
    def hello(name: str) -> str: pass
    +

    To se hodí především pro knihovny, kde je možné definice typů na jednu stranu +úplně ignorovat a na stranu druhou tyto definice snadno přidat, aniž bychom +museli měnit zdrojový kód samotný. Je tímto způsobem samozřejmě i možné přidat +definice typů ke kódu, který jinak nemáte právo upravovat.

    +

    Definice sama o sobě je validní Python kód a funguje ve stejné formě +pro Python 2 i 3.

    +

    Složitější definice a modul typing

    +

    Změníme naši jednoduchou funkci tak, aby uměla přímo pozdravit a to hned +několikrát.

    +
    def say_hello(names):
    +    for name in names:
    +        print("Hello {}!".format(name))
    +
    +say_hello(["PyLadies", "Ostrava"])
    +
    $ python say_hello.py 
    +Hello PyLadies!
    +Hello Ostrava!
    +

    Program funguje dobře. Přidejme tedy definice typů — seznam pro jména +na vstupu a protože funkce nic nevrací, tak None jako automatická návratová +hodnota.

    +

    Označit argument funkce za seznam můžeme pomocí List z modulu typing. +Modul typing obsahuje takových pomocných objektů celou řadu a my se některé +z nich postupně podíváme.

    +
    from typing import List
    +
    +def say_hello(names: List) -> None:
    +    for name in names:
    +        print("Hello {}!".format(name))
    +
    +say_hello(["PyLadies", "Ostrava"])
    +
    $ python say_hello.py
    +Hello PyLadies!
    +Hello Ostrava!
    +
    +$ mypy say_hello.py  
    +Success: no issues found in 1 source file
    +

    Na fungování programu nemá změna žádný vliv a mypy je zdá se také spokojená. +Máme hotovo? Svým způsobem ano, ale naše funkce je přeci jen univerzálnější +než dokládá definice typu vstupního argumentu a bude fungovat bez problémů +i s n-ticí nebo slovníkem:

    +
    say_hello(["PyLadies", "Ostrava"])
    +say_hello(("Tom", "Peter"))
    +say_hello({"Susan": 32, "Carol": 25})
    +

    Co s tím? U složitějších definic si musíme vzít na pomoc modul typing. +Ten je u Pythonu 3.5 a novějších dostupný ve standardní knihovně a pro starší +verze se dá standardním způsobem nainstalovat. Z něj si pak můžeme importovat +jednotlivé části, které nám pomohou s přesnější definicí typů.

    +
    from typing import List, Tuple, Dict, Union, Any
    +
    +def say_hello(names: Union[List[str], Tuple[str, ...], Dict[str, Any]]) -> None:
    +    for name in names:
    +        print("Hello {}!".format(name))
    +
    +say_hello(["PyLadies", "Ostrava"])
    +say_hello(("Tom", "Peter"))
    +say_hello({"Susan": 32, "Carol": 25})
    +

    Definice se nám celkem nepříjemně rozrostla, ale i na to najdeme řešení. +V aktuální podobě specifikuje následující pravidla:

    +
      +
    • Union — vyber si libovolnou definici z těch následujících +v hranatých závorkách
    • +
    • List[str] — seznam řetězců
    • +
    • Tuple[str, ...] — n-tice s jedním či více řetězci
    • +
    • Dict[str, Any] — slovník s řetězcovými klíči a libovolnými hodnotami
    • +
    +

    U n-tic se počítá s tím, že hodnota na každé z pozic má nějaký specifický +účel (např. n-tice se třemi souřadnicemi by měla +Tuple[float, float, float]) a proto vypadá definice pro n-tici +s libovolnou délkou jinak než pro seznam.

    +

    Takové konkrétní definice jsou zdlouhavé a proto modul typing obsahuje mnoho +užitečných zkratek. V našem případě by se dala definice zobecnit na libovolný +iterovatelný objekt obsahující řetězce.

    +
    from typing import Iterable
    +
    +def say_hello(names: Iterable[str]) -> None:
    +    for name in names:
    +        print("Hello {}!".format(name))
    +
    +say_hello(["PyLadies", "Ostrava"])
    +say_hello(("Tom", "Peter"))
    +say_hello({"Susan": 32, "Carol": 25})
    +

    Importovat zvláštní List, Dict nebo Tuple jen pro potřeby typových +anotací se nezdá být úplně praktické. Proto vznikl PEP 585, který pro složitější +struktury v typových anotacích umožní použít názvy tříd dostupné přímo v Pythonu. +Toto je již implementováno v Pythonu od verze 3.9.0, ale mypy tento zápis ještě nepodporuje. +Brzy si tedy i u složitějších anotací (např.: argument: dict[str, list[int]]) vystačíme +bez importů z modulu typing

    +

    U funkcí s argumenty s výchozí hodnotou se definice typů píše mezi jméno +argumentu a rovnítko.

    +
    def pow(base: int, exp: int = None) -> int:
    +    if exp:
    +        return base ** exp
    +    else:
    +        return base ** 2
    +
    +print(pow(5, 3))
    +print(pow(5))
    +

    Funkce pow ukazuje ještě jeden speciální případ. Často se stává, že funkce +jako argument může brát nějakou hodnotu daného typu nebo None. V takovém +případě by psaní Union[str, None] bylo příliš zdlouhavé a modul typing +proto obsahuje Optional. Optional[str] a Union[str, None] jsou naprosto identické definice.

    +

    V příkladu výše je navíc zápis exp: int = None díky výchozí hodnotě +argumentu exp nastavené na None konvertován na Optional[int] automaticky.

    +

    mypy umí samozřejmě kontrolovat nejen konstanty, ale i návratové hodnoty +funkcí předané jako argument jiné funkci.

    +
    def pow(base: int, exp: int = None) -> int:
    +    if exp:
    +        return base ** exp
    +    else:
    +        return base ** 2
    +
    +def hello(name: str) -> str:
    +    return "Hello {}!".format(name)
    +
    +result = pow(5, 3)
    +print(hello(result))
    +
    $ mypy program.py
    +program.py:11: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
    +Found 1 error in 1 file (checked 1 source file)
    +

    Globální proměnné

    +

    Ne vždy si mypy dokáže odvodit datové typy např. pro globální proměnné.

    +
    global_dict = {}
    +
    $ mypy global.py
    +global.py:1: error: Need type annotation for 'global_dict' (hint: "global_dict: Dict[<type>, <type>] = ...")
    +Found 1 error in 1 file (checked 1 source file)
    +

    V takovém případě se dá datový typ definovat velmi podobně jako u funkcí:

    +
    from typing import Dict
    +
    +global_dict: Dict[str, float] = {}
    +

    A mnohem více

    +

    Tohle by na úvod mohlo stačit. O mypy se toho dá samozřejmě nejvíce dočíst +v dokumentaci +a totéž platí pro modul typing a dokumentaci standardní knihovny.

    \ No newline at end of file diff --git a/lessons/nested-traceback/index.html b/lessons/nested-traceback/index.html new file mode 100644 index 00000000..423f6483 --- /dev/null +++ b/lessons/nested-traceback/index.html @@ -0,0 +1,58 @@ +

    Výpisy chyb ze zanořených funkcí

    +

    Teď si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která +nastane v zanořené funkci.

    +

    Pročti si následující ukázkový příklad.

    +

    Tohle je absurdní ilustrační příklad, ne ukázka jak dobře programovat!

    +
    + +
    def podel(delenec, delitel):
    +    """Podělí čísla mezi sebou a vrátí výsledek."""
    +    return delenec / delitel        # řádek 3
    +
    +
    +def podel_nulou(cislo):
    +    """Vydělí dané číslo nulou a vrátí výsledek."""
    +    return podel(cislo, 0)          # řádek 8
    +
    +
    +def ukaz_priklad():
    +    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
    +    vysledek = podel_nulou(3)       # řádek 13
    +    print(vysledek)
    +
    +ukaz_priklad()                      # řádek 16
    +

    Co se stane, když tohle pustíš?

    +
    Traceback (most recent call last):
    +  File "ukazka.py", line 16, in <module>
    +    ukaz_priklad()
    +  File "ukazka.py", line 13, in ukaz_priklad
    +    vysledek = podel_nulou(3)
    +  File "ukazka.py", line 8, in podel_nulou
    +    return podel(cislo, 0)
    +  File "ukazka.py", line 3, in podel
    +    return delenec / delitel
    +ZeroDivisionError: division by zero
    +

    Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu. +Skutečná chyba (tedy místo, které musíš opravit) je asi někde poblíž těchto +míst:

    +
      +
    • Na řádku 3, ve funkci podel, vzniklo dělení nulou. +Měla by funkce podel zjistit, jestli dostane nulu, a nějak na to +zareagovat?
    • +
    • Na řádku 8, ve funkci podel_nulou, kde voláš podel s dělitelem 0. +Má to tak opravdu být?
    • +
    • Na řádku 13, ve funkci ukaz_priklad, kde voláš funkci podel_nulou. +Kdybys to nedělal/a, chyba by taky nevznikla!
    • +
    • Na řádku 16, ne ve funkci, když voláš funkci ukaz_priklad. +Možná by to chtělo použít jiný příklad?
    • +
    +

    Python (a asi ani ty) nemůže vědět, co tím programem programátor myslel, +a kdy by tedy bylo nejlepší chybu opravit. +Ukáže tedy v programu všechna místa, která k chybě vedla. +Je na tobě abys z nich vybral/a to nejvhodnější a zaměřil/a se na něj.

    +

    Tahle ukázka je samozřejmě jen teoretická, ale v reálných programech vypadá +hlášení chyb stejně. +Až takovou složitou hlášku uvidíš, nepanikař! +Python se snaží co nejvíc napovědět a usnadnit ti chybu najít a opravit. +Sice stroze a anglicky, ale snaží. +Vyjdi mu vstříc a nauč se tyhle hlášky číst.

    \ No newline at end of file diff --git a/lessons/notebook/index.html b/lessons/notebook/index.html new file mode 100644 index 00000000..5f9c9842 --- /dev/null +++ b/lessons/notebook/index.html @@ -0,0 +1,116 @@ +
    +
    +
    +

    Jupyter Notebook

    +

    Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

    +

    Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). +V Jupyter Notebooku jsou psány i tyto materiály.

    +

    Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. +Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

    +

    Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

    +
    $ python -m pip install --upgrade pip wheel
    +$ python -m pip install notebook
    +

    Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

    +

    Nainstalovaný Notebook pusťte pomocí:

    +
    $ python -m notebook
    +

    V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

    +

    Jak na Notebook

    +

    Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

    +

    Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

    +

    Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

    +
    str.l<TAB>
    +! ls -a<SHIFT+ENTER>
    +str.lower?<SHIFT+ENTER>

    Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

    +
    +
    +
    +
    +
    +
    In [2]:
    +
    +
    +
    1+1  # Nevypíše se (není poslední příkaz)
    +2+2  # Vypíše se
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[2]:
    + + + + +
    +
    4
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [3]:
    +
    +
    +
    seznam = [5, 6, 3, 2]
    +print(seznam)  # print() funguje
    +seznam.sort()
    +seznam         # Poslední výraz se vypíše
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    [5, 6, 3, 2]
    +
    +
    +
    + +
    + +
    Out[3]:
    + + + + +
    +
    [2, 3, 5, 6]
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další možnosti, jako např. změna typu buňky na Markdown, jsou dostupné z menu nebo klávesovými zkratkami.

    +
    +
    +
    + + diff --git a/lessons/numpy/index.html b/lessons/numpy/index.html new file mode 100644 index 00000000..3ea6f301 --- /dev/null +++ b/lessons/numpy/index.html @@ -0,0 +1,4175 @@ +
    +
    +
    +

    Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky:

    +
    $ python -m pip install --upgrade pip
    +$ python -m pip install notebook numpy scipy imageio matplotlib pillow
    +
    +
    +
    +
    +
    +
    +
    +

    Mezitím, co se to bude instalovat, si stáhněte do adresáře static tyto soubory:

    + +

    A až bude nainstalováno, spusťte si nový Notebook. (Viz lekce o Notebooku.)

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    NumPy

    +
    +
    +
    +
    +
    +
    +

    NumPy je základní knihovna pro vědce a analytiky, kteří pracují s Pythonem. Definuje typ pro n-rozměrné homogenní pole (nejčastěji čísel) a API pro práci s takovým polem.

    +

    Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

    +

    Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

    +

    Nejednoznačnost a zkratky

    +

    Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. +Na obojí se používají podobné nástroje. +Automaticky pouštěné skripty musí být samozřejmě robustní. Nástroje ke zkoumání dat ale bývají přívětivé k vědcům, často na úkor robustnosti nebo „dobrých programátorských mravů”. Například některé funkce tak trochu „hádají”, co uživatel chtěl, a v tutoriálech se setkáte se zkratkami jako import numpy as np či dokonce from numpy import *.

    +

    Toto je kurz programovací, kde nám záleží více na znovupoužitelném kódu než na jednom konkrétním výsledku. Budeme proto preferovat explicitní a jednoznačné operace. Ty jsou v použitých knihovnách vždy vedle zkratek k dispozici a popsány v dokumentaci.

    +
    +
    +
    +
    +
    +
    +

    Jak s polem pracovat? Nejprve si ho vytvoříme, nejlépe ze seznamu čísel:

    +
    +
    +
    +
    +
    +
    In [1]:
    +
    +
    +
    import numpy
    +array = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[1]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6],
    +       [7, 8, 9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Každé pole má dvě základní, neměnné vlastnosti: tvar (shape), neboli velikost, a datový typ (dtype).

    +
    +
    +
    +
    +
    +
    In [2]:
    +
    +
    +
    array.shape
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[2]:
    + + + + +
    +
    (3, 3)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [3]:
    +
    +
    +
    array.dtype
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[3]:
    + + + + +
    +
    dtype('int64')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tvar je n-tice, kde n je počet dimenzí pole; shape=(3, 3) dtype='int64' znamená pole 3×3 celých čísel. +Dimenzí může být libovolně mnoho, např. trojrozměrnou matici můžeme vytvořit z trojnásobně vnořených seznamů a NumPy ji „rozumně” vypíše:

    +
    +
    +
    +
    +
    +
    In [4]:
    +
    +
    +
    cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    +print(cube.shape)
    +cube
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    (2, 2, 2)
    +
    +
    +
    + +
    + +
    Out[4]:
    + + + + +
    +
    array([[[1, 2],
    +        [3, 4]],
    +
    +       [[5, 6],
    +        [7, 8]]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Základní operace

    +
    +
    +
    +
    +
    +
    +

    Základní vlastnost NumPy polí je to, že aritmetické operace se skalárními hodnotami (např. čísly) fungují po prvcích.

    +
    +
    +
    +
    +
    +
    In [5]:
    +
    +
    +
    array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[5]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6],
    +       [7, 8, 9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [6]:
    +
    +
    +
    array - 1
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[6]:
    + + + + +
    +
    array([[0, 1, 2],
    +       [3, 4, 5],
    +       [6, 7, 8]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [7]:
    +
    +
    +
    array / 2
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[7]:
    + + + + +
    +
    array([[0.5, 1. , 1.5],
    +       [2. , 2.5, 3. ],
    +       [3.5, 4. , 4.5]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [8]:
    +
    +
    +
    -(array % 4)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[8]:
    + + + + +
    +
    array([[-1, -2, -3],
    +       [ 0, -1, -2],
    +       [-3,  0, -1]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Kromě aritmetických operací takto funguje i porovnávání. Následujícím výrazem dostanete pravdivostní tabulku, která má True na místech, kde pro příslušný prvek platí podmínka:

    +
    +
    +
    +
    +
    +
    In [9]:
    +
    +
    +
    array > 5
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[9]:
    + + + + +
    +
    array([[False, False, False],
    +       [False, False,  True],
    +       [ True,  True,  True]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Protože Python neumožňuje předefinovat chování operátorů and a or, logické spojení operací se tradičně dělá přes bitové operátory & (a) a | (nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:

    +
    +
    +
    +
    +
    +
    In [10]:
    +
    +
    +
    (array > 3) & (array < 7)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[10]:
    + + + + +
    +
    array([[False, False, False],
    +       [ True,  True,  True],
    +       [False, False, False]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Operace s jinými poli pracují po prvcích. Obě pole musí být stejně velké.

    +
    +
    +
    +
    +
    +
    In [11]:
    +
    +
    +
    array + array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[11]:
    + + + + +
    +
    array([[ 2,  4,  6],
    +       [ 8, 10, 12],
    +       [14, 16, 18]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [12]:
    +
    +
    +
    array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[12]:
    + + + + +
    +
    array([[0, 2, 0],
    +       [4, 0, 6],
    +       [0, 8, 0]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Sekvence (jako seznamy) jsou před operací převedeny na pole.

    +
    +
    +
    +
    +
    +
    In [13]:
    +
    +
    +
    array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[13]:
    + + + + +
    +
    array([[0, 2, 0],
    +       [4, 0, 6],
    +       [0, 8, 0]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexování

    +
    +
    +
    +
    +
    +
    +

    NumPy pole jde různými způsoby indexovat. Základní způsoby známe už ze samotného Pythonu – pole se chová jako sekvence menších polí:

    +
    +
    +
    +
    +
    +
    In [14]:
    +
    +
    +
    array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[14]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6],
    +       [7, 8, 9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [15]:
    +
    +
    +
    array[0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[15]:
    + + + + +
    +
    array([1, 2, 3])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [16]:
    +
    +
    +
    array[0:-1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[16]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [17]:
    +
    +
    +
    array[0][1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[17]:
    + + + + +
    +
    2
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Na rozdíl od Pythonu se ale dá vícerozměrné pole indexovat přímo n-ticí. Toto je dokonce preferovaný způsob – přehlednější a mnohem rychlejší:

    +
    +
    +
    +
    +
    +
    In [18]:
    +
    +
    +
    array[0, 1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[18]:
    + + + + +
    +
    2
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [19]:
    +
    +
    +
    array[0:-1, 1:]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[19]:
    + + + + +
    +
    array([[2, 3],
    +       [5, 6]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Chceme-li vybrat určitý sloupec, řekneme si „kompletním intervalem“ (:) o všechny řádky:

    +
    +
    +
    +
    +
    +
    In [20]:
    +
    +
    +
    array[:, 2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[20]:
    + + + + +
    +
    array([3, 6, 9])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další způsob specifický pro NumPy je indexování pravdivostní tabulkou.

    +

    Když potřebujete z matice vybrat prvky, pro které platí nějaká podmínka, napřed si vytvořte pole hodnot True/False:

    +
    +
    +
    +
    +
    +
    In [21]:
    +
    +
    +
    array > 4
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[21]:
    + + + + +
    +
    array([[False, False, False],
    +       [False,  True,  True],
    +       [ True,  True,  True]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    To pak použijte jako index:

    +
    +
    +
    +
    +
    +
    In [22]:
    +
    +
    +
    array[array > 4]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[22]:
    + + + + +
    +
    array([5, 6, 7, 8, 9])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Výsledek je jednorozměrný – informace o původních pozicích prvků se ztratí.

    +
    +
    +
    +
    +
    +
    +

    Pro úplnost uvedu ještě dva způsoby indexování. První je seznamem indexů, kterým můžete vybírat, přehazovat nebo i duplikovat konkrétní řádky:

    +
    +
    +
    +
    +
    +
    In [23]:
    +
    +
    +
    array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[23]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [7, 8, 9],
    +       [4, 5, 6],
    +       [4, 5, 6]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [24]:
    +
    +
    +
    array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[24]:
    + + + + +
    +
    array([[3, 3, 1, 1],
    +       [6, 6, 4, 4],
    +       [9, 9, 7, 7]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Druhý je indexování pomocí n-tice „řádkových souřadnic“ a n-tice odpovídajících „sloupcových souřadnic“:

    +
    +
    +
    +
    +
    +
    In [25]:
    +
    +
    +
    array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[25]:
    + + + + +
    +
    array([2, 6, 7])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Trochu specifické je indexování vícerozměrných polí. U nich se často využije „kompletní interval“ (:):

    +
    +
    +
    +
    +
    +
    In [26]:
    +
    +
    +
    cube
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[26]:
    + + + + +
    +
    array([[[1, 2],
    +        [3, 4]],
    +
    +       [[5, 6],
    +        [7, 8]]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [27]:
    +
    +
    +
    cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[27]:
    + + + + +
    +
    array([[1, 2],
    +       [3, 4]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [28]:
    +
    +
    +
    cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[28]:
    + + + + +
    +
    array([[1, 2],
    +       [5, 6]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [29]:
    +
    +
    +
    cube[:, :, 0]  # První sloupce
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[29]:
    + + + + +
    +
    array([[1, 3],
    +       [5, 7]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Má-li pole hodně rozměrů, je psaní spousty :, zdlouhavé a nepřehledné. Existuje proto speciální hodnota ... (Ellipsis), která doplní tolik „kompletních intervalů“ (:), aby souhlasil počet dimenzí:

    +
    +
    +
    +
    +
    +
    In [30]:
    +
    +
    +
    cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[30]:
    + + + + +
    +
    array([[1, 3],
    +       [5, 7]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Broadcasting a změny

    +
    +
    +
    +
    +
    +
    +

    Už jsme si ukázali, že aritmetické operace se skalárními hodnotami se provede pro všechny prvky, zatímco operace mezi dvěma stejně velkými poli se provede po prvcích:

    +
    +
    +
    +
    +
    +
    In [31]:
    +
    +
    +
    array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[31]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6],
    +       [7, 8, 9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [32]:
    +
    +
    +
    array * 3
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[32]:
    + + + + +
    +
    array([[ 3,  6,  9],
    +       [12, 15, 18],
    +       [21, 24, 27]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [33]:
    +
    +
    +
    array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[33]:
    + + + + +
    +
    array([[0, 2, 0],
    +       [4, 0, 6],
    +       [0, 8, 0]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jak je to ale s různě velkými poli?

    +

    Nemá-li sekvence, se kterou pracujeme, dost dimenzí, poslední dimenze se „rozšíří“, jako bychom pracovali v každém sloupci se skalární hodnotou. Tomuto „rozšiřování” se obecně říká broadcasting.

    +
    +
    +
    +
    +
    +
    In [34]:
    +
    +
    +
    array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[34]:
    + + + + +
    +
    array([[1, 2, 3],
    +       [4, 5, 6],
    +       [7, 8, 9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [35]:
    +
    +
    +
    array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[35]:
    + + + + +
    +
    array([[ 0,  2, 30],
    +       [ 0,  5, 60],
    +       [ 0,  8, 90]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Podobné rozšiřování nastane, má-li některá dimenze velikost 1:

    +
    +
    +
    +
    +
    +
    In [36]:
    +
    +
    +
    array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[36]:
    + + + + +
    +
    array([[ 0,  0,  0],
    +       [ 4,  5,  6],
    +       [70, 80, 90]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jednotlivé hodnoty v poli lze měnit:

    +
    +
    +
    +
    +
    +
    In [37]:
    +
    +
    +
    array[0, 0] = 123
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[37]:
    + + + + +
    +
    array([[123,   2,   3],
    +       [  4,   5,   6],
    +       [  7,   8,   9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ...a i na měnění se vztahuje broadcasting:

    +
    +
    +
    +
    +
    +
    In [38]:
    +
    +
    +
    array[0] = 123
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[38]:
    + + + + +
    +
    array([[123, 123, 123],
    +       [  4,   5,   6],
    +       [  7,   8,   9]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [39]:
    +
    +
    +
    array[:] = 123
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[39]:
    + + + + +
    +
    array([[123, 123, 123],
    +       [123, 123, 123],
    +       [123, 123, 123]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Obecně platí, že lze-li něčím vybírat prvky, lze tím i pole měnit:

    +
    +
    +
    +
    +
    +
    In [40]:
    +
    +
    +
    array[(1, 2, 0), (0, 2, 1)] = 0
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[40]:
    + + + + +
    +
    array([[123,   0, 123],
    +       [  0, 123, 123],
    +       [123, 123,   0]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další způsob, jak pole měnit, je rozšířeným přiřazením.

    +
    +
    +
    +
    +
    +
    In [41]:
    +
    +
    +
    array *= 2
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[41]:
    + + + + +
    +
    array([[246,   0, 246],
    +       [  0, 246, 246],
    +       [246, 246,   0]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tato operace není totéž co array = array * 2, ačkoli má stejný výsledek.

    +

    array *= 2 změní existující pole, zatímco array = array * 2 vytvoří nové pole, které pak přiřadí do původní proměnné.

    +
    +
    +
    +
    +
    +
    +

    Pozor na to, že není možné měnit typ pole:

    +
    +
    +
    +
    +
    +
    In [42]:
    +
    +
    +
    try:
    +    array /= 2
    +except Exception as e:
    +    print("Chyba!!", type(e), e)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Tvoření matic, část 2

    +
    +
    +
    +
    +
    +
    +

    Časté druhy matic se dají vytvořit pomocí pomocných funkcí. Výsledky se dají použít přímo nebo naplnit vypočítanými daty:

    +
    +
    +
    +
    +
    +
    In [43]:
    +
    +
    +
    numpy.zeros((4, 4))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[43]:
    + + + + +
    +
    array([[0., 0., 0., 0.],
    +       [0., 0., 0., 0.],
    +       [0., 0., 0., 0.],
    +       [0., 0., 0., 0.]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [44]:
    +
    +
    +
    numpy.ones((4, 4))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[44]:
    + + + + +
    +
    array([[1., 1., 1., 1.],
    +       [1., 1., 1., 1.],
    +       [1., 1., 1., 1.],
    +       [1., 1., 1., 1.]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [45]:
    +
    +
    +
    numpy.full((4, 4), 12.34)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[45]:
    + + + + +
    +
    array([[12.34, 12.34, 12.34, 12.34],
    +       [12.34, 12.34, 12.34, 12.34],
    +       [12.34, 12.34, 12.34, 12.34],
    +       [12.34, 12.34, 12.34, 12.34]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [46]:
    +
    +
    +
    numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[46]:
    + + + + +
    +
    array([[1., 0., 0., 0.],
    +       [0., 1., 0., 0.],
    +       [0., 0., 1., 0.],
    +       [0., 0., 0., 1.]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [47]:
    +
    +
    +
    numpy.diag([1, 2, 3, 4])  # Diagonální matice
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[47]:
    + + + + +
    +
    array([[1, 0, 0, 0],
    +       [0, 2, 0, 0],
    +       [0, 0, 3, 0],
    +       [0, 0, 0, 4]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    U těchto funkcí lze obecně použít argument dtype, kterým specifikujeme datový typ:

    +
    +
    +
    +
    +
    +
    In [48]:
    +
    +
    +
    int_zeros = numpy.zeros((4, 4), dtype='int8')
    +print(int_zeros.dtype)
    +int_zeros
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    int8
    +
    +
    +
    + +
    + +
    Out[48]:
    + + + + +
    +
    array([[0, 0, 0, 0],
    +       [0, 0, 0, 0],
    +       [0, 0, 0, 0],
    +       [0, 0, 0, 0]], dtype=int8)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další funkce tvoří jednorozměrné matice. Základní je arange, která bere stejné argumenty jako range v Pythonu:

    +
    +
    +
    +
    +
    +
    In [49]:
    +
    +
    +
    numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[49]:
    + + + + +
    +
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
    +       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
    +       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Navíc umí pracovat s reálnými čísly (float). Pozor ale na to, že reálná čísla jsou nepřesná! arange k začátku sekvence postupně přičítá „krok”, takže chyba narůstá celkem rychle:

    +
    +
    +
    +
    +
    +
    In [50]:
    +
    +
    +
    numpy.arange(0.0, 50.0, 0.3)[-1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[50]:
    + + + + +
    +
    49.799999999999997
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    V krajních případech takto dokonce můžeme dostat pole jiné velikosti, než jsme zamýšleli. Proto arange používejte jen pro celá čísla; pro reálná je tu linspace, která bere začátek a konec intervalu, plus počet prvků:

    +
    +
    +
    +
    +
    +
    In [51]:
    +
    +
    +
    numpy.linspace(0, 50, num=11)  # vždy 11 prvků
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[51]:
    + + + + +
    +
    array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Reshape

    +
    +
    +
    +
    +
    +
    +

    Ačkoli indexování polí v NumPy je dost mocné, v paměti jsou jednotlivé hodnoty reprezentovány jako (metadata a) jednorozměrné pole, známé z jazyka C (ačkoli samotné rozmístění prvků může být jiné než po řádcích, jak jsme zvyklí u C).

    +

    Je jednoduché změnit tvar pole, nezmění-li se tím celkový počet prvků:

    +
    +
    +
    +
    +
    +
    In [52]:
    +
    +
    +
    array = numpy.arange(12)
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[52]:
    + + + + +
    +
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [53]:
    +
    +
    +
    reshaped = array.reshape((3, 4))
    +reshaped
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[53]:
    + + + + +
    +
    array([[ 0,  1,  2,  3],
    +       [ 4,  5,  6,  7],
    +       [ 8,  9, 10, 11]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pozor na to, že reshape sice vrací nový objekt, ale může (ale nemusí!) to být jen nový pohled na existující data. Změny v pohledu se projeví i v původním poli:

    +
    +
    +
    +
    +
    +
    In [54]:
    +
    +
    +
    reshaped[2, 2] = -99
    +reshaped
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[54]:
    + + + + +
    +
    array([[  0,   1,   2,   3],
    +       [  4,   5,   6,   7],
    +       [  8,   9, -99,  11]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [55]:
    +
    +
    +
    array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[55]:
    + + + + +
    +
    array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9, -99,  11])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Podobně tvoří pohledy i jednoduché indexování:

    +
    +
    +
    +
    +
    +
    In [56]:
    +
    +
    +
    a_slice = array[2:4]
    +a_slice[:] = -99, -99
    +
    +array
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[56]:
    + + + + +
    +
    array([  0,   1, -99, -99,   4,   5,   6,   7,   8,   9, -99,  11])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Potřebujete-li kopii dat, použijte metodu copy:

    +
    +
    +
    +
    +
    +
    In [57]:
    +
    +
    +
    array.reshape((3, 4)).copy()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[57]:
    + + + + +
    +
    array([[  0,   1, -99, -99],
    +       [  4,   5,   6,   7],
    +       [  8,   9, -99,  11]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Podobně jako reshape funguje transpozice, což je tak častá operace, že má jednopísmennou zkratku – atribut T. (Tohle hodně napomáhá tomu, že zápis maticových výpočtů v NumPy se podobá odpovídajícím matematickým vzorcům.)

    +
    +
    +
    +
    +
    +
    In [58]:
    +
    +
    +
    reshaped.T
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[58]:
    + + + + +
    +
    array([[  0,   4,   8],
    +       [  1,   5,   9],
    +       [-99,   6, -99],
    +       [-99,   7,  11]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Až budete NumPy zkoušet, doporučuji si u nových funkcí najít, zda tvoří nová pole, vracejí pohled nebo modifikují původní pole. U některých funkcí najdete pojmenovaný argument inplace (modifikuje původní pole), případně out, („naplní“ jiné, existující pole).

    +
    +
    +
    +
    +
    +
    +

    Datové typy

    +
    +
    +
    +
    +
    +
    +

    Jak už bylo řečeno, matice v NumPy mají určené datové typy. Ty jdou nastavit ve většině funkcí, které matice tvoří, argumentem dtype:

    +
    +
    +
    +
    +
    +
    In [59]:
    +
    +
    +
    numpy.zeros(4, dtype=int)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[59]:
    + + + + +
    +
    array([0, 0, 0, 0])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [60]:
    +
    +
    +
    numpy.zeros(4, dtype=float)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[60]:
    + + + + +
    +
    array([0., 0., 0., 0.])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [61]:
    +
    +
    +
    numpy.zeros(4, dtype=bool)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[61]:
    + + + + +
    +
    array([False, False, False, False])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Nejobecnější typ je object (jehož použitím ale přicházíme o většinu výhod NumPy).

    +
    +
    +
    +
    +
    +
    In [62]:
    +
    +
    +
    numpy.array([0, 1.3, "foobar"], dtype=object)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[62]:
    + + + + +
    +
    array([0, 1.3, 'foobar'], dtype=object)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Kromě pythonních typů bere dtype i řetězcové specifikace typu:

    +
    +
    +
    +
    +
    +
    In [63]:
    +
    +
    +
    numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[63]:
    + + + + +
    +
    array([  1,   8, -12], dtype=int8)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Znáte-li modul array ze standardní knihovny, můžete jeho specifikaci použít i tady:

    +
    +
    +
    +
    +
    +
    In [64]:
    +
    +
    +
    numpy.zeros(4, dtype='<I')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[64]:
    + + + + +
    +
    array([0, 0, 0, 0], dtype=uint32)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Navíc dtype umí řetězcové a bytestring typy. Tyto mají danou maximální velikost a nesmí obsahovat \0 (resp. znakem '\0' jsou ukončeny):

    +
    +
    +
    +
    +
    +
    In [65]:
    +
    +
    +
    numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[65]:
    + + + + +
    +
    array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [66]:
    +
    +
    +
    numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[66]:
    + + + + +
    +
    array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Typy v NumPy můžou být poměrně složité; např. existují i složené datové typy (records). Ty nebudeme používat, ale je dobré o nich aspoň tušit:

    +
    +
    +
    +
    +
    +
    In [67]:
    +
    +
    +
    record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
    +numpy.array([(1, 2, 'abc')] * 4, record_type)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[67]:
    + + + + +
    +
    array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
    +      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Maticové násobení

    +
    +
    +
    +
    +
    +
    +

    Kromě základních aritmetických operací se u vícerozměrných polí často setkáme s maticovým násobením. Předpokládám, že jako bakaláři jste se s ním už setkali a tušíte co dělá – jestli ne, tuto sekci ignorujte.

    +
    +
    +
    +
    +
    +
    +

    V Pythonu 3.5 byl na výzvu vědecké komunity do jazyka přidán operátor @ (mATrix multiplication), který je vyhrazen pro maticové násobení. V samotném Pythonu ani ve standardní knihovně není typ, který ho podporuje, ale matice v NumPy tuto operaci samozřejmě umí.

    +
    +
    +
    +
    +
    +
    In [68]:
    +
    +
    +
    array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    +array2 = numpy.array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])
    +array1 @ array2
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[68]:
    + + + + +
    +
    array([[ 1,  4,  9],
    +       [ 4, 10, 18],
    +       [ 7, 16, 27]])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Ve starších verzích Pythonu je potřeba používat metodu nebo funkci dot.

    +
    +
    +
    +
    +
    +
    +

    Důvod přidání operátoru @ byl prostý – zjednodušení zápisu maticových operací. Jako příklad uvedený v návrhu je uveden tento vzorec pro testování hypotéz v lineárním regresním modelu:

    +

    $ S=(H\beta-r)^T(HVH^T)^{-1} (H\beta-r) $

    +

    V NumPy se dá přepsat jako:

    +
    from numpy import dot
    +from numpy.linalg import inv, solve
    +

    Pomocí funkce dot:

    +
    S = dot((dot(H, beta) - r).T,
    +       dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
    +

    Pomocí metoody dot:

    +
    S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)
    +

    Pomocí operátoru @:

    +
    S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
    +

    Poslední varianta nápadně připomíná původní vzorec; u prvních dvou se člověk snadno ztratí ve změti závorek.

    +
    +
    +
    +
    +
    +
    +

    Booleovské hodnoty polí

    +
    +
    +
    +
    +
    +
    +

    Použijeme-li pole v příkazu if, NumPy nám vynadá. Standardní pythonní seznam je „pravdivý“ pokud obsahuje nějaké prvky, ale u pole, které má fixní velikost, je tahle informace téměř vždy zbytečná.

    +
    +
    +
    +
    +
    +
    In [69]:
    +
    +
    +
    try:
    +    if numpy.eye(3):
    +        pass
    +except ValueError as e:
    +    print("Chyba!", type(e), e)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Musíme říct přesně, co chceme.

    +
    +
    +
    +
    +
    +
    In [70]:
    +
    +
    +
    if numpy.eye(3).any():
    +    print('Alespoň jeden prvek je nenulový')
    +if numpy.eye(3).all():
    +    print('Všechny prvky jsou nenulové')
    +if numpy.eye(3).size:
    +    print('Pole obsahuje nějaké prvky')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Alespoň jeden prvek je nenulový
    +Pole obsahuje nějaké prvky
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Z historických důvodů existují dvě výjimky: pole s právě jedním prvkem má pravdivostní hodnotu podle daného prvku a prázdné pole je „nepravdivé“:

    +
    +
    +
    +
    +
    +
    In [71]:
    +
    +
    +
    if numpy.ones((1, 1, 1, 1)):
    +    print('Ano')
    +if numpy.zeros((1, 1, 1, 1)):
    +    print('Ne')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Ano
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    In [72]:
    +
    +
    +
    if numpy.ones((0, 0)):
    +    print('Ano')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Další operace

    +
    +
    +
    +
    +
    +
    +

    Modul numpy obsahuje spoustu základních funkcí, které pracují s maticemi; mimo jiné většinu funkcií z pythonního modulu math. Oproti math zvládají funkce z NumPy broadcasting.

    +
    +
    +
    +
    +
    +
    In [73]:
    +
    +
    +
    array = numpy.linspace(0, numpy.pi, num=1000)
    +array[:10]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[73]:
    + + + + +
    +
    array([0.        , 0.00314474, 0.00628947, 0.00943421, 0.01257895,
    +       0.01572369, 0.01886842, 0.02201316, 0.0251579 , 0.02830264])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [74]:
    +
    +
    +
    sine = numpy.sin(array)
    +sine[:10]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[74]:
    + + + + +
    +
    array([0.        , 0.00314473, 0.00628943, 0.00943407, 0.01257862,
    +       0.01572304, 0.0188673 , 0.02201138, 0.02515525, 0.02829886])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další operace doporučuji hledat buď v Notebooku přes tab, v dokumentaci, nebo obecně na Internetu (kde najdete i případné knihovny, které implementují operace, které v NumPy nejsou).

    +
    +
    +
    +
    +
    +
    +

    Příklady použití

    +
    +
    +
    +
    +
    +
    +

    Dost teorie. Tahle n-rozměrná pole se používají na spoustu zajímavých věcí. Podívejme se na některé příklady.

    +
    +
    +
    +
    +
    +
    +

    Matematika a grafy

    +
    +
    +
    +
    +
    +
    +

    Jak se používají matice, jistě znáte z matematiky a cílem tohoto kurzu není vás to naučit. Ukážu ale pár ochutnávek.

    +

    Použijeme knihovnu Matplotlib, která vykresluje grafy. Jak ji použít dohledáte v dokumentaci nebo – často efektivněji – v galerii příkladů.

    +

    Matplotlib nemá automatickou integraci s Jupyter Notebookem, proto ji je potřeba po importu zapnout:

    +
    +
    +
    +
    +
    +
    In [75]:
    +
    +
    +
    from matplotlib import pyplot
    +
    +# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
    +%matplotlib inline
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    A teď můžeme nakreslit třeba graf funkce:

    +
    +
    +
    +
    +
    +
    In [76]:
    +
    +
    +
    x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
    +y = numpy.sin(x)                      # odpovídající hodnoty funkce
    +
    +pyplot.plot(x, y)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[76]:
    + + + + +
    +
    [<matplotlib.lines.Line2D at 0x7fab9ebd62d0>]
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    In [77]:
    +
    +
    +
    s = numpy.linspace(-10, 10, num=100)
    +
    +# meshgrid vrátí dvě 100×100 matice:
    +# - jednu, kde v každém řádku jsou čísla od -10 do 10,
    +# - druhou, kde v každém sloupci jsou čísla od -10 do 10.
    +x, y = numpy.meshgrid(s, s)
    +
    +# vyhodnotíme (x**2 + y**2) pro každý prvek
    +z = x ** 2 + y ** 2
    +
    +# výsledek vykreslíme jako obrázek
    +pyplot.imshow(z)
    +
    +# přidáme legendu
    +pyplot.colorbar()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[77]:
    + + + + +
    +
    <matplotlib.colorbar.Colorbar at 0x7fab9e6e56d0>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    In [78]:
    +
    +
    +
    # Ta samá data můžeme vykreslit i ve 3D
    +from mpl_toolkits.mplot3d import Axes3D
    +
    +fig = pyplot.figure()
    +axes = fig.gca(projection='3d')
    +
    +surf = axes.plot_surface(x, y, z, cmap='viridis')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Obrázky

    +
    +
    +
    +
    +
    +
    +

    Typický barevný obrázek není nic než matice $m \times n \times 3$ čísel: $m \times n$ pixelů na šířku a výšku a 3 kanály pro červenou, zelenou a modrou barvu.

    +

    Knihovna pillow (nástupce knihovny PIL, který se stále importuje jako PIL) obsahuje nástroje na práci s obrázky, např. „nakresli čáru“ nebo „převeď na černobílý obrázek“ nebo „načti PNG“. Není postavena přímo na NumPy, ale umí obrázky převádět z a na NumPy pole, pokud máme NumPy nainstalované.

    +

    Knihovna imageio slouží k načítání a ukládání různých (njen obrázkových) formátů do/z NumPy matic.

    +

    Nás bude zajímat funkce imageio.imread, která pomocí Pillow/PIL načte obrázek jako 3D matici 8bitových čísel. Já načtu obrázek hada, vy najděte na internetu jakýkoli RGB obrázek a načtěte si ten.

    +

    Použitý obrázek je stažený z Wikimedia Commons a je pod licencí CC-BY-SA 3.0. Autor je uživatel Mokele na anglické Wikipedii.

    +
    +
    +
    +
    +
    +
    In [79]:
    +
    +
    +
    import imageio
    +img = imageio.imread('static/python.jpg')
    +img
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[79]:
    + + + + +
    +
    Array([[[172, 173, 165],
    +        [173, 174, 166],
    +        [173, 174, 168],
    +        ...,
    +        [172, 171, 167],
    +        [173, 172, 168],
    +        [173, 172, 168]],
    +
    +       [[175, 176, 168],
    +        [174, 175, 167],
    +        [172, 173, 167],
    +        ...,
    +        [172, 171, 167],
    +        [173, 172, 168],
    +        [174, 173, 169]],
    +
    +       [[176, 177, 169],
    +        [174, 175, 167],
    +        [171, 172, 166],
    +        ...,
    +        [173, 172, 168],
    +        [173, 172, 168],
    +        [172, 171, 167]],
    +
    +       ...,
    +
    +       [[209, 211, 206],
    +        [210, 212, 207],
    +        [211, 213, 208],
    +        ...,
    +        [202, 203, 197],
    +        [200, 201, 195],
    +        [200, 201, 195]],
    +
    +       [[208, 210, 205],
    +        [209, 211, 206],
    +        [209, 211, 206],
    +        ...,
    +        [202, 203, 197],
    +        [202, 203, 197],
    +        [203, 204, 198]],
    +
    +       [[207, 209, 204],
    +        [209, 211, 206],
    +        [210, 212, 207],
    +        ...,
    +        [201, 202, 196],
    +        [201, 202, 196],
    +        [201, 202, 196]]], dtype=uint8)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pomocí nám už známé knihovny matplotlib takovou matici můžeme zobrazit:

    +
    +
    +
    +
    +
    +
    In [80]:
    +
    +
    +
    pyplot.imshow(img)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[80]:
    + + + + +
    +
    <matplotlib.image.AxesImage at 0x7fabd75fcc50>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Podívejme se teď na strukturu matice:

    +
    +
    +
    +
    +
    +
    In [81]:
    +
    +
    +
    img.shape
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[81]:
    + + + + +
    +
    (887, 1037, 3)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    První rozměr jsou řádky (y); můj obrázek je 887 pixelů vysoký. Druhý jsou sloupce (x); tento obrázek má na šířku 1037 px. +Třetí rozměr jsou barevné kanály.

    +
    +
    +
    +
    +
    +
    +

    Pomocí indexování se můžeme na jednotlivé barevné kanály dostat: je to poslední index, takže řádky a sloupce nahradíme buď dvěma kompletními intervaly (:, :) nebo vynechávkou (...). Červený kanál tedy bude [..., 1], modrý [..., -1].

    +

    Zobrazení chceme černobílé; na to má matplotlib pojmenovaný argument cmap. Výchozí způsob obarvování je vhodný spíše pro grafy funkcí.

    +
    +
    +
    +
    +
    +
    In [82]:
    +
    +
    +
    blue_channel = img[..., -1]
    +pyplot.imshow(blue_channel, cmap='gray')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[82]:
    + + + + +
    +
    <matplotlib.image.AxesImage at 0x7fabd75bfc50>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Zajímavé využití obrázku jako matice je steganografie: ukrytí informace v obrazových datech.

    +

    Načteme jiný obrázek stejné velikosti, tentokrát černobílý (s módem L). Informace v něm schováme do posledního bitu modrého kanálu.

    +
    +
    +
    +
    +
    +
    In [83]:
    +
    +
    +
    secret = imageio.imread('static/secret.png', pilmode='L')
    +
    +img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Obrázek vypadá na první pohled stejně...

    +
    +
    +
    +
    +
    +
    In [84]:
    +
    +
    +
    pyplot.imshow(img)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[84]:
    + + + + +
    +
    <matplotlib.image.AxesImage at 0x7fabd75813d0>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... ale v posledím modrém bitu se skrývá tajná informace.

    +
    +
    +
    +
    +
    +
    In [85]:
    +
    +
    +
    pyplot.imshow(img[..., -1] & 1, cmap='gray')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[85]:
    + + + + +
    +
    <matplotlib.image.AxesImage at 0x7fab9c631d90>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Výsledek je dobré uložit v bezztrátovém formátu (PNG), aby se informace neztratila:

    +
    +
    +
    +
    +
    +
    In [86]:
    +
    +
    +
    imageio.imsave('python.png', img)
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Zvuk

    +
    +
    +
    +
    +
    +
    +

    Jako pole lze reprezentovat i zvukový záznam. Mám záznam, na kterém zkouším zpívat; pomocí funkce scipy.io.wavfile ho můžu načíst jako NumPy pole:

    +
    +
    +
    +
    +
    +
    In [87]:
    +
    +
    +
    import scipy.io.wavfile
    +sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
    +print(sample_rate)
    +sound
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    48000
    +
    +
    +
    + +
    + +
    Out[87]:
    + + + + +
    +
    array([[ -58,  -88],
    +       [ -65,  -49],
    +       [  56,  -18],
    +       ...,
    +       [   1,  231],
    +       [ -85,  234],
    +       [-118,  212]], dtype=int16)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Zvuk je stereo, má dvě stopy; jednu z nich si vykreslím:

    +
    +
    +
    +
    +
    +
    In [88]:
    +
    +
    +
    channel = sound[..., 1]
    +pyplot.plot(channel)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[88]:
    + + + + +
    +
    [<matplotlib.lines.Line2D at 0x7fab9c051b90>]
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Případně můžu využít možností Jupyter Notebooku a HTML a zvuk si přehrát:

    +
    +
    +
    +
    +
    +
    In [89]:
    +
    +
    +
    from IPython.display import Audio
    +Audio(data=channel, rate=sample_rate)
    +print('(Zkuste si to sami; tento print vymažte)')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    (Zkuste si to sami; tento print vymažte)
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Podívám se na detail první „noty”, kde je patrná vlna s nějakou frekvencí:

    +
    +
    +
    +
    +
    +
    In [90]:
    +
    +
    +
    segment = channel[50000:55000]
    +pyplot.plot(segment)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[90]:
    + + + + +
    +
    [<matplotlib.lines.Line2D at 0x7fab96685510>]
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    In [91]:
    +
    +
    +
    from IPython.display import Audio
    +Audio(data=segment, rate=sample_rate)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[91]:
    + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jaká to je frekvence? Znáte-li analýzu signálů, tušíte, že na podobné otázky odpovídá Fourierova transformace. +NumPy obsahuje diskrétní Fourierovu transformaci v modulu numpy.fft spolu s funkcí, která spočítá odpovídající frekvence v Hz:

    +
    +
    +
    +
    +
    +
    In [92]:
    +
    +
    +
    spectrum = numpy.fft.fft(segment)
    +freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
    +pyplot.xlabel('Frekvence (Hz)')
    +pyplot.plot(freqs, numpy.abs(spectrum))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[92]:
    + + + + +
    +
    [<matplotlib.lines.Line2D at 0x7fab965a4ad0>]
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    V tomto grafu hledám maximum. Můžu se zaměřit na prvních pár hodnot spektra:

    +
    +
    +
    +
    +
    +
    In [93]:
    +
    +
    +
    pyplot.xlabel('Frekvence (Hz)')
    +pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[93]:
    + + + + +
    +
    [<matplotlib.lines.Line2D at 0x7fab96514910>]
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Maximum je někde kolem 120 Hz; abych to zjistil přesně, použiji funkci argmax:

    +
    +
    +
    +
    +
    +
    In [94]:
    +
    +
    +
    amax = numpy.argmax(abs(spectrum))
    +amax
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[94]:
    + + + + +
    +
    13
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... a najdu odpovídající frekvenci:

    +
    +
    +
    +
    +
    +
    In [95]:
    +
    +
    +
    freqs[amax]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[95]:
    + + + + +
    +
    124.80000000000001
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Což je podle seznamu not skoro H$_2$ (123,5 Hz).

    +
    +
    +
    + + diff --git a/lessons/numpy/python.jpg b/lessons/numpy/python.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c01d299ee5e282b6e708eba651103d39d090aa22 GIT binary patch literal 126582 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 literal 0 HcmV?d00001 diff --git a/lessons/numpy/sample.wav b/lessons/numpy/sample.wav new file mode 100644 index 0000000000000000000000000000000000000000..7ba79adb13d002c574da8bf17cb7d9a2a673880a GIT binary patch literal 925262 zcmXWk3Aj$x_c-u#E}2Q@ITcYPq-3ZN$`~4aQ<9++X_V%aG%2Yl6%r{VRHlp>GH0G= znKI8a_dWm5zQ6x-pZDJPJ!kJVueH}&d!P5VYSge{!%}&o)^#6h@MO2{rSnEn6h~>% zJJY>6nige_@<_7Nxx zl2OTD$%^Fm=x8z}S(YqHh9$ozKPKB;|0NlhoJ%Gor;_E#cgf=9SaO9?XMOt1y~D|- zWPY;Gtk09V$*g2*GCdjL^JYJXl7Y$hNs{zQb{qR|vOk$)Oy20vZ^fq(xJb+oJW!P0>}+mSk(vBD!GA;Utgor~NGwoiu-E@<(zaDHI(^ zE+&7QbA2?;*sqe=Nt@_!av3GrjK7rJ9NidQH1}|FM|5k{fCO?zm7?3D0?`Z6-sHh( zO|mvA<@567*Jw#HFWHsc9VO(jJIQ4Ja8k?{9YELVbdeS|5DEcTW8g-1$CXYtNqG9H@ ziq0hieXbcj5j~2Qb5XZwdvaCuSyVr29BoXlkE%wCqax9F(I&Dg5sf5=MN#4COj0s> zAX=9E5gkm9;(0=JB6$~{igex-%rf9Fh&uUvMf3qWE+*GTzv87WUP?r}k{9q&C)%0Z z=}vFZk|f4qQ8ed@?upJPDY|V=!){RQ+@`xeguUl&1e%{POhWl8%e)1E4?X7v4;y}yb=DBcr6lr95tt% z4QwZsbO5Ujev5!#BC5g?%0$hgOi}HqP;^~1KPd~w1JMmp$!K=+0RB6H+ZBw)=8vG? z`=TqOw_v%|xR=2gY<@L1@*){jiLQ;_L`i47c8Rh_ZOHB^W5&`?k0@)@7u~~Xy1V)P zGw|k$>VX|>ry2eqq`S{i^(vf0QTA+9i{7h7-;mLV#`h$xPyOvps+-W!1@D8SQqd1^ z^e3~ysO|&Wcl6bVmfEwXSt$L?wYpI`^Qy6_TG5uMEqdxj-=gWms0kewh*s0mm-twN z);>`kxbEWi&7!Zs+=;vC?q3uKO2yrxue~3R=6B6K8MTf+!O@7QLNuS;zGi(xV7r%1 zFUQ+h9?%F+1KH}!toE7UPbAlptcKvHIi7?4k721l!1Y#iC%%&8?M!%{iw5KYAWhtbn!K4Sc%QM>3R<9{)tCZBqPw`76sf#@|7+>zXhw<qDTFxSM)gOkD>os5__E`e9Pk+qp=qMD}|=lVW~}X7n9ecvfj6%ga5%_*x37c zTQ}BrIQbj}50Y^sI6h+~16f1U=#t2HrHJu~dG+a}x=~Nl*>z;z2@UtNz+K5*=Cx-j zU1|Cqvt9wECK}tbzy>h1!~LtY{sC+4%R&RM-B|WhUbRKD5V7;1+y6 z&k9=6YNqII*dJ%z<#})eHaeZ;+OUT^>GlEiRd)4y5_!a@p7;qGJdoT+3LV*CXEc8; z8a#r>V$nKRYDR;|{YL!NXIHh^=Sb0^1H1em89ZlXM|S-lDK|9cQGAudM`7G4%MI1^BttqH2NZ%Yt8$V zWGb`qCOqmRzyAigEUCQ4Cf`KUH<6VUH;v8hi-O+d^McuJMeR4p^+TLJ3HI~6xf>pv z(^Obto`?J4=)dGmpP#gPJuiy)pwo|Ns|L%s*&6&mI(!4(7Hr@aQhv<3`jZIMfdson z-&x5jv%-o#e*ovEq?wf@={bSW~pV;oUoU{)l`AnbQ)ty;<5o*C+C|*5LN^8Z5TF=qIe= zZNf--#$+v6_kE)O+k|47jtv8qNPEv8o=R{=h=V;G_jVd=9kM zS+XY8pRZeKOxRkr+wJFU%n9Gs8&`qN&ov%|00 zT!=pPSYiBtrrB@*TJK5&LD6a@@AHqpnwA{#6nxf$e zdTmbro&A2%%KffY>rwJ<4ED>ifgkDWefT<~?K$-HU?W4}d4?~%${QX;QwRR?l{oUE zxcwk_b!4#ZqLJcCSv2Rz)8^#4XgWLHDfhgam2Bkir`hzy*!D}H-ROD;7qCE?Gnxgqy@u60Rzpu5XtW9pj zV_q?&ENgUN5`sO7q?MK^HOME%xx7Oy?zQ(sSVV zkfF7qr#r>2reyXye%|1>HTd6iGVmwJzMioU%cNgNS0C}_P1#Xj@v8&gI*3Q3ygKs7 zA7m=elkx-6I%`rsaU`eLx}><+RYOd>4a6$Z-$_32?~X=^A%BZm8#3yJ=EmP6t~4f} z>%hH|j2jzsYxJWG?H*dcj)Zn6*BBqN%F?WApBiINGTAznh0PYkaZVAsD5$^D!8Yh@CHtrwscE5WON#u0>Lh=Zh75uG5rq{B$d#%-vMW51H zZa#B5se+zb;64m)12CGivcOv#+_$9f!lc&*?dM3SCH~rwQ4zT7f?wbGf#Uh+uD3)} zJ+@k(AM_-t@_eRU#(L2P9gWQ^LATf9|5|q&iWCpP^$h+y(Pd>bZxW*#@aa2v@Bh3n z$bxH%IF(4gwYgLI)N%aeh~FWX7WnxP?p9#GY@Pi8?;XVNUie!^(jjBnCC~Vn6_-Qr zJY2VCi%T->BiKX{D@kwhsfIC2=)4#`bg`0r=w68V_0cvOl!xhMPV!weR(11w#_FjS zql4{3?-A>(qJOg0`2#X~7tfW<`V8LYuKdOCp5)^pZ&^z>n?M_B{sCG34?cf{ zm-%E}lQe!u&tlh}gZ~XQ9rk&u)u)%Z+td3mQFR>53EsCR(S;xsjt5vBK2m3VkD`82 z#rVVM9N2x?Pyc92lpZaL{$z{a^TU(ojfhtI85A8t<5INlm1B*itrcSSO!HR3{kJvc z6?Ff~4whNd7tvvm!2mj#OH!};nM+q+z(JE9{9J7CbGqF{H*b5rZ~i~t{qFBr zzVItt?MdS;<7b*1K0k!_&%9sa_h&v`#B0dYKLdZdk^ONphK}BI^#{`Zouzc3jgLsa z4+_2m>9q_wHsV=7vCu&%ea+bZ?tJcNBptkDPJe%Y1fj1!!VfTaC(k{on-$HYf&1CY zkMfZ3$f$-9U&G!7Z7;gk4YmO&dP&t6s2IWm-Z6d{Ee#~ar)X%ZvCq)Vl;{r_#?kfX zWH!jyIT`XBF1H&r6_s#%?lmO_VvF!=A=QP2PY=UToNpdZywa}#=Li<@%<%(y!mVovjzRu$=S9}fW z9HfDS#Qr0r?D1l>?g#(o`1*Ld>&K1yg?)TLD#v{~XXG%F{)zWpLcu~7vK21}(C`k- z>#Yn&cy@c#|7gS(GVVxLgTR@=A3lKhBNq5A?f2o$yLtEsct(@>LR4Kq<0$qy7tFsz zj+G?1#qT-pEM*BH5-iKGz5Pb#h`;CEi)e2r%o|8%dbESTOr*6FDBhT%*I&`H5?zx} zKUOroDqiXR9JmX{6QX?axBPH7o~K1|d=@ADU_ZtuS4Y|6_HYiz(fcSqWW;E6tb?%_ zDgML;3&kT{oyPJfp%uv(H%GsHP-~W*VJgVnkIXyEh+zu=X5J>SM}rnqH$@flNRx)=-&9&xJ&$6bm!%} zqC82z)B^IlMn%`l$olcUai=6-T7k4dY27jvNo|R4PFt63kLIU`Ue>heRHnNxuTMTo z@?4&U|7B^TGSx|2oK%RXrvDr-N%}_nGjB{?PWvT&U#eZy`*M`Ia8f1hgdSvvbRt!Zo1CuQ20OpDgWb5nidnyEL@b0}3ko)wpf%g1$+HL1Ik zcB$j>m&wvhZ^xzLiE*FwPoqw$f0M;=)@Wp$MX$G3vNZW9^-uguYFj)Z{ydqK);hg; zyd>2tH7-7s%9A!)2e49Dv-86=@-urS!6sV^=I^S z(qC5ewOpzmsb!Ke*3bnVXuW?+W;Qi>DY->Q`be_e-D2@qI?ct^z~|-VljP2S>Oeo5 z+LhdpdL-JL`c8g$ENU-vIhWe5OFmm)HFU2}MU|5L@w(K_?p>GMn-ol5(233@3+=2s z{*&ncN3B-(yv1mhTcrq<@Q}RPs9C0_MkLoKS0&k!2a_$SbID`!w!U8fr7A>+QddQV)GH6lX_upI zTB>tWFZnttpR7x6)W<4e$Kv1AkYqq=OL96@BI=&3B!v%?;i<97pQ$gBZmFM>NvTW8 z7x1Q~%0#KuDYR@(o=8Pe@6_yMmiI$b%aSBLdvr%?dNMZ^=DwTUm-;qonYxg4CZ9E_ zDao+Zq@;Ih1^dZ{j<=J^sTweM0hk{?r3!D*Mwq~mU> z<;mx%b;+1i|73QmmwWq@zrgF8>YHRrje~z>@@(pp!Qg5V+%4!>^UnV9Kled$S_HyQ>wz9!nqUTa&k_PG5rQS+iO1*%S715g1 zZOL27eD?>Zj?qC6avGO>lA4uzE$M@kg{jkO#LrW|M}MT2MJrSJqV&|l)Us6hsH94OumyAp{)A!s|?kJ1>pqEmQ;_WK>dp^0ybFWOwCO4(#k>6HOn@6isMWPSb z_KMW+sZ*%|sjKZmwPORX+v(X$AFEP*=zM1KN>V9llnhDsqVnydz^YD{u_l8X!{kVnArd$N<>`lME;@+MCt(^yiT zBx~|is#&s)%qk{*lebgVlgsHZCF4`g#g27GfGq;N7awJudU$(}r)^hi1;4U=B*o?#1Zjcb(D;q%qV@L{y|MQ`0?dul@JNNQ^8 z0$a+NG@$!#$*-wuNt@(C>X~FJO&&~DVgtqT87GHR7yUG(<@_MlLG3X!BeCQ?mXXGD z?n@p|wx&wBpBcT)lH5rvv+JQPpZBLzWs@7koYv%8m4`i=3}zRFaMQ^eaIaaPCM}aU z%={dWqmqY{u}SUZ%VcBf5th_Dxic9A(kDsHq-l~jdEbmzSWKU!aq^kf=36ix0J*D( zRD(3@is2p1UrYw&;6K3152dmsdB7i%YMMNg+?{Mn^`wVK+3Uw-`z%>kPj-_*A+a&o z_Ra9cqW=++xRO2J1>-X~x)IOUiOQW}=|Y+f{4R_4Ye?WlHv2HVfr7U5Pz|2+)V<_& zKOCKDr5xYNN7k<=Rg%|n_6-ld3%*+P-VJ?EqvL%suQs3l7A?&|eJWX(YQrL)r^&9# zn`F^Vl&XpACTQx-Ui#p+G0ZWPsXs6=aVc+e>^>rRL5s?oZJR?EnKz0V{1HBqt#N@+-{(EfbmXBTVd_jYs>C-v&)}w`vb}xs?she^@u06+L)YkAzZY1A_Q?S@i?qMs=T8!zZ#CYg z%l0`42`g{TpXcai&9v%1MjEf6=NIqaK}B19R8M}uZ_cPy@{ieHiziEy9mc$$3y&)T02Hh3GFKS$vyF|vtO@LI8DK0D}&+P!GY9{pkFK^>D}Y`Q1jhOzZo_VNEq zM%z{I@72!E{a5mei^)Rv`;sxw+4q0N-u7nv?;^o{#!d12B|o1Tdx*To*oU9)(+DzI zY0fRWXX|7>Kfpa8S(BvP-)7xeLC+iE|0`MIJi&Z;$0n;#w@Ivc(V2h&=$U4Be}lc@ z$s{&RNyC)w|xgY(NyAk2m9qIrX8qpD74W?i(LI!CkNSmXS{34Bc={qv-; z6}826brEapQr0rEm(Et$qpquS*#_K?^_rg1H48f*<8+(f*OBY3ix~9O*Eo50 z@{+$}b(Ow!Z>cg=olW~ zg5Ia2+Hu?HgScDt2>c(!UD5Su^bz`Rjq64)#V<$A;i!+lk;XQUACF#%KZ)MNL#OzS z=&ktKXhiH}fVm&Wy`x@eEfT-vy8Xm>Tr>pE`^cku{9M#1{vv7{e~w1=RXjAR2G-4J z?i3H!Gnf#SL_-5Gt~TcZFmH*!GUnarnfL`&USIU}0q6JVb+UZYylUWfj-MyrH^^`_ zp65lQ;~`NSRYuKtEE&BYJsR(b?v7VQ_qf+aP4;B`QS=QM4Z$rEkBIuj{i1>Kg6K6c zC%NAi%+HPaM9nx#H9Q;Mr(-oExjYPBcX+=hyBpB*T>Pru$45~Q*E_cKBlhiOx|sb8A8V0BED`WuCYzu4QXsDk@X>q6WdPiEuav4J_pO=tJN(a%isyr8pi zn#^~w%k6CPGWt&QkB#0J(EC`1*EPnTLGKhfpw90K8V-0dPz5AT>I0NJyB2B%EZ}Fu`hZ&&Zir5 zOZ=GbQN{R<_~rO8UN7V4int`2YrFP6*|$_NcQ?0(p3m)ZvG_f>o0-|i-zMm3XG~Ll zvp3P#*R}7})0JHtqE~hw95<0gFWsm7=G;eKb-g;m)iti2A<6c}*CM~eJUvrfC=T79 zhtaWIFQ;{Ui9Z)W$r*GX6NB=`RpXOUC6d1i7u7QKb8}obz7loijV}PxZSiYyjks}q zzp)SFt9;xU=7;05u5^yCiyw`f#&7u4l0I7Kp1lxPGP*>g3)UeT(d==g{TRyh6;w6pZo~-k8usgv25-Im&IUj-bn!ZvO zR&OUwq)qAcY_kTO)1fWSf>KfM=n8Y!>j#$*sdDqE61=d42)Nf;REeiX?iY*S_Ugft z{-=x8pAQUUO^@-Ax6ydBdv?3jn+L2^SBbK5oW~0DknUeKt5417xSfh^b~#q-59{S6 zo9&epiZAG8oV6l8pbK^_Z*8on8eC3BSsNEw&CcR=ymfbN(fK-HrTkh? z@F*Co^v84sqfvIN{=m;7f2ZSPqkWZ0_Fv}N3mJgs*{)4M$8U0gIray?u`e{<9!w{@ z$}ig)nq~F=#A&>RR_f36cfPaI_k(LNTIb_yu)Uk1K99l2U^@~cbbLMl^CvWo_WmQi z{?Dw`-#Veu1@OfN3CY~yy&3X)C*W2%#23Ht;2QD4qpLMuB0 zmHoXLww?Bzk0!6l96qw6)fXRa?4y0-{6z;@##`n;NPc(0Z@( z0B4s>ri}b0oE7*dd0TeY1<&=!p@Hk|(9^M+v=|VL8W6VsaO$Yh=o2+$?jQ=D3fO&GzF?MKo%c)fuDvL$3+mJb@ML)^M zN1^veG>z8>8E9;Ccm7QFsA?`Hz06veQN3J}>+1K&l79yI4{%qap{Mt2;MpP{pDX7c z?A>Y=##!*bLc>-(98+%$c5jRN<~^`3`a2kp8|1=2%Do56na7dED3Tcu%loqARiJzc z-xp{cAo*_p(c38oNwUjXWZMmCO@kH-g572IsX(@ zR_OHXgr`5AMw8_LFh7>FFUycws3rEw_y1A(O!RlDuE+*lY=twN7M=mubngeLB1V(T zAF8a)c%SV33>@exgYcbtWqiixY32_{XXpj|rb_w(+>euAQ85^`qe*Kn%3gABsM=({ z(VdN%0`D7O&c)vxkOsRx(3kkm7qFj8t_GKubUTe5=lUQ_rC% zd5u(E{*IpC)Z4vCsxL@`^$dPc5%%{QYSc6xiT*mEBmI1?Ztn-?Sns|gy;*u6z4cax z8Pn6d&-5QYQwhKAN-r3P>p2W%&u^2&404&ShMfh&OkJ98aDS!i(I=_w(-I?!z<4(< zZ^U&q6y0M)Rh4xGu=1exDRxi?ru)_FgYZz9lv?4qKFp!h(_Y7+oyxp1OK+6Xak<~! zW@vBX)3dr9P07ED_w8M~C&P+bqo_RzyUoN>L1Q8nFffQzztsEyM7sjevQ zis$C^Q3HK#-L0onQ%PU3gR5`hy`~;ePxQ10_f=!t>6lgZ(+0<{=(s(N@_Y4%%A4C* z$FDVsH8tx=GrEBFmaa~HSDWCWp1q3);BBtga=%_(3w@5?jD1@V?rkz_r5|>$zFcR0 zsHf=WwPZo6o?g_0dOhuR7@yWRZ==)p6ga)Wy%$aT-KlP1x6SAaT}<7s-&a4GZd~Yv zrc$l#S=_FZ*IFmHhOYU8xg!~O-dP$g z9MoUCEyE7FqqlJeth`{}0aht?@(N$M#_uX9Ys1Q$l2MBc-9F?~6A~CeM-A9rHJ3Pgdyzfy^J2~eeC*S z{NAqTR@UFpHSNwqU!afY*~eA9;XVHFCcE$N=VR9QEWJLA2AzFyy2APtdww6>H_`Pr z7$Lg#6Nz5qt>5wb9wNqg-J4H%_hj>4vr4?r>plj#8;|VILkAc$P`~h5zTVDS(oP5G zU87$R|39~C_Ypha61!j3NgF28ek|68Rqi!W>`y(QSyqIBR=~ON{_XuVyK*zFCR3~$ z6EepC&nc{5(3vahZAD#g%nUuC4c4}QoFYq4N?5T=Syi8Knk$w$RmeDLH(jz*X zEcSPzd5dHii}dt&T6zC*dOES{E|Fb~k-_W(>sP0~7TUGi>HS12_+r_~&vpREn>R;h zve?SD&W>C-y}sVbv%Pi#ipkBw3BsKAa<7wP<&^gwcM5Nh)4TheEIaGu;4T@|1=-Ot zncM-{LpoTiok~0Gl-Ob?z)rxqTNbp`NyQ_sr^(WC$RJnCTrS9VvdMkUm|HF*uk7q| zRoU5tGM<}cNfl&RH_65t%Y?dsUBmtQa-xPZ`~S&wo1>wj%&)vLm5nLu6yc+&ydAzL zozlvVrk3y)cMj_jvdu5syVJGX>7fC5jqG&RmuZGm==aI^`pB*xAgA^+-JIm|jO?`v znoG(W%YoBW#(Jk~kC9V8{kqohzwC2$8F*op#jR+rgqp|9zuUDdeQrqx;Y4RWbl-%= zda~D+^wZS+YvC(T&X0S4y`1w#(rBs2RzL<{3+8aHtb;RF_Zjn`th$%KA-k+-W(j;h zgO{6(eg*DJ*792DD`s2{ycE#`JZmSlBRLm_^FJet<0WyX@R0l~r@KYL$tE+c?9;#2 z?B#N*8&ncISWkZQJ=uZN6q`72#x5CQT1JQR951Kzm0=&&enb$S50- zT`}hq?*==I47CJ(-)K}-vdF4>DFJFhwt0x>oVV7WmuuB^3bK%UOXO{j)4?fuQGT|T z;$g>Rtf7-TmuK!mp|Ub=iRH@hxP zGU@W(O88Bu@v5@+nk1j!&#g3Afi82B&JE57UV+yXNF~T1JKg2NUoPC|FzTodZUtBV zlONWglQjNug_&8%ELVn14(QcZVZC9`y)s&M;eR*&j`Hn*;YJ!ii-#+XxRQ3tz>t}h z>^43>Xeae~OR|luEFlXzv-+I_ylYs;zxd3_z5=BEeCI|d$O>m@ekbm8qq7G;t>E4q zc$$kD1z-$MQk|jKJnr2s7L`;@gTeytp!P`AlpAqjuqhh zl{Qw2WvA(2M@GK2R*v^Cth4yqChNckBX-D=)?`Gzt#aWN?(dcV&XOBeW(zsQsiktC z0%A)Rz4|jCHdGPZ9DQ#mcRib$g}?RU?KpI8S4Aun#};Qi3wK@@{%)3j0hcFbsRv;$ zjF0Qs=U=ktEBN_V8Eg^Uq>HFC_(V4L|D#HxEZfUWQ)x6+5SQoJY;*F@ijLA=E$OHU zZHE({r)BI9@{KC0&En$BgHFKKB%_Mte%a`UjmyU_%9GE%-WT;#kTq2B_bwh5&Qa&* zmnBHChEc`+F6L7$wzeN9H|jE6t%|Hn?~kip%V$_#BmUjg`*L34>4AsX=`l1`U@Jv= zb&4*ocC{)`*v}_7g)`^YgDXy^D+G4bdM7>l6#6u-(2M=4N`I3=823|b22 ze6e|>Q{(H|&@%e{Om)58>C=U@^c$Iuvu>@mb}Xdn?Vh0f9jhJC4jlb+^WkM^qQxQ68o z5F;v)d{LEqX>^~ZpH`%mi{9?y*Lm1*b+9_{u$0=X6>Dw+cO&%Qf|;J)&IaX#r0Wu-UUU(Ewr}4c4+^`mp7t0P=kHbms z4S3sb{2?}a9?p5-?c`m{+1C_n!#RA0=MTr4cbpF-aI7TnHN0y*8(!sFIBC6~t!ELr zHsfU@o1CKZoT)b2z%Le{?jLt%!Mlu{bFkbro_$z0aS5EQXf0-?E2<|G?p-oJ*w=Zx zO2^T;&sw{VA6>$8Db}_Zy=TRf|H#JK4P!2W9^&<6dCE~1b2U92qs8?+X`i3nbY0kK z?nL%8mIog-{vP!G%cpW@VBCS{@fm)%!@cm#?m~K6r55`|WZUTHd`4v0isk|2F;k{D zSGKcGW;RGAw-~NLD!uJ|atnNG)Dc@{TN~k;XU!E3ge zKZCZB4eodKBXn+&d(Cz4XF23%v8jb@ZmF4L-hRKaMt5vnEC7EprO+-#rvS^aHgX$d!0c$n?={0Y-~5X$sY}tzy3(B zKNz_U4I_*WPcZLAf5<2=qH-ZgZUk|uyOZR^XH*rlWW0-H;qzt13td|d+Zgm6K;Ht; z)}V2iZ1@NAIH4LHZ{}v0{_}Y_Jx>Jp2T}^s90t-KXd6jxV`=VtmBDx543_;424kpE zbHx0yC_k!FnB_Iir$r!*fo-YWdkKsYi`h;Jo5<}5Tz{i9^o@QtdZf&LB43|p-X!(t z7(5O$_aD;Rj;60=*CW`iGg{_@WBK3V=qEYIpP;OlF@5cB zC%8g<8Er-W*53o7&@1LHV3W(i?`Otzum>8qmPLLK(;zxoZ|rQpw`Rz=Kg~==*)n?S z=N0U77#kRBb|3tH2>xgI8p+mvBC*Nt4)wb|ir$0m2h#6r&G^I5C^Gp59e;wq(%)c9 z;XKpVFi%6l6c#?5KkviE3~_T0E;kq%p6uV@{z|gh!WWl-u!=1#Wv8Kbo4^}}i_K$b ze+=)NhQ?K1BSp>?-u(maI9v?^X9`-@!#mo%1$dtA{xrU~G^5H3xqdk3IGznSJ%@)G za=_{GoN?qa9zUB|@gMS)AL((CHEXeGx|w&cv)*m7&aJc#|6%S=`1;%R*=meI#ttXV z*Q`gs;dPnZ_ZzzT$@QspdWyeq#LGg|{cip;y8qq%(eC_+&S9=iA(waY@uL|2nKdv( zofl|UZH~v=;k&2{^dAb-c-dk0w_Z(p)Z7zzSqt82o_d6Q^2pD!ShosCA6v6Rto_P5 zJss_;8de-hpcg?aVfQ23iJq{fh38b3cf~ z1FUg4T0W+)g>>^dtJ_Xbz0o_Bj%MR!I=-fg0Ta=?(mMF3jAcLiHpnA>MO!243k% zV-~Tkl^N2_5)BnqmeSAHI9@{!VZENp>JE_Mb~)rMR~Kja)?|Dx!{-JPI4?5HrQ=9P zIjp>^jaiG6i{!DERPtG0SHN9N{~m19XRl27f!VZIFeEFrVGgqKWm((NE# zqLENboq^#9d0au;XVG$$TtYr^9*k-7m%^%>qH>@UI6cD_4$4Kc$eIp-e5K5%q}`Xo zvZQP>zEI7VRZkR=gXWjP-wEdl>q$*n!v*87lcnZh0V(xc=<%n6Xy=O6gw^jHc~4^% zD{y((E6_Pe7QF=K-}&%&?yNKB1W237ca}M6@`MCWwNx}mWlMQvoHbm#RULbUdTuw5 z=^|gMjHm1D;*^x@J*%#1Vqc|!S%+w{s;jlpvqH8}N#3029;D-->qpEfYi2`K7a^-$#*~rc zhHr}q9fk|$H6*`6Xxv8YZ-MzF+MXqe8(@C`^m}m{%$vi{qZNUwitwG0+fKnRf zhgFVu8Ci>7oWsR=L%VAYN%uZ9*Rk8yl$~U?2YaOqvXWGeiF(JntX+AFa%)1XnrGZg;;d`^#m|@;W_>$1?6UpqpxFdV_?E z(pMYu2~XyIYVIely^5kXY~wZWzaft>{vI_1$Y{f<;!g0PEWO^zv~2;dFbnUpU>*umG+EWb}{3e zGhs#S)Rwc8x!3OIA-km)cwBCByR1jHLtpW#hcBPZM0?^`2|sl#p|p_q=E+3CIP z^Nlnfd?;c=waFq~-B-dhAtk{L-w#uOBv090z1HV~K4)P`dC*>vMV7X2x>AJ5=2}h? zID+rf)~s~>pVApUzB+uZCJViv=QvLwLX^kvR-QP?w-y}p6y*^S>auST2)1=b@9&tM z{)&7de3L+Cayuv%U2V>dtnCt6HIQGZ_a$bza%;^}F1^KNTy8eT#@xmi#2oM%3_ zsV}p$o;-H=4_lkFcz=>?&V!Q@T@p_?l!B`OUh=`8754n}ol={I>c1?VUF5Hs;91Wz z3-a-ZCUc-Ibda{Q_v=u1oabes|6J_-ck%2J9LvB=P)w|4c$OCe_PQ)52+N$Wq4*T{u{b`;rpWgBik(eCl49raP2yh%t6A3 z$l|hj$LU}`*)7HCVtj>;&t|gU2wL_GjKy&l^4+KKlLLl3*vIuKFF?-Mff%}w<%~V4 z_ITar+8Ot<@TvT$%g!&tdC*eU(Lzp0WaSSB^%aicF|Sxtluf3ImlsLw7&(MV&pyOtjcb3>j^Yr7gfo;3SNQ^ z4xzk(`$b&~yti_O#-7s#sDAuI%^={hESkt4b%O>Ev;AgmtC} zx?W*5=V|C_^Kz3zc5qKyn?n{C zvZ~zX)ghOV1D3(lF`l(YhM3!x*w|a(xh#vjmkh4MV=dW~Z-jAui#>@Ee14IR^JMhR z##15koxxVFAlr$!&%qx5l?#Vh5c>67*-$pzUPN2SU304hX0fGgC|)Qh$cwKEv>PZp zjQ4#5 zTK~;}Q1E(8w+@B6eWkdNMuQW@;YF^kQa1SHk;ioUYt-<>}F#}$aF5>*bP_c0WKl+ zNM^oCbvK81tU&v3GSDerzmm-SjLdb0T4fcvgfr?VdF5L9_`h=T1wPGiHHE^RbTz_^ zU23P9viwwEIu5U41zajLr-d2Gxu`~RltN*y(hZOq#|E|OYJF1_0Ki~DAy&EGg{;X3m z6^xL{?SnD|lb01{|WcU+K^|Etwcu;s8z5PC?P z=y1QNQ;t54!?7F2E35)J>=p#Q>|vFm{&zUdokT*qQgZjyp$+kL3GK_vyahYUaMl*UHgxQj-%p?SzAf{9B7BhFqhh8l95^M zV#Tubu#;O7jQsej!2Z%il)W@pNTgkguM?zw6b+%P9(rG4NB%6o+KASiBJLKF+C+9U z`OY8Soy5~-nww7^fAf#oY~dW~gm0f*O0K_xzMLkHvWyY9Ig6$Zq__p87s)Q04ovul z!EN&G1GwKKX6?*aZSq)!ijiIkuUzbUA88a3*RG_2&{xPN2A_f}D~^t#V;tJTdLR0x zJa6tk^2$6<`HuXThZ@9 z*X^>S^RSl_xkEo8yslw2d1u=bLUrTpu$>|(^!*?eAF1wg!`~*_`S+(|)jA8(qfA_Z+%j!y2Psj@X za_=+QML6~Gqm}+0_dawzbPYGl#=k`KNYz3g{ER@uc-Hp@d;`ekJNo?8=eJQk2k(=} zX1q_ko{P*Ct|26Z4BjACY0$p&Q~gS$6b^ zIWyszhxV`7*Jd(#4gMi)Xfa)NA=CF<>wvbW=yEJCehQ529zVtZp!S8PCRh zi(gy4dc*w*`~TVBy{e)yvd*xp`kRhG_)e@t^fuV%pREfURcAY8Wz)!Q0bUQX^ zk_x!9NYX*o*H%1vTpiV1WEg>-_uy#8|68(q-gYZ2&2xbG)}cJPI6!#C`$ zFC1@^!HeY4na$nFHlFbJRxUe04zB)cvl*NaRUuT_(R&w&kbQ=1p_gkauX%V!x+`T>d)h4&wWW5i8dzXsf zJ`pi|KiLaniQ&~>N3q03bhT@Bd%D?W$sLG)~wDl8K@ z-Xh+Xa!$W+#xnus@%OUvZPhpJ%x+9#;iOeX_p8hK?=m}7);H0|eXz8Lw*h=Nkb5z- zccjN#%zsP`nczB~wYVx-M))X;=kQHhHL#kUeT;Tp~<{;I;*DN_&o0t?*x z$BeKixm8@<@9x!Paz^cQR^5|J?7S@JE-a=kQXk|M^Y>VbqUc%lZIjWol8wA)wS53%^59{w_RETNkFI>09G_!1Opcn`CL>If@zheMqjj8qYi797tA+ z(J_x{Tme*YczGLDCG* z0K6n``53=X$YeIqz(AD$U?qKlO#i~eeE7!VzqfhAeG0qdU!d`4aDPHmR`$}9q<%v~ zc>ZA-?S$u&A4kI`+3rbWCYm)Ctm$+!21k9+8TN!{z~9e|Z6p|;IQY}=VJvU}`D7DS zR*~G>eBcu!=CHgIa6W46N^%{G-W5L2rQg16Eam+~x>yBE`1bbj{PtP7>k#%4_TzW@ zyo}C9v9&#@-{bRgeEvi>@4yl2kgweDV*F6mKu`AZ1AF}j-2NHw)4@6|OWs0qVTX0C z(c94u|Ob)~)2V0Mu~)cbA-G5)oMRZaFY&dQYL&aa}{Wb__K<#PAu!xm1w&Byt6mKIJ0|Bbq^ zvpf;@Ghpqs;-3I9>|y@{*G8k}$SlJ7tx@pphiL(8oC((ouYFdf;I(V@e~-uri&{fY zTYbV#-Y&YyBYuSMf!~O;HCCxL;2+IcA@_lNwUw-r74W#b9Yvctc)r7Gkxw7x3ir;C zLpYfc&N3Y}KNg+B*{&O%P}+u@^Y}`GZwm?B2;WiE^_nIYF1KFjI1eMSE8TdvY^l(Dg1CsvRT*C z!JN<9H(N1|@wc^f7tUC26vYpTJQs1fll&HuPdHIA$=_Y%y_y8a)5m_Zcad~ykXCrN zgIqRe$m>7eUmgvYGG;8mdkNMyIz#sRNjxW;tB%+GVtX+$KPUPNSv^nF$zk?V9gjCz zO~UD{aQd_Z8Dy8GuVQOO^#PwC-$EHx+)goJj*M@I3?y_UcHr%VEbE|5^t>p2z~}ws zbhTV0WCeNf9nMJpEAz}I57})r?G1sV$!g;fF`Z$i;d7?q6 z;KDbx?%*LaGuEuX(GqH5-?BlUAtH3L((E9&?Dz`RedrOE0dEfsq3aV)mKDMODPDEZ zwf!J}kJAhMX*3>p@#gU)9=`P=bc4dFg!B9`^fuNT6TbC-v-lQty^uaiiTrCwXOrh%mMQk@6^b+ocGl?lAzhi`KY9hdO`4sMhc zU8c1VSB@D|jvP;dnoCA$!TTA zwGDWRFql^G#w%kWd3tjmJZ0Ixcy_x-Xk`-R-@1w@OCw`SDgJ$Az zc?ne+T+#L_bBn8mPqUh=Faz$U7cW0GsOH3 zw{AqU+?Ou+)7S8*vTDe>qjmf;0)(W9`d;bxQ&eO zW_;MIe*_O%!OnueP@xt#w~}}eItsb?*j?mPl>EY8T=;J*E$KT%>+pOwLp#YUJMAA38E((;$N#DP68(}=)|cw+_X={pSDZX9Hm{Zg z9<&A)hButfs*JB{#vA}8ROUI+dYkb#$w`Xw{b%U3fX`Qg`2f0KL(gH-xkKCv9kiRk zsmS-!MZarMTigB6WjR7pHSiefq;N7Ue1rRyD6cEV)Ff};m?)m)Ac3pg%R*zv@qAP_ zVmF$0^MgIΘ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

    (A=c(g?dKH!b2v;^K2eNcX0ayv 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

    lDnNJ|0_hbDJhBJea>B! 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%0A^UMTaf?Qnj9vUz@4)&>AVr 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 *$(I(>kySg$!y#(f>7aYKg=;&Gy`!{|K{q^Hx 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 z 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 CW22!7~~gyrrx`U8)nT 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

  • 7q~;c5NtQ0?+y)ZgiE zDtw~z&s8Sdp;lZPH1Q(6P&~L5{tl3DlhOGdkv%19k@Zu(v_kUPG|ScO%Hm9ECrKu< zs1Wviv@Ov~^|QXw;hNZIiIQy_9s|5%^2-&QjKgWYR%2|IRWyERN!hBsDa6D zDTn_5G`a?=k!5#2`wsM-jii?!>b;(%#nX7M2U-7~?DuPCF`P8%Xa+Os!c0LGa&ams zY}Hd;7#d8^SEd6-fY4UD|6i5;ZYO^;)0=}~d7T!w;Eu8QoK^t_`O!eXe;mCx_hcv)7H3hTz z{z7;Ud_NWbsE=k&2EQ0a$#m-Q9b>z;BvTT>kz_Y==suEVExEWVwc6VY_&lx!_pe$* z-JJkZ(M(6eYAb!Oqvs#;ZLR8aO+8hNjnNW~j8^OJqFEMIo#=7nOYmt1qRa?3pInX;%BELqoJBkM(<0;d>p+TW@p z_Nc{~d_UTltgWu%KT%~Ti5^I{RVVr7=X;PKglQY>yYT*WY!=h{NCImb(HrxZ@WTJJe&~~aq8Hmif4Id2BgynXmo+Zm4 zaQ_1N^fVcB0%fGf+ZouiKhZ~1=)hxYJFX$mcc>ni8;*{s@3#YP2D|@@Z`)AXar|<_ z{i3N9_#mFjNfUO5;i~ZVELqx9oxu}$eU?gEHOaG^9khhL9R{r%%W&R*j`=IcRcqQ8oEiZPeONX=y4Ss z!-1+{uHy&(NLF{#&svo*muh1;J-N`i7hCDM_t5$-?Hr}=Yq2qA=zpB=tJM@=)rh%J3HeoHAzP}f#Dl9j1Q@e+7cbcCk*zW(Pl;0!)5gHYiho}pwA-U z(1dOACMY&n4|F2A-2q;nHRk^4su?^jMp>QENHsI5ZN!~WXHU4EN|JO&HML-WKKfb7 ze*YipdXc7Rh(bs4x<7{LHuTsNTp#Dc;(I28YsQPx`!of)?^x zN0Q|8WnzDX-h1+2>iT@dq8U#LH>SnUW)atN^>;%y9=USwf>uMfD$p(NS=i?Aj0T zH-;3R2J+va)NDS(=)9(=|5Fej1cndM;{$MbL-4sD9Ls|J0DLx%er*lPFTrL$JW`Lg zj%!@E!cmR1T_3LM8Rc`JHlC%s4BW@-w>r2tU?=s{=3_YM4*Z)PcQ(hf6YOmy08HBfH>qYqJV3shP%+!=kEoDgkD&W$pL zRZ)FjUS=a)bUA#NY|l%M4-Ynl-}1@(v3IXKNxEbrO*AY~HF`Z!Dax5R68@4}WoMjN zR1JEv7q}&OC1qGFH&u(x6C4jW(Msc0)o(##496MMonF(;_uOVyktAqGN=!%F%gCMG zEVZ~Q^%2r}A>64%%+`8Cwb-vc`Jp=e@6*rI)T151ww>(nov zi#r>$m_9)>`&e>6sKV7lwG6L09e&8l-g-`4D63Bm^1mq$_BK(9nj+Nq z%I0k1??s%NON8%hGVpJ$?nJ-eqw+u5XmM;QlgRl}{_YV_Y!7aC;+zI7w>bKcmzABF z%r8bdw4__!BUhio9aYKRs^m^=uRchs);HItq!ry3vaP}_(aJEbQy1Ejpf5UkA(vAX zhB(zA2MeYUP5Y1<_%+qZ{~s+~kc1lv+Dp({Nm99ew3+P|SCO9U`Aw<__dvaqJzp0c z+)Ta@-RgU8w9rHy{7PYpzj>V&ku!QWOn4?kEM1+Ramgth*`oNYlK33q_2FmE_{eN5 zABG#8_;JIj0;*3L4aZmS;{z!I=oIe=dr)G0n`X-%`eUSVxI*IB} zCRa!2le440lS87*$#!h2MS5Ns-NL?U5l)GwhohaV^IX){3}2+Ly0h)Jp{pig1A3sc z8TLhYGt6oSdh8DZlSqi~$^G>>_68mEEy^w!+(lx3%l_)XXMdQVoDFwu3$MV(t>P>t z*s*1TyGhF%eAhPKby5f&b3{8|@!5X&8S3{*T=P9$`D@fKJO=VTqBrT6KLK-d-Opv#^lNwee2=R6nt;x){>o|(2HB}>s{&*9}qNY|z$ z*kE^C;kKOaS0ooFvYg9$yPlRBc%BAe$NWw{q`|chYiSHCybe083A#l|fcDzj;BGzE z))rcJ5&L2_+8T^|-_qCn;Q1=MqYJ6vRAOGo!#JQM`90gab6Gksq32oT%2v|$JHK8r zgSnp1Mc=J+%~}j8+)pHLh#H%1=)u~e9BoBcmWz_T%i|HJZ%expW z5>_u5LB~#08?qyQew=P~LNLvo8PA_058ol}4;kk+8sU4I=@JP1>iIqVv1M$=|IF|d z?yRJ*xNd1qk)gXqK2zx9n`StTV;qh5`{ChOAgikfrTZ>(N zjRYR+$?v^A##`_BcZm(S%2;Nwhj!3M`{=EW#xa59UCrjqZq;P0R_khg5_qm7t19ZV zs+iGJyyoj{qS|J6CH#ubHUK`lJ2he#2{@8&>P=?!P;dR1D&mXbraHVeBTX97qnki= z1-ZVRgo*vv&1Cs}mgXiB={!w()7`@$an!wk;V)efSLc7u@3%m_4nMlMxIjaeLOz9k{AJHK3n0(>;e3qroaQP9h9>g1`NFRQC7@xHK z2PyM`=f3dF&(VeC;V2s)=da`j=ek^s9t$51UQh0iiiI1U)v_;IoIDlXo%|{KF!{B! zSb9g}l3k)+$<9%Sq=;g2ZS+v`<*0IUq-!msEy?$yfyvXJ-xzgGR*s4$D@HAoO`?ZA z(>vK9YLe^_RVRCz>Z?hzXVjOk*DBe|`B~kYO-!rGbu8Wd?WfyyHk<}qG8GYQL|*HXmE00w9Ghi zCEtoxB|nX(CdWjdo6AeduF;<4wCI@U&X9rW$(d`(Ez#{@^>cDg^iy&HxJ)E3&P4Zw zhrlkjfwzL)Xz{WwVqG7QBVVT4-7UzI5p48N!_Qe2ZOJX?G2r%J!Ra4zWj)*WG&^`_ z_&@L;Oj=K3`wk)d>YG%LnaDDkqaOcg z)#yjjzH4aiFUYHD=y4=%eZk2rBchMk1FOTnVhFWWur(U{#F3~@DDyY`G8?CKK=%vLcYE?=8hJK`9GNRFGn!mELI&+a z!>{1q-n_pJo~z+*T~elkU-L*IXJ%{rN%!lKgnh}li8!q>>K?4cH`y$c@N5I$a~Rj1 zWZ$DW{8n66SF5#Ct;fUoC{Iusk3Nwq?Y<{%Gt>Nsyt{z5O^Z7oB%8{xzcb?CYsOxR zJ^vsZ`lyx=YaLs$WL};#( znqRR_uCRKSp&nK4y))Ll`gx-?tlevLH9@aGnb;rPAMt(-a%P(EOTfM|SyT&_p7#4` zSZ@bE_p=F0z``&Po9#+p-asuFiO<})7o}N2aQy^dtpJ@jiL7qu%0F~&Ve=dVmz9iT zC7oN?7+>+k%joV-@^7He8%9>1>@V$C3uFJsXquy}zOc9$j4qkUVYD_lUE_RMTix?Nz=j*m9hy8}fazvV0KhtDs_&{L%0DbcuZSrR8j<$tpp z^E-)p$*ScBD|p-BSR8~8mO+&97OR1oUB3ddzr$a75wyQqfFGI9H~PxTZ=28FeH$lS zMB7Fi#<=FS+*v%0A0;68UnyCEln92M?jceCVOIHiyzACF#!W=&Wuk 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

    MS~W4bR0HaHXsi^uZZFc>gn3 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

    )Bi>GZMGmC;k(})c LIM>nkapeC2&tab^ literal 0 HcmV?d00001 diff --git a/lessons/numpy/secret.png b/lessons/numpy/secret.png new file mode 100644 index 0000000000000000000000000000000000000000..02e442ff8ad3e32addf24abb2c4f840763e86822 GIT binary patch literal 4883 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 x^e-#*VP`51rGf9e*+a!nG*m2 literal 0 HcmV?d00001 diff --git a/lessons/pandas/actors.csv b/lessons/pandas/actors.csv new file mode 100644 index 00000000..74d7b11e --- /dev/null +++ b/lessons/pandas/actors.csv @@ -0,0 +1,7 @@ +name,birth,alive +Terry,1942,False +Michael,1943,True +Eric,1943,True +Graham,1941,False +Terry,1940,True +John,1939,True diff --git a/lessons/pandas/index.html b/lessons/pandas/index.html new file mode 100644 index 00000000..ea94379e --- /dev/null +++ b/lessons/pandas/index.html @@ -0,0 +1,7214 @@ +

    +
    +
    +
    +

    Analýza dat v Pythonu

    +

    Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

    +

    Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

    +

    Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

    +

    Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

    +

    Proces analýzy dat

    +

    Práce datového analytika se většinou drží následujícího postupu:

    +
      +
    • Formulace otázky, kterou chceme zodpovědět
    • +
    • Identifikace dat, která můžeme použít
    • +
    • Získání dat (stažení, převod do použitelného formátu)
    • +
    • Uložení dat
    • +
    • Zkoumání dat
    • +
    • Publikace výsledků
    • +
    +

    *(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*

    +

    S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: json, csv, případně doinstalovat requests, lxml pro XML či xlwt/openpyxl na excelové soubory.

    +

    Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.

    +
    +
    +
    +
    +
    +
    +

    Pandas

    +

    Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

    +
    +
    +
    +
    +
    +
    +

    Jak bylo řečeno u NumPy, analytici – cílová skupina této knihovny – mají rádi zkratky. Ve spoustě materiálů na Webu proto najdete import pandas as pd, případně rovnou (a bez vysvětlení) použité pd jako zkratku pro pandas. Tento návod ale používá plné jméno.

    +
    +
    +
    +
    +
    +
    In [1]:
    +
    +
    +
    import pandas
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Tabulky

    +
    +
    +
    +
    +
    +
    +

    Základní datový typ, který Pandas nabízí, je DataFrame, neboli lidově „tabulka”. Jednotlivé záznamy jsou v ní uvedeny jako řádky a části těchto záznamů jsou úhledně srovnány ve sloupcích.

    +
    +
    +
    +
    +
    +
    +

    Nejpoužívanější způsob, jak naplnit první DataFrame, je načtení ze souboru. Na to má Pandas sadu funkcí začínající read_. (Některé z nich potřebují další knihovny, viz dokumentace.)

    +

    Jeden z nejpříjemnějších formátů je CSV:

    +
    +
    +
    +
    +
    +
    In [2]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[2]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Případně lze tabulku vytvořit ze seznamu seznamů:

    +
    +
    +
    +
    +
    +
    In [3]:
    +
    +
    +
    items = pandas.DataFrame([
    +    ["Book", 123],
    +    ["Computer", 2185],
    +])
    +items
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[3]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    01
    0Book123
    1Computer2185
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    …nebo seznamu slovníků:

    +
    +
    +
    +
    +
    +
    In [4]:
    +
    +
    +
    items = pandas.DataFrame([
    +    {"name": "Book", "price": 123},
    +    {"name": "Computer", "price": 2185},
    +])
    +items
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[4]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    nameprice
    0Book123
    1Computer2185
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    V Jupyter Notebooku se tabulka vykreslí „graficky”. +V konzoli se vypíše textově, ale data v ní jsou stejná:

    +
    +
    +
    +
    +
    +
    In [5]:
    +
    +
    +
    print(actors)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
          name  birth  alive
    +0    Terry   1942  False
    +1  Michael   1943   True
    +2     Eric   1943   True
    +3   Graham   1941  False
    +4    Terry   1940   True
    +5     John   1939   True
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Základní informace o tabulce se dají získat metodou info:

    +
    +
    +
    +
    +
    +
    In [6]:
    +
    +
    +
    actors.info()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    <class 'pandas.core.frame.DataFrame'>
    +RangeIndex: 6 entries, 0 to 5
    +Data columns (total 3 columns):
    +name     6 non-null object
    +birth    6 non-null int64
    +alive    6 non-null bool
    +dtypes: bool(1), int64(1), object(1)
    +memory usage: 182.0+ bytes
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Vidíme, že je to tabulka (DataFrame), má 6 řádků indexovaných +(pomocí automaticky vygenerovaného indexu) od 0 do 5 +a 3 sloupce: jeden s objekty, jeden s int64 a jeden s bool.

    +

    Tyto datové typy (dtypes) se doplnily automaticky podle zadaných +hodnot. Pandas je používá hlavně pro šetření pamětí: pythonní objekt +typu bool zabírá v paměti desítky bytů, ale v bool sloupci +si každá hodnota vystačí s jedním bytem.

    +

    Na rozdíl od NumPy jsou typy dynamické: když do sloupce zapíšeme „nekompatibilní” +hodnotu, kterou Pandas neumí převést na daný typ, typ sloupce +se automaticky zobecní. +Některé automatické převody ovšem nemusí být úplně intuitivní, např. None na NaN.

    +
    +
    +
    +
    +
    +
    +

    Sloupce

    +
    +
    +
    +
    +
    +
    +

    Sloupec, neboli Series, je druhý základní datový typ v Pandas. Obsahuje sérii hodnot, jako seznam, ale navíc má jméno, datový typ a „index”, který jednotlivé hodnoty pojmenovává. Sloupce se dají získat vybráním z tabulky:

    +
    +
    +
    +
    +
    +
    In [7]:
    +
    +
    +
    birth_years = actors['birth']
    +birth_years
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[7]:
    + + + + +
    +
    0    1942
    +1    1943
    +2    1943
    +3    1941
    +4    1940
    +5    1939
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [8]:
    +
    +
    +
    type(birth_years)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[8]:
    + + + + +
    +
    pandas.core.series.Series
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [9]:
    +
    +
    +
    birth_years.name
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[9]:
    + + + + +
    +
    'birth'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [10]:
    +
    +
    +
    birth_years.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[10]:
    + + + + +
    +
    RangeIndex(start=0, stop=6, step=1)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [11]:
    +
    +
    +
    birth_years.dtype
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[11]:
    + + + + +
    +
    dtype('int64')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    S informacemi ve sloupcích se dá počítat. +Základní aritmetické operace (jako sčítání či dělení) se sloupcem a skalární hodnotou (číslem, řetězcem, ...) provedou danou operaci nad každou hodnotou ve sloupci. Výsledek je nový sloupec:

    +
    +
    +
    +
    +
    +
    In [12]:
    +
    +
    +
    ages = 2016 - birth_years
    +ages
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[12]:
    + + + + +
    +
    0    74
    +1    73
    +2    73
    +3    75
    +4    76
    +5    77
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [13]:
    +
    +
    +
    century = birth_years // 100 + 1
    +century
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[13]:
    + + + + +
    +
    0    20
    +1    20
    +2    20
    +3    20
    +4    20
    +5    20
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    To platí jak pro aritmetické operace (+, -, *, /, //, %, **), tak pro porovnávání:

    +
    +
    +
    +
    +
    +
    In [14]:
    +
    +
    +
    birth_years > 1940
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[14]:
    + + + + +
    +
    0     True
    +1     True
    +2     True
    +3     True
    +4    False
    +5    False
    +Name: birth, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [15]:
    +
    +
    +
    birth_years == 1940
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[15]:
    + + + + +
    +
    0    False
    +1    False
    +2    False
    +3    False
    +4     True
    +5    False
    +Name: birth, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Když sloupec nesečteme se skalární hodnotou (číslem) ale sekvencí, např. seznamem nebo dalším sloupcem, operace se provede na odpovídajících prvcích. Sloupec a druhá sekvence musí mít stejnou délku.

    +
    +
    +
    +
    +
    +
    In [16]:
    +
    +
    +
    actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[16]:
    + + + + +
    +
    0      Terry (1)
    +1    Michael (2)
    +2       Eric (3)
    +3     Graham (4)
    +4      Terry (5)
    +5       John (6)
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Řetězcové operace se u řetězcových sloupců schovávají pod jmenným prostorem str:

    +
    +
    +
    +
    +
    +
    In [17]:
    +
    +
    +
    actors['name'].str.upper()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[17]:
    + + + + +
    +
    0      TERRY
    +1    MICHAEL
    +2       ERIC
    +3     GRAHAM
    +4      TERRY
    +5       JOHN
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... a operace s daty a časy (datetime) najdeme pod dt.

    +
    +
    +
    +
    +
    +
    +

    Ze slupců jdou vybírat prvky či podsekvence podobně jako třeba ze seznamů:

    +
    +
    +
    +
    +
    +
    In [18]:
    +
    +
    +
    birth_years[2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[18]:
    + + + + +
    +
    1943
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [19]:
    +
    +
    +
    birth_years[2:-2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[19]:
    + + + + +
    +
    2    1943
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A navíc je lze vybírat pomocí sloupce typu bool, což vybere ty záznamy, u kterých je odpovídající hodnota true. Tak lze rychle vybrat hodnoty, které odpovídají nějaké podmínce:

    +
    +
    +
    +
    +
    +
    In [20]:
    +
    +
    +
    # Roky narození po roce 1940
    +birth_years[birth_years > 1940]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[20]:
    + + + + +
    +
    0    1942
    +1    1943
    +2    1943
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Protože Python neumožňuje předefinovat chování operátorů and a or, logické spojení operací se tradičně dělá přes bitové operátory & (a) a | (nebo). Ty mají ale neintuitivní prioritu, proto se jednotlivé výrazy hodí uzavřít do závorek:

    +
    +
    +
    +
    +
    +
    In [21]:
    +
    +
    +
    # Roky narození v daném rozmezí
    +birth_years[(birth_years > 1940) & (birth_years < 1943)]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[21]:
    + + + + +
    +
    0    1942
    +3    1941
    +Name: birth, dtype: int64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Sloupce mají zabudovanou celou řadu operací, od základních (např. column.sum(), která bývá rychlejší než vestavěná funkce sum()) po roztodivné statistické specialitky. Kompletní seznam hledejte v dokumentaci. Povědomí o operacích, které sloupce umožňují, je základní znalost datového analytika.

    +
    +
    +
    +
    +
    +
    In [22]:
    +
    +
    +
    print('Součet: ', birth_years.sum())
    +print('Průměr: ', birth_years.mean())
    +print('Medián: ', birth_years.median())
    +print('Počet unikátních hodnot: ', birth_years.nunique())
    +print('Koeficient špičatosti: ', birth_years.kurtosis())
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    Součet:  11648
    +Průměr:  1941.3333333333333
    +Medián:  1941.5
    +Počet unikátních hodnot:  5
    +Koeficient špičatosti:  -1.48125
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Zvláště mocná je metoda apply, která nám dovoluje aplikovat jakoukoli funkci na všechny hodnoty sloupce:

    +
    +
    +
    +
    +
    +
    In [23]:
    +
    +
    +
    actors['name'].apply(lambda x: ''.join(reversed(x)))
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[23]:
    + + + + +
    +
    0      yrreT
    +1    leahciM
    +2       cirE
    +3     maharG
    +4      yrreT
    +5       nhoJ
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [24]:
    +
    +
    +
    actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[24]:
    + + + + +
    +
    0    deceased
    +1       alive
    +2       alive
    +3    deceased
    +4       alive
    +5       alive
    +Name: alive, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tabulky a vybírání prvků

    +
    +
    +
    +
    +
    +
    +

    Prvky ze sloupců jdou vybírat jako u seznamů. Ale z tabulek v Pandas jde vybírat spoustou různých způsobů. Tradiční hranaté závorky plní několik funkcí najednou, takže někdy není na první pohled jasné, co jaké indexování znamená:

    +
    +
    +
    +
    +
    +
    In [25]:
    +
    +
    +
    actors['name']  # Jméno sloupce
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[25]:
    + + + + +
    +
    0      Terry
    +1    Michael
    +2       Eric
    +3     Graham
    +4      Terry
    +5       John
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [26]:
    +
    +
    +
    actors[1:-1]  # Interval řádků
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[26]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [27]:
    +
    +
    +
    actors[['name', 'alive']]  # Seznam sloupců
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[27]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namealive
    0TerryFalse
    1MichaelTrue
    2EricTrue
    3GrahamFalse
    4TerryTrue
    5JohnTrue
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Toto je příklad nejednoznačného chování, které zjednodušuje život datovým analytikům, pro které je knihovna Pandas primárně určena.

    +

    My, coby programátoři píšící robustní kód, budeme čisté indexování ([]) používat jen pro výběr sloupců podle jména. +Pro ostatní přístup použijeme tzv. indexery, jako loc a iloc.

    +
    +
    +
    +
    +
    +
    +

    Indexer loc

    +
    +
    +
    +
    +
    +
    +

    Indexer loc zprostředkovává primárně řádky, a to podle indexu, tedy hlaviček tabulky. V našem příkladu jsou řádky očíslované a sloupce pojmenované, ale dále uvidíme, že v obou indexech můžou být jakékoli hodnoty.

    +
    +
    +
    +
    +
    +
    In [28]:
    +
    +
    +
    actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[28]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [29]:
    +
    +
    +
    actors.loc[2]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[29]:
    + + + + +
    +
    name     Eric
    +birth    1943
    +alive    True
    +Name: 2, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Všimněte si, že loc není metoda: používají se s ním hranaté závorky.

    +
    +
    +
    +
    +
    +
    +

    Použijeme-li k indexování n-tici, prvním prvkem se indexují řádky a druhým sloupce – podobně jako u NumPy:

    +
    +
    +
    +
    +
    +
    In [30]:
    +
    +
    +
    actors.loc[2, 'birth']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[30]:
    + + + + +
    +
    1943
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Na obou pozicích může být „interval”, ale na rozdíl od klasického Pythonu jsou ve výsledku obsaženy obě koncové hodnoty. (S indexem, který nemusí být vždy číselný, to dává smysl.)

    +
    +
    +
    +
    +
    +
    In [31]:
    +
    +
    +
    actors.loc[2:4, 'birth':'alive']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[31]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    birthalive
    21943True
    31941False
    41940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Když uvedeme jen jednu hodnotu, sníží se dimenzionalita – z tabulky na sloupec (případně řádek – taky Series), ze sloupce na skalární hodnotu. Porovnejte:

    +
    +
    +
    +
    +
    +
    In [32]:
    +
    +
    +
    actors.loc[2:4, 'name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[32]:
    + + + + +
    +
    2      Eric
    +3    Graham
    +4     Terry
    +Name: name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [33]:
    +
    +
    +
    actors.loc[2:4, 'name':'name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[33]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    name
    2Eric
    3Graham
    4Terry
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Chcete-li vybrat sloupec, na místě řádků uveďte dvojtečku – t.j. kompletní interval.

    +
    +
    +
    +
    +
    +
    In [34]:
    +
    +
    +
    actors.loc[:, 'alive']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[34]:
    + + + + +
    +
    0    False
    +1     True
    +2     True
    +3    False
    +4     True
    +5     True
    +Name: alive, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další možnost indexování je seznamem hodnot. Tím se dají řádky či sloupce vybírat, přeskupovat, nebo i duplikovat:

    +
    +
    +
    +
    +
    +
    In [35]:
    +
    +
    +
    actors.loc[:, ['name', 'alive']]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[35]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namealive
    0TerryFalse
    1MichaelTrue
    2EricTrue
    3GrahamFalse
    4TerryTrue
    5JohnTrue
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [36]:
    +
    +
    +
    actors.loc[[3, 2, 4, 4], :]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[36]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    3Graham1941False
    2Eric1943True
    4Terry1940True
    4Terry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexer iloc

    +
    +
    +
    +
    +
    +
    +

    Druhý indexer, který si v krátkosti ukážeme, je iloc. Umí to samé co loc, jen nepracuje s klíčem, ale s pozicemi řádků či sloupců. Funguje tedy jako indexování v NumPy.

    +
    +
    +
    +
    +
    +
    In [37]:
    +
    +
    +
    actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[37]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [38]:
    +
    +
    +
    actors.iloc[0, 0]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[38]:
    + + + + +
    +
    'Terry'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Protože iloc pracuje s čísly, záporná čísla a intervaly fungují jako ve standardním Pythonu:

    +
    +
    +
    +
    +
    +
    In [39]:
    +
    +
    +
    actors.iloc[-1, 1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[39]:
    + + + + +
    +
    1939
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [40]:
    +
    +
    +
    actors.iloc[:, 0:1]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[40]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name
    0Terry
    1Michael
    2Eric
    3Graham
    4Terry
    5John
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexování seznamem ale funguje jako u loc:

    +
    +
    +
    +
    +
    +
    In [41]:
    +
    +
    +
    actors.iloc[[0, -1, 3], [-1, 1, 0]]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[41]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivebirthname
    0False1942Terry
    5True1939John
    3False1941Graham
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jak loc tak iloc fungují i na sloupcích (Series), takže se dají kombinovat:

    +
    +
    +
    +
    +
    +
    In [42]:
    +
    +
    +
    actors.iloc[-1].loc['name']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[42]:
    + + + + +
    +
    'John'
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Indexy

    +
    +
    +
    +
    +
    +
    +

    V minulé sekci jsme naťukli indexy – jména jednotlivých sloupců nebo řádků. Teď se podívejme, co všechno s nimi lze dělat. +Načtěte si znovu stejnou tabulku:

    +
    +
    +
    +
    +
    +
    In [43]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[43]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Tato tabulka má dva klíče: jeden pro řádky, index, a druhý pro sloupce, který se jmenuje columns.

    +
    +
    +
    +
    +
    +
    In [44]:
    +
    +
    +
    actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[44]:
    + + + + +
    +
    RangeIndex(start=0, stop=6, step=1)
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [45]:
    +
    +
    +
    actors.columns
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[45]:
    + + + + +
    +
    Index(['name', 'birth', 'alive'], dtype='object')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Klíč se dá změnit tím, že do něj přiřadíme sloupec (nebo jinou sekvenci):

    +
    +
    +
    +
    +
    +
    In [46]:
    +
    +
    +
    actors.index = actors['name']
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[46]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    TerryTerry1942False
    MichaelMichael1943True
    EricEric1943True
    GrahamGraham1941False
    TerryTerry1940True
    JohnJohn1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [47]:
    +
    +
    +
    actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[47]:
    + + + + +
    +
    Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Potom jde pomocí tohoto klíče vyhledávat. Chceme-li vyhledávat efektivně (což dává smysl, pokud by řádků byly miliony), je dobré nejdřív tabulku podle indexu seřadit:

    +
    +
    +
    +
    +
    +
    In [48]:
    +
    +
    +
    actors = actors.sort_index()
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[48]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    EricEric1943True
    GrahamGraham1941False
    JohnJohn1939True
    MichaelMichael1943True
    TerryTerry1942False
    TerryTerry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [49]:
    +
    +
    +
    actors.loc[['Eric', 'Graham']]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[49]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    EricEric1943True
    GrahamGraham1941False
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pozor ale na situaci, kdy hodnoty v klíči nejsou unikátní. To Pandas podporuje, ale chování nemusí být podle vašich představ:

    +
    +
    +
    +
    +
    +
    In [50]:
    +
    +
    +
    actors.loc['Terry']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[50]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    name
    TerryTerry1942False
    TerryTerry1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Trochu pokročilejší možnost, jak klíč nastavit, je metoda set_index. Nejčastěji se používá k přesunutí sloupců do klíče, ale v dokumentaci se dočtete i o dalších možnostech. +Přesuňte teď do klíče dva sloupce najednou:

    +
    +
    +
    +
    +
    +
    In [51]:
    +
    +
    +
    indexed_actors = actors.set_index(['name', 'birth'])
    +indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[51]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alive
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Vznikl tím víceúrovňový klíč:

    +
    +
    +
    +
    +
    +
    In [52]:
    +
    +
    +
    indexed_actors.index
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[52]:
    + + + + +
    +
    MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
    +           labels=[[0, 1, 2, 3, 4, 4], [4, 2, 0, 4, 3, 1]],
    +           names=['name', 'birth'])
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Řádky z tabulky s víceúrovňovým klíčem se dají vybírat buď postupně po jednotlivých úrovních, nebo n-ticí:

    +
    +
    +
    +
    +
    +
    In [53]:
    +
    +
    +
    indexed_actors.loc['Terry']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[53]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    alive
    birth
    1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [54]:
    +
    +
    +
    indexed_actors.loc['Terry'].loc[1940]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[54]:
    + + + + +
    +
    alive    True
    +Name: 1940, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [55]:
    +
    +
    +
    indexed_actors.loc[('Terry', 1942)]
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[55]:
    + + + + +
    +
    alive    False
    +Name: (Terry, 1942), dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Kromě výběru dat mají klíče i jinou vlastnost: přidáme-li do tabulky nový sloupec s klíčem, jednotlivé řádky se seřadí podle něj:

    +
    +
    +
    +
    +
    +
    In [56]:
    +
    +
    +
    indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[56]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alive
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942False
    1940True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [57]:
    +
    +
    +
    last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
    +                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
    +last_names
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[57]:
    + + + + +
    +
    (Terry, 1940)      Gilliam
    +(Terry, 1942)        Jones
    +(Carol, 1942)    Cleveland
    +dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [58]:
    +
    +
    +
    indexed_actors['last_name'] = last_names
    +indexed_actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[58]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Eric1943TrueNaN
    Graham1941FalseNaN
    John1939TrueNaN
    Michael1943TrueNaN
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    NaN neboli NULL či N/A

    +
    +
    +
    +
    +
    +
    +

    V posledním příkladu vidíme, že Pandas doplňuje za neznámé hodnoty NaN, tedy "Not a Number" – hodnotu, která plní podobnou funkci jako NULL v SQL nebo None v Pythonu. Znamená, že daná informace chybí, není k dispozici nebo ani nedává smysl ji mít. Naprostá většina operací s NaN dává opět NaN:

    +
    +
    +
    +
    +
    +
    In [59]:
    +
    +
    +
    '(' + indexed_actors['last_name'] + ')'
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[59]:
    + + + + +
    +
    name     birth
    +Eric     1943           NaN
    +Graham   1941           NaN
    +John     1939           NaN
    +Michael  1943           NaN
    +Terry    1942       (Jones)
    +         1940     (Gilliam)
    +Name: last_name, dtype: object
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    NaN se chová divně i při porovnávání; (NaN == NaN) je nepravda. Pro zjištění chybějících hodnot máme metodu isnull():

    +
    +
    +
    +
    +
    +
    In [60]:
    +
    +
    +
    indexed_actors['last_name'].isnull()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[60]:
    + + + + +
    +
    name     birth
    +Eric     1943      True
    +Graham   1941      True
    +John     1939      True
    +Michael  1943      True
    +Terry    1942     False
    +         1940     False
    +Name: last_name, dtype: bool
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Abychom se NaN zbavili, máme dvě možnosti. Buď je zaplníme pomocí metody fillna hodnotou jako 0, False nebo, pro přehlednější výpis, prázdným řetězcem:

    +
    +
    +
    +
    +
    +
    In [61]:
    +
    +
    +
    indexed_actors.fillna('')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[61]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Eric1943True
    Graham1941False
    John1939True
    Michael1943True
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Nebo se můžeme zbavit všech řádků, které nějaký NaN obsahují:

    +
    +
    +
    +
    +
    +
    In [62]:
    +
    +
    +
    indexed_actors.dropna()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[62]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    alivelast_name
    namebirth
    Terry1942FalseJones
    1940TrueGilliam
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Bohužel existuje jistá nekonzistence mezi NaN a slovy null či na v názvech funkcí. C'est la vie.

    +
    +
    +
    +
    +
    +
    +

    Merge

    +

    Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

    +
    +
    +
    +
    +
    +
    In [63]:
    +
    +
    +
    actors = pandas.read_csv('static/actors.csv', index_col=None)
    +actors
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[63]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalive
    0Terry1942False
    1Michael1943True
    2Eric1943True
    3Graham1941False
    4Terry1940True
    5John1939True
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [64]:
    +
    +
    +
    spouses = pandas.read_csv('static/spouses.csv', index_col=None)
    +spouses
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[64]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthspouse_name
    0Graham1941David Sherlock
    1John1939Connie Booth
    2John1939Barbara Trentham
    3John1939Alyce Eichelberger
    4John1939Jennifer Wade
    5Terry1940Maggie Westo
    6Eric1943Lyn Ashley
    7Eric1943Tania Kosevich
    8Terry1942Alison Telfer
    9Terry1942Anna Söderström
    10Michael1943Helen Gibbins
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [65]:
    +
    +
    +
    actors.merge(spouses)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[65]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namebirthalivespouse_name
    0Terry1942FalseAlison Telfer
    1Terry1942FalseAnna Söderström
    2Michael1943TrueHelen Gibbins
    3Eric1943TrueLyn Ashley
    4Eric1943TrueTania Kosevich
    5Graham1941FalseDavid Sherlock
    6Terry1940TrueMaggie Westo
    7John1939TrueConnie Booth
    8John1939TrueBarbara Trentham
    9John1939TrueAlyce Eichelberger
    10John1939TrueJennifer Wade
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Mají-li spojované tabulky sloupce stejných jmen, Pandas je spojí podle těchto sloupců. V dokumentaci se dá zjistit, jak explicitně určit podle kterých klíčů spojovat, co udělat když v jedné z tabulek chybí odpovídající hodnoty apod.

    +

    Fanoušky SQL ještě odkážu na porovnání mezi SQL a Pandas.

    +
    +
    +
    +
    +
    +
    +

    Přesýpání dat

    +
    +
    +
    +
    +
    +
    +

    Dostáváme se do bodu, kdy nám jednoduchá tabulka přestává stačit. Pojďme si vytvořit tabulku větší: fiktivních prodejů v e-shopu, ve formátu jaký bychom mohli dostat z SQL databáze nebo datového souboru.

    +

    Použijeme k tomu mimo jiné date_range, která vytváří kalendářní intervaly. Zde, i v jiných případech, kdy je jasné, že se má nějaká hodnota interpretovat jako datum, nám Pandas dovolí místo objektů datetime zadávat data řetězcem:

    +
    +
    +
    +
    +
    +
    In [66]:
    +
    +
    +
    import itertools
    +import random
    +random.seed(0)
    +
    +months = pandas.date_range('2015-01', '2016-12', freq='M')
    +categories = ['Electronics', 'Power Tools', 'Clothing']
    +data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)}
    +                          for a, b in itertools.product(months, categories)
    +                          if random.randrange(20) > 0])
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    Tabulka je celkem dlouhá (i když v analýze dat bývají ještě delší). Podívejme se na několik obecných informací:

    +
    +
    +
    +
    +
    +
    In [67]:
    +
    +
    +
    # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
    +data.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[67]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    categorymonthsales
    0Electronics2015-01-315890
    1Power Tools2015-01-313242
    2Clothing2015-01-316961
    3Electronics2015-02-283969
    4Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [68]:
    +
    +
    +
    # Celkový počet řádků
    +len(data)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[68]:
    + + + + +
    +
    67
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [69]:
    +
    +
    +
    data['sales'].describe()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[69]:
    + + + + +
    +
    count      67.000000
    +mean     4795.552239
    +std      3101.026552
    +min      -735.000000
    +25%      2089.000000
    +50%      4448.000000
    +75%      7874.000000
    +max      9817.000000
    +Name: sales, dtype: float64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Pomocí set_index nastavíme, které sloupce budeme brát jako hlavičky:

    +
    +
    +
    +
    +
    +
    In [70]:
    +
    +
    +
    indexed = data.set_index(['category', 'month'])
    +indexed.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[70]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    categorymonth
    Electronics2015-01-315890
    Power Tools2015-01-313242
    Clothing2015-01-316961
    Electronics2015-02-283969
    Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Budeme-li chtít z těchto dat vytvořit tabulku, která má v řádcích kategorie a ve sloupcích měsíce, můžeme využít metodu unstack, která "přesune" vnitřní úroveň indexu řádků do sloupců a uspořádá podle toho i data.

    +

    Můžeme samozřejmě použít kteroukoli úroveň klíče; viz dokumentace k unstack a reverzní operaci stack.

    +
    +
    +
    +
    +
    +
    In [71]:
    +
    +
    +
    unstacked = indexed.unstack('month')
    +unstacked
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[71]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
    category
    Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
    Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
    Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
    +

    3 rows × 23 columns

    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Teď je sloupcový klíč dvouúrovňový, ale úroveň sales je zbytečná. Můžeme se jí zbavit pomocí MultiIndex.droplevel.

    +
    +
    +
    +
    +
    +
    In [72]:
    +
    +
    +
    unstacked.columns = unstacked.columns.droplevel()
    +unstacked
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[72]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
    category
    Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
    Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
    Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
    +

    3 rows × 23 columns

    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A teď můžeme data analyzovat. Kolik se celkem utratilo za elektroniku?

    +
    +
    +
    +
    +
    +
    In [73]:
    +
    +
    +
    unstacked.loc['Electronics'].sum()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[73]:
    + + + + +
    +
    103742.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jak to vypadalo se všemi elektrickými zařízeními v třech konkrétních měsících?

    +
    +
    +
    +
    +
    +
    In [74]:
    +
    +
    +
    unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[74]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
    category
    Electronics2966.09039.01450.0
    Power Tools2012.06807.0314.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A jak se prodávalo oblečení?

    +
    +
    +
    +
    +
    +
    In [75]:
    +
    +
    +
    unstacked.loc['Clothing']
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[75]:
    + + + + +
    +
    month
    +2015-01-31    6961.0
    +2015-02-28    2578.0
    +2015-03-31    9131.0
    +2015-04-30     618.0
    +2015-05-31    4796.0
    +2015-06-30    8052.0
    +2015-07-31    7989.0
    +2015-08-31       NaN
    +2015-09-30      31.0
    +2015-10-31    7896.0
    +2015-11-30    7016.0
    +2015-12-31    7969.0
    +2016-01-31    8627.0
    +2016-02-29    4194.0
    +2016-03-31    2059.0
    +2016-04-30     471.0
    +2016-05-31    5410.0
    +2016-06-30    8663.0
    +2016-07-31    9817.0
    +2016-08-31    6969.0
    +2016-09-30    -735.0
    +2016-10-31    4448.0
    +2016-11-30    -259.0
    +Name: Clothing, dtype: float64
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Metody stack a unstack jsou sice asi nejužitečnější, ale stále jen jeden ze způsobů jak v Pandas tabulky přeskládávat. Náročnější studenti najdou další možnosti v dokumentaci.

    +
    +
    +
    +
    +
    +
    +

    Grafy

    +
    +
    +
    +
    +
    +
    +

    Je-li nainstalována knihovna matplotlib, Pandas ji umí využít k tomu, aby kreslil grafy. Nastavení je trochu jiné pro Jupyter Notebook a pro příkazovou řádku.

    +

    Používáte-li Jupyter Notebook, zapněte integraci pro kreslení grafů pomocí:

    +
    +
    +
    +
    +
    +
    In [76]:
    +
    +
    +
    import matplotlib
    +
    +# Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):
    +%matplotlib inline
    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    a pak můžete přímo použít metodu plot(), která bez dalších argumentů vynese data z tabulky proti indexu:

    +
    +
    +
    +
    +
    +
    In [77]:
    +
    +
    +
    unstacked.loc['Clothing'].dropna().plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[77]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab57c0470>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Jste-li v příkazové řádce, napřed použij plot() a potom se na graf buď podívete, nebo ho uložte:

    +
    # Setup
    +import matplotlib.pyplot
    +
    +# Plot
    +unstacked.loc['Clothing'].plot()
    +matplotlib.pyplot.show()
    +matplotlib.pyplot.savefig('graph.png')
    +

    Funkce show a savefig pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce savefig aktuální graf zahodí; před dalším show nebo savefig je potřeba ho vykreslit znovu.

    +
    +
    +
    +
    +
    +
    +

    V kombinaci s dalšími funkcemi Series a DataFrame umožňují grafy získat o datech rychlý přehled:

    +
    +
    +
    +
    +
    +
    In [78]:
    +
    +
    +
    # Jak se postupně vyvíjely zisky z oblečení?
    +# `.T` udělá transpozici tabulky (vymění řádky a sloupce)
    +# `cumsum()` spočítá průběžný součet po sloupcích
    +unstacked.T.fillna(0).cumsum().plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[78]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5733160>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    In [79]:
    +
    +
    +
    # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
    +unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[79]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab567ae10>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Další informace jsou, jak už to bývá, v dokumentaci.

    +
    +
    +
    +
    +
    +
    +

    Groupby

    +

    Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

    +
    +
    +
    +
    +
    +
    In [80]:
    +
    +
    +
    data.head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[80]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    categorymonthsales
    0Electronics2015-01-315890
    1Power Tools2015-01-313242
    2Clothing2015-01-316961
    3Electronics2015-02-283969
    4Power Tools2015-02-284866
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Samotný výsledek groupby() je jen objekt:

    +
    +
    +
    +
    +
    +
    In [81]:
    +
    +
    +
    data.groupby('category')
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[81]:
    + + + + +
    +
    <pandas.core.groupby.DataFrameGroupBy object at 0x7f4ab8363f28>
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    ... na který musíme zavolat příslušnou agregující funkci. Tady je například součet částek podle kategorie:

    +
    +
    +
    +
    +
    +
    In [82]:
    +
    +
    +
    data.groupby('category').sum()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[82]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    category
    Clothing112701
    Electronics103742
    Power Tools104859
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Nebo počet záznamů:

    +
    +
    +
    +
    +
    +
    In [83]:
    +
    +
    +
    data.groupby('category').count()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[83]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    monthsales
    category
    Clothing2222
    Electronics2222
    Power Tools2323
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Groupby umí agregovat podle více sloupců najednou (i když u našeho příkladu nedává velký smysl):

    +
    +
    +
    +
    +
    +
    In [84]:
    +
    +
    +
    data.groupby(['category', 'month']).sum().head()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[84]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    categorymonth
    Clothing2015-01-316961
    2015-02-282578
    2015-03-319131
    2015-04-30618
    2015-05-314796
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Chceme-li aplikovat více funkcí najednou, předáme jejich seznam metodě agg. Časté funkce lze předat jen jménem, jinak předáme funkci či metodu přímo:

    +
    +
    +
    +
    +
    +
    In [85]:
    +
    +
    +
    data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[85]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    meanmediansumkurt
    category
    Clothing5122.7727276185.5112701-1.298035
    Electronics4715.5454554294.5103742-1.353210
    Power Tools4559.0869573769.0104859-1.044767
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    Případně použijeme zkratku pro základní analýzu:

    +
    +
    +
    +
    +
    +
    In [86]:
    +
    +
    +
    g = data.groupby('month')
    +g.describe()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[86]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    countmeanstdmin25%50%75%max
    month
    2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
    2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
    2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
    2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
    2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
    2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
    2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
    2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
    2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
    2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
    2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
    2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
    2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
    2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
    2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
    2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
    2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
    2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
    2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
    2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
    2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
    2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
    2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +

    A perlička nakonec – agregovat se dá i podle sloupců, které nejsou v tabulce. Následující kód rozloží data na slabé, průměrné a silné měsíce podle toho, kolik jsme v daném měsíci vydělali celých tisícikorun, a zjistí celkový zisk ze slabých, průměrných a silných měsíců:

    +
    +
    +
    +
    +
    +
    In [87]:
    +
    +
    +
    bin_size = 10000
    +by_month = data.groupby('month').sum()
    +by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
    +by_thousands
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[87]:
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sales
    countsum
    sales
    0530651
    1000015218870
    20000371781
    +
    + +
    + +
    +
    + +
    +
    +
    +
    In [88]:
    +
    +
    +
    by_thousands[('sales', 'sum')].plot()
    +
    + +
    +
    +
    + +
    +
    + + +
    + +
    Out[88]:
    + + + + +
    +
    <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5588240>
    +
    + +
    + +
    + +
    + + + + +
    + +
    + +
    + +
    +
    + +
    + + diff --git a/lessons/pandas/spouses.csv b/lessons/pandas/spouses.csv new file mode 100644 index 00000000..47ec344b --- /dev/null +++ b/lessons/pandas/spouses.csv @@ -0,0 +1,12 @@ +name,birth,spouse_name +Graham,1941,David Sherlock +John,1939,Connie Booth +John,1939,Barbara Trentham +John,1939,Alyce Eichelberger +John,1939,Jennifer Wade +Terry,1940,Maggie Westo +Eric,1943,Lyn Ashley +Eric,1943,Tania Kosevich +Terry,1942,Alison Telfer +Terry,1942,Anna Söderström +Michael,1943,Helen Gibbins diff --git a/lessons/pandas/style-table.css b/lessons/pandas/style-table.css new file mode 100644 index 00000000..96378a77 --- /dev/null +++ b/lessons/pandas/style-table.css @@ -0,0 +1,57 @@ +/* +Pandas table style from Brandon Rhodes' amazing Pandas workshop at PyCon 2015: +https://www.youtube.com/watch?v=5JnMutdy6Fw + +Copyright © 2015 Brandon Rhodes and available under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + */ + +body { + margin: 0; + font-family: Helvetica; +} +table.dataframe { + border-collapse: collapse; + border: none; +} +table.dataframe tr { + border: none; +} +table.dataframe td, table.dataframe th { + margin: 0; + border: 1px solid white; + padding-left: 0.25em; + padding-right: 0.25em; +} +table.dataframe th:not(:empty) { + background-color: #fec; + text-align: left; + font-weight: normal; +} +table.dataframe tr:nth-child(2) th:empty { + border-left: none; + border-right: 1px dashed #888; +} +table.dataframe td { + border: 2px solid #ccf; + background-color: #f4f4ff; +} diff --git a/lessons/pong/index.html b/lessons/pong/index.html new file mode 100644 index 00000000..3bd6132f --- /dev/null +++ b/lessons/pong/index.html @@ -0,0 +1,499 @@ +

    Pong

    +
    + +

    Dnes si prohloubíme znalosti programování grafických aplikací, +které jsme získali na lekci o Pygletu, +na reálném problému.

    +

    Naprogramujeme si s pomocí knihovny Pyglet +jednu z prvních videoher, Pong. +Pong vydala společnost Atari +jako svůj první titul v roce 1972 a odstartovala tak boom herního průmyslu.

    +

    Na Youtube se můžeš podívat na +video, které ukazuje jak se Pong hraje.

    +

    Konstanty a stav hry

    +

    Hra Pong má jednoduchá pravidla. Musíme je ale umět +vyjádřit v Pythonu a to není úplně jednoduché. +Pojdmě si srovnat v hlavě, co ve hře máme.

    +
      +
    • Hrací pole ve tvaru obdélníku s půlící čárou.
    • +
    • Míček létající určitou rychlostí po hracím poli.
    • +
    • Dvě pálky pohybující se vertikálně na krajích pole.
    • +
    • Dvě počítadla skóre.
    • +
    +

    Hra bude pro 2 hráče, nebudeme programovat chování počítače. +Každý z hráčů může ovládat svou pálku stiskem kláves. +Jeden hráč šipkou nahoru a šipkou dolů a druhý hráč klávesami W +a S.

    +

    Stav hry dokážeme v Pythonu vyjádřit pomocí proměnných +a konstant. To dává smysl, protože některé +věci se ve hře mění (poloha pálek, poloha míčku, rychlost míčku, skóre) +a některé ne (velikost hrací plochy, velikost pálek a +míčku, poloha a velikost počítadel skóre). +Ze složitějších datových struktur použijeme seznam +(list, ten už známe) a množinu (set), která je velmi podobná +matematické množině. Zjednodušeně je to seznam, který se +nestará o pořadí a stejné prvky v něm mohou být právě jednou.

    +

    Možná přemýšlíš nad tím, v jakých jednotkách můžeme měřit +vzdálenost a rychlost v takovéto hře na počítači. +Na obrazovce je nešikovné měřit vzdálenost např. +v centimetrech. Nicméně každá obrazovka se skládá +z jednotlivých svítících bodů tzn. pixelů. +V grafické aplikaci jako je Pong můžeme tedy měřit +vzdálenost dvou míst na obrazovce jako počet pixelů +mezi těmito dvěma místy. Souřadný systém Pygletu +je založený právě na pixelech, přičemž pixel se +souřadnicemi [0, 0] je na obrazovce vlevo dole. +Rychlost můžeme jednoduše měřit v pixelech za sekundu.

    +

    Založte si nový skript. Společně nadefinujeme konstanty, které +budeme v tvorbě hry potřebovat. Normálně bychom +definovali konstanty postupně, až bychom je potřebovali, +ale pro jednoduchost to udělejme společně a najednou. +Ukážeme si na tom, jak začít převádět problém z reálného +světa do Pythonu.

    +
    # Velikost okna (v pixelech)
    +SIRKA = 900
    +VYSKA = 600
    +
    +VELIKOST_MICE = 20
    +TLOUSTKA_PALKY = 10
    +DELKA_PALKY = 100
    +RYCHLOST = 200  # v pixelech za sekundu
    +RYCHLOST_PALKY = RYCHLOST * 1.5  # taky v pixelech za sekundu
    +
    +DELKA_PULICI_CARKY = 20
    +VELIKOST_FONTU = 42
    +ODSAZENI_TEXTU = 30
    +

    Nyní nadefinujeme proměnné potřebné v naší hře: poloha míčku, poloha pálek, +rychlost míče, stisknuté klávesy a skóre obou hráčů. +Budou to globální proměnné, za což by nás profesionální +programátor pokáral, ale nám to v tuhle chvíli ulehčí +práci.

    +
    pozice_palek = [VYSKA // 2, VYSKA // 2]  # vertikalni pozice dvou palek
    +pozice_mice = [0, 0]  # x, y souradnice micku -- nastavene v reset()
    +rychlost_mice = [0, 0]  # x, y slozky rychlosti micku -- nastavene v reset()
    +stisknute_klavesy = set()  # sada stisknutych klaves
    +skore = [0, 0]  # skore dvou hracu
    +

    Vykreslení hrací plochy

    +

    Nejprve si v Pygletu otevřeme okno velikosti hrací plochy.

    +
    import pyglet
    +...
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +pyglet.app.run()  # vse je nastaveno, at zacne hra
    +

    Než začneme dělat interaktivní část hry reagující na vstupy +od uživatele, je třeba umět vůbec vykreslit prvky na hrací +ploše. Podobně jako jsme v lekci o Pygletu měli funkci +vykresli(), která vykreslila hada, budeme mít +v Pongu funkci stejného jména, která vykreslí prvky na hrací +ploše.

    +

    Většina z tvarů jsou obdélníky, takže nejprve +navrhněme funkci nakresli_obdelnik, která +dostane čtveřici souřadnic a pomocí modulu gl +z Pygletu vykreslí čtverec pomocí 2 trojúhelníků.

    +
    from pyglet import gl
    +...
    +def nakresli_obdelnik(x1, y1, x2, y2):
    +    """Nakresli obdelnik na dane souradnice
    +
    +    Nazorny diagram::
    +
    +         y2 - +-----+
    +              |/////|
    +         y1 - +-----+
    +              :     :
    +             x1    x2
    +    """
    +    # Tady pouzijeme volani OpenGL, ktere je pro nas zatim asi nejjednodussi
    +    # na pouziti
    +    gl.glBegin(gl.GL_TRIANGLE_FAN)   # zacni kreslit spojene trojuhelniky
    +    gl.glVertex2f(int(x1), int(y1))  # vrchol A
    +    gl.glVertex2f(int(x1), int(y2))  # vrchol B
    +    gl.glVertex2f(int(x2), int(y2))  # vrchol C, nakresli trojuhelnik ABC
    +    gl.glVertex2f(int(x2), int(y1))  # vrchol D, nakresli trojuhelnik BCD
    +    # dalsi souradnice E by nakreslila trojuhelnik CDE, atd.
    +    gl.glEnd()  # ukonci kresleni trojuhelniku
    +

    Teď začneme pracovat na funkci vykresli() +Nejprve ji vytvoř prázdnou a zaregistruj ji +v Pygletu na událost on_draw, jak jsme to +dělali v lekci o Pygletu. To znamená, že se tato funkce +zavolá pokaždé, když Pyglet překreslí okno. Pokud se +mezitím např. změnila poloha míčku, funkce ho vykreslí +o kousek jinde. Tím vlastně vytváříme dynamiku hry. +Analogicky jsme to dělali s hadem, tady máme jen víc +grafických prvků.

    +
    ...
    +def vykresli():
    +    """Vykresli stav hry"""
    +    gl.glClear(gl.GL_COLOR_BUFFER_BIT)  # smaz obsah okna (vybarvi na cerno)
    +    gl.glColor3f(1, 1, 1)  # nastav barvu kresleni na bilou
    +
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +window.push_handlers(
    +    on_draw=vykresli,  # na vykresleni okna pouzij funkci `vykresli`
    +)
    +pyglet.app.run()  # vse je nastaveno, at zacne hra
    +

    Zatím máme v těle funkce jen volání, která vyčistí +plochu, do které kreslíme a nastaví barvu kreslení na bílou.

    +

    Teď zkus sám/sama do funkce vykresli() přidat +vykreslení míčku na správné pozici, +kterou získáš z příslušné globální proměnné. Míček je +v našem případě jen malý čtvereček jehož velikost +máme uloženou v konstantě.

    +
    +

    Řešení

    + + +

    Po míčku zkus vykreslit obě pálky. +V proměnné pozice_palek máme vertikální +polohu první a druhé pálky, ale horizontální poloha je +konstantní. Jaké souřadnice musíš předat funkci +nakresli_obdelnik, aby se pálka vykreslila +správně a na správném místě? Princip určení souřadnic +je podobný jako u vykreslení míčku.

    +
    +

    Řešení

    + + +

    Přehlednosti hry pomůže půlící čára +uprostřed. Jak ji ale namalovat? +Nebudeme vymýšlet zbytečné složitosti. +Namalujme ji jako sérii obdélníčků táhnoucích se odshora +dolů. Chce to jen vygenerovat seznam souřadnic, +které budou mít dostatečné rozestupy, a na každé +z nich vykreslit obdélníček. Kterou funkci z Pythonu +bys použila na získání tohoto seznamu souřadnic?

    +
    +

    Řešení

    + + +

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. +K tomu se musíme naučit vykreslovat v Pygletu text. +V Pygletu je modul text, který obsahuje +objekt Label (Nápis). Ten se hodí k vykreslení hodnoty +skóre. Objekt musíme nejdřív vytvořit. To uděláme +kulatými závorkami za jménem objektu, jako bychom +volali funkci, a uložíme si ho do proměnné: +napis = Label(). Normálně bychom objekt +vytvořili jen jednou a pak měnili jeho hodnotu, ale +pro jednoduchost vytvoříme vždy nový a celé to zabalíme +do funkce. V jejím závěru musíme na nadpisu zavolat +metodu draw(), jinak se nápis nevykreslí.

    +
    def nakresli_text(text, x, y, pozice_x):
    +    """Nakresli dany text na danou pozici
    +
    +    Argument ``pozice_x`` muze byt "left" nebo "right", udava na kterou stranu
    +    bude text zarovnany
    +    """
    +    napis = pyglet.text.Label(
    +        text,
    +        font_size=VELIKOST_FONTU,
    +        x=x, y=y, anchor_x=pozice_x
    +    )
    +    napis.draw()
    +

    Teď zkus tuto funkci použít ve funkci vykresli() +k nakreslení skóre. K určení pozice textu použij +konstanty SIRKA, VYSKA, ODSAZENI_TEXTU a VELIKOST_FONTU.

    +
    +

    Řešení

    + + +

    Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

    +

    Dynamika hry

    +

    Teď to začne být zajímavé. Nejdřív rozhýbeme pálky, +protože je to jednodušší, pak míček.

    +

    Vstup od uživatele

    +

    Potřebujeme pohybovat s pálkami podle vstupu od uživatele. +Dokud bude uživatel držet např. klávesu S, levá pálka +pojede dolů. +V Pygletu jsme se naučili pracovat s událostí +on_text, ta nám ale v tomto případě nebude stačit. +K realizaci pohybu pálek budeme potřebovat 2 typy událostí, +které ještě neznáme - on_key_press a on_key_release.

    +

    Pyglet zavolá funkci registrovanou na událost on_key_press +stejně jako při vykreslování okna zavolal funkci vykresli(), +zaregistrovanou na události on_draw. +Přidáme právě stisknutou klávesu do množiny stisknutých +kláves v globální proměnné stisknute_klavesy +jako n-tici (směr, číslo pálky), např. tedy +('nahoru', 0), což bude vyjadřovat, že levá pálka má jet nahoru. +Při události on_key_release odebereme právě +stisknutou klávesu z množiny stisknute_klavesy. +Tím zajistíme, že v daný okamžik bude množina stisknute_klavesy +obsahovat všechny klávesy, které uživatel drží, a budeme +podle toho moct pohnout s pálkami.

    +

    Troufneš si napsat funkce stisk_klavesy(symbol, modifikatory) +a pusteni_klavesy(symbol, modifikatory)? +Poznamenejme, že do množiny stisknute_klavesy +můžeš přidat prvek metodou add(prvek) a pak +odebrat metodou discard(prvek). Obě berou jako +argument prvek, který se má přidat nebo odstranit, +v našem případě konkrétní n-tici.

    +

    Budeš potřebovat zjistit, kterou klávesu uživatel stisknul. +Kód stisknuté klávesy předá Pyglet našim funkcím +v argumentu symbol. Je to ale nic neříkající +číslo. Z pyglet.window můžeš naimportovat +modul key, který obsahuje konstanty jednotlivých +kláves. Můžeš pak porovnat, zda symbol odpovídá např. +klávese jako symbol == key.UP.

    +
    +

    Řešení

    + + +

    Proč vlastně používáme k odebrání n-tice metodu +discard() místo metody remove(), +kterou známe ze seznamů a množiny ji také mají? +Nezpůsobí totiž chybu, když se pokusíme odebrat +prvek, který v množině není. To by se mohlo stát, +kdyby uživatel stiskl jednu z funkčních kláves +a teprve pak se přepnul do našeho okna a pak jí +pustil.

    +

    Zaregistruj si obě funkce na příslušné události:

    +
    ...
    +window = pyglet.window.Window(width=SIRKA, height=VYSKA)
    +window.push_handlers(
    +    on_draw=vykresli,  # na vykresleni okna pouzij funkci `vykresli`
    +    on_key_press=stisk_klavesy,
    +    on_key_release=pusteni_klavesy,
    +)
    +pyglet.app.run()
    +

    Pohyb pálek

    +

    Když už jsme dokázali zpracovat vstup od uživatele, +můžeme podle něj pohnout s pálkami. +Pohyb předmětů budeme provádět ve funkci obnov_stav(dt), +která bude registrována na tik hodin v Pygletu. +Argument dt je čas od posledního zavolání funkce Pygletem.

    +
    def obnov_stav(dt):
    +    for cislo_palky in (0, 1):
    +        # pohyb podle klaves (viz funkce `stisk_klavesy`)
    +        if ('nahoru', cislo_palky) in stisknute_klavesy:
    +            pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt
    +        if ('dolu', cislo_palky) in stisknute_klavesy:
    +            pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt
    +
    +        # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum
    +        if pozice_palek[cislo_palky] < DELKA_PALKY / 2:
    +            pozice_palek[cislo_palky] = DELKA_PALKY / 2
    +        # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum
    +        if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2:
    +            pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2
    +

    Podívejme se na tento kus kódu. Procházíme +v cyklu obě pálky a ptáme se, zda je v množině +stisknutých kláves n-tice reprezentující +pohyb dané pálky nahoru nebo dolů. +Když ano, pohneme pálkou v daném směru +(přičteme nebo odečteme od vertikální polohy pálky +změnu polohy, což je čas od posledního zavolání, +který známe, vynásobený rychlostí pálky nastavené +v konstantě).

    +

    V druhé části musíme zajistit, aby pálka nevyjela +z hracího pole. Z minulých hrátek s hadem víme, +že to se může stát velmi snadno. Pálku malujeme kolem +jejího středu, což znamená, že když se pálka přiblíží na +na y-ovou pozici DELKA_PALKY / 2, začíná +překračovat dolní hranici hracího pole. V tom případě +její pozici zafixujeme na nejnižší možné souřadnici. +Analogicky to provedeme, když se blíží hornímu okraji.

    +

    Zaregistruj vytvořenou funkci na tik hodin jako

    +
    ...
    +pyglet.clock.schedule(obnov_stav)
    +pyglet.app.run()
    +

    a podívej se na výsledek.

    +

    Rozehrání

    +

    Než začneme míček odrážet od stěn, musíme ho nejprve +uvést do pohybu. Vystřelíme ho ze středu hrací plochy +do náhodného směru. Toto se také stane v momentě, kdy +jeden z hráčů skóruje a hra se rozehrává znovu. +Proto tohle rozehrání zabalíme do funkce reset(). +Zavolejte ji, než se spustí hra.

    +

    Jak bude tato funkce vypadat? +Nejprve přesuň míček do středu hrací plochy nastavením +proměnné pozice_mice. Potom je třeba +simulovat hod mincí pomocí volání funkce +random.randint(0, 1). Tím rozhodneme, zda +se míček rozletí doprava nebo doleva. +Míček rozpohybujeme horizontálním směrem přičtením +požadované rychlosti k rychlost_mice[0]. +Ve vertikálním směru rychlost_mice[1] +se bude míček pohybovat zcela náhodně přičtením +náhodné rychlosti.

    +
    +

    Řešení

    + + +

    Nic se zatím ale nestane, protože funkce +obnov_stav(dt) zatím nepracuje +se změnou rychlosti. Musíme v ní tedy nastavit proměnnou +poloha_micku podle současné rychlosti míčku +a času uplynulého od posledního zavolání funkce podle +fyzikálního vztahu s = v t, tedy že dráha +je rovna rychlosti vynásobené časem. Přidej tedy do +funkce obnov_stav(dt) následující kód:

    +
    def obnov_stav(dt):
    +    ...
    +    # POHYB MICKU
    +    pozice_mice[0] += rychlost_mice[0] * dt
    +    pozice_mice[1] += rychlost_mice[1] * dt
    +

    Zkus, co se teď stane při spuštění hry. +Míček by měl vyletět pokaždé do jiného směru.

    +

    Odrážení míčku

    +

    Míček nám teď nekontrolovaně vyletí z hřiště. +Musíme tedy zařídit, aby se odrážel od stěn. +Jelikož úhel dopadu se rovná úhlu odrazu, +stačí otočit znaménko y-ové složky rychlosti. +Do funkce obnov_stav(dt) musíme +přidat kontroly na polohu míčku a případně +změnit jeho směr, pokud je moc nízko nebo moc vysoko.

    +
    def obnov_stav(dt):
    +    ...
    +    # Odraz micku od sten
    +    if pozice_mice[1] < VELIKOST_MICE // 2:
    +        rychlost_mice[1] = abs(rychlost_mice[1])
    +    if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2:
    +        rychlost_mice[1] = -abs(rychlost_mice[1])
    +

    Teď nám zbývá odraz od pálky, případně resetování +hry, pokud míček padne mimo pálku jednoho hráče a +ten druhý tak získá bod. Opět tedy budeme přidávat +kód do funkce obnov_stav(dt).

    +

    Prvním krokem je poznamenání mezí na y-ové ose, +kde se musí míček nacházet, aby byl úspěšně odražen – +to je mezi horním a dolním koncem pálky:

    +
    def obnov_stav(dt):
    +    ...
    +    palka_min = pozice_mice[1] - VELIKOST_MICE / 2 - DELKA_PALKY / 2
    +    palka_max = pozice_mice[1] + VELIKOST_MICE / 2 + DELKA_PALKY / 2
    +

    Nyní když míček narazí do pravé nebo levé stěny +se umíme zeptat, zda je pálka na správné pozici +a my máme odrazit míček nebo zda hráč +prohrál kolo a my máme přičíst jeho soupeři bod a +restartovat hru.

    +
    def obnov_stav(dt):
    +    ...
    +    # odrazeni vlevo
    +    if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2:
    +        if palka_min < pozice_palek[0] < palka_max:
    +            # palka je na spravnem miste, odrazime micek
    +            rychlost_mice[0] = abs(rychlost_mice[0])
    +        else:
    +            # palka je jinde nez ma byt, hrac prohral
    +            skore[1] += 1
    +            reset()
    +
    +    # odrazeni vpravo
    +    if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2):
    +        if palka_min < pozice_palek[1] < palka_max:
    +            rychlost_mice[0] = -abs(rychlost_mice[0])
    +        else:
    +            skore[0] += 1
    +            reset()
    +

    Závěr

    +

    Hurá, prokousali jsme se k zdárnému konci Pongu! +Máš teď plně funkční interaktivní grafickou +hru zakládající se na reálné předloze. :)

    \ No newline at end of file diff --git a/lessons/pong/pong.png b/lessons/pong/pong.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa25809fb06d8c9b07eb033afcf53d87665bc6b GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!k8>~qNuAd}uLCL00*}aI1_r((Aj~*bn@^g7 zfjQpO#WAGf*4w)qy=DhWG$c+2SA7tZ%ejYG3WMp9Y;P1u!jNzh+ zXVBWPvy3hrN-SXP;q~mBgSE&&$}Cm;e^B&Z0qPf_rOaF>9fl9S*r3m^%S1e%g)R;dyKv=7%9RgryKIpd*;+l9<8017H7NAQR1)aD^*0m5*-J+n1F_|1C_f1Q;i^#5(`lL-l7N{HRolFf-T>E0V$;?|My+30J_Iz zpLewr!jT{!039Ql0(6-JIM6@=r{MJH&Qe>joCru77=J*|D;?tbkcGKg4B4r`njxgN@xNAV#s8F literal 0 HcmV?d00001 diff --git a/lessons/print/index.html b/lessons/print/index.html new file mode 100644 index 00000000..8283d5c8 --- /dev/null +++ b/lessons/print/index.html @@ -0,0 +1,112 @@ +

    Print a chybové hlášky

    +

    Vytvoř v editoru nový soubor, ulož ho do adresáře pro dnešní lekci +pod jménem printing.py a napiš do něj teď už známý příkaz:

    +
    print("Ahoj světe!")
    +

    Program spusť:

    +
      +
    • pokud ti už na začátku příkazové řádky nesvítí (venv), +aktivuj si virtuální prostředí,
    • +
    • pomocí cd donaviguj do adresáře s programem,
    • +
    • zadej python printing.py.
    • +
    +

    Funguje? Doufám, že ano; za chvíli ho vylepšíme.

    +

    Další příkazy

    +

    Zkus do programu postupně, po jednom, přidávat další řádky. +Po přidání každého dalšího print program znovu spusť a vyzkoušej, jestli +funguje.

    +

    Abys nemusel/a v příkazové řádce stále dokola psát python printing.py, +zkus zmáčknout na klávesnici šipku nahoru, . +Vrátíš se tak k předchozímu příkazu, který stačí „odklepnout“ pomocí +Enter.

    +

    Úplně každý příkaz ti asi nebude fungovat hned napoprvé – kdyby program +dělal něco divného, přeskoč na další sekci, jak číst chyby.

    +
    print(1)
    +print(1, 2, 3)
    +print(1 + 1)
    +print(3 * 8)
    +print(10 - 2.2)
    +print(3 + (4 + 6) * 8 / 2 - 1)
    +print('*' * 80)
    +print("Ahoj" + " " + "PyLadies!")
    +print("Součet čísel 3 a 8 je", 3 + 8)
    +print('Máma má mísu')
    +print(V míse je maso.)
    +

    Řetězce

    +

    Proč jsou některé hodnoty v uvozovkách a některé ne? +Pokud chceš v Pythonu pracovat s textem, musíš ho obalit do uvozovek, aby Python +věděl, že se k němu má chovat jinak než například k číslům. +Více se dozvíš později, zatím si zapamatuj, že se takovýto text označuje označuje v programovací +hantýrce jako řetězec.

    +

    Jak číst chyby

    +

    Často zjistíš, že program, který napíšeš, nebude fungovat hned napoprvé. +Počítač je hloupý stroj; pokud instrukce nenapíšeš přesně podle pravidel jazyka +Python, neumí si domyslet, co po něm chceš. +Ale nevěš hlavu, stává se to všem programátorům. +Důležité je vědět, jak chybu najít. +A k tomu ti pomůžou chybové výpisy.

    +

    Pokud program výše opíšeš přesně, vypíše po spuštění následující hlášku:

    +
    +  File "~/pyladies/02/printing.py", line 11
    +    print(V míse je maso.)
    +               ^
    +SyntaxError: invalid syntax
    +

    Při chybě Python napřed zmíní jméno souboru a +číslo řádku, na kterém si chyby všimnul. +Potom vypíše celý řádek s chybou +a nakonec oznámí druh chyby +(v tomto případě je to „syntaktická chyba“) +a případně nějaké bližší upřesnění.

    +

    Pro zvídavé

    +

    Jak se od téhle chyby liší ta, která nastane, když zkusíš sečíst číslo a řetězec? +Nebo když zkusíš dělit nulou?

    +

    Chybové hlášky můžou být ze začátku těžko pochopitelné, +zvyknout se na ně dá asi jenom praxí. +Pro tebe bude ze začátku důležité hlavně ono číslo řádku. +Když víš, že chyba je na řádku 11, +můžeš se podívat na tento řádek a zkusit chybu najít.

    +

    Když chyba není na daném řádku, může být ještě +o pár řádků výš nebo níž: +Python občas nesdílí lidské představy o tom, kde přesně chyba je. +Ukáže jen, kde si jí sám všimnul.

    +

    V našem případě je chyba v tom, že kolem řetězce V míse je maso nejsou uvozovky. +Přidej je a program znovu spusť. +Jestli funguje, gratuluji! +Jinak chybu opět oprav a opakuj, dokud to nebude fungovat :)

    +

    Jak funguje program

    +

    Teď, když program běží, se můžeme podívat, co se při +jeho spuštění vlastně děje. +Je to zatím docela jednoduché: příkazy se provádějí jeden po druhém, +odshora dolů. +Program je jako recept na vaření: seznam instrukcí, které říkají co je potřeba +udělat.

    +

    Zanedlouho budou tvoje programy připomínat spíš recepty na +čarodějné lektvary (počkej do úplňku a pokud je Mars +v konjunkci s Jupiterem, třikrát zamíchej), +ale základní myšlenka je stále stejná: +počítač „čte“ odshora dolů a provádí příkazy jeden po druhém.

    +

    Print a výrazy

    +

    A z jakých že instrukcí se náš „recept“ skládá?

    +

    Ten print, který tu celou dobu používáš, je funkce. +O funkcích se ještě budeme bavit později, +teď stačí vědět, že když napíšeš print +a za to do závorky několik výrazů (angl. expressions) +oddělených čárkou, hodnoty těchto výrazů se vypíšou.

    +

    A co že je ten výraz? +V našem programu máš několik příkladů: +výraz je číslo, řetězec nebo nějaká (třeba matematická) operace +složená z více výrazů. +Třeba výraz 3 + 8 sčítá výrazy 3 a 8.

    +

    V sekci o proměnných se +na výrazy a jejich hodnoty podíváme podrobněji.

    +

    Typografická vsuvka

    +

    Všimni si stylu zápisu: jako v češtině se po otevírací závorce a před +uzavírací závorkou nepíše mezera; na rozdíl od češtiny ale mezera není +mezi print a závorkou.

    +
    print("Ahoj!")
    +

    S čárkou je to jako v češtině: mezeru píšeme po čárce, ale ne před ní:

    +
    print(1, 2, 3)
    +

    Kolem operátorů jako + a / se obyčejně píše jedna mezera zleva a +jedna zprava. Někdy je ale přehlednější obě vynechat:

    +
    print(2 + 8)
    +print("Jedna a půl je", 1 + 1/2)
    +
    \ No newline at end of file diff --git a/lessons/pyglet/had.gif b/lessons/pyglet/had.gif new file mode 100644 index 0000000000000000000000000000000000000000..b06e29c4cacb74ab075a38b72be763b4af2563d4 GIT binary patch literal 10907 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 literal 0 HcmV?d00001 diff --git a/lessons/pyglet/had.png b/lessons/pyglet/had.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3900f71e94be4506eaf5fdc59da5198108e4de GIT binary patch literal 12723 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 z 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 XI*WvsLZ?o500000NkvXXu0mjflJM`; literal 0 HcmV?d00001 diff --git a/lessons/pyglet/index.html b/lessons/pyglet/index.html new file mode 100644 index 00000000..4a7ed63f --- /dev/null +++ b/lessons/pyglet/index.html @@ -0,0 +1,413 @@ +

    Grafika

    +

    Dnes si ukážeme, jak s Pythonem napsat grafickou aplikaci.

    +

    Použijeme knihovnu, která není zabudovaná přímo +v Pythonu (podobně jako pytest, který používáme na testování). +Musíme si ji nejdřív nainstalovat a na to použijeme +v zapnutém virtualenvu modul pip – +konkrétně příkaz python -m pip install pyglet. +U mě vypadá instalace nějak takto:

    +
    (venv)$ python -m pip install pyglet
    +Collecting pyglet
    +  Downloading pyglet-1.2.4-py3-none-any.whl (964kB)
    +Installing collected packages: pyglet
    +Successfully installed pyglet-1.2.4
    +

    Máš-li nainstalováno, zkus napsat a spustit +následující program. Mělo by se objevit černé +okýnko:

    +
    import pyglet
    +window = pyglet.window.Window()
    +pyglet.app.run()
    +print('Hotovo!')
    +

    Jestli okýnko není černé ale je v něm nějaký +„nepořádek“, představuj si zatím, že černé je. +Stává se to hlavně na počítačích s Mac OS a některými +druhy Linuxu. +Než do okýnka začneme kreslit obrázky, nepořádek +uklidíme.

    +

    Hotovo? Pojďme si vysvětlit, co se tu vlastně děje.

    +

    Interaktivní programy

    +

    Podívejme se ještě jednou, jak zhruba vypadá hlavní +program pro Piškvorky, který jsme napsali +na projektech. +V komentářích je napsané, co která část kódu dělá:

    +
    def piskvorky1d():
    +    pole = '-' * 20                 # Příprava hry
    +    while True:                     # Pořád dokola:
    +        pole = tah_hrace(pole)      # 1. Zeptej se na tah
    +        if vyhodnot(pole) != '-':   # 2. Zpracuj tah
    +            break
    +        print(pole)                 # 3. Vypiš stav hry
    +
    +                                    # A znova:
    +        pole = tah_pocitace(pole)   # 1. Zeptej se na tah
    +        if vyhodnot(pole) != '-':   # 2. Zpracuj tah
    +            break
    +        print(pole)                 # 3. Vypiš stav hry
    +

    V tomhle programu máme dva druhy akcí, které se pravidelně střídají. +Jakmile taková akce nastane, ať vstup od člověka nebo +od počítače, tak se zpracuje a výsledný stav se oznámí.

    +

    Podobnou strukturu „reakcí“ jsme použily už dřív, +třeba u hry kámen-nůžky-papír:

    +
      +
    • Nějaká příprava
    • +
    • Dokud program nemá skončit:
        +
      • Načti vstup
      • +
      • Nějak ten vstup vyhodnoť
      • +
      • Vypiš výstup
      • +
      +
    • +
    +

    A podobně funguje většina programů, které nějakým +způsobem reagují na vstup od uživatele nebo i na jiné +události.

    +

    Webový server čeká na požadavek (angl. request) +o webovou stránku. Když nějaký přijme, zpracuje ho +(např. přečte příslušnou stránku z disku) +a jako výstup pošle odpověď.

    +

    Složitější programy reagují na spoustu druhů událostí, +ne jen na „požadavek“ nebo „tah hráče“/„tah počítače“. +Co se stane ve „vyhodnocení vstupu“ pak závisí +na druhu události.

    +

    Webový prohlížeč čeká na kliknutí myši nebo stisk klávesy +a zachová se podle něj – třeba pošle přes Internet +požadavek vzdálenému serveru. +A potom čeká na další akci. Může přijít odpověď od +serveru, a až ta přijde, vykreslí příslušnou stránku +na obrazovku. Nebo může uživatel zmáčknout „STOP“ +a požadavek se zruší.

    +

    Textový editor čeká na různé druhy vstupu z klávesnice +či myši a každý musí nějak zpracovat.

    +

    Prostě, podobná struktura programu – smyčka která +načte vstup, zpracuje ho a vyprodukuje výstup – je velice užitečná. +Říká se jí smyčka událostí (angl. event loop) +a programy na ní postavené jsou +řízené událostmi (angl. event-driven).

    +

    Programátoři jsou líní. +Když je něco užitečné pro více programů, nebývá +zvykem, že to každý programátor v každém programu opakuje. +Napíše se to jednou a dobře, zabalí se to jako tzv. +knihovna (angl. library) +a ostatní to pak můžou používat.

    +

    Pyglet 🐷

    +

    Jedna z takových knihoven je Pyglet. +Obsahuje kromě smyčky událostí taky funkce na +vykreslování 2D grafiky (pomocí jiné knihovny zvané +OpenGL) nebo třeba načítání událostí z klávesnice a myši.

    +

    Pojďme se vrátit k prográmku, který ukazuje okno:

    +
    import pyglet
    +window = pyglet.window.Window()
    +pyglet.app.run()
    +print('Hotovo!')
    +

    Celá smyčka událostí se skrývá ve funkci pyglet.app.run(). +Načtení vstupu (např. z klávesnice) dělá Pyglet sám, +ale jejich zpracování a vykreslení výsledků +už je pro každý program jiné, takže si je budeš muset +naprogramovat sám/sama.

    +

    Zatím pro nás Pyglet zpracovává jen dvě události: +zavření okna (tlačítkem „✕“, které k okýnkům přidává +operační systém) a stisk klávesy Esc, +který taky zavře okno. +Po zavření okna skončí smyčka událostí +(funkce pyglet.app.run()) +a program může pokračovat.

    +

    Text

    +

    Klávesa Esc není příliš zajímavá. +Zkusme reagovat i na jiné klávesy.

    +

    V Pygletu se na události reaguje tak, že napíšeš +funkci a pak ji zaregistruješ (angl. register) – řekneš +Pygletu, aby ji vždy v pravý čas zavolal. +Události, která nastane, když uživatel píše na klávesnici, +se v Pygletu říká on_text a zpracovává se takto:

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +window.push_handlers(on_text=zpracuj_text)
    +
    +pyglet.app.run()
    +

    Co to dělá? window.push_handlers(on_text=zpracuj_text) +řekne Pygletu, že když uživatel něco napíše do našeho okna, +má Pyglet zavolat funkci zpracuj_text. +Tahle funkce pak dostane jako argument text, který uživatel napsal.

    +

    Všimni si, že při registraci nepíšeme +zpracuj_text se závorkami, ačkoli jsme si +kdysi +říkali, že funkce se mají volat. +Vzpomínáš na tenhle příklad? Možná ti tehdy připadal zvláštní.

    +
    from math import sin
    +print(sin(1))
    +print(sin)
    +print(sin + 1)
    +

    Teď, když známe kromě čísel, řetězců a +True/False i soubory, seznamy, +n-tice a kdo ví jaké jiné typy, si můžeme říct, +že funkce je v Pythonu hodnota jako každá jiná. +Čísla se dají násobit, řetězce zapisovat do souboru, +ze souborů se dá číst – a funkce jsou zvláštní jen tím, +že se dají zavolat. +Než ale takovou funkci zavoláme, můžeme ji, tu samotnou +funkci, třeba přiřadit do proměnné:

    +
    vypis = print
    +vypis("Ahoj světe!")
    +

    nebo předat jako argument jiné funkci:

    +
    print(print)
    +

    No a funkce window.push_handlers je přímo +dělaná na to, že jí předáš funkci. +Proč? +Pyglet nepotřebuje jeden výsledek funkce +zpracuj_text – ten moc k ničemu není. +A navíc tu funkci teď ani nemůžeme zavolat; nemáme +vhodný argument text. +Proto Pygletu dáme samotnou funkci, kterou bude sám +volat, kdykoli uživatel stiskne klávesu.

    +

    Čas ⏲

    +

    Ještě jednu událost zpracujme, než se přesuneme ke grafice.

    +

    Bude to takzvaný tik hodin +(angl. clock tick). +To je událost, která nastává pravidelně po nějakém čase.

    +

    Funkce pro tiky se registruje trochu jinak než on_text:

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    print(t)
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +window.push_handlers(on_text=zpracuj_text)
    +
    +pyglet.app.run()
    +

    Co to dělá? pyglet.clock.schedule_interval(tik, 1/30) +řekne Pygletu, že má zavolat funkci tik každou +třicetinu (1/30) vteřiny.

    +

    A funkce tik dostane jeden argument – kolik času +uplynulo od posledního zavolání. +Většinou to není přesně 1/30 vteřiny, ale něco víc. +Počítač má i jiné věci na práci, takže se k naší aplikaci +nemusí dostat hned; a taky Pythonu trvá nějakou tu +tisícinu vteřiny než zařídí samotné zavolání naší funkce.

    +

    A proč vlastně třicetina vteřiny? +Je to kvůli tomu, že potom budeme stavět animace. +Když se nám před očima vystřídá 30 obrázků za vteřinu, +mozek si je spojí a vznikne iluze plynulého pohybu. +
    +Většina filmů používá jen 24 obrázků za vteřinu; +realistické 3D hry až 60.

    +

    Vykreslování 🖌

    +

    +

    Program, který vypisuje na terminál spoustu čísel, +není asi zas tak zajímavý. +Téma téhle stránky je ale grafika, tak se začněme od +terminálu odpoutávat. Pojďme kreslit.

    +

    Najdi si na Internetu nějaký obrázek. Ne moc velký, +tak 3cm, ať je kolem něj v našem černém okýnku dost +místa, a nejlépe ve formátu PNG. Začni třeba na +téhle stránce. +Ale nevybírej obrázek, který je celý černý, protože by v našem černém okně +nebyl vidět. +Ulož si ho do adresáře, odkud spouštíš svůj pythonní +program. Já mám třeba obrázek hada v souboru had.png.

    +

    Pak obrázek vykresli (použij jméno souboru se svým obrázkem):

    +
    import pyglet
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    print(t)
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    print(text)
    +
    +obrazek = pyglet.image.load('had.png')
    +had = pyglet.sprite.Sprite(obrazek)
    +
    +def vykresli():
    +    window.clear()
    +    had.draw()
    +
    +window.push_handlers(
    +    on_text=zpracuj_text,
    +    on_draw=vykresli,
    +)
    +
    +pyglet.app.run()
    +

    Povedlo se?

    +

    Vysvětleme si, co se tady děje:

    +
      +
    • obrazek = pyglet.image.load('had.png') načte ze souboru obrázek
    • +
    • had = pyglet.sprite.Sprite(obrazek) +vytvoří speciální objekt Sprite, +který určuje, že tento obrázek chceme „posadit“ +na určité místo v černém okýnku. +Když neuděláme nic dalšího, bude obrázek čekat v levém rohu.
    • +
    • Funkce vykresli() se stará o vykreslení okna – výstup našeho programu. +Volá se vždycky, když je potřeba okno překreslit – +například když okno minimalizuješ a pak vrátíš +nebo přesuneš částečně ven z obrazovky a pak dáš zase zpět. +A nebo když budeme něco animovat.
    • +
    +

    Některé operační systémy si pamatují i obsah oken, +které nejsou vidět, ale není radno na to spoléhat.

    +
      +
    • window.clear() vyčistí okno – natře ho černou barvou a smaže +všechno, co v něm bylo předtím.
    • +
    +

    Na spoustě počítačů tohle není potřeba. +Ale je lepší psát programy tak, aby +běžely správně kdekoli.

    +
      +
    • had.draw() nakreslí obrázek pomocí předpřipraveného spritu had.
    • +
    • window.push_handlers(on_draw=vykresli) zaregistruje funkci vykresli – +řekne Pygletu, aby ji volal vždy, když je třeba. +
      +Když potřebuješ zaregistrovat pro jedno okno +víc funkcí na obsluhu událostí, +dají se dát funkci push_handlers +takhle najednou.
    • +
    +

    Jakékoli kreslení se musí dělat v rámci kreslící funkce, +kterou Pyglet volá z on_draw. +Jinde funkce jako clear a draw nebudou fungovat správně.

    +

    Animace

    +

    Pojď si teď se Spritem trochu pohrát.

    +

    Do funkce zpracuj_text dej místo printu tento příkaz:

    +
    def zpracuj_text(text):
    +    had.x = 150
    +

    Náš Sprite má atribut (angl. attribute) +x, který určuje jeho x-ovou souřadnici – +jak moc je vpravo od okraje okna. +Tenhle atribut se dá nastavit, jak budeš chtít – nejčastěji +v reakci na nějakou událost, ale často se nastavuje +i na začátku programu.

    +

    Zajímavé je zkusit k x něco přičíst při každém tiknutí hodin. +Dokážeš předpovědět, co udělá tenhle kód?

    +
    def tik(t):
    +    had.x = had.x + t * 20
    +

    Nebojíš-li se matematiky, naimportuj math +a nech obrázek, ať se pohybuje podle nějaké funkce:

    +
    def tik(t):
    +    had.x = had.x + t * 20
    +    had.y = 20 + 20 * math.sin(had.x / 5)
    +

    Co se stane, když začneš měnit ta čísla?

    +

    Co se stane, když zkusíš podobně nastavovat atribut rotation?

    +

    Zavolej později

    +

    +

    Pyglet umí kromě opakovaného „tikání“ zavolat funkci +jednorázově, za určitou dobu.

    +

    Stáhni si (nebo vytvoř) druhý obrázek. Já mám druhého +hada, tentokrát s trochu natočenou hlavou a ocasem.

    +

    Až budeš mít obrázek v adresáři s programem, +přidej těsně před pyglet.app.run() tenhle kus kódu:

    +
    obrazek2 = pyglet.image.load('had2.png')
    +
    +def zmen(t):
    +    had.image = obrazek2
    +
    +pyglet.clock.schedule_once(zmen, 1)
    +

    Volání schedule_once(zmen, 1) říká Pygletu, +že za jednu vteřinu má zavolat funkci zmen. +A funkce změní obrázek – stejně jako se předtím měnily +souřadnice.

    +

    schedule_once se dá volat i v rámci obsluhy jiné události. Zkus funkci zmen +nahradit tímhle:

    +
    def zmen(t):
    +    had.image = obrazek2
    +    pyglet.clock.schedule_once(zmen_zpatky, 0.2)
    +
    +def zmen_zpatky(t):
    +    had.image = obrazek
    +    pyglet.clock.schedule_once(zmen, 0.2)
    +

    Klik 🐭

    +

    Poslední věc, na kterou se tady naučíme reagovat, je klikání. +Těsně před window.push_handlers napiš funkci:

    +
    def klik(x, y, tlacitko, mod):
    +    had.x = x
    +    had.y = y
    +

    … a pak v push_handlers ji zaregistruj +pomocí řádku on_mouse_press=klik,.

    +

    Co znamená který argument, to zkus zjistit sama.

    +

    Nápověda

    +
      +
    • Dokud příkazovou řádku neopustíš úplně, bude fungovat print! +Kdykoliv budeš chtít zjistit nějakou hodnotu, prostě si ji vypiš.
    • +
    • Kolik má myš tlačítek?
    • +
    • Jak se projeví Shift+klik?
    • +
    +

    Pokračování příště

    +

    Koukám že kódu už je dnes tak akorát na ukončení lekce:

    +
    import math
    +
    +import pyglet
    +
    +window = pyglet.window.Window()
    +
    +def tik(t):
    +    had.x = had.x + t * 20
    +
    +pyglet.clock.schedule_interval(tik, 1/30)
    +
    +def zpracuj_text(text):
    +    had.x = 150
    +    had.rotation = had.rotation + 10
    +
    +obrazek = pyglet.image.load('had.png')
    +had = pyglet.sprite.Sprite(obrazek, x=10, y=10)
    +
    +def vykresli():
    +    window.clear()
    +    had.draw()
    +
    +def klik(x, y, tlacitko, mod):
    +    print(tlacitko, mod)
    +    had.x = x
    +    had.y = y
    +
    +window.push_handlers(
    +    on_text=zpracuj_text,
    +    on_draw=vykresli,
    +    on_mouse_press=klik,
    +)
    +
    +obrazek2 = pyglet.image.load('had2.png')
    +
    +def zmen(t):
    +    had.image = obrazek2
    +    pyglet.clock.schedule_once(zmen_zpatky, 0.2)
    +
    +def zmen_zpatky(t):
    +    had.image = obrazek
    +    pyglet.clock.schedule_once(zmen, 0.2)
    +
    +pyglet.clock.schedule_once(zmen, 0.2)
    +
    +pyglet.app.run()
    +

    Se vstupem z klávesnice a myši, časováním a vykreslováním +Spritu si vystačíš u leckteré hry nebo grafické aplikace.

    +

    Až budeš nějakou hru dělat, zkus udržovat +stav aplikace v seznamech a n-ticích (případně +slovnících a třídách, které se naučíme později). +Jedna funkce by měla umět takový stav vykreslit a +jiné s ním pak budou manipulovat. +Tyhle dvě sady funkcí můžeš mít i v jiných souborech, +aby se nezapletly dohromady.

    +

    Zajímá-li tě toto téma, zkus si zahrát přiloženou hru +Pong, +která ukazuje některé další +možnosti Pygletu: psaní textu, kreslení obdélníků +a obsluhu jednotlivých kláves (např. šipek). +Na první pohled může její kód vypadat složitě, +ale zkus si k němu sednout a s pomocí komentářů ho pochopit. +Kdyby komentáře nestačily, jsou k Pongu připravené +i podrobné materiály.

    +

    To, co jsme tu probrali a pár věcí navíc, +je shrnuto v taháku na Pyglet, +který si můžeš stáhnout a vytisknout.

    +

    A chceš-li se do Pygletu ponořit hlouběji, +existuje pro něj dokumentace. +Nebude-li ti v ní něco jasné, zeptej se!

    \ No newline at end of file diff --git a/lessons/pyglet/pong.py b/lessons/pyglet/pong.py new file mode 100644 index 00000000..e11e760f --- /dev/null +++ b/lessons/pyglet/pong.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python3 +"""Hra typu Pong + +Graficka hra pro dva hrace. Kazdy hrac ovlada "palku" na sve strane hriste, +a snazi se odpalit micek na protivnikovu stranu. + +Ovladani: +Hrac 1: klavesy W a S +Hrac 2: sipky Nahoru a Dolu +Konec: Esc + + +Hra pouziva gravickou knihovnu Pyglet, coz je Pythonova nadstavba nad OpenGL. + +Souradny system okynka je nasledujici:: + + y ^ + | + VYSKA +---------------------------------------+ + | : | + | : | + | : | + | ; [] | + |] ; [| + |] ; [| + |] ; [| + |] ; [| + | ; | + | : | + | ; | + | ; | + 0 +---------------------------------------+------> x + : : : + 0 SIRKA/2 SIRKA + +Pozor pokud mate zkusenosti s nekterymi grafickymi programy, nebo 2D +knihovnami. OpenGL pouziva matematicky souradny system, nula je vlevo *dole*. + +""" + +# Prvni radek (#!/usr/bin/env python3) je takzvany "shebang": na systemech +# zalozenych na Unixu (Linux, OS X) umoznuje spustit tenhle soubor jednoduse +# pomoci prikazu: ./pong.py + +# A ted uz k samotne hre: napred naimportujeme potrebne veci z knihovny pyglet + +import random + +import pyglet +from pyglet import gl +from pyglet.window import key + + +# Nejake konstanty: + +# Velikost okna (v pixelech) +SIRKA = 900 +VYSKA = 600 + +VELIKOST_MICE = 20 +TLOUSTKA_PALKY = 10 +DELKA_PALKY = 100 +RYCHLOST = 200 # v pixelech za sekundu +RYCHLOST_PALKY = RYCHLOST * 1.5 # taky v pixelech za sekundu + +DELKA_PULICI_CARKY = 20 +VELIKOST_FONTU = 42 +ODSAZENI_TEXTU = 30 + + +# Stav hry si budeme pamatovat v globalnich promennych. +# Profesionalni programator se nad tim zhrozi, ale pro nas je to tak zatim +# jednodussi. +# Jen nezapomente ze prikaz jako: +# pozice_mice = [0, 0] +# ve funkci by vytvoril novou lokalni promennou, ktera by s globalni +# `pozice_mice` nemela nic spolecneho. Oproti tomu prikaz jako: +# pozice_mice[0] = 0 +# nastavi prvni prvek globalni `pozice_mice`. + +pozice_palek = [VYSKA // 2, VYSKA // 2] # vertikalni pozice dvou palek +pozice_mice = [0, 0] # x, y souradnice micku -- nastavene v reset() +rychlost_mice = [0, 0] # x, y slozky rychlosti micku -- nastavene v reset() +stisknute_klavesy = set() # sada stisknutych klaves +skore = [0, 0] # skore dvou hracu + +# Pozice palek a micku vzdy bude urcovat stred daneho obdelnicku. + + +def reset(): + """Nastav pocatecni stav + + Tahle funkce se bude volat na zacatku programu, a taky potom co nektery + z hracu prohraje. + Funkce da micek doprostred obrazovky a da mu nahodnou rychlost. + + N.B. Neresetujeme tady skore ani pozici palek; ty zustavaji do dalsiho kola + """ + pozice_mice[0] = SIRKA // 2 + pozice_mice[1] = VYSKA // 2 + + # x-ova rychlost - bud vpravo, nebo vlevo + if random.randint(0, 1): + rychlost_mice[0] = RYCHLOST + else: + rychlost_mice[0] = -RYCHLOST + # y-ova rychlost - uplne nahodna + rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST + + +def obnov_stav(dt): + """Spocitej novy stav hry + + Tahle funkce se vola mockrat za sekundu. V parametru ``dt`` dostane cas + v sekundach od posledniho zavolani. Pocitac je rychly, proto to + vetsinou bude velice male cislo - kolem sedesatiny sekundy (0.0167). + """ + # Jak zname z fyziky, micek s rychlosti `v` se za cas `t` pohne o `v*t`. + # Tenhle vyraz muzeme rozlozit pro slozky x, y. + pozice_mice[0] += rychlost_mice[0] * dt + pozice_mice[1] += rychlost_mice[1] * dt + + # odraz od spodni hrany + # Kdyz je micek prilis "nizko", odrazi se, a zacne se pohybovat nahoru. + # To znamena ze bude mit kladnou y-ovou slozku rychlosti. + # x-ova slozka (vpravo/vlevo) se nezmeni. + if pozice_mice[1] < VELIKOST_MICE // 2: + rychlost_mice[1] = abs(rychlost_mice[1]) + + # odraz od vrchni hrany + # To same, ale micek je moc vysoko a musi se zacit pohybovat dolu. + if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2: + rychlost_mice[1] = -abs(rychlost_mice[1]) + + # pohyb palek - cyklus se projde dvkrat; jednou pro kazdou palku + for cislo_palky in (0, 1): + # pohyb podle klaves (viz funkce `stisk_klavesy`) + if ('nahoru', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt + if ('dolu', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt + + # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum + if pozice_palek[cislo_palky] < DELKA_PALKY / 2: + pozice_palek[cislo_palky] = DELKA_PALKY / 2 + # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum + if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2: + pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2 + + # odrazeni micku + # Pokud je micek prilis vlevo, muze se budto odrazit od leve palky, anebo + # tam palka neni a levy hrac prohral. Podobne pro pravou stranu. + # Doporucuju si to nakreslit na papir :) + + # nejdriv si poznamename minimalni a maximalni pozici, kde musi byt palka + # (t.j. stred palky), aby odrazila micek. + palka_min = pozice_mice[1] - VELIKOST_MICE/2 - DELKA_PALKY/2 + palka_max = pozice_mice[1] + VELIKOST_MICE/2 + DELKA_PALKY/2 + + # odrazeni vlevo + if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2: + if palka_min < pozice_palek[0] < palka_max: + # palka je na spravnem miste, odrazime micek + rychlost_mice[0] = abs(rychlost_mice[0]) + else: + # palka je jinde nez ma byt, hrac prohral + skore[1] += 1 + reset() + + # odrazeni vpravo + if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2): + if palka_min < pozice_palek[1] < palka_max: + rychlost_mice[0] = -abs(rychlost_mice[0]) + else: + skore[0] += 1 + reset() + + +def nakresli_obdelnik(x1, y1, x2, y2): + """Nakresli obdelnik na dane souradnice + + Nazorny diagram:: + + y2 - +-----+ + |/////| + y1 - +-----+ + : : + x1 x2 + """ + # Tady pouzivam volani OpenGL, ktere je pro nas zatim asi nejjednodussi + # na pouziti + gl.glBegin(gl.GL_TRIANGLE_FAN) # zacni kreslit spojene trojuhelniky + gl.glVertex2f(int(x1), int(y1)) # souradnice A + gl.glVertex2f(int(x1), int(y2)) # souradnice B + gl.glVertex2f(int(x2), int(y2)) # souradnice C, nakresli trojuhelnik ABC + gl.glVertex2f(int(x2), int(y1)) # souradnice D, nakresli trojuhelnik BCD + # dalsi souradnice E by nakreslila trojuhelnik CDE, atd. + gl.glEnd() # ukonci kresleni trojuhelniku + + +def nakresli_text(text, x, y, pozice_x): + """Nakresli dany text na danou pozici + + Argument ``pozice_x`` muse byt "left" nebo "right", udava na kterou stranu + bude text zarovnany + """ + # Texty umi vypisovat Pyglet, a to tak, ze vytvorime objekt "napis" + # a pak ho nakreslime. + # (Normalne bychom tenhle objekt udelali jednou, a pak v nem jen menili + # text a vykreslovali ho, ale pro jednoduchost si ho vytvorime tady:) + napis = pyglet.text.Label( + text, + font_name='League Gothic', + font_size=VELIKOST_FONTU, + x=x, y=y, anchor_x=pozice_x) + napis.draw() + + +def vykresli(): + """Vykresli stav hry""" + gl.glClear(gl.GL_COLOR_BUFFER_BIT) # smaz obsah okna (vybarvi na cerno) + gl.glColor3f(1, 1, 1) # nastav barvu kresleni na bilou + + # micek + nakresli_obdelnik( + pozice_mice[0] - VELIKOST_MICE // 2, + pozice_mice[1] - VELIKOST_MICE // 2, + pozice_mice[0] + VELIKOST_MICE // 2, + pozice_mice[1] + VELIKOST_MICE // 2) + + # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic + # v tom seznamu palku vykreslime + for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] : + nakresli_obdelnik( + x - TLOUSTKA_PALKY, + y - DELKA_PALKY // 2, + x + TLOUSTKA_PALKY, + y + DELKA_PALKY // 2) + + # prerusovana pulici cara - slozena ze spousty malych obdelnicku + for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2): + nakresli_obdelnik( + SIRKA // 2 - 1, + y, + SIRKA // 2 + 1, + y + DELKA_PULICI_CARKY) + + # A nakonec vypiseme skore obou hracu + nakresli_text(str(skore[0]), + x=ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='left') + + nakresli_text(str(skore[1]), + x=SIRKA - ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='right') + + +def stisk_klavesy(symbol, modifikatory): + """Osetri stisknuti klavesy + + Kdyz hrac stiskne spravnou klavesu, do mnoziny ``stisknute_klavesy`` se + prida dvojice (n-tice) tvaru (smer, cislo palky). + Program pak muze pohybovat palkou podle toho, co je v mnozine. + """ + if symbol == key.W: + stisknute_klavesy.add(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.add(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.add(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.add(('dolu', 1)) + # N.B. klavesu ESC Pyglet osetri sam: zavre okno a ukonci funkci run() + + +def pusteni_klavesy(symbol, modifikatory): + """Osetri pusteni klavesy + + Opak funkce ``stisk_klavesy`` -- podle argumentu vynda prislusnou + dvojici z mnoziny. + """ + # Vsimnete si pouziti funkce ``discard``: na rozdil od ``remove`` + # nezpusobi chybu, kdyz prvek v mnozine neni. Takze program nespadne, + # kdyz napr. uzivatel zmackne klavesu, pak se prepne do naseho okna, + # a pak teprve klavesu pusti. + if symbol == key.W: + stisknute_klavesy.discard(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.discard(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.discard(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.discard(('dolu', 1)) + # Mimochodem, funkce pusteni_klavesy a stisk_klavesy by se daly hodne + # zjednodusit pomoci slovniku. Zkusite to? + +# Nastavime prvotni stav +reset() + +# Vytvorime okno, do ktereho budeme kreslit +window = pyglet.window.Window(width=SIRKA, height=VYSKA) + +# Oknu priradime par funkci, ktere budou reagovat na udalosti. +# Kdyz napr. uzivatel zmackne klavesu na klavesnici, +# Pyglet zavola funkci, kterou tady zaregistrujeme pod `on_key_press`, +# a preda ji prislusne argumenty. +# Jake vsechny udalosti muzou nastat, a jake argumenty se predaji prislusne +# funkci, se doctete v dokumentaci Pygletu, +# nebo pomoci `help(pyglet.window.event)`. +window.push_handlers( + on_draw=vykresli, # na vykresleni okna pouzij funkci `vykresli` + on_key_press=stisk_klavesy, # po stisknuti klavesy zavolej `stisk_klavesy` + on_key_release=pusteni_klavesy, # a mame i funkci na pusteni klavesy + ) + +# Jeste mame jednu podobnou funkci, kterou ale neprirazujeme primo +# oknu. Misto toho chceme aby ji Pyglet zavolal vzdycky kdyz "tiknou hodiny" +pyglet.clock.schedule(obnov_stav) + +pyglet.app.run() # vse je nastaveno, at zacne hra +# (funkce run() bude porad dokola volat obnov_stav, vykresli, a kdyz se mezitim +# neco stane, zavola navic funkci kterou jsme nastavili jako reakci na +# danou udalost) diff --git a/lessons/pyqt/basic-screenshot.png b/lessons/pyqt/basic-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ece64175f5da02af7608f4ec92be6441789dabd6 GIT binary patch literal 52134 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 w!-xJcJSk3zUX7$6eRcf$ipL+9T=_{PKbZj9GUI v Pythonu: PyQt5 +

    Způsobů, jak dělat v Pythonu aplikace s GUI, je mnoho. Dá se použít zabudovaný, ale ošklivý Tkinter, nebo nějaký externí framework.

    +

    V tomto cvičení budeme používat framework Qt, protože je multiplatformní, používá se i v jiných oblastech, než je Python, +je dostatečně robustní a dá se na většinu systémů nainstalovat bez větších problémů.

    +

    Pomocí aplikace Qt Designer se dá navíc základní kostra GUI poměrně jednoduše naklikat, takže není nutné psát layout aplikace v kódu.

    +

    Instalace

    +

    Na tomto cvičení budete potřebovat balíček PyQt5 a aplikaci Qt5 Designer. +Pokud budete používat svůj počítač, prosíme vás o instalaci již předem, na cvičení toho bude opravdu hodně a nemůžeme si dovolit plýtvat časem.

    +

    PyQt5

    +

    Pokud máte Python alespoň 3.5 a jednu z platforem, pro které je připraven wheel na PyPI, stačí udělat:

    +
    (__venv__) $ python -m pip install --upgrade pip
    +(__venv__) $ python -m pip install PyQt5
    +

    Pro starší verzi Pythonu nebo 32bitový Linux to ale nebude fungovat. +V takovém případě můžete PyQt5 zkusit najít v balíčkovacím systému vaší distribuce (např. balíček python3-qt5 ve Fedoře nebo python3-pyqt5 v Debianu). +Virtualenv pak může vytvořit s přepínačem --system-site-packages, který zajistí, že i z virtualenvu uvidíte PyQt5 nainstalované z distribučního balíčku.

    +
    $ python3 -m venv --system-site-packages __venv__
    +

    Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů +(návod).

    +

    První aplikace níže by vám měla fungovat.

    +

    Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

    +

    Qt5 Designer

    +

    Na Linuxu najdete Qt5 Designer v balíčkách, třeba qt5-designer na Fedoře nebo qttools5-dev-tools na Debianu.

    +

    Na Windows (i na Macu) si můžete stáhnout instalátor Qt 5, který (doufáme) nainstaluje i Designer.

    +

    Pokud používáte na Macu homebrew, můžete to udělat i takto:

    +
    $ brew install qt5
    +$ brew linkapps qt5
    +

    Existují i Python wheely pyqt5-tools pro Windows obsahující Qt5 Designer. +Ten je pak potřeba pro spuštění dohledat v nainstalované lokaci.

    +

    NumPy

    +

    Do virtuálního prostředí s PyQt5 si nainstalujte i NumPy:

    +
    $ python -m pip install numpy
    +

    První aplikace

    +

    Napište si první aplikaci, ať vidíte, jak kód v PyQt vypadá. +Detaily toho, jak to funguje, si ukážeme později.

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +button = QtWidgets.QPushButton("Click to Exit")
    +button.setWindowTitle("Goodbye World")
    +button.clicked.connect(app.quit)
    +
    +button.show()
    +
    +app.exec()
    +

    O Qt, PyQt a PySide

    +

    Qt je aplikační framework napsaný v C++, který zjednodušuje psaní multiplatformních aplikací (od počítačů s Linuxem, Mac OS či Windows po různá vestavěná zařízení).

    +

    PyQt je knihovna, která umožňuje použít Qt z Pythonu. +Na rozdíl od samotného Qt je licencovaná pod GNU GPL v3, která (stručně řečeno) vyžaduje, aby programy napsané s použitím PyQt byly šířeny pod stejnou licencí a se zdrojovým kódem. +Tedy: kdokoliv, kdo dostane kopii programu, musí mít možnost dostat odpovídající zdrojový kód a má možnost tento kód dál šířit pod stejnou licencí.

    +

    Pokud by se vám tato licence nelíbila, je možnost použít PySide, které má permisivnější licenci a téměř stejné API jako PyQt, ale není tak stabilní.

    +

    Moduly Qt

    +

    Qt je rozděleno na několik tzv. modulů. +Pro grafická uživatelská rozhraní (GUI), kterými se budeme zabývat, použijeme hlavně QtGui a QtWidgets.

    +

    Dále je tu modul QtCore, který obsahuje mj. základní datové typy jako QString a QList (které PyQt +automaticky převádí na pythonní ekvivalenty a zpět) nebo třeba QRect – abstraktní obdélník.

    +

    Další moduly jsou nadstavby od vykreslování SVG nebo práci s multimédii (které se můžou hodit) po +třeba práci s SQL a XML nebo síťovou komunikaci, kde je pro Python pohodlnější použít jiné knihovny.

    +

    Specifika PyQt

    +

    Ačkoli se Qt dá použít z Pythonu, bohužel zjistíte, že ne všechno funguje a vypadá tak, jako kdyby to byla knihovna od základů napsaná pro Python. +Tady jsou některé zvláštnosti, na které se můžete připravit.

    +

    Jména a dokumentace

    +

    Qt pojmenovává funkce, metody a atributy konvencí camelCase, místo pythonistického snake_case. +PyQt tuto konvenci nemění: je užitečnější používat identická jména, a kromě toho knihovna PyQt vznikla ještě před PEP 8.

    +

    Hledáte-li dokumentaci, doporučuji zadat do vyhledávače qt5 <hledaný objekt>. +Dostanete se tak na dokumentaci pro C++ (např. QObject). +Hledáte-li pyqt5 <hledaný objekt>, dostanete se k dokumentaci pro Python, která ale většinou obsahuje doslova to samé +co verze pro C++ (např. pro QObject). +Občas však můžete narazit na nekompletní dokumentaci (např. pro QAbstractButton).

    +

    Rozdíly mezi C a pythonní verzí jsou většinou intuitivní (např. None místo NULL), ale jsou popsány +v dokumentaci PyQt.

    +

    Atributy

    +

    Qt zásadně používá pro přístup k atributům objektů funkce. +Funkce pro čtení se typicky jmenuje podle atributu, funkce pro nastavení má předponu set. +Namísto pythonního c = obj.color a obj.color = ... tedy použijeme c = obj.color() a obj.setColor(...).

    +

    Správa paměti

    +

    Python a C++/Qt mají, bohužel, rozdílný přístup ke správě paměti. +Python používá reference counting a garbage collection. +C++ má objekty s destruktory, což Qt zjednodušuje (alespoň pro C++) stromem vlastnictví.

    +

    Základní třída v Qt, ze které dědí téměř všechny ostatní, je QObject. +Ten má seznam potomků (children), o které se „stará“, a když uvolníme rodiče, uvolní se rekurzivně i všichni potomci. +Z Pythonu pak můžeme dostat chybu wrapped C/C++ object has been deleted. +Jinak ale kombinace QObject a pythonních objektů funguje dobře.

    +

    Větší problémy můžou nastat s pomocnými objekty, které nedědí z QObject a nemají potřebné „dynamické“ vlastnosti. +Takový objekt doporučujeme používat jen v rámci jedné funkce (t.j. neukládat si ho jinde), pokud si nejste jistí že +ho „nevlastníte“ i ve smyslu C++/Qt.

    +

    Občas se stane, že program spadne pro chybu jako nepovolený přístup do paměti. +Bez hlubší znalosti Qt a PyQt se taková chyba odstraňuje poměrně těžko, ale vaše znalosti C++ (z jiných kurzů) +a CPython C API (z minula) vám v tom pomůžou. +Doporučujeme dělat malé commity a psát jednoduchý kód.

    +

    Smyčka událostí, signály a sloty

    +

    Qt funguje na principu smyčky událostí (event loop). +Metoda QApplication.exec obsahuje v podstatě nekonečnou smyčku, která čeká na externí události (klik myši, +žádost OS o vykreslení okna atd.) a na jejich základě volá příslušné funkce – ať už interní +nebo námi definované.

    +

    Pro komunikaci mezi objekty v rámci aplikace pak Qt používá mechanismus signálů a slotů (variantu observer pattern). +Signál je vyslán (emitted) při události jako kliknutí na tlačítko, výběr položky z menu, zavření okna atp. +K signálu může být připojeno několik slotů, což jsou funkce, které se po vyslání signálu zavolají. +Kód, který vysílá signál, obecně neví o tom, kolik slotů je připojeno (a jsou-li nějaké).

    +

    V C++ jsou signály a sloty vždy staticky nadefinované na nějaké třídě, která dědí z QObject. +V PyQt takto musí být nadefinovány jen signály; za slot poslouží jakákoli pythonní funkce.

    +

    V příkladu výše jsme připojili signál clicked tlačítka na slot quit aplikace. +Stejně bychom mohli připojit jakoukoli funkci/metodu, která bere správný počet argumentů – v následujícím případě nula:

    +
        button.clicked.connect(lambda: print('Exiting program'))
    +

    V C++ je časté přetěžování funkcí (včetně signálů), což Pythonistům občas ztěžuje život. +PyQt většinou automaticky vybere variantu signálu podle připojené funkce, ale ne vždy je to možné.

    +

    Ukažme si to na následujícím kódu, který napojuje funkci print na dvě varianty signálu QComboBox.activated. +Ten se vyšle při výběru položky ze seznamu buď jako QComboBox.activated[int], kdy předává index vybrané položky, +nebo jako QComboBox.activated[str], kdy předává text položky:

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +# QComboBox - políčko pro výběr z několika možností
    +box = QtWidgets.QComboBox()
    +box.addItem('First Option')
    +box.addItem('Second Option')
    +
    +# Základní varianta napojí na activated[int]
    +box.activated.connect(print)
    +
    +# Výběr varianty signálu pomocí hranatých závorek
    +box.activated[str].connect(print)
    +box.activated[int].connect(print)
    +
    +box.show()
    +
    +app.exec()
    +

    Skládání GUI

    +

    Základní způsob, jak v Qt vytvářet grafické rozhraní, je skládání funkčních prvků (widgets) do +hierarchie oken, skupin a panelů.

    +

    Základní třída pro funkční prvky, QWidget, dědí z už zmíněného QObject. +Každý QObject může obsahovat potomky (children), a v případě QWidget se potomci vykreslují +jako součást svého rodiče. +Navíc může mít každý widget tzv. layout, který určuje pozici a velikost widgetů, které jsou +do něj přidané.

    +

    Ukažme to v kódu:

    +
    from PyQt5 import QtWidgets
    +
    +app = QtWidgets.QApplication([])
    +
    +# Hlavní okno
    +main = QtWidgets.QWidget()
    +main.setWindowTitle('Hello Qt')
    +
    +# Layout pro hlavní okno
    +layout = QtWidgets.QHBoxLayout()
    +main.setLayout(layout)
    +
    +# Nápis
    +label = QtWidgets.QLabel('Click the button to change me')
    +# Přidáním do layoutu se nápis automaticky stane potomkem hlavního okna
    +layout.addWidget(label)
    +
    +# Tlačítko
    +button = QtWidgets.QPushButton('Click me')
    +layout.addWidget(button)
    +
    +# Funkcionalita
    +def change_label():
    +    label.setText('Good job. +100 points.')
    +
    +button.clicked.connect(change_label)
    +
    +# Spuštění
    +main.show()
    +app.exec()
    +

    Zabudovaných layoutů i widgetů existuje spousta, jednodušší +programy stačí „poskládat“ z nich a napojit je na logiku. +Pro složitější programy jsou pak možnosti, jak si widgety přizpůsobit.

    +

    Qt Designer

    +

    Na tomto cvičení si připravíme aplikaci pro editaci dlaždicových map (tile maps) +– obrázků složených z omezené nabídky čtverečků („dlaždic“), +známých mj. ze starých her.

    +

    Aplikace bude mít část s mapou, paletu pro výběr dlaždice ke kreslení a navíc +menu a panel nástrojů pro akce jako ukládání a otevírání souborů:

    +

    Obrázek aplikace

    +

    Vytvářet GUI v kódu je poměrně neefektivní, a tak existuje nástroj, kde si okna můžeme „naklikat“. +Jmenuje se Qt Designer a měli byste ho mít nainstalovaný. +Na školních počítačích se spouští příkazem designer -qt=5.

    +

    Spustíme Designer a vytvoříme v něm nové Main Window. +Do něj si z palety přidáme Scroll Area a doprava vedle něj List Widget. +Poté aplikujeme layout: na volnou plochu okna klikneme pravým tlačítkem a vybereme Lay Out ‣ Horizontally. +(Dá se to udělat i tlačítkem v liště.)

    +

    Pomocí Ctrl+R lze zkontrolovat, jak okno vypadá a jak reaguje na změny velikosti.

    +

    Potom přidáme položku do menu: místo Type Here napíšeme Map a pod něj podobně přidáme položky New a Quit.

    +

    V panelu Property Editor jde měnit vlastnosti jednotlivých prvků. +U skrolovacího okna nastavíme objectName na scrollArea. +U ListWidget nastavíme objectName na palette a sizePolicy ‣ Horizontal na Preferred. +V panelu ActionEditor najdeme položky pro New a Quit a nastavíme jim objectName na actionNew, resp. actionQuit.

    +

    Potom přes pravé tlačítko na nevyužité ploše okna přidáme lištu nástrojů (Add Toolbar) a z panelu +Action Editor do něj akci actionQuit přetáhneme.

    +

    Pomocí Ctrl+R opět zkontrolujeme, jak okno vypadá a jak po nastavení sizePolicy reaguje na změny velikosti.

    +

    V Designeru jde i napojovat signály. V panelu Signal/Slot Editor přidáme tento řádek:

    +
      +
    • Sender: actionQuit
    • +
    • Signal: triggered()
    • +
    • Receiver: MainWindow
    • +
    • Slot: close()
    • +
    +

    Pomocí Ctrl+R jde ověřit, že zavírání okna funguje.

    +

    Návrh okna uložíme do souboru mainwindow.ui.

    +

    Soubor s návrhem jde převést na pythonní zdrojový soubor pomocí programu pyuic5 nebo +ho vždy načíst přímo z programu. +My použijeme druhou variantu, je však dobré o pyuic5 vědět, kdybyste někdy potřebovali +základ pro vytváření UI v kódu (např. na vytvoření sady několika podobných tlačítek v cyklu).

    +

    Načíst .ui soubor z programu do předpřipraveného okna QMainWindow lze pomocí funkce uic.loadUi:

    +
    from PyQt5 import QtWidgets, uic
    +
    +def main():
    +    app = QtWidgets.QApplication([])
    +
    +    window = QtWidgets.QMainWindow()
    +
    +    with open('mainwindow.ui') as f:
    +        uic.loadUi(f, window)
    +
    +    window.show()
    +
    +    return app.exec()
    +
    +main()
    +

    Vlastní widget - Grid

    +

    Qt neobsahuje předpřipravený widget na dlaždicové mapy. Musíme si tedy vyrobit vlastní.

    +

    Mapu budeme reprezentovat jako NumPy matici (viz lekce o NumPy). +Zatím budeme používat dva druhy dlaždic: trávu (v matici reprezentovanou jako 0) a zeď (-1).

    +

    Velikost widgetu se zadává v pixelech. Musíme ho udělat dostatečně velký, aby se do něj vešla všechna políčka mapy. +Velikost jednoho políčka v pixelech zvolíme pro jednoduchost konstantou.

    +

    Souřadnice v Qt jsou v pixelech ve formě (x, y) – klasicky jak jsme zvyklí, x je horizontální souřadnice – +kdežto matice je uložená po políčkách (řádek, sloupec). +Abychom se v tom neztratili, je dobré hned ze začátku udělat funkce pro převod mezi souřadnými systémy +a důsledně rozlišovat (x, y) vs. (row, column).

    +
    CELL_SIZE = 32
    +
    +
    +def pixels_to_logical(x, y):
    +    return y // CELL_SIZE, x // CELL_SIZE
    +
    +
    +def logical_to_pixels(row, column):
    +    return column * CELL_SIZE, row * CELL_SIZE
    +
    +
    +class GridWidget(QtWidgets.QWidget):
    +    def __init__(self, array):
    +        super().__init__()  # musíme zavolat konstruktor předka
    +        self.array = array
    +        # nastavíme velikost podle velikosti matice, jinak je náš widget příliš malý
    +        size = logical_to_pixels(*array.shape)
    +        self.setMinimumSize(*size)
    +        self.setMaximumSize(*size)
    +        self.resize(*size)
    +

    GridWidget vložíme do QScrollArea, kterou jsme si vytvořili v Qt Designeru:

    +
    import numpy
    +
    +    ...
    +
    +    # mapa zatím nadefinovaná rovnou v kódu
    +    array = numpy.zeros((15, 20), dtype=numpy.int8)
    +    array[:, 5] = -1  # nějaká zeď
    +
    +    # získáme oblast s posuvníky z Qt Designeru
    +    scroll_area = window.findChild(QtWidgets.QScrollArea, 'scrollArea')
    +
    +    # dáme do ní náš grid
    +    grid = GridWidget(array)
    +    scroll_area.setWidget(grid)
    +
    +    ...
    +

    Po spuštění aplikace zatím nic nového neuvidíte, maximálně se trochu změní posuvníky. +Potřebujeme ještě zařídit, aby se data z matice vykreslovala do gridu. +Nejlepší je vykreslovat, kdykoliv nás OS (nebo Qt) vyzve, že potřebuje kus okna překreslit: +při prvním zobrazení, odminimalizování okna, ukázání nové části mapy přes scrollování. +Také je zbytečné vykreslovat obrázky mimo oblast, kterou je vidět na obrazovce.

    +

    K tomuto účelu nám poslouží událost (event). +Jak bylo řečeno v úvodu, na rozdíl od signálů a slotů, které zajišťují komunikaci v rámci aplikace, +události vznikají mimo aplikaci. +Jde například o kliknutí myší (mouse*Event), vstup z klávesnice (key*Event) +nebo žádost OS o překreslení okna (paintEvent). +Na poslední jmenovanou událost, paintEvent, teď budeme reagovat.

    +

    Události se obsluhují předefinováním příslušné metody, která jako argument bere objekt popisující +danou událost.

    +

    V rámci reakce na událost paintEvent můžeme používat QPainter, objekt, který generalizuje kreslení +na různé „povrchy“ jako widgety, obrázky, nebo i instrukce pro tiskárnu.

    +
    from PyQt5 import QtWidgets, QtGui, QtCore, uic
    +
    +
    +class GridWidget(QtWidgets.QWidget):
    +
    +    ...
    +
    +    def paintEvent(self, event):
    +        rect = event.rect()  # získáme informace o překreslované oblasti
    +
    +        # zjistíme, jakou oblast naší matice to představuje
    +        # nesmíme se přitom dostat z matice ven
    +        row_min, col_min = pixels_to_logical(rect.left(), rect.top())
    +        row_min = max(row_min, 0)
    +        col_min = max(col_min, 0)
    +        row_max, col_max = pixels_to_logical(rect.right(), rect.bottom())
    +        row_max = min(row_max + 1, self.array.shape[0])
    +        col_max = min(col_max + 1, self.array.shape[1])
    +
    +        painter = QtGui.QPainter(self)  # budeme kreslit
    +
    +        for row in range(row_min, row_max):
    +            for column in range(col_min, col_max):
    +                # získáme čtvereček, který budeme vybarvovat
    +                x, y = logical_to_pixels(row, column)
    +                rect = QtCore.QRectF(x, y, CELL_SIZE, CELL_SIZE)
    +
    +                # šedá pro zdi, zelená pro trávu
    +                if self.array[row, column] < 0:
    +                    color = QtGui.QColor(115, 115, 115)
    +                else:
    +                    color = QtGui.QColor(0, 255, 0)
    +
    +                # vyplníme čtvereček barvou
    +                painter.fillRect(rect, QtGui.QBrush(color))
    +

    Nyní by již mapa měla být v okně vidět barevně.

    +

    Obrázky

    +

    Protože barvičky jsou příliš nudné, přidáme do mapového widgetu obrázky.

    +

    Veškerou, ke cvičení i k úkolu potřebnou, grafiku najdete na GitHubu. +Je k dispozici pod public domain (tj. „dělej si s tím, co chceš“), pochází ze studia Kenney +a je (společně se další volně licencovanou grafikou) ke stažení z OpenGameArt.org.

    +

    Zatím budeme potřebovat jen dva obrázky:

    + +

    Nejprve si načteme SVG soubory jako objekty QSvgRenderer:

    +
    from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg, uic
    +
    +SVG_GRASS = QtSvg.QSvgRenderer('grass.svg')
    +SVG_WALL = QtSvg.QSvgRenderer('wall.svg')
    +

    A poté je na správných místech vyrendrujeme:

    +
                    ...
    +                rect = QtCore.QRectF(x, y, CELL_SIZE, CELL_SIZE)
    +
    +                # podkladová barva pod poloprůhledné obrázky
    +                white = QtGui.QColor(255, 255, 255)
    +                painter.fillRect(rect, QtGui.QBrush(white))
    +
    +                # trávu dáme všude, protože i zdi stojí na trávě
    +                SVG_GRASS.render(painter, rect)
    +
    +                # zdi dáme jen tam, kam patří
    +                if self.array[row, column] < 0:
    +                    SVG_WALL.render(painter, rect)
    +

    Model/View

    +

    Nyní trochu odbočíme a povíme si krátce o dalším podsystému Qt: o modelech.

    +

    Qt obsahuje framework, který mapuje informace do podoby tabulek, seznamů nebo obecných stromů. +Vzniklé modely se potom dají zobrazit ve specializovaných widgetech. +Samotná data můžou být uložena kdekoli – v paměti, SQL databázi, souborech a podobně. +Dokonce nemusí být všechna dostupná: existuje vestavěný model pro souborový systém, +který se dá zobrazit aniž by se procházely všechny soubory. +Když je informace potřeba, model se postará o její načtení. +Pomocí modelů a modelových widgetů lze informace i měnit, a pokud je model +zobrazen ve více widgetech zároveň, změny se projeví ve všech.

    +

    Obecné modely je bohužel relativně obtížné implementovat v Pythonu, protože používají třídy, +které nedědí z QObject, takže je potřeba sledovat, jestli je „vlastní“ Python nebo C++. +Naštěstí ale existují widgety se zabudovanými modely, které obsahují i samotná data. +Tyto modely je složitější napojit na existující aplikační logiku, ale pro většinu účelů postačí.

    +

    O obecných modelech si můžete přečíst v dokumentaci.

    +

    QListWidget - Paleta

    +

    Jeden z widgetů se zabudovaným modelem je QListWidget, který umí spravovat a zobrazovat +nějaký seznam. +My jsme si v Qt Designeru připravili QListWidget s názvem palette, který použijeme +jako paletu jednotlivých dílků, které budeme moci vkládat do mapy. +Položky se do tohoto modelu přidávají následovně:

    +
    def main():
    +    ...
    +
    +    # získáme paletu vytvořenou v Qt Designeru
    +    palette = window.findChild(QtWidgets.QListWidget, 'palette')
    +
    +    item = QtWidgets.QListWidgetItem('Grass')  # vytvoříme položku
    +    icon = QtGui.QIcon('grass.svg')  # ikonu
    +    item.setIcon(icon)  # přiřadíme ikonu položce
    +    palette.addItem(item)  # přidáme položku do palety
    +

    Stejným způsobem lze do palety přidat další položky: kromě trávy budeme na toto +cvičení potřebovat i stěnu. +Protože v úkolu bude položek více, je lepší si na to vytvořit funkci či metodu. +To necháme na vás.

    +

    Zatím jsme vytvořili paletu, ve které uživatel může položky vybírat. +Výběr položky aktivuje signál itemSelectionChanged, na který můžeme +navázat volání funkce. +(Pokud bychom měli pod kontrolou třídu widgetu, jako tomu je u třídy Grid, +mohli bychom místo toho i předefinovat metodu itemSelectionChanged().)

    +
    def main():
    +    ...
    +
    +    def item_activated():
    +        """Tato funkce se zavolá, když uživatel zvolí položku"""
    +
    +        # Položek může obecně být vybráno víc, ale v našem seznamu je to
    +        # zakázáno (v Designeru selectionMode=SingleSelection).
    +        # Projdeme "všechny vybrané položky", i když víme že bude max. jedna.
    +        for item in palette.selectedItems():
    +            row_num = palette.indexFromItem(item).row()
    +            print(row_num)
    +
    +    palette.itemSelectionChanged.connect(item_activated)
    +

    Nyní, když uživatel zvolí položku, vypíše se do konzole její pořadí. +Nás by ale spíš zajímalo, jak bude tato položka reprezentována v matici s mapou. +K položce v paletě můžeme uložit informace pomocí item.setData(<role>, <data>). +Rolí pro informace je spousta a několik z nich Qt používá pro vykreslování. +Pro vlastní data můžeme použít QtCore.Qt.UserRole. +V případě potřeby ukládat více dat můžeme dále zvolit QtCore.Qt.UserRole + 1 atd. +Pro případ, že budeme potřebovat rolí víc, je dobré si je vhodně pojmenovat.

    +
    VALUE_ROLE = QtCore.Qt.UserRole
    +
    +def main():
    +    ...
    +    self.palette.addItem(item)  # přidáme položku do palety
    +    item.setData(VALUE_ROLE, -1)  # přiřadíme jí data
    +    ...
    +
    +    def item_activated():
    +        for item in palette.selectedItems():
    +            print(item.data(VALUE_ROLE))  # čteme data stejné role z položky
    +

    Nyní byste měli mít v paletě trávu a stěnu s patřičnými čísly (0 a -1), které se vypisují do konzole při zvolení položky.

    +

    Nakonec si číslo místo vypisování uložíme do gridu, abychom ho mohli později použít.

    +
        def item_activated():
    +        for item in palette.selectedItems():
    +            grid.selected = item.data(VALUE_ROLE)
    +

    Klikání do gridu

    +

    Nyní nezbývá nic jiného, než pomocí klikání nanášet zvolené dílky do mapy. +K tomu opět použijeme událost, tentokrát událost kliknutí, tedy mousePressEvent.

    +
    class GridWidget(QtWidgets.QWidget):
    +    ...
    +
    +    def mousePressEvent(self, event):
    +        # převedeme klik na souřadnice matice
    +        row, column = pixels_to_logical(event.x(), event.y())
    +
    +        # Pokud jsme v matici, aktualizujeme data
    +        if 0 <= row < self.array.shape[0] and 0 <= column < self.array.shape[1]:
    +            self.array[row, column] = self.selected
    +
    +            # tímto zajistíme překreslení widgetu v místě změny:
    +            # (pro Python 3.4 a nižší volejte jen self.update() bez argumentů)
    +            self.update(*logical_to_pixels(row, column), CELL_SIZE, CELL_SIZE)
    +

    Zde víme, že kliknutí může změnit vykreslenou mapu pouze v místě kliknutí. +Pokud by ale kliknutí na určité políčko mohlo změnit obsah mapy někde jinde, +je lepší zavolat self.update() bez argumentů a říct tak systému, že se má překreslit celý widget.

    +

    Protože po spuštění aplikace není zvolena žádná položka a self.selected není definován, je rozumné prostě nějakou položku zvolit:

    +
    # Za přidáním položek do palety a napojení signálu
    +palette.setCurrentRow(1)
    +

    Více tlačítek myši

    +

    Můžete si vyzkoušet, že se mapa mění při použití jakéhokoliv tlačítka myši. +Je to proto, že mousePressEvent se stane, kdykoli na widgetu stiskneme libovolné tlačítko. +Pokud bychom chtěli řešit pouze levé (primární) tlačítko, můžeme zjistit, které tlačítko událost vyvolalo:

    +
                if event.button() == QtCore.Qt.LeftButton:
    +                self.array[row, column] = self.selected
    +            else:
    +                return
    +            self.update(*logical_to_pixels(row, column), CELL_SIZE, CELL_SIZE)
    +

    Na pravé tlačítko myši můžeme namapovat funkci mazání:

    +
                elif event.button() == QtCore.Qt.RightButton:
    +                self.array[row, column] = 0
    +

    Tažení myši

    +

    Pro splnění úkolu bude stačit objekty mazat a klást pomocí klikání na jednotlivá políčka. +Pokud však chcete poskytnout uživateli větší komfort, prozkoumejte další události +a můžete políčka nanášet/mazat i při kliknutí a táhnutí. +(Možná tu narazíte na problém, kdy se při příliš rychlém pohybu myši generují události +pro body příliš daleko od sebe. +Když program nestíhá, OS nebo Qt spojuje víc událostí pohybu myši dohromady a posílá +jen jednu poslední. +Jednotlivé body můžete spojit čárou pomocí knihovny bresenham.)

    +

    Menu a modální dialog

    +

    Naše aplikace bude umět vytvořit novou, prázdnou mapu. +Ukážeme si, jak vytvořit modální dialog pro volby (šířka a výška nové mapy). +„Modální dialog“ znamená okno, které musí uživatel zavřít, než může pracovat se zbytkem aplikace.

    +

    Layout okna nejprve naklikáme v Qt Designeru:

    +
      +
    1. Po spuštění zvolíme Dialog with Buttons Bottom a Create.
    2. +
    3. Přes pravé tlačítko pro dialog zvolíme Lay Out ‣ Vertically.
    4. +
    5. Nad tlačítka Cancel a OK přetáhneme z Widet Box Form Layout (layouty lze takto přímo vnořovat).
    6. +
    7. Do něj přetáhneme postupně dvakrát Label a Spin Box, abychom vytvořili formulář.
    8. +
    9. Přejmenujeme v panelu Property Editor jednotlivé přidané položky tak, aby dávaly v kódu smysl (widthBox, heightBox).
    10. +
    11. Poklikáním na Labely změníme jejich text.
    12. +
    13. Nastavíme v panelu Property Editor rozumné limity a výchozí hodnoty pro Spin Boxy.
    14. +
    15. Okno případně zmenšíme, aby nebylo zbytečně velké.
    16. +
    17. V menu zvolíme Edit ‣ Edit Buddies a táhnutím z Labelu na Spin Box nastavíme, ke kterému prvku se Label vztahuje.
    18. +
    19. V menu zvolíme Edit ‣ Edit Tab Order a zkontrolujeme, že pořadí, ve kterém bude prvky vybírat klávesa Tab, je rozumné.
    20. +
    21. Můžeme se vrátit zpět na Edit ‣ Edit Widgets.
    22. +
    23. Dialog uložíme jako newmaze.ui.
    24. +
    +

    Poté připravíme funkci pro zobrazení dialogu a pro jeho vyhodnocení:

    +
    def new_dialog(window, grid):
    +    # Vytvoříme nový dialog.
    +    # V dokumentaci mají dialogy jako argument `this`;
    +    # jde o "nadřazené" okno.
    +    dialog = QtWidgets.QDialog(window)
    +
    +    # Načteme layout z Qt Designeru.
    +    with open('newmaze.ui') as f:
    +        uic.loadUi(f, dialog)
    +
    +    # Zobrazíme dialog.
    +    # Funkce exec zajistí modalitu (tzn. nejde ovládat zbytek aplikace,
    +    # dokud je dialog zobrazen) a vrátí se až potom, co uživatel dialog zavře.
    +    result = dialog.exec()
    +
    +    # Výsledná hodnota odpovídá tlačítku/způsobu, kterým uživatel dialog zavřel.
    +    if result == QtWidgets.QDialog.Rejected:
    +        # Dialog uživatel zavřel nebo klikl na Cancel.
    +        return
    +
    +    # Načtení hodnot ze SpinBoxů
    +    cols = dialog.findChild(QtWidgets.QSpinBox, 'widthBox').value()
    +    rows = dialog.findChild(QtWidgets.QSpinBox, 'heightBox').value()
    +
    +    # Vytvoření nové mapy
    +    grid.array = numpy.zeros((rows, cols), dtype=numpy.int8)
    +
    +    # Mapa může být jinak velká, tak musíme změnit velikost Gridu;
    +    # (tento kód používáme i jinde, měli bychom si na to udělat funkci!)
    +    size = logical_to_pixels(rows, cols)
    +    grid.setMinimumSize(*size)
    +    grid.setMaximumSize(*size)
    +    grid.resize(*size)
    +
    +    # Překreslení celého Gridu
    +    grid.update()
    +
    +
    +def main():
    +    ...
    +
    +
    +     # Napojení signálu actionNew.triggered
    +
    +    action = window.findChild(QtWidgets.QAction, 'actionNew')
    +    action.triggered.connect(lambda: new_dialog(window, grid))
    +

    Další dialogy, které budeme potřebovat, jsou tak rozšířené (a mezi jednotlivými platformami tak různé), +že je Qt má předpřipravené. +Jsou to dialogy pro ukázání hlášky, výběr souboru, barvy nebo fontu nebo pro nastavení tisku.

    +

    Tyto předpřipravené dialogy mají typicky statické metody, které dialog vytvoří a přímo zavolají +exec() a vrátí výsledek.

    +

    Pro splnění úkolu (dalších položek v menu) se vám můžou hodit tyto dialogy:

    + +

    Třída pro GUI aplikace

    +

    Funkce main se nám pomalu rozrůstá a další funkce, které volá, musí být buď definované v ní (jako item_activated) +nebo musí brát relativně hodně argumentů (jako new_dialog). +Abychom si zjednodušili práci, můžeme logiku místo do funkce dát do třídy, ve které si důležité prvky +uložíme do atributů (self.grid, self.window, self.app atd.). +Doporučujeme udělat přípravu v __init__ a volání window.show() a return app.exec() dát do metody run.

    +

    A to je zatím vše! +Další vylepšení budete mít za úkol – nebo si aplikaci přetvořte podle svého uvážení.

    \ No newline at end of file diff --git a/lessons/pyqt/pics/README/index.md b/lessons/pyqt/pics/README/index.md new file mode 100644 index 00000000..02a24503 --- /dev/null +++ b/lessons/pyqt/pics/README/index.md @@ -0,0 +1,11 @@ +These images were created by the [Kenney] studio, and were kindly released into +the Public Domain. +They can be downloaded from [OpenGameArt.org]. + +Thank you! + +[Kenney]: http://kenney.nl/ +[OpenGameArt.org]: http://opengameart.org/users/kenney + +The shark image was adapted from a fish image by Miro Hrončok and is released +into the Public Domain as well. diff --git a/lessons/pyqt/pics/arrows/down.svg b/lessons/pyqt/pics/arrows/down.svg new file mode 100644 index 00000000..6f0b270b --- /dev/null +++ b/lessons/pyqt/pics/arrows/down.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/arrows/left.svg b/lessons/pyqt/pics/arrows/left.svg new file mode 100644 index 00000000..2341affe --- /dev/null +++ b/lessons/pyqt/pics/arrows/left.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/arrows/right.svg b/lessons/pyqt/pics/arrows/right.svg new file mode 100644 index 00000000..00d20cec --- /dev/null +++ b/lessons/pyqt/pics/arrows/right.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/arrows/up.svg b/lessons/pyqt/pics/arrows/up.svg new file mode 100644 index 00000000..f88b60d7 --- /dev/null +++ b/lessons/pyqt/pics/arrows/up.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/castle.svg b/lessons/pyqt/pics/castle.svg new file mode 100644 index 00000000..2c4d0ec2 --- /dev/null +++ b/lessons/pyqt/pics/castle.svg @@ -0,0 +1,130 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/dude1.svg b/lessons/pyqt/pics/dude1.svg new file mode 100644 index 00000000..0badb730 --- /dev/null +++ b/lessons/pyqt/pics/dude1.svg @@ -0,0 +1,120 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/dude2.svg b/lessons/pyqt/pics/dude2.svg new file mode 100644 index 00000000..e47c48cc --- /dev/null +++ b/lessons/pyqt/pics/dude2.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/dude3.svg b/lessons/pyqt/pics/dude3.svg new file mode 100644 index 00000000..97ceec2c --- /dev/null +++ b/lessons/pyqt/pics/dude3.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/dude4.svg b/lessons/pyqt/pics/dude4.svg new file mode 100644 index 00000000..9aaba3b6 --- /dev/null +++ b/lessons/pyqt/pics/dude4.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/dude5.svg b/lessons/pyqt/pics/dude5.svg new file mode 100644 index 00000000..627c4616 --- /dev/null +++ b/lessons/pyqt/pics/dude5.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/fish.svg b/lessons/pyqt/pics/fish.svg new file mode 100644 index 00000000..ec3322b2 --- /dev/null +++ b/lessons/pyqt/pics/fish.svg @@ -0,0 +1,97 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/fish2.svg b/lessons/pyqt/pics/fish2.svg new file mode 100644 index 00000000..a8b38daa --- /dev/null +++ b/lessons/pyqt/pics/fish2.svg @@ -0,0 +1,97 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/grass.svg b/lessons/pyqt/pics/grass.svg new file mode 100644 index 00000000..dd68d54b --- /dev/null +++ b/lessons/pyqt/pics/grass.svg @@ -0,0 +1,84 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/1.svg b/lessons/pyqt/pics/lines/1.svg new file mode 100644 index 00000000..887b0960 --- /dev/null +++ b/lessons/pyqt/pics/lines/1.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/10.svg b/lessons/pyqt/pics/lines/10.svg new file mode 100644 index 00000000..e86ebe4c --- /dev/null +++ b/lessons/pyqt/pics/lines/10.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/11.svg b/lessons/pyqt/pics/lines/11.svg new file mode 100644 index 00000000..c9cd02d9 --- /dev/null +++ b/lessons/pyqt/pics/lines/11.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/12.svg b/lessons/pyqt/pics/lines/12.svg new file mode 100644 index 00000000..20a23c92 --- /dev/null +++ b/lessons/pyqt/pics/lines/12.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/13.svg b/lessons/pyqt/pics/lines/13.svg new file mode 100644 index 00000000..7251a739 --- /dev/null +++ b/lessons/pyqt/pics/lines/13.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/14.svg b/lessons/pyqt/pics/lines/14.svg new file mode 100644 index 00000000..c56c30cb --- /dev/null +++ b/lessons/pyqt/pics/lines/14.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/15.svg b/lessons/pyqt/pics/lines/15.svg new file mode 100644 index 00000000..d5b31fa6 --- /dev/null +++ b/lessons/pyqt/pics/lines/15.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/2.svg b/lessons/pyqt/pics/lines/2.svg new file mode 100644 index 00000000..1904b3ac --- /dev/null +++ b/lessons/pyqt/pics/lines/2.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/3.svg b/lessons/pyqt/pics/lines/3.svg new file mode 100644 index 00000000..2374249e --- /dev/null +++ b/lessons/pyqt/pics/lines/3.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/4.svg b/lessons/pyqt/pics/lines/4.svg new file mode 100644 index 00000000..bc827c71 --- /dev/null +++ b/lessons/pyqt/pics/lines/4.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/5.svg b/lessons/pyqt/pics/lines/5.svg new file mode 100644 index 00000000..ff303510 --- /dev/null +++ b/lessons/pyqt/pics/lines/5.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/6.svg b/lessons/pyqt/pics/lines/6.svg new file mode 100644 index 00000000..780819b6 --- /dev/null +++ b/lessons/pyqt/pics/lines/6.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/7.svg b/lessons/pyqt/pics/lines/7.svg new file mode 100644 index 00000000..fba19418 --- /dev/null +++ b/lessons/pyqt/pics/lines/7.svg @@ -0,0 +1,85 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/8.svg b/lessons/pyqt/pics/lines/8.svg new file mode 100644 index 00000000..c2c78902 --- /dev/null +++ b/lessons/pyqt/pics/lines/8.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/lines/9.svg b/lessons/pyqt/pics/lines/9.svg new file mode 100644 index 00000000..b9098914 --- /dev/null +++ b/lessons/pyqt/pics/lines/9.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/shark.svg b/lessons/pyqt/pics/shark.svg new file mode 100644 index 00000000..533812b0 --- /dev/null +++ b/lessons/pyqt/pics/shark.svg @@ -0,0 +1,57 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/wall.svg b/lessons/pyqt/pics/wall.svg new file mode 100644 index 00000000..6931307f --- /dev/null +++ b/lessons/pyqt/pics/wall.svg @@ -0,0 +1,94 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/wall2.svg b/lessons/pyqt/pics/wall2.svg new file mode 100644 index 00000000..b68d8a88 --- /dev/null +++ b/lessons/pyqt/pics/wall2.svg @@ -0,0 +1,94 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/lessons/pyqt/pics/water.svg b/lessons/pyqt/pics/water.svg new file mode 100644 index 00000000..eaa590cd --- /dev/null +++ b/lessons/pyqt/pics/water.svg @@ -0,0 +1,71 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/lessons/reassignment/index.html b/lessons/reassignment/index.html new file mode 100644 index 00000000..46d7bf2b --- /dev/null +++ b/lessons/reassignment/index.html @@ -0,0 +1,92 @@ +

    Přepisování proměnných

    +

    Už víš, že hodnota proměnné se může v čase měnit: +když přiřadíš do už existující proměnné, stará hodnota se zahodí +a použije se nová.

    +
    oblibena_barva = 'modrá'
    +print(oblibena_barva)
    +
    +oblibena_barva = 'žlutá'
    +print(oblibena_barva)
    +
    +# Na tomhle místě programu už se k řetězci 'modrá' nedostaneš...
    +

    Trošku zajímavější (nebo složitější?) je situace, kdy hodnotu proměnné +přepíšeš výrazem, který používá tu stejnou proměnnou. +Zkus si to:

    +
    oblibene_cislo = 7
    +print(oblibene_cislo)
    +
    +oblibene_cislo = oblibene_cislo * 6
    +print(oblibene_cislo)
    +

    Co se tady děje? +Python vyhodnotí výraz za = se starou hodnotou proměnné, a teprve když +zná výsledek, přiřadí ho (a na starou hodnotu zapomene). +V našem příkladu postupuje takhle:

    +
    oblibene_cislo = oblibene_cislo * 6
    +#                ╰──────────┬─╯
    +oblibene_cislo =            7   * 6
    +#                           ╰─┬───╯
    +oblibene_cislo =             42
    +#         ▲                  |
    +#         ╰──────────────────╯
    +

    Přepisování v cyklu

    +

    Ještě „zajímavější“ je použít podobné přepisování v cyklu.

    +

    Zopakuj si, že for cyklus jako:

    +
    print("Tady je pár čísel:")
    +
    +for cislo in 8, 45, 9, 21:
    +    print(cislo)
    +

    opakuje přiřazení do proměnné a tělo cyklu; můžeš si ho rozepsat jako:

    +
    print("Tady je pár čísel:")
    +
    +cislo = 8
    +print(cislo)
    +
    +cislo = 45
    +print(cislo)
    +
    +cislo = 9
    +print(cislo)
    +
    +cislo = 21
    +print(cislo)
    +

    Zkus podobně rozepsat cyklus v následujícím programu +a popsat, co se děje:

    +
    celkem = 0
    +
    +for delka_trasy in 8, 45, 9, 21:
    +    print('Jdu', delka_trasy, 'km do další vesnice.')
    +    celkem = celkem + delka_trasy
    +
    +print('Celkem jsem ušla', celkem, 'km')
    +
    +

    Řešení

    + + +
    \ No newline at end of file diff --git a/lessons/recursion/index.html b/lessons/recursion/index.html new file mode 100644 index 00000000..29ec3d89 --- /dev/null +++ b/lessons/recursion/index.html @@ -0,0 +1,146 @@ +

    Rekurze

    +

    Rekurze (angl. recursion) je programátorská technika, +kdy funkce volá sebe sama.

    +

    Taková rekurze skončí nekonečným voláním. +Když zadáš tento program:

    +
    def rekurzivni_funkce():
    +    vysledek = ...
    +    rekurzivni_funkce()
    +    return vysledek
    +
    +rekurzivni_funkce()
    +

    Jak to funguje?

    +
      +
    • Python si nadefinuje funkci rekurzivni_funkce
    • +
    • Zavolá funkci rekurzivni_funkce:
        +
      • Vypočítá výsledek
      • +
      • Zavolá funkci rekurzivni_funkce:
          +
        • Vypočítá výsledek
        • +
        • Zavolá funkci rekurzivni_funkce:
            +
          • Vypočítá výsledek
          • +
          • Zavolá funkci rekurzivni_funkce:
              +
            • Vypočítá výsledek
            • +
            • Zavolá funkci rekurzivni_funkce:
                +
              • ...
                  +
                • ... + po stovkách opakování si Python všimne, že tohle asi + nikam nevede, a skončí s chybou.
                • +
                +
              • +
              +
            • +
            +
          • +
          +
        • +
        +
      • +
      +
    • +
    +

    Tomu odpovídá chybová hláška:

    +
    Traceback (most recent call last):
    +  File "/tmp/ukazka.py", line 4, in <module>
    +    rekurzivni_funkce()
    +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
    +    return rekurzivni_funkce()
    +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
    +    return rekurzivni_funkce()
    +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
    +    return rekurzivni_funkce()
    +  [Previous line repeated 996 more times]
    +RecursionError: maximum recursion depth exceeded

    Hláška je zkrácená – dva řádky by se správně měly opakovat 999×, ale novější +verze Pythonu je vypíšou jen třikrát.

    +

    Kontrolované zanoření

    +

    Jak rekurzi využít v praxi? +Jeden způsob je si počítat, kolikrát se ještě „zanořit“.

    +

    Představ si potápěče, který prozkoumává mořské hlubiny následujícím způsobem:

    +
      +
    • Jak „prozkoumat moře“ v určité hloubce:
        +
      • Porozhlédnu se kolem
      • +
      • Jsem-li už teď moc hluboko, kašlu na to; nebudu prozkoumávat dál.
      • +
      • Jinak:
          +
        • Zanořím se o 10 m níž
        • +
        • Prozkoumám moře v nové hloubce
        • +
        • Zase se o 10 m vynořím
        • +
        +
      • +
      +
    • +
    +

    Neboli v Pythonu:

    +
    def pruzkum(hloubka):
    +    print(f'Rozhlížím se v hloubce {hloubka} m')
    +
    +    if hloubka >= 30:
    +        print('Už toho bylo dost!')
    +    else:
    +        print(f'Zanořuju se (z {hloubka} m)')
    +
    +        pruzkum(hloubka + 10)
    +
    +        print(f'Vynořuju se (na {hloubka} m)')
    +
    +pruzkum(0)
    +
      +
    • Python si nadefinuje funkci pruzkum
    • +
    • Zavolá funkci pruzkum s hloubkou 0:
        +
      • Vypíše Rozhlížím se v hloubce 0 m
      • +
      • Zkontroluje, že 0 ≥ 30 (což neplatí)
      • +
      • Vypíše Zanořuju se (z 0 m)
      • +
      • Zavolá funkci pruzkum s hloubkou 10 m:
          +
        • Vypíše Rozhlížím se v hloubce 10 m
        • +
        • Zkontroluje, že 10 ≥ 30 (což neplatí)
        • +
        • Vypíše Zanořuju se (na 10 m)
        • +
        • Zavolá funkci pruzkum s hloubkou 20 m:
            +
          • Zkontroluje, že 20 ≥ 30 (což neplatí)
          • +
          • Vypíše Zanořuju se (na 20 m)
              +
            • Zavolá funkci pruzkum s hloubkou 30 m:
                +
              • Zkontroluje, že 30 ≥ 30 (což platí! konečně!)
                  +
                • Vypíše Už toho bylo dost! a skončí
                • +
                +
              • +
              +
            • +
            +
          • +
          • Vypíše Vynořuju se (na 20 m)
          • +
          +
        • +
        • Vypíše Vynořuju se (na 10 m)
        • +
        +
      • +
      • Vypíše Vynořuju se (na 0 m)
      • +
      +
    • +
    +

    Lokální proměnné

    +

    Na předchozím příkladu je vidět zajímavé chování lokálních proměnných. +Když je potápěč „na dně“, jakou hodnotu má proměnná hloubka?

    +

    Tahle otázka je chyták. Která proměnná hloubka? +Když je program „na dně“, existují čtyři různé lokální proměnné hloubka: +každé zanoření, každé zavolání funkce pruzkum, má vlastní proměnnou.

    +

    Podobně jako když máš globální a lokální proměnnou stejného jména, +každá funkce „vidí“ jen tu svoji proměnnou. +Ale když se potápěč vynoří a volání funkce se ukončí, tato proměnná +přestane existovat. +A „volající“ funkce vidí svoji proměnnou, ve které je stále původní hodnota.

    +

    Pro matematiky

    +

    Nemáš-li rád/a matematiku, tuhle sekci přeskoč!

    +

    Rekurzivní algoritmy mají původ v matematice. Faktoriál x, neboli +součin všech čísel od 1 do x, zapsaný jako x!, +matematici definují takto:

    +
      +
    • 0! = 1
    • +
    • Pro kladná x je x! = x · (x - 1)!
    • +
    +

    Neboli v Pythonu:

    +
    def factorial(x):
    +    if x == 0:
    +        return 1
    +    elif x > 0:
    +        return x * factorial(x - 1)
    +
    +print(factorial(5))
    +print(1 * 2 * 3 * 4 * 5)
    +
    \ No newline at end of file diff --git a/lessons/requests/index.html b/lessons/requests/index.html new file mode 100644 index 00000000..574c8133 --- /dev/null +++ b/lessons/requests/index.html @@ -0,0 +1,153 @@ +

    Requests

    +

    Knihoven pro HTTP klienty (tedy “programy, které stahují webové stránky“) +je celá řada. +Jedna z nich, urllib.request, je dokonce součástí standardní knihovny Pythonu. +Pokud tedy budete chtít HTTP používat a seznam závislostí +svého projektu nemůžete rozšířit o další knihovnu, jde to.

    +

    Mnohem snáze se vám ale bude pracovat s knihovnou Requests, +která má mnohem “lidštější” rozhraní a používá se mnohem jednodušeji. +Rozdíl je největší u pokročilejších vlastností +jako cookies, autentizace nebo sdílení spojení (Keep-alive), +které s Requests zvládnete i bez detailních znalostí protokolu HTTP.

    +

    Dokonce i v dokumentaci modulu urllib se píše: +The Requests package is recommended for a higher-level HTTP +client interface. +Zaměříme se tedy na Requests hned od začátku.

    +

    Knihovna Requests se instaluje standardním způsobem:

    +
    $ python -m pip install requests
    +

    Budeme předpokládat, že znáte alespoň základy HTTP protokolu, +a vrhneme se rovnou na příklad.

    +

    Pokud základy neznáte, můžete se podívat na +shrnutí pro začátečníky, +které vysvětluje vše potřebné.

    +
    >>> import getpass
    +>>> import requests
    +>>> username = input('Username: ')
    +Username: hroncok
    +>>> password = getpass.getpass()
    +Password: 
    +>>> r = requests.get('https://api.github.com/user', auth=(username, password))
    +>>> r.status_code
    +200
    +>>> r.headers['content-type']
    +'application/json; charset=utf8'
    +>>> r.encoding
    +'utf-8'
    +>>> r.text
    +'{"login":"hroncok"...'
    +>>> r.json()
    +{'avatar_url': 'https://avatars.githubusercontent.com/u/2401856?v=3', ...}
    +

    Tento příklad pracuje přímo se jménem a heslem. +To se většinou nedělá a webové API to často ani nepodporují. +Pokud na GitHub používáte dvoufaktorovou autentizaci, příklad nebude fungovat.

    +

    Příklady použití pro další HTTP metody najdete v dokumentaci.

    +

    Použití session

    +

    Hlavně v budoucnu se nám bude hodit použití tzv. +session.

    +

    Session má několik výhod. +První je, že využívá na pozadí jedno otevřené HTTP spojení a poskytuje tak +při více sousledných požadavcích výrazné zrychlení.

    +

    Dále pak session automaticky ukládá cookies a je možné u ní nastavit výchozí +hlavičky.

    +

    Zkuste si cookies vyzkoušet s httpbin.org – službou +k testování HTTP dotazů:

    +
    >>> session = requests.Session()
    +>>> session.get('http://httpbin.org/cookies/set/mipyt/best')
    +<Response [200]>
    +>>> r = session.get('http://httpbin.org/cookies')
    +>>> r.json()
    +{'cookies': {'mipyt': 'best'}}
    +>>> session.headers.update({'x-test': 'true'})
    +>>> r = session.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
    +>>> r.json()
    +{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Cookie': 'mipyt=best', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.19.1', 'X-Test': 'true', 'X-Test2': 'true'}}
    +

    GitHub API

    +

    Podíváme se teď, podobně jako v úvodním příkladu, na GitHub API, +které má poměrně jednoduchou autentizaci (od GitHubu přímo +získáte token). Stačí jít do nastavení a vyrobit nový token +(zatím není třeba zaškrtávat žádná oprávnění).

    +

    Ochrana přihlašovacích tokenů

    +

    Váš token je něco jako vaše heslo. +Nikomu je nesmíte ukazovat a nesmíte jej dát do Gitu. +Stane-li se přesto, že se k němu dostane někdo nepovolaný, +můžete jej v nastavení opět smazat.

    +

    Pomocí tokenu můžete z GitHubu získávat informace. +Prozatím token nastavte do proměnné, později jej schováme například do +konfiguračního souboru.

    +

    Tímto kódem lze například získat popis přihlášeného uživatele, tedy sebe sama.

    +
    >>> token = 'd7313dab254b7fd0d0f3ec3cbf754b3abce462d5'
    +>>> session = requests.Session()
    +>>> session.headers = {'User-Agent': 'Python'}
    +>>> def token_auth(req):
    +...     req.headers['Authorization'] = f'token {token}'
    +...     return req
    +... 
    +>>> session.auth = token_auth
    +>>> r = session.get('https://api.github.com/user')
    +>>> r.json()
    +

    Funkce session.auth v příkladu výše je autentizační funkce, +která nějakým způsobem modifikuje HTTP požadavek za účelem autentizace, +většinou přidává specifické hlavičky (jak je tomu i zde). +Lze ji nastavit buďto na celé session nebo předat argumentem auth s každým +požadavkem.

    +

    Existují předpřipravené funkce v modulu requests.auth, například +requests.auth.HTTPBasicAuth provádí základní HTTP přihlášení. +Dle specifikace zakóduje jméno a heslo pomocí +algoritmu base64 a přidá hlavičku Authorization.

    +

    Základní HTTP přihlášení +je tak běžné, že pro něj Requests mají zkratku – +místo HTTPBasicAuth se dá použít i dvojice (jméno, heslo):

    +
    >>> requests.get('https://httpbin.org/basic-auth/AzureDiamond/hunter2',
    +                 auth=requests.auth.HTTPBasicAuth('AzureDiamond', 'hunter2'))
    +>>> 
    +>>> requests.get('https://httpbin.org/basic-auth/AzureDiamond/hunter2',
    +                 auth=('AzureDiamond', 'hunter2'))
    +

    Všimněte si také hlavičky User-Agent. +Ta je potřeba při komunikaci s GitHub API explicitně nastavit. +Nastavení na objektu session zajistí, že tato hlavička +bude ve všech požadavcích.

    +

    Pokud budete chtít něco provést, například dát hvězdičku repozitáři s těmito +materiály, musíte tokenu nastavit patřičné oprávnění +(u hvězdičky je to public_repo). +To se dělá přes nastavení na GitHubu.

    +

    Hvězdičku pak přidáte takto:

    +
    >>> r = session.put('https://api.github.com/user/starred/pyvec/naucse.python.cz')
    +>>> r.text
    +''
    +

    Jak vidíte, API nevrací žádný text (žádné tělo odpovědi). +Můžete ale zkontrolovat návratový stav:

    +
    >>> r.status_code
    +204
    +

    Případně vyhodit výjimku, pokud je stavový kód divný (např 404 Nenalezeno, +401 Chybí oprávnění apod.):

    +
    >>> r.raise_for_status()
    +

    Pokud hvězdičku chcete odebrat, použijte metodu DELETE. +My ale věříme, že ji odebrat nechcete :)

    +

    Dokumentace ke GitHub API.

    +

    Chraňte své tokeny

    +

    Když ukládáte skript do gitu, mějte na paměti, že tokeny a klíče do něj nikdy +nepatří. Můžete je uložit do konfiguračního souboru, který bude gitem ignorován, +například takhle:

    +
    [github]
    +token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
    +

    A následně konfiguraci načtete pomocí modulu +configparser:

    +
    >>> import configparser
    +>>> config = configparser.ConfigParser()
    +>>> with open('auth.cfg') as f:
    +...     config.read_file(f)
    +>>> config['github']['token']
    +'d7313dab254b7fd0d0f3ec3cbf754b3abce462d5'
    +

    Do souboru .gitignore pak musíte přidat název ignorovaného souboru, např.:

    +
    auth.cfg
    +
    +

    Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže +ve výstupu git status.

    +

    Jelikož ostatní tento konfigurační soubor neuvidí, +je vhodné jim vysvětlit, jak takový soubor (s jejich údaji) vytvořit. +Můžete například vložit do gitu soubor auth.cfg.sample +s vymyšlenými údaji, či příklad uvést v README.

    +

    ConfigParser změní velikost písmen klíčů z konfiguračního souboru na malá. +Pokud potřebujete, aby byly klíče přesně tak, jak jsou v souboru, musíte +před načtením nastavit config.optionxform = str.

    +
    \ No newline at end of file diff --git a/lessons/snake/apple.png b/lessons/snake/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..830b78684050289f319e5bcf8b2841fdff56e4f1 GIT binary patch literal 2482 zcmV;j2~GBiP)GrHCNOjYUu^ z{YP!Bv`A6$7Z$-vi+?Dkzidktv1)&2OVhfxrZLTKOtSmlj(?mxd(S=Z%zO830uNyi zT<(2y?>#f$?>Td3?wNV8Dyy<8Bar)nhk)@>H)K@uXCMM!9(6-TCGSHBcy`nc8I`nv zmk|=)JnDvwLY9EvmDlebQ5%5K5diRHdA?wTZ5Sy5Gv)dG5w>BZ1Uz4!-#EfHFm^hX z6>te~8SoBZ8)DrJ!1@6H1!e-=7vR1>z>x=l0Gqxl&+UkCd4$V>^CL_GbHGu=Tb>0T z10E{iiPP2QaHE9*t-`VUkQ$( z2`HqEHv^vrS}ovQ;G7bGRv5|_2B#b<3)|o6I=ySl=YW3$uOK9qr#sicm%al383xZ# z1QhTd;3vS=0K6V}1NA@>`kW(TSqn@PwPfz)&Hx?YMc|)R`3u0O3V5I?rp5#ma5Zoz zFtHxE5OGzjOdnqPph}}T29<+!k7p3i02Ts#W*_`?FsgtM>#IZ}81WcA3hTi3vLRav?Zb?>HAvG3&26SJPPb6;K0xX6cXDW1a?jV+szBw@(Hj8-ZtghJ3KGY zAheY&@UBx1^=`XAg=OXN!K&EuI;VpVC-gd6X=(T=s{;k0z z5;_WSw|uutHDYKIG>O|-o-^zO_5k0_;Ovz`#`HR@L zPeankS^|C8JBbt({IoHJc12hBJXUk=Jwu1CLP-C?X~s{>kW2@ zOrX4HJTLR=8#nJ-!lx>1yDZom0R^-Id^7-?`hZW3OAXUUYP5Z}O|J)dUJ=YYNss4w zw(Ds^wLXRA%EDl-{bjoJzOF2jDwggP3!dxydHreH|jtQ=%m(X2{;q#*0p`mtK5E%Hvv3Ia)ju*nv5Vxni8;*w*J3K4WlJs4(b^h z&3rW1_8Ds>O!+X9^CDfBmqPREhbpHC%}GC1ILgBk^u7&emRhU8{k-kTO-TsYqdC#vx3(s>lGcN!*(t0=2owF zbm%4A5^%7(zO68mAeVqrZVE7em@0baR%;Sy>j|D`bg5gc)2FYXKGz6uFcTCxW(V?GRF#5C(Z$U(N*R&Bi!Z!*D z1wGPlo7}g7tB%8t1IS{do*bnyAL_wtjA|hxm$}J(JmrR5ud8@g*E$ZcJo)*{dGO5~ z$iDNE0xk*gaD;W!$mR%}V6f>iefAbX^t)EP)nRXW+?MHgBeG{`M(UjpaM@n?>xu{f z*bkooejXug171hng1OwGwKZ6RC2I=!0J8mT<2bUv zG|xb_v>nYemYgHVBxkOA_4mN;qS}StNLG@r0|*6t7Wf+F&bc#?0J({31EuaBUe?wU z;8|RgaRS-v@^X1y%1glB0)A*zGy^j13tDc5wR5m1!WU61E|Z97tfN|)O$(VF#7|$L z`YfA7R%AA+XBLr(&k3qM^D3zUV(IT}fLpKcxz$`wiGU=9c=i>@cG?dkj&RDAIOaSI z{1*5baBtx!p@x#vLV%WEK>P3Tc4T|nrAVxt4&@&w5Q9De+;LO6ap?y5KCm14!^L`F wF3NK=NR0av@aS9M@vCYH-c?zZRXIiZABq1YX8&ZR0ssI207*qoM6N<$f?U6*LI3~& literal 0 HcmV?d00001 diff --git a/lessons/snake/coords.svg b/lessons/snake/coords.svg new file mode 100644 index 00000000..0aba3b43 --- /dev/null +++ b/lessons/snake/coords.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + y + x + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 0 + 1 + 2 + 3 + 4 + + + + + + + + + + + + + + + + + + + + + 5 + 6 + 7 + + + + + + + diff --git a/lessons/snake/green.png b/lessons/snake/green.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fbc0a2d59590435d15f13a92f9ec5b31d05050 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=h*^TujB(5S{-;18+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VqVW>EalYaqsPUM_vX74weO%|IOXnSZ|);koqY~oryHCoi(tHvA$Mh!$pvdp00i_ I>zopr0M&IYk^lez literal 0 HcmV?d00001 diff --git a/lessons/snake/index.html b/lessons/snake/index.html new file mode 100644 index 00000000..d80f24a8 --- /dev/null +++ b/lessons/snake/index.html @@ -0,0 +1,233 @@ +

    Hra typu Had

    +

    Dnes to všechno — třídy, grafiku, seznamy a tak dále – +spojíme dohromady do závěrečného projektu. +Doufám, že se ti bude líbit!

    +

    Naším cílem bude vytvořit klon známé hry Snake (neboli Had) +jejíž princip je tu s námi od roku 1976. Největší popularity se Had dočkal +díky mobilním telefonům Nokia, kde je jako základní hra dostupný od roku 1998 +až dodnes.

    +

    Projekt není zase tak složitý, protože jeho základní principy už dobře znáš +z domácích projektů a lekcí kurzu. Následující text je tedy spíše +zadání než výukový materiál a v projektu jistě narazíš na něco, co jsme +společně neprobírali. V takovém případě se neboj zeptat nebo si informace +dohledat!

    +

    A ještě jedna věc: protože začátečnický kurz končí, +začneme kód psát v angličtině, aby se pak dal sdílet s celým světem.

    +

    Procházíš-li si projekt doma, je možné, že narazíš na +něco s čím si nebudeš vědět rady. +Kdyby se to stalo, prosím, ozvi se nám! +Rádi ti s projektem pomůžeme.

    +

    Logika hry a fáze projektu

    +

    Základní princip hry máš v malíčku, pokud jsi dokončil/a domácí projekt +po lekci o seznamech. Pokud jej nemáš, doporučuji +se k němu vrátit.

    +

    Práci s pygletem jsme dělali v lekci o grafice.

    +

    Teď nám nezbývá než princip tolik populární hry a znalosti z kurzu spojit +dohromady. Doporučuji začít s čistým souborem v prázdné složce a do hotových +programů se koukat jen v případě potřeby.

    +

    Jak postupovat, aby se projekt nezdál nedosažitelný už na začátku? Třeba takto:

    +
      +
    1. Promysli si, jak bude hra fungovat a jak přeneseme mřížku s hadem +z příkazové řádky do grafického okna.
    2. +
    3. Vykresli hada do grafického okna (ve formě barevných čtverců)
    4. +
    5. Přidej funkci, která bude hadem hýbat.
    6. +
    7. Umožni změnit směr hada pomocí klávesnice.
    8. +
    9. Nenech hada utéct z herní plochy a nabourat do sebe sama.
    10. +
    11. Přidej hadovi jídlo a zajisti, aby po jídle rostl.
    12. +
    13. Vyměň barevné čtverečky za opravdovou grafiku.
    14. +
    +

    Po těchto krocích budeš mít základní hru, ale tou to nekončí, právě naopak! +Budeš mít vlastní hru, jejímuž fungování rozumíš jako nikdo jiný, a to je to pravé pro +přidávání dalších možností. Fantazii se meze nekladou. Například:

    +
      +
    1. Ve hře mohou být dva nebo třeba tři hadi najednou – každý ovládaný +jinými klávesami — navzájem soupeřící o jídlo.
    2. +
    3. Kromě jídla se mohou na ploše objevovat i jiné objekty – překážky, +do kterých nesmí had narazit, otrávené jídlo, které hada zkrátí atp.
    4. +
    5. Hrací plocha může být nekonečná a když z ní had vyleze, objeví se +na druhé straně.
    6. +
    +

    Z příkazové řádky do grafické aplikace

    +

    V příkazové řádce měl had souřadnice označující řádek a sloupec. V grafické +aplikaci to bude podobné, ale protože pixelů na obrazovce je mnohem více, budeme +si muset vytvořit pomyslnou síť stejně velkých čtverců, které nám nahradí +řádky a sloupce. Velikost takového čtverce bude konstanta, kterou se vyplatí +mít po celou dobu hry k dispozici, aby se podle ní daly vypočítat +souřadnice k vykreslení obrázků. Pro začátek řekněme, že ideální velikost +takového čtverce bude 64 × 64 pixelů.

    +

    Z velikosti čtverce, kterou si můžeme v budoucnu libovolně změnit, +a velikosti okna aplikace můžeme vypočítat, kolik se nám do okna takových +čtverců vejde na šířku a na výšku a tím i zjistit, kolik pomyslných +sloupců a řádků bude naše hrací plocha mít.

    +

    Vykreslení hada

    +

    Abychom mohli hada vykreslit, potřebujeme si pro začátek uložit jeho souřadnice. +K tomu můžeš použít seznam dvojic – stejně jako v domácím projektu. Podobných +informací, které se budou v průběhu hry dynamicky měnit, budeme mít už +za malou chvíli více. Proto dává smysl si pro stav hry vytvořit třídu, která +bude tyto informace obsahovat jako atributy a bude s nimi umět pracovat.

    +

    I když se může na začátku zdát vlastní třída jako zbytečná +komplikace, později zjistíš, že ne všechno by se dalo snadno udržovat v globálních +proměnných.

    +

    Had na „šachovnici“ se souřadnicemi

    +

    Když už je had definován, budeme potřebovat jednoduchou funkci, která +na ta správná místa umístí obrázky. Pro začátek si vystačíme se zeleným +čtvercem. Obrázek si stáhni zde a ulož +do složky k programu.

    +

    Stejně jako na lekci i zde použijeme pro vykreslení Sprite, kterému už při +vytvoření můžeme zadat obrázek pro vykreslení a vypočtené souřadnice. +Pro jednoduchost stačí Sprite vytvořit, vykreslit a „zapomenout“. Není to ale +optimální přístup a tak tohle může být jedním z adeptů pro pozdější vylepšení.

    +

    Rozpohybování hada

    +

    Aby se mohl had hýbat, potřebuje znát směr pohybu. V příkazové řádce jsme +vždy počkali, až nám směr zadá uživatel, ale v opravdové hře se bude had +pohybovat sám. Bude tedy potřeba nějaký atribut v naší třídě, kde bude směr +neustále uložen a měnit se bude podle stisknutých kláves v dalším kroku.

    +

    Směr pohybu může být uložen v libovolné podobě – světové strany, slovní +označení strany, nebo třeba dvojice s číselným označením pohybu +((0, 1) pro pohyb nahoru, (-1, 0) pro pohyb doleva atp.). Podle vybraného +formátu pak bude třeba směr zpracovat.

    +

    Pro tuhle chvíli mu tedy bude stačit nastavit směr napevno a napsat funkci, +nebo metodu, která hadem pohne. Pohyb bude probíhat +naprosto stejně jako v příkazové řádce – přidáme do seznamu souřadnice, +kde by měla být „nová hlava“ a umažeme poslední kousek hada.

    +

    Protože se pohyb má provádět pravidelně, bude potřeba tuto operaci provádět +automaticky v pravidelných intervalech. pyglet.clock.schedule_interval je +zde jasná volba.

    +

    Ovládání pomocí klávesnice

    +

    Reagovat na stisknuté klávesy jsme se už taky učili. Teď to tedy využijeme, +abychom dokázali změnit nastavený směr pohybu z předchozího bodu. Bude pro to +samozřejmě potřeba funkce, kterou v pygletu zaregistrujeme pro spuštění po +stisku klávesy.

    +

    Protože had už se nám v závislosti na směru pohybuje, měl by začít reagovat +na jeho změnu.

    +

    V tuto chvíli:

    +
      +
    • Směr se mění podle stisknuté klávesy.
    • +
    • Had se sám pohybuje podle zadaného směru.
    • +
    • Nová pozice hada se automaticky vykresluje jako zelené čtverečky.
    • +
    +

    Vida, máme hotový základ!

    +

    Nenechme ho utéct

    +

    Had už se nám hýbe podle našich představ, ale stačí ho nechat chvíli bez dozoru +a uteče nám z hrací plochy. Tomu není těžké zabránit, když víme, že žádná +souřadnice hada nesmí být menší než nula a větší než je velikost hrací plochy. +Kontrolovat je potřeba souřadnice jeho hlavy, která bude vždy všude jako první.

    +

    Reagovat na náraz do zdi se dá mnoha způsoby. Nejjednodušší by asi bylo +ukončit hru, ale to by se pak hráč nemohl podívat na tu šlamastiku, do které +se dostal. Proto bude lepší místo toho pouze zastavit časovač, který se stará +o pohyb hada.

    +

    Stejným způsobem a na stejném místě v programu bude třeba vyřešit i situaci, +kdy had narazí sám do sebe.

    +

    Jen ať jí, hlavně že mu chutná

    +

    Jezdit s hadem po hrací ploše může být chvíli zábava, ale protože had neroste, +není to žádná výzva. A aby mohl růst, potřebuje jíst.

    +

    K tomu budeš potřebovat další globálně dostupný seznam (nejlépe atribut +existující třídy), který bude obsahovat informace (souřadnice) o existujícím +jídle na hrací ploše. Navíc bude potřeba mít k dispozici metodu, která bude +umět jídlo na hrací plochu přidat.

    +

    Záleží jen na tobě, zda se bude nové jídlo objevovat, když had jedno +z existujících sní, nebo automaticky v pravidelných intervalech.

    +

    Jídlo vykreslíme stejným způsobem jako hada (ve stejné funkci/metodě) a jako +obrázek použijeme třeba jablko.

    +

    První závan grafiky :-)

    +

    Čtverečky ven, grafiku sem

    +

    Čtverečky jsou fajn, ale hra by měla lahodit oku a had by měl vypadat jako had. +K tomu máme připravenou sadu obrázků - ke stažení zde. +Archiv si rozbal do adresáře s hrou tak, aby adresář snake-tiles byl na stejné +úrovni jako soubor s programem.

    +

    Kousky hada

    +

    Načtení všech obrázků ze složky

    +

    Nejdříve si načteme všechny obrázky do hry, abychom je pak mohli bez potíží +použít. Protože se nechceme opakovat (DRY), bude potřeba to udělat nějak +poloautomaticky. Python obsahuje knihovnu pathlib, +která umí velmi přehledně pracovat s cestami k souborům a třeba nám dát +i seznam všech souborů ve složce.

    +

    Nejdříve si z této knihovny naimportujeme třídu Path, která reprezentuje +soubor či složku na disku a vytvoříme z ní instanci, která bude +ukazovat do naší složky s obrázky.

    +
    from pathlib import Path
    +
    +TILES_DIRECTORY = Path('snake-tiles')
    +

    Třída Path má metodu glob(), která nám ze zadané cesty umí vrátit sekvenci +s názvy souborů dle argumentem zadaných kritérií. My potřebujeme všechny soubory +s příponou .png bez ohledu na jméno. Jakýkoli řetězec je v regulárních +výrazech označen hvězdičkou (*), takže argument pro metodu glob() bude +*.png, což označuje jakýkoli soubor s příponou .png. Jako výsledek +dostaneme sekvenci cest k souborům s obrázky, kterou můžeme projít pomocí cyklu +for, a každý obrázek si můžeme načíst do slovníku, kde hodnotou bude samotný obrázek +pyglet.image a klíčem jeho název. Z názvu však potřebujeme jen samotný název souboru +bez přípony a názvu složky – ten je uložen v atributu stem.

    +

    Výsledný slovník by měl vypadat takto:

    +
    {'right-tongue': <ImageData 64x64>, 'top-tongue': <ImageData 64x64>,
    + 'right-top': <ImageData 64x64>, 'left-bottom': <ImageData 64x64>,
    + 'tail-left': <ImageData 64x64>, 'bottom-tongue': <ImageData 64x64>,
    + 'left-top': <ImageData 64x64>, 'bottom-bottom': <ImageData 64x64>,
    + ...

    Pokud je tohle pro tebe příliš mnoho nových věcí najednou a nedaří se ti to +vyřešit, zkus to ještě jednou a pak se můžeš podívat na řešení.

    +
    +

    Řešení

    + + +

    Housenka

    +

    Než se začneme zabývat různými obrázky, uděláme pokus k ověření, že nám vše stále funguje. +Jako mezistupeň od hranatého hada k jeho věrné grafické podobě vytvoř housenku. +Uděláš to jednoduše tak, že místo zeleného čtverce použiješ k vykreslení hada +obrázek tail-head.png, který máš ve slovníku načten jako pod klíčem tail-head.

    +

    Funguje? No výborně! Před pokračováním si u jeho hraní na chvíli odpočiň. +Začne to být náročnější.

    +

    Housenka

    +

    Výběr správných obrázků

    +

    Jistě sis všiml/a, že některé obrázky v naší sadě jsou téměř identické a liší +se jen v otočení. V tuhle chvíli máme totiž dvě možnosti, jak vykreslit +celého hada pomocí správných obrázků na správných pozicích:

    +
      +
    1. Můžeme vzít jeden obrázek pro tělo, jeden pro ohyb a po jednom pro +hlavu a ocas a ty otáčet tak, jak to bude pro konkrétní kousek hada potřeba.
    2. +
    3. Můžeme využít všech dostupných (různé otočených) obrázků a použít ten +správný obrázek na tom správném místě.
    4. +
    +

    Bod č. 2 je v tuto chvíli snazší a tak budeme pokračovat tímto způsobem.

    +

    Jak vybrat správné obrázky na ta správná místa? Jména obrázků (klíče ve slovníku) +obsahují informaci, odkud kam daný obrázek vede. Stačí se tedy při +vykreslování každého kousku hada podívat na umístění jednoho před ním +a jednoho za ním a podle toho vybrat ze slovníku ten správný obrázek. +U každého kousku hada a kousku před i za ním tě budou zajímat jejich +souřadnice, protože podle nich lze velmi snadno poznat, zda je zkoumaný kousek +nalevo, napravo, nahoře, nebo dole.

    +

    Způsobů, jak toho docílit, je celá řada a i když se to může zdát jako složitější +úkol, vše potřebné k jeho vyřešení znáš.

    +

    Finální had

    +

    Odměnou za vyřešení ti bude kompletní grafická hra Had. Gratuluji!

    +

    Optimalizace, úklid

    +

    Než se po dokončení základní hry vrhneš na její rozšiřování, měl by se celý kód +uklidit a zpřehlednit, aby se v něm další úpravy dělaly snáze a s menším +rizikem, že se něco pokazí.

    +

    Body k zamyšlení:

    +
      +
    • Pokud se ti tam opakuje nějaký kousek kódu vícekrát, možná by se dal +vložit do funkce nebo cyklu.
    • +
    • Mají všechny proměnné smysluplná jména?
    • +
    • Při vykreslování možná tvoříš pro každý kousek hada nový Sprite a ten +je po vykreslení zapomenut. Optimálnější by možná bylo použít seznam +a v něm všechny instance třídy Sprite uchovávat a používat znovu a znovu. +Sprite přeci můžeme posunout na libovolné místo i změnit obrázek, který +obsahuje.
    • +
    • Používáš globální proměnné? Nebylo by lepší mít jednu třídu pro stav hry +a v ní všechny podstatné informace a metody?
    • +
    • Funguje ovládání dle tvých představ nebo by šlo nějak zlepšit?
    • +
    \ No newline at end of file diff --git a/lessons/snake/screenshot-cat.png b/lessons/snake/screenshot-cat.png new file mode 100644 index 0000000000000000000000000000000000000000..58067ba4b3fde631041733454c787b4e92a948d4 GIT binary patch literal 13753 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 literal 0 HcmV?d00001 diff --git a/lessons/snake/screenshot-final.png b/lessons/snake/screenshot-final.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac246c7202515ace4b3f1d3abfa689765e6f8fe GIT binary patch literal 19063 zcmeFZXH-+s_a=NP0)i9^0wP6e3P`ZfyC@LpB27wAK%}Gek^m~GAT2cMAWfu%ju1!? zR0O0*m5#I!T7ZNa66W&zziYkk%zD4fx0zYPS}Y*RJ@=ly_u1#!&$AEjjSRF|nJ+N| z0Kf{>x%UtNXv4toQ%nrtD|ajPbig0<-glvon82?PCWm+6-#k9|EqqKopZWMddFco^ zd3d@z-te}6>FDU;{oK=sK!;TY06_qHPvcQQ=Gs(nrii}{?%3ZnYp@tHcw1#Kv2meG z@78fkm5SLJ*nHB)n=J*Rft%t~d>)lWoyNVxf|&X5l@MD%Q6c1WLzQE7=S zDkoDuWO>?NTU0dGK<~&%`sA)zb#U^J47s=&#oJ0s9FbSPu>-*D8M_b0+>tH~6Lk5! z+K~8W%_nHzC+_n_`Y8ShWsK`HzY(kTM0x;d9k~7T`LkyuGtG`i<7sIo6BK=WE4Dis zJqg3AH^G}rqMp?#D9Y9^T4GhDy;Suv;A>8*_8(Su4jVBymokS{dB9i7&Il2#XSg+q z5CBlW&wbu~)0qlR{4<;VhofQD(JlBpeOT^mpQ&rzm)(oiX&WtyP1^@Q+}rffAEqpN_21 zQg+H%PWK+Xg*-Y_7!8@u|HI1bv%L9c<0~=o5Egnc%9rymFdIR!!IousHW_2d!B|w> z)Qe)R$hSK`bAn!be5EQ5yU4%~x?#iQW3s^Wm)ij|IE;4(Tg#%pTDdL+UNOF2PhFfQ z`wS;T`fdC}4FvX&sRgSC!>c=_aaqslGMw$ps@NR)JS_E>w(q|Uo2HF%*E_eA%OI5Q zmc#OyKva59k?@V>%*4L^7SdV@_fddJZ!@u)E?YyDS5{|WL${bIOVs4FSoZeHy7Rq6FxP*nKs1t;d z>}bE$lHwd&68RwweSbqY1pP?u*xPgD*RM({sXa8$Fl5{0*3aer_vi698xZ6hQEf&7 z=y`*KY?Q!p!YICR#_#>7YXk2~u1~$d&8+x`682;i6iVc%3x>-@ycLA~%;QbMah3-L zuQf$!>|3?>pS%tY+Ved6f|+-O49~!qq~KJRz2yb7!1^9Irs4%K`-X}>%atC% zo#ltIsZ%NZ*pJ?bVF_5CUuofq_dfkv)`snA1}#cpOa#bpD2kK2NUK46&!&Gtr!;c= zCVl;9V2r?Ox77?adc5J7XMMU(mq5;%83+#Th{Vz{vMrZ;hIV|KNo5uc!>Hh1u?RzR z$VV!N{W+AtjYdHxVJJI-m=V-HF)am6SC%cwLChPjRO>>9HD^LBu+$7}7C-hl&1r`^ z1COf+m|kq!qe6<~VDRDOp!PV*yX>H#90b`<>DodR&ZYtf+fs%vQ6}*#^(@P3<>Z)^q~Ec5|)uaNC!*m zCLo2~C+hV_VgBXQTfP4HlHxu5N@>MV@C<0=ms{C`ia1aB>RHMp0z+(qt6ax0o z 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 Qnzopr0G54!rT_o{ literal 0 HcmV?d00001 diff --git a/lessons/snake/snake-tiles.png b/lessons/snake/snake-tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7b1c8d52d5a64b5e1fd0d6b225c359a050f62d GIT binary patch literal 87807 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 jog(^gP3b#4eF*bP0l+XkK**z13 literal 0 HcmV?d00001 diff --git a/lessons/snake/snake-tiles.zip b/lessons/snake/snake-tiles.zip new file mode 100644 index 0000000000000000000000000000000000000000..7faf9e410509a2e2420b5b7bb27fb956caf2d612 GIT binary patch literal 65885 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 D27VcM literal 0 HcmV?d00001 diff --git a/lessons/str-index-slice/index.html b/lessons/str-index-slice/index.html new file mode 100644 index 00000000..b175eebb --- /dev/null +++ b/lessons/str-index-slice/index.html @@ -0,0 +1,165 @@ +

    Výběr z řetězců

    +

    Už umíš spojovat dohromady kratší řetězce:

    +
    spojeny_retezec = 'a' + 'b'
    +dlouhy_retezec = 'ó' * 100
    +

    Teď se podíváme na opačný proces: jak z dlouhého +řetězce dostat kratší součásti. +Začneme jednotlivými znaky.

    +

    Výběr znaku

    +

    Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku +(angl. subscripting), +která se píše podobně jako volání funkce, jen s hranatými závorkami. +Třeba takhle se dá vybrat znak na páté pozici:

    +
    pate_pismeno = 'čokoláda'[5]
    +
    +print(pate_pismeno)
    +

    Funguje to? Dostal/a jsi opravdu páté písmeno?

    +
    +

    Řešení

    + + +

    Jak sis možná už všiml/a, programátoři počítají od nuly. +„První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.

    +

    Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, +druhé jedna, ... a osmé písmeno má číslo sedm.

    +

    Proč je tomu tak? +K úplnému pochopení důvodů by ses potřeboval/a +naučit něco o ukazatelích a polích, +což nebude hned, takže pro teď nám bude +stačit vědět, +že programátoři jsou prostě divní.

    +

    Nebo aspoň že mají rádi divná čísla – jako nulu.

    +
       [0] [1] [2] [3] [4] [5] [6] [7]
    +
    +  ╭───┬───┬───┬───┬───┬───┬───┬───╮
    +  │ Č │ o │ k │ o │ l │ á │ d │ a │
    +  ╰───┴───┴───┴───┴───┴───┴───┴───╯

    A když už jsme u divných čísel, +co se asi stane, když budu vybírat písmena pomocí záporných čísel?

    +
    +

    Řešení

    + + +

    Sekání řetězců

    +

    Kromě jednotlivých znaků můžeme vybírat i delší části – odborně +podřetězce (angl. substrings).

    +

    Zkus, co dělá tenhle program:

    +
    retezec = 'čokoláda'
    +kousek = retezec[5:]
    +print(kousek)
    +
    +

    Řešení

    + + +

    Dá se použít i retezec[:5], +který vybere všechno až po znak číslo 5. +Ne však znak 5 samotný, což je možná trochu zarážející, +ale je potřeba s tím počítat. +Poslední prvek není ve výběru obsažen, podobně jako range(5) neobsahuje +číslo 5.

    +

    Ačkoli je tohle chování divné, má hezké důsledky. +Všimni si třeba, že retezec[:5] + retezec[5:] ti dá zpět původní retezec.

    +

    Podobnému vybírání podřetězců se říká „sekání“ řetězců +(angl. string slicing).

    +

    Sekání „od“ a „do“ se dá kombinovat. +Zkus si to: co asi udělají následující příkazy?

    +
    retezec = 'čokoláda'
    +print(retezec[:4])
    +print(retezec[2:6])
    +print(retezec[-3:])
    +print(retezec[:])
    +
    +

    Řešení

    + + +

    Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

    +

    U sekání (s :) pomáhá očíslovat si „hranice“ mezi znaky, +abys v tom měl/a lepší přehled:

    +

    +
      ╭───┬───┬───┬───┬───┬───┬───┬───╮
    +  │ Č │ o │ k │ o │ l │ á │ d │ a │
    +  ├───┼───┼───┼───┼───┼───┼───┼───┤
    +  │   │   │   │   │   │   │   │   │
    +  0   1   2   3   4   5   6   7   8
    + -8  -7  -6  -5  -4  -3  -2  -1
    +
    +  ╰───────────────╯
    +  'čokoláda'[:4] == 'čoko'
    +
    +          ╰───────────────╯
    +        'čokoláda'[2:6] == 'kolá'
    +
    +                      ╰───────────╯
    +                      'čokoláda'[-3:] == 'áda'

    Cvičení

    +

    Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za +jiné. Například:

    +
    slovo = input('Slovo: ')
    +pozice = int(input('Které písmeno zaměnit (od nuly)? '))
    +novy_znak = input('Nové písmeno: ')
    +
    +... # sem doplň kód
    +
    +print(nove_slovo)
    +

    Příklad použití:

    +
    +Slovo: čokoláda
    +Které písmeno zaměnit (od nuly)? 3
    +Nové písmeno: u
    +čokuláda
    +
    +Slovo: kočka
    +Které písmeno zaměnit (od nuly)? 1
    +Nové písmeno: a
    +kačka
    +

    Pozor na to, že řetězce v Pythonu nelze měnit. +Nemůžeš v existujícím řetězci zaměnit jeden znak za jiný; +musíš vytvořit nový řetězec poskládaný z částí toho starého.

    +
    +

    Řešení

    + + +
    \ No newline at end of file diff --git a/lessons/str-methods/index.html b/lessons/str-methods/index.html new file mode 100644 index 00000000..298d7d86 --- /dev/null +++ b/lessons/str-methods/index.html @@ -0,0 +1,83 @@ +

    Řetězcové funkce a metody

    +

    Řetězce umí všelijaké triky. +Funkcí len() můžeš zjistit, jak je řetězec dlouhý; +operátorem in pak jestli v sobě obsahuje daný podřetězec.

    + + + + + + + + + + + + + + + + + + + + + +
    ZápisPopisPříklad
    len(r)Délka řetězcelen('čokoláda')
    x in rTrue pokud je řetězec x obsažen v r'oko' in 'čokoláda'
    x not in rOpak x in r'dub' not in 'čokoláda

    Řetězce vždy berou v potaz velikost písmen, +takže např. 'ČOKO' in 'čokoláda' je False. +Kdybys chtěl/a porovnávat bez ohledu na velikost písmen, +musel/a bys oba řetězce převést třeba na malá písmena +a pak je porovnat.

    +

    A jak se převádí na malá písmena? +K tomu budeme potřebovat další novou vlastnost Pythonu: metody.

    +

    Metody

    +

    Metoda (angl. method) je jako funkce – něco, co se dá zavolat. +Na rozdíl od funkce je svázaná s nějakým objektem (hodnotou). +Volá se tak, že se za objekt napíše tečka, +za ní jméno metody a za to celé se, jako u funkcí, připojí závorky +s případnými argumenty.

    +

    Řetězcové metody upper() a lower() +převádí text na velká, respektive malá písmena. +Zkus si to!

    +
    retezec = 'Ahoj'
    +print(retezec.upper())
    +print(retezec.lower())
    +print(retezec)
    +

    Všimni si, že původní řetězec se nemění; metoda vrátí nový řetězec, ten +starý zůstává.

    +

    To je obecná vlastnost řetězců v Pythonu: jednou existující řetězec se už +nedá změnit, dá se jen vytvořit nějaký odvozený. +S touto vlastností už ses mohl/a setkat při psaní funkce zamen.

    +

    Iniciály

    +

    Pro procvičení metod a vybírání znaků si zkus napsat program, +který se zeptá na jméno, pak na příjmení +a pak vypíše iniciály – první písmena zadaných jmen.

    +

    Iniciály jsou vždycky velkými písmeny +(i kdyby byl uživatel líný mačkat Shift).

    +
    +

    Řešení

    + + +

    A další

    +

    Řetězcových metod je celá řada. +Nejužitečnější z nich najdeš v taháku, který si můžeš stáhnout či vytisknout. +Podívej se na ně a zjisti, co dělají.

    +

    A úplně všechny řetězcové metody jsou popsány v dokumentaci Pythonu (anglicky; plné věcí, které ještě neznáš).

    +

    Všimni si, že len není metoda, ale funkce; píše se len(r), ne r.len(). +Proč tomu tak je, to za nějakou dobu poznáš.

    \ No newline at end of file diff --git a/lessons/str/index.html b/lessons/str/index.html new file mode 100644 index 00000000..abdc43d2 --- /dev/null +++ b/lessons/str/index.html @@ -0,0 +1,209 @@ +

    Zápis řetězců

    +

    Teď se podíváme na zoubek řetězcům. +Už s nimi trochu umíš, tak začneme rekapitulací.

    +

    Textový řetězec (angl. string) je datový typ (druh hodnot), +který obsahuje text – třeba slovo nebo větu.

    +

    Když řetězec zadáváš do programu, musíš ho označit – uzavřít do +uvozovek, buď jednoduchých nebo dvojitých:

    +
    'tohle je řetězec'
    +"tohle taky"
    +

    Je velký rozdíl mezi print('cislo') – vypiš slovo „cislo“ – +a print(cislo) – vypiš hodnotu výrazu cislo. +Jednou je cislo pět konkrétních písmen; podruhé instrukce k použití +proměnné. +Počítač, na rozdíl od lidí, rozdíl mezi textem a instrukcí nepozná z kontextu, +a tak je uvozovky potřeba používat důsledně.

    +

    (Ilustrační komiks. Člověk říká robotovi: "Řekni Pavlovi, ať mi zavolá!". Robot odpoví: "PAVLOVI AŤ MI ZAVOLÁ!")

    +

    Znaky

    +

    Texty sestávají z jednotlivých písmenek. +Řetězce víceméně taky, ale aby bylo jasné, co přesně tím písmenkem +myslíme, říkáme, že řetězce sestávají ze znaků (angl. characters).

    +

    Takový znak může být písmenko (např. A) nebo číslice (3), +ale i jiný symbol (!).

    +

    Každý řetězec má určitý počet znaků. +Kolik, to zjistíš pomocí funkce len(). +Třeba řetězec Ahoj! má znaků pět:

    +
    >>> len('Ahoj!')
    +5
    +

    Jeden ze zajímavějších znaků je mezera. +Je to taky znak. V řetězci se tedy chová stejně jako písmenko:

    +
    >>> len(' ')
    +1
    +>>> len('K ní')
    +4
    +>>> len('3 + 2')
    +5
    +

    Mimochodem, řetězec může být i prázdný – pak má nula znaků:

    +
    >>> len('')
    +0
    +>>> len("")
    +0
    +

    Uvozovky

    +

    K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. +Není mezi nimi rozdíl. +Podobně 4.0 a 4.000 jsou dva zápisy téhož čísla, +tak 'slovo' a "slovo" pro Python označuje stejnou +hodnotu, skládající se ze stejných pěti písmen.

    +

    Použité uvozovky nejsou součástí hodnoty – python si „nepamatuje“, jakým +způsobem byl řetězec uvozen. +Když má nějaký řetězec vypsat s uvozovkami, jedny si k tomu vybere – většinou +ty jednoduché:

    +
    >>> "python"
    +'python'
    +>>> 'slovo'
    +'slovo'
    +

    Předchozí příklad je z interaktivního režimu Pythonu, který ukazuje hodnoty +výrazů „programátorsky“ – pokud možno tak, jak se zapisují v Pythonu. +Funkce print() vypisuje hodnoty „hezky“, „pro uživatele“ – v případě +řetězců tedy bez uvozovek.

    +

    Uvozovky v uvozovkách

    +

    Proč si při zadávání textu můžeš vybrat mezi dvěma druhy uvozovek?

    +

    Občas se stane, že v rámci textu potřebuješ použít samotnou uvozovku (nebo +apostrof). +Pak musíš „kolem“ řetězce použít tu druhou:

    +
    print('Zpívala si: "Tralala!"')
    +print("Byl to Goa'uld, parazit z planety P3X-888")
    +

    Když v rámci textu použiješ stejnou uvozovku jako „kolem něj“, tak bude Python +naprosto zmatený.

    +
    >>> len("Zpívala si: "Tralala"")
    +Traceback (most recent call last)
    +  File "<>", line 1
    +    len("Zpívala si: "Tralala"")
    +                      ^
    +SyntaxError: invalid syntax
    +

    Pokud používáš chytrý editor, doporučuju si zvyknout na to, jakou barvou +máš řetězce zvýrazněné. +Často to pomáhá odhalit chybky.

    +

    Sekvence se zpětným lomítkem

    +

    Co dělat, když v řetězci potřebuješ oba druhy uvozovek, +jako ve větě Vtom vnuk křik': "Hleď!"?

    +

    Můžeš si pomoci tím, že spojíš dva řetězce:

    +
    >>> print("Vtom vnuk křik': " + '"Hleď!"')
    +Vtom vnuk křik': "Hleď!"
    +

    Ale lepší způsob je použít speciální zápis se zpětným lomítkem. +Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou +uvozovku.

    +
    >>> print("Vtom vnuk křik': \"Hleď!\"")
    +Vtom vnuk křik': "Hleď!"
    +>>> print('"Jen ho nech," řek\' děd. "Kdo zná líp kraj?"')
    +"Jen ho nech," řek' děd. "Kdo zná líp kraj?"
    +

    Ve výsledném řetězci pak ovšem žádné zpětné lomítko není. +Sekvence \' je jen způsob, jak v Pythonu zadat ' – jediný znak. +Tomu je celkem důležité porozumět. +Zkus si, jestli zvládneš předpovědět výsledek těchto výrazů:

    +
    >>> print(".\".")
    +>>> len(".\".")
    +>>> ".\"."
    +
    +

    Řešení

    + + +

    Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. +Jedna ze zajímavějších je \t, představující tabulátor – jediný znak, který +se, když ho vypíšeš, „roztáhne“ na víc mezer.

    +
    >>> print("a\tb")   # Výpis "pro lidi"
    +a       b
    +>>> "a\tb"          # Výpis "pro programátory"
    +'a\tb'
    +>>> len("a\tb")     # Počet znaků v řetězci
    +3
    +

    Se zpětným lomítkem se dá zadat jakýkoli znak – včetně emoji – podle jména +(\N{…}) nebo identifikačního čísla (\x.., \u...., \U........) +standardu Unicode. +Stačí přesné jméno nebo číslo znát (nebo třeba dohledat na internetu). +V následujících řetězcích jsou takové znaky pro přehlednost mezi dvěma +pomlčkami -. Délka každého řetězce je tedy celkem 3:

    +
    >>> print('-\N{GREEK CAPITAL LETTER DELTA}-')
    +-Δ-
    +>>> print('-\N{SECTION SIGN}-')
    +-§-
    +>>> print('-\N{GRINNING CAT FACE WITH SMILING EYES}-')
    +-😸-
    +>>> print('-\x60-')
    +-`-
    +>>> print('-\u30C4-')
    +-ツ-
    +>>> print('-\U0001F0BD-')
    +-🂽-
    +

    Zpětné lomítko

    +

    Zpětné lomítko tedy začíná speciální sekvenci (známou pod anglickým +termínem escape sequence), kterou zadáš jediný znak.

    +

    Tahle vychytávka má jeden, někdy nepříjemný, důsledek: pokud chceš mít jako +součást řetězce zpětné lomítko (třeba ve jménech souborů na Windows), +nemůžeš použít přímo \. +Musíš použít speciální sekvenci \\ – tedy lomítko zdvojit:

    +
    print('C:\\PyLadies\\Nový adresář')
    +

    Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ +je zápis pro jedno zpětné lomítko.

    +

    Nový řádek

    +

    Někdy potřebuješ řetězce, které obsahují více řádků. +Pythonní řetězce ale můžeš normálně napsat jen na jeden řádek. +(Python se tak snaží ulehčit hledání chyby, kdybys koncovou uvozovku +zapoměl/a.)

    +

    Můžeš ale do řetězce znak pro nový řádek vložit pomocí sekvence \n:

    +
    >>> print('Haló haló!\nCo se stalo?')
    +Haló haló!
    +Co se stalo?
    +

    Ono \n do řetězce vloží znak nového řádku. +Ten při výpisu ukončí stávající řádek a přejde na nový – ale jinak se chová +jako jakýkoli jiný znak:

    +
    >>> print('-\n-')
    +-
    +-
    +>>> len('-\n-')
    +3
    +

    Trojité uvozovky

    +

    Kromě \n je i druhý způsob, jak zadat řetězec se znakem nového řádku: +ohraničit ho třemi uvozovkami (jednoduchými nebo dvojitými) +na každé straně. +Dají se tak zadávat delší víceřádkové řetězce:

    +
    basen = '''Haló haló!
    +Co se stalo?
    +Prase kozu potrkalo!'''
    +

    Pozor na to, že pokud je tenhle řetězec +v odsazeném kódu, každý jeho řádek bude začínat +několika mezerami. +(V dokumentačních řetězcích tohle nevadí, tam se s odsazením počítá.)

    +
    cislo = 4
    +
    +if cislo > 0:
    +    print("""
    +        Výsledek porovnání:
    +
    +        Číslo je kladné.
    +    """)
    +

    Cvičení

    +

    Jaká je délka těchto řetězců?

    +

    Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

    +
    print(len('ahoj'))
    +print(len("""Ahoj!"""))
    +print(len('a b'))
    +print(len( ' a b ' ))
    +print(len('\N{SNOWMAN}ové'))
    +print(len('a\nb'))
    +print(len('a\tb'))
    +print(len('"\'"'))
    +
    +
    +print(len("""
    +abc"""))
    +
    +
    +if True:
    +    print(len("""a
    +    b"""))
    +
    +
    +print(len('C:\new_dir'))
    +
    +print(len(f'{print}'))
    \ No newline at end of file diff --git a/lessons/str/quote-comic.svg b/lessons/str/quote-comic.svg new file mode 100644 index 00000000..cd80509d --- /dev/null +++ b/lessons/str/quote-comic.svg @@ -0,0 +1,466 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lessons/submitting-a-run/index.html b/lessons/submitting-a-run/index.html new file mode 100644 index 00000000..10ac08f7 --- /dev/null +++ b/lessons/submitting-a-run/index.html @@ -0,0 +1,71 @@ +

    Přidání kurzu na Nauč se Python

    +

    Když už máme nadefinováný vlastní kurz, zbývá nám jen ho dostat na naucse.python.cz. +Budeme k tomu potřebovat jen pár příkazu v Gitu a trochu trpělivosti.

    +

    Nahrání do vlastního forku

    +

    První věc, kterou budeš potřebovat, je vlastní účet na GitHubu.

    +

    Přihlaš se na GitHub a vytvoř „fork” repozitáře pyvec/naucse.python.cz. +Na stránce repozitáře vpravo nahoře na to je tlačítko Fork.

    +
    +Tlačítko na vytvoření forku repozitáře s Nauč se Python +

    Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, +jestli fork bude pod tvým účtem nebo pod organizací. +Děláš-li kurz pro organizaci, použij tu, +abyste do materiálů mohli přispívat všichni. +Jinak udělej kurz pod vlastním účtem.

    +

    Vytvoření chvilku trvá. +To, že je fork vytvořen, poznáš tak, že tě GitHub přesměruje na stránku, která bude skoro stejná, ale v hlavičce bude jiné uživatelské jméno (tvoje nebo tvé +organizace) a pod tím text forked from pyvec/naucse.python.cz.

    +

    Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. +To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno, +pod kterým fork je):

    +
    $ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/naucse.python.cz.git
    +

    Dále potřebuješ vytvořit commit se svým kurzem a případně se změnami v materiálech. +Je dobré změny dělat v zvláštní větvi, ne v master. +Vymysli si název větve (např. podzim-2016) a pusť příkazy

    +
    $ git branch nazevvetve
    +$ git checkout nazevvetve
    +

    Jak vytvořit commit, se dozvíš například v návodu na používání Gitu. +Více o větvích se můžeš dozvědět v návodu na větvení v Gitu.

    +

    Svůj commit teď potřebuješ dostat do svého forku na GitHubu. +To uděláš příkazem (uzivatelskejmeno nahraď za uživatelské jméno, pod kterým fork +je):

    +
    $ git push uzivatelskejmeno
    +

    Informace o forku pro Nauč se Python

    +

    Teď potřebuješ dostat informaci o tvém forku do základního repozitáře. +To se dělá pomocí souboru link.yml, se kterým se udělá Pull Request do základního repozitáře.

    +

    Nejdřív si vytvoř novou větev odvozenou od původního repozitáře, ve které vytvoříš soubor link.yml. +To uděláš tímto příkazem (pridanikurzu můžeš změnit, je to název nové větve):

    +
    $ git checkout -b pridanikurzu origin/master
    +

    Možná sis všiml/a, že tvoje změny jsou najednou pryč, ale neboj, ony jsou uloženy na tvém počítači i na GitHubu, jen zrovna nejsou vidět.

    +

    Teď potřebuješ vytvořit stejnou složku jako jsi vytvořil/a pro soubor info.yml – musí se jmenovat úplně stejně. +V té složce vytvoř soubor, který se tentokrát bude jmenovat link.yml. +Bude zase ve formátu YAML, ale tentokrát bude jednoduchý. +Jedinou povinou informací je klíč repo, do kterého musíš dát odkaz na tvůj fork. +Jméno větve pak napiš do klíče branch. +Pozor, jedná se o větev s kurzem, ne o větev, ze které kurz přidáváš na Nauč se Python (tedy ne pridanikurzu z příkladu výše).

    +

    Výsledný soubor pak vypadá následovně:

    +
    repo: https://github.com/uzivatelskejmeno/naucse.python.cz.git
    +branch: nazevvetve
    +

    Vytvoř s tímto souborem (a jen tímto souborem) commit a zase odešli změnu na GitHub.

    +
    $ git push uzivatelskejmeno
    +

    Teď už potřebuješ udělat Pull Request (dále jen jako PR) se souborem link.yml. +Jak udělat PR je popsáno v návodu na používání Gitu. +Ideálně do popisku napiš, kdo jsi a co organizuješ za kurz, ať to správci nemusí zjišťovat například z popisku v info.yml.

    +

    Po tom, co správci PR schválí a sloučí tvoje změny do základního repozitáře, stačí počkat pár minut a tvůj kurz se objeví na naucse.python.cz.

    +

    Upravování kurzu

    +

    Pokud budeš chtít na svém kurzu něco změnit, musíš se nejdřív zpátky přepnout do větve, ve které ten kurz je. +To uděláš následujícím příkazem. +nazevvetve nahraď za větev, ve které kurz máš.

    +
    $ git checkout nazevvetve
    +

    S každou změnou pak musíš udělat commit a odeslat commit na GitHub.

    +

    Už naprosto poslední věc, kterou je potřeba zařídit, je aby se změny ve tvém kurzu u tebe ve forku projevily na Nauč se. +To se dělá pomocí tzv. webhooků, webových adres, které reagují na nějaké akce. +Musíš tedy nastavit svůj fork, aby posílal akce na webhook, který vyvolá nové nasazení webové stránky naucse.python.cz.

    +

    Pro instalaci webhooků máme speciální aplikaci, která je umí sama nastavit. +Běží na adrese hooks.nauc.se. +Když se v té aplikaci přihlásíš, uvidíš tam svůj fork repozitáře naucse.python.cz (a všechny ostatní forky Nauč se, do kterých máš přístup). +Poté už jen stačí kliknout na tlačítko Aktivovat u správného repozitáře a webhook se nainstaluje. +A to je všechno! Přidal/a jsi kurz na Nauč se Python!

    +

    Pokud to umíš a chceš, můžeš si webhook nainstalovat sám/sama manuálně. +Adresa webhooku je https://hooks.nauc.se/hooks/push, je potřeba Content-Type application/json a secret není potřeba zadávat.

    +
    \ No newline at end of file diff --git a/lessons/submitting-a-run/naucse_fork.png b/lessons/submitting-a-run/naucse_fork.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdfb521cf3a04d9d6cfd9fd95c48ba3dd230709 GIT binary patch literal 49953 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 literal 0 HcmV?d00001 diff --git a/lessons/testing/index.1.html b/lessons/testing/index.1.html new file mode 100644 index 00000000..2291b0a2 --- /dev/null +++ b/lessons/testing/index.1.html @@ -0,0 +1,564 @@ +

    Testování

    +

    V tomto cvičení se budeme zabývat automatickým testováním kódu. +Modul unittest ze standardní knihovny už byste měli znát, +co to jsou jednotkové testy a k čemu slouží tedy rovnou přeskočím.

    +

    Pokud základy testování neznáte, projděte si +začátečnickou lekci o testování. +Obsah se zčásti překrývá, ale základní principy jsou tam vysvětleny trošku +podrobněji.

    +

    Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový +zápisek Michala Hořejška.

    +

    pytest

    +

    Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu +unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday +z cvičení o modulech.

    +
    import isholiday
    +
    +def test_xmas_2016():
    +    """Test whether there is Christmas in 2016"""
    +    holidays = isholiday.getholidays(2016)
    +    assert (24, 12) in holidays
    +

    Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a +nainstalujeme a spustíme pytest:

    +
    (__venv__) $ python -m pip install pytest
    +(__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py .                                                 [100%]
    +
    +=========================== 1 passed in 0.01 seconds ===========================
    +

    Všimněte si několika věcí:

    +
      +
    • V testovacím souboru stačí mít funkci pojmenovanou test_* a pytest pozná, +že se jedná o test.
    • +
    • V ukázce je použit obyčejný assert, nikoliv metoda z unittest.
    • +
    +

    Co se má testovat, se pytestu dá zadat pomocí argumentů příkazové řádky. +Můžou to být jednotlivé soubory nebo adresáře, ve kterých pytest +rekurzivně hledá všechny soubory začínající na test_. +Vynecháme-li argumenty úplně, hledá rekurzivně v aktuálním adresáři. +(To se často hodí, ale obsahuje-li aktuální adresář i vaše virtuální prostředí, +pytest prohledá i to a často v něm najde neprocházející testy.)

    +

    Pokud pytest nemůže naimportovat váš modul, můžete udělat několik věcí:

    +
      +
    • Nainstalovat svůj balíček (například v režimu develop).
    • +
    • Nastavit proměnnou prostředí PYTHONPATH na ..
    • +
    +

    Testovat nainstalovaný balíček je výhodnější – ověříte zároveň, že +nainstalovaný modul se chová dle očekávání. Je dobré testy psát tak, aby +šly spouštět z jakéhokoliv adresáře, a pro jistotu je spouštět odjinud, +než z adresáře s kódem. Odhalíte tím často balíčkovací chyby.

    +

    Pytest upravuje chování assertu, což oceníte především, pokud test selže:

    +
        ...
    +    assert (23, 12) in holidays
    +
    (__venv__) $ python -m pytest tests/test_holidays.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collected 1 item
    +
    +tests/test_holidays.py F                                                 [100%]
    +
    +=================================== FAILURES ===================================
    +________________________________ test_xmas_2016 ________________________________
    +
    +    def test_xmas_2016():
    +        """Test whether there is Christmas in 2016"""
    +        holidays = isholiday.getholidays(2016)
    +>       assert (23, 12) in holidays
    +E       assert (23, 12) in {(1, 1), (1, 5), (5, 7), (6, 7), (8, 5), (17, 11), ...}
    +
    +tests/test_holidays.py:6: AssertionError
    +=========================== 1 failed in 0.02 seconds ===========================
    +

    S obyčejným assertem si vystačíte pro většinu testovaných případů kromě +ověření vyhození výjimky. To se dělá takto:

    +
    import pytest
    +
    +def f():
    +    raise SystemExit(1)
    +
    +def test_mytest():
    +    with pytest.raises(SystemExit):
    +        f()
    +

    Více o základním použití pytestu najdete v dokumentaci.

    +

    Parametrické testy

    +

    Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. +Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen +v roce 2016, ale v jiných letech, nemusíme psát testů více, ani použít cyklus.

    +

    Nevýhoda více téměř stejných testů je patrná sama o sobě, nevýhoda cyklu je +v tom, že celý test selže, i pokud selže jen jeden průběh cyklem. Zároveň se +průběh testu při selhání ukončí.

    +

    Místo toho tedy použijeme parametrický test:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +def test_xmas(year):
    +    """Test whether there is Christmas"""
    +    holidays = isholiday.getholidays(year)
    +    assert (24, 12) in holidays
    +

    Zápis je určitým způsobem podobný knihovně click: funkce +s testem přijímá parametr vytvořený v dekorátoru. +Test se spustí pro každou uvedenou hodnotu, k jejich definici lze použít +jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité +n-tice např. seznam, množinu, range, vlastní generátor...

    +

    Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

    +
    (__venv__) $ python -m pytest -v
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] PASSED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] PASSED                           [100%]
    +
    +=========================== 5 passed in 0.02 seconds ===========================
    +

    Jednoduchým způsobem tak lze vyrobit z jednoho testu testů více. +Výhodou je, že každý se testuje zvlášť, což má vliv na čitelnost +výstupu, pokud nějaký test selže, a umožňuje to například testy pouštět +paralelně nebo distribuovaně. (Což s jedním testem, který více podmínek ověřuje +v cyklu, nejde, tedy alespoň ne jednoduše.)

    +

    Potřebujeme-li parametrizovat více argumentů, můžeme předat seznam jmen +argumentů a seznam jejich hodnot:

    +
    import pytest
    +import isholiday
    +
    +@pytest.mark.parametrize(
    +    ['year', 'month', 'day'],
    +    [(2015, 12, 24),
    +     (2016, 12, 24),
    +     (2017, 1, 1),
    +     (2033, 7, 5),
    +     (2048, 7, 6)],
    +)
    +def test_some_holidays(year, month, day):
    +    """Test a few sample holidays"""
    +    holidays = isholiday.getholidays(year)
    +    assert (day, month) in holidays
    +

    Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, +abychom se ujistili, že testujeme správně. +Přidáme tedy dočasně na konec funkce getholidays() tento pesimistický kus kódu:

    +
        if year > 2020:
    +        # After the Zygon war, the puppet government canceled all holidays
    +        holidays = set()
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
    +cachedir: .pytest_cache
    +rootdir: /tmp/tmp.etepchwQWh, inifile:
    +collecting ... collected 5 items
    +
    +tests/test_holidays.py::test_xmas[2015] PASSED                           [ 20%]
    +tests/test_holidays.py::test_xmas[2016] PASSED                           [ 40%]
    +tests/test_holidays.py::test_xmas[2017] PASSED                           [ 60%]
    +tests/test_holidays.py::test_xmas[2033] FAILED                           [ 80%]
    +tests/test_holidays.py::test_xmas[2048] FAILED                           [100%]
    +
    +=================================== FAILURES ===================================
    +_______________________________ test_xmas[2033] ________________________________
    +
    +year = 2033
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +_______________________________ test_xmas[2048] ________________________________
    +
    +year = 2048
    +
    +    @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048))
    +    def test_xmas(year):
    +        """Test whether there is Christmas"""
    +        holidays = isholiday.getholidays(year)
    +>       assert (24, 12) in holidays
    +E       assert (24, 12) in set()
    +
    +tests/test_holidays.py:8: AssertionError
    +====================== 2 failed, 3 passed in 0.03 seconds ======================
    +

    Fixtures

    +

    Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, +abyste získali to, co teprve chcete testovat. Příkladem může být například +inicializace objektu pro komunikaci s nějakým API.

    +

    V pytestu k tomuto účelu nejlépe slouží tz. fixtures, které se v samotných +testech používají jako argumenty funkcí.

    +
    import pytest
    +
    +@pytest.fixture
    +def client():
    +    import twitter
    +    return twitter.Client(...)
    +
    +def test_search_python(client):
    +    tweets = client.search('python', size=1)
    +    assert len(tweets) == 1
    +    assert 'python' in tweets[0].text.lower()
    +

    Fixtures se hledají pomocí jména: když má testovací funkce (nebo i jiná +fixture) parametr, podle jména tohoto parametru se najde odpovídající fixture. +Fixtures můžou být definovány v aktuálním souboru, +v pluginu, +konfiguračním souboru +a některé jsou zabudované přímo v pytestu.

    +

    Pokud potřebujete po použití s fixturou ještě něco udělat, můžete místo return +použít yield. +Často se to používá u zdrojů, které je po použití potřeba nějak finalizovat či +zavřít, například u databázových spojení. +Zde je ilustrační příklad, který si můžete rovnou vyzkoušet:

    +
    import pytest
    +
    +
    +class DBConnection:
    +    def __init__(self, name):
    +        print('Creating connection for ' + name)
    +        ...
    +
    +    def select(self, arg):
    +        return arg
    +
    +    def cleanup(self):
    +        print('Cleaning up connection')
    +        ...
    +
    +
    +@pytest.fixture
    +def connection():
    +    d = DBConnection('sqlite')
    +    yield d
    +    d.cleanup()
    +
    +
    +@pytest.mark.parametrize('arg', (1, float, None))
    +def test_with_fixture(connection, arg):
    +    assert arg == connection.select(arg)
    +

    Standardní výstup (stderr a stdout) z testů se normálně zobrazuje, +jen když test selže. +Chceme-li výstup vidět u všech testů, je třeba použít přepínač -s.

    +

    I fixtury jdou parametrizovat, jen trochu jiným způsobem než testovací funkce: +parametry předané dekorátoru pytest.fixture získáme ze speciálního parametru +request, který obsahuje informace o probíhajícím testu:

    +
    @pytest.fixture(params=('sqlite', 'postgres'))
    +def connection(request):
    +    d = DBConnection(request.param)
    +    yield d
    +    d.cleanup()
    +

    Hromadu dalších příkladů použití pytestu najdete dokumentaci v +sekci s příklady. +Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference +PyCon PL.

    +

    „Podvádění“

    +

    Při psaní testů se občas hodí trochu podvádět. Například když nechceme, +aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na +náhodě a podobně. Obecně se tomuto říká mocking * či test doubles a existuje více různých +knihoven, které to umožňují. Jednou z nich je flexmock.

    +

    * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít +pro funkcionalitu knihoven, které mají v názvu mock :)

    +

    Falešné objekty (fakes)

    +

    Při testování často potřebujeme nějaký objekt, který má určité atributy a +metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

    +
    class FakePlane:
    +    operational = True
    +    model = 'MIG-21'
    +    def fly(self): pass
    +
    +plane = FakePlane()  # this is tedious!
    +

    Flexmock umožňuje vytvoření objektu rychle a jednoduše:

    +
    plane = flexmock(operational=True,
    +                 model='MIG-21',
    +                 fly=lambda: None)
    +

    Částečně upravené objekty, třídy, moduly (stubs)

    +

    Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část +atributů nebo metod:

    +
    >>> import flexmock
    +>>> class Train:
    +...     def get_speed(self):
    +...         return 0
    +... 
    +>>> flexmock(Train, get_speed=200)
    +<flexmock.Mock object at 0x7f88501d8908>
    +>>> train = Train()
    +>>> train.get_speed()
    +200
    +

    Můžete tak zfalšovat i volání builtin funkcí, jako je například open():

    +
    >>> import sys
    +>>> import flexmock
    +>>> import builtins
    +>>> from io import StringIO
    +>>> flexmock(builtins, open=StringIO('fake content'))
    +<module 'builtins' (built-in)>
    +>>> with open('/etc/passwd') as f:
    +...     f.readlines()
    +... 
    +['fake content']
    +

    Očekávání (mocks, spies)

    +

    Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco +zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), +nebo jen sledujete, jestli se zavolala (spies). +(Příklady na odkazu.)

    +

    Integrace s pytestem

    +

    Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená +kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double +ale není nic těžkého a můžete to udělat sami (bez knihovny). +Pro přepsání nějaké metody, funkce apod. na omezenou dobu +můžete využít zabudovanou pytest fixturu +monkeypatch.

    +

    Varování

    +

    Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce +čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud +bude obsahovat daný obsah, musíte si trochu zapodvádět, protože nemůžete vědět, +co v tom souboru je doopravdy na daném systému, v daný čas.

    +

    Je ale jednoduché sklouznout do fáze, kdy jsou vaše testy natolik přemockované, +že už ani neplní svůj účel. Buďto proto, že příliš podvádíte a testy vždy +projdou, i když je implementace rozbitá; nebo proto, že při sebemenší úpravě +vnitřní implementace musíte vždy upravit i testy.

    +

    Mějte toto na paměti a k mockování se uchylujte až po vyčerpání „slušnějších” +možností. +Často jde trochu změnit kód, aby byl testovatelnější – například napsat funkci, +která čte soubor formátu /etc/passwd, ale jméno souboru jí předat argumentem.

    +

    Mohl by vás zajímat záznam z přednášky Should I mock or should I not? +z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění +při psaní testů.

    +

    Testování HTTP komunikace: betamax

    +

    Vaše programy často používají webová API. Při testování funkcionality API klientů +se vynoří řada problémů:

    +
      +
    • výsledky volání API mohou být pokaždé různé,
    • +
    • k některým volání API je potřeba mít přístupové údaje,
    • +
    • API může být zrovna nedostupné.
    • +
    +

    V zásadě můžete omockovat knihovnu requests tak, aby +jednotlivá volání jako get() apod. vracela předem definovanou odpověď. +Při ponoření do hloubky ale zjistíte, že komplexita takového mockování může +velmi přesáhnout komplexitu samotného kódu, který testujete. +Jednodušší je tak použít již hotové řešení. Jedno z nich je betamax.

    +

    Betamax umožňuje nahrát HTTP komunikaci do kazet (souborů), které se potom +použijí při testech. V zásadě to funguje takto:

    +
      +
    • Pokud daný HTTP požadavek ještě neproběhl, provede se a nahraje na kazetu.
    • +
    • Pokud již proběhl, použije se daná kazeta pro simulaci.
    • +
    +

    Betamax funguje pouze s knihovnou requests při použití session.

    +

    V kombinaci s pytestem můžete použít předpřipravenou fixture:

    +
    import betamax
    +
    +with betamax.Betamax.configure() as config:
    +    # tell Betamax where to find the cassettes
    +    # make sure to create the directory
    +    config.cassette_library_dir = 'tests/fixtures/cassettes'
    +
    +def test_get(betamax_session):
    +    betamax_session.get('https://httpbin.org/get')
    +

    Před spuštěním testu vytvořte složku tests/fixtures/cassettes. +Po spuštění testu ji prozkoumejte. +Měla by obsahovat soubor test_filename.test_get.json. +To je nahraná kazeta. Každý další průběh testu nevykoná GET požadavek, +ale pouze přehraje danou kazetu. Pokud chcete kazetu opět nahrát, prostě ji +smažte a pusťte test znovu.

    +

    Celé to ale funguje pouze, pokud kód vykonávaný uvnitř testu použije speciální +session, kterou máme od betamaxu. Jak to udělat?

    +

    Je třeba, aby implementační část kódu uměla session přejmout, například takto:

    +
    class Client:
    +    def __init__(self, session=None):
    +        self.session = session or requests.Session()
    +        ...
    +
    +def test_clent_foo(betamax_session):
    +    client = Client(session=betamax_session)
    +    assert client.foo() == 42
    +

    Pokud budete používat parametrizované testy, použijte +betamax_parametrized_session, aby kazety měly odlišné jméno při odlišných +parametrech.

    +

    Pro tip: Abyste nevytvářeli novou instanci třídy ve všech testech, můžete si +vytvořit vlastní fixture, která použije fixture betamax_session:

    +
    @pytest.fixture
    +def client(betamax_session):
    +    return Client(session=betamax_session)
    +

    Citlivé údaje

    +

    Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

    +

    Vyvstávají dvě otázky:

    +
      +
    1. Jak umožnit spuštění testů bez vlastního tokenu?
    2. +
    3. Jak citlivé údaje skrýt v kazetách a nedávat je do gitu?
    4. +
    +

    Na obě otázky se pokusím odpovědět jedním okomentovaným kódem:

    +
    with betamax.Betamax.configure() as config:
    +    if 'AUTH_FILE' in os.environ:
    +        # If the tests are invoked with an AUTH_FILE environ variable
    +        TOKEN = my_auth_parsing_func(os.environ['AUTH_FILE'])
    +        # Always re-record the cassetes
    +        # https://betamax.readthedocs.io/en/latest/record_modes.html
    +        config.default_cassette_options['record_mode'] = 'all'
    +    else:
    +        TOKEN = 'false_token'
    +        # Do not attempt to record sessions with bad fake token
    +        config.default_cassette_options['record_mode'] = 'none'
    +
    +    # Hide the token in the cassettes
    +    config.define_cassette_placeholder('<TOKEN>', TOKEN)
    +    ...
    +
    +@pytest.fixture
    +def client(betamax_session):
    +    return Client(token=TOKEN, session=betamax_session)
    +

    Co když ale nevíme, jak bude vypadat citlivá část požadavku, protože se teprve +někde spočítá a získá, jako například v případě Twitter API? +Na tuto otázku podrobněji odpovídá +dokumentace.

    +

    V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách +nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

    +

    Komprimované citlivé údaje

    +

    Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle +odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní +chování, viz dokumentace). +V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit +hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, +compress ani deflate:

    +
    betamax_session.headers.update({'Accept-Encoding': 'identity'})

    Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou +nijak transformována, více viz Wikipedia +a specifikace HTTP)

    +

    Které HTTP požadavky jsou stejné?

    +

    Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se +pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. +Pokud tedy na jedno URL provedete dva POST požadavky s jiným tělem, betamax +je bude považovat za stejné. Toto chování lze měnit zapnutím (nebo vypnutím) +různých matcherů. Těch je v betamaxu celá řada a je jednoduché napsat si +vlastní. Více informací najdete +v dokumentaci.

    +

    Mohl by vás zajímat záznam z přednášky If it Moves, Test it Anyway +z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak +testovat webové API klienty v Pythonu.

    +

    Testování aplikací ve Flasku

    +

    Pro testování aplikací ve Flasku se +používá app.test_client():

    +
    import pytest
    +
    +@pytest.fixture
    +def testapp():
    +    from hello import app
    +    app.config['TESTING'] = True
    +    return app.test_client()
    +
    +def test_hello(testapp):
    +    assert 'Hello' in testapp.get('/').get_data(as_text=True)
    +

    Pozor, metody na testovacím klientu vrací Response, ale trochu jinou, než tu +z requests. +Proto nelze použít přímo response.text; text dostaneme pomocí +response.get_data(as_text=True).

    +

    Testování aplikací v clicku

    +

    Podobně funguje testování aplikací v clicku. +Click obsahuje třídu CliRunner, která pomáhá s testováním:

    +
    from click.testing import CliRunner
    +
    +def test_push_force():
    +    runner = CliRunner()
    +    result = runner.invoke(git_cli_made_in_click, ['push', '--force'])
    +    assert result.exit_code == 0
    +    assert 'forced update' in result.output
    +

    Kam dát testy?

    +

    Dokumentace pytestu +uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +tests/
    +    test_app.py
    +    ...

    nebo do něj:

    +
    setup.py
    +mypkg/
    +    __init__.py
    +    appmodule.py
    +    ...
    +    test/
    +        test_app.py
    +        ...

    První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. +Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný +Pythonní modul, ale jen sada souborů s testy.

    +

    Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné +moduly, ne jako součást vašeho balíčku. +Relativní importy (from ..appmodule import xyz) v testech nebudou fungovat.

    +

    Pozor na to, aby testy byly součástí archivu s balíčkem (setup.py sdist), ale +pokud zvolíte první variantu umístění, aby se neinstalovaly (setup.py install), +protože by tam kolidovaly s ostatními testy z jiných balíčků.

    +

    Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve +složce s testy.

    +

    Spouštění testů pomocí setup.py test

    +

    Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale +python setup.py test, což funguje i s jinými nástroji než je pytest. +Pokud pytest používáme, je proto dobré setup.py naučit spouštět pytest.

    +

    K tomu potřebujeme nakonfigurovat závislosti: v setup_requires musí být +pytest-runner a v tests_require pak pytest a další testovací závislosti +(flexmock, betamax...).

    +
    from setuptools import setup
    +
    +setup(
    +    ...,
    +    setup_requires=['pytest-runner', ...],
    +    tests_require=['pytest', ...],
    +    ...,
    +)
    +

    a přidat následující sekci do setup.cfg:

    +
    [aliases]
    +test=pytest

    Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude +podporovat další argumenty pytestu (jako -v). +Na to uživatel spustí pytest samotný.

    +

    Další informace jsou v dokumentaci pytestu.

    +

    Travis CI

    +

    Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky +na službě Travis CI při každém pushnutí na GitHub.

    +

    Travis CI je zadarmo pro veřejné repozitáře na travis-ci.org, pro soukromé +repozitáře je placená verze na travis-ci.com. V rámci studentského balíčku +můžete i tuto verzi využít zdarma.

    +

    Přihlaste se na travis-ci.com pomocí GitHubu (vpravo nahoře). +Pak opět vpravo nahoře zvolte Accounts +a povolte Travis pro váš repozitář.

    +

    Do repozitáře přidejte soubor .travis.yml:

    +
    language: python
    +python:
    +- '3.6'
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Uvedený příklad je pro Python 3.6. +Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

    +
    language: python
    +python:
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Verze Pythonu lze kombinovat:

    +
    language: python
    +python:
    +- '3.6'
    +- '3.7'
    +dist: xenial
    +install:
    +- python setup.py install
    +script:
    +- python setup.py test
    +

    Po pushnutí by se na Travisu měl automaticky spustit test. +Více informací o použití pro Python najdete +v dokumentaci.

    +

    Kvíz

    +

    Co je špatně na této testovací sadě k funkci is_even()?

    +
    def is_even(n):
    +    return n % 2 == 0
    +
    +
    +@pytest.mark.parametrize('n', range(0, 1000, 2))
    +def test_is_even(n):
    +    assert is_even(n)
    +
    \ No newline at end of file diff --git a/lessons/testing/index.html b/lessons/testing/index.html new file mode 100644 index 00000000..371afde3 --- /dev/null +++ b/lessons/testing/index.html @@ -0,0 +1,226 @@ +

    Testování

    +

    Programátorská práce nespočívá jen v tom, program napsat. +Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. +Ověřování, že program funguje, se říká testování (angl. testing).

    +

    Zatím jsi asi svoje programy testoval/a tak, že jsi +je zkusil/a spustit, něco zadal/a a podíval/a se, +jestli jsou výsledky v pořádku. +U větších programů, které budou mít více a více +možností, ale bude těžší a těžší takhle zkontrolovat, +jestli všechny ty možnosti fungují, jak mají.

    +

    Proto si programátoři často nezkouší programy „ručně“. +Píšou jiné programy, které jejich výtvory testují za ně.

    +

    Automatické testy jsou funkce, které +zkontrolují, že program funguje správně. +Spuštěním testů můžeš kdykoli ověřit, že kód funguje. +Když v otestovaném kódu v budoucnu uděláš nějakou změnu, +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

    +

    Instalace knihovny pytest

    +

    Zatím jsme v kurzu pracovali/y s tím, co se instaluje +se samotným Pythonem – s moduly jako math a turtle. +Kromě takových modulů ale existuje ale velká spousta +dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat +a používat.

    +

    Na testy je v samotném Pythonu zabudovaná knihovna unittest. +Ta je ale celkem složitá na použití, proto ji my používat nebudeme. +Nainstalujeme si knihovnu pytest, která se používá +mnohem jednodušeji a je velice populární.

    +

    Knihovny se instalují do aktivního virtuálního prostředí. +Jak se dělá a spouští virtuální prostředí +ses naučil/a při instalaci Pythonu, +ale teprve teď to začíná být opravdu důležité. +Ujisti se, že máš virtuální prostředí aktivované.

    +

    Potom zadej následující příkaz. +(Je to příkaz příkazové řádky, podobně jako +cd nebo mkdir; nezadávej ho do Pythonu.)

    +

    Opisuj opatrně!

    +

    Příkaz níže instaluje software z Internetu. +Za knihovnu pytest autoři tohoto kurzu ručí. +Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“. +Dej si proto pozor a ve jménu pytest neudělej překlep!

    +
    (venv)$ python -m pip install pytest
    +

    Co ten příkaz znamená?

    +

    python -m pip zavolá Python s tím, že má pustit modul +pip. Tento modul umí instalovat nebo +odinstalovávat knihovny. +(Jestli si pamatuješ vytváření virtuálního prostředí, použil/a jsi tam +příkaz python -m venv – modul venv umí vytvářet virtuální prostředí.) +No a slova install pytest říkají Pipu, že má nainstalovat pytest.

    +

    Nápověda k použití Pipu se dá vypsat pomocí příkazu +python -m pip --help.

    +

    Pro Windows

    +

    Jsi-li na Windows, od této lekce začne být důležité +spouštět pythonní programy pomocí python program.py, ne jen +program.py. +Ačkoli se v těchto materiálech všude používá python na začátku, zatím +mohlo všechno fungovat i bez toho. +Program se ale bez příkazu python může spustit v jiném Pythonu, +než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

    +

    Psaní testů

    +

    Nejdříve si testování ukážeme na jednoduchém příkladu. +Tady je funkce secti, která umí sečíst +dvě čísla, a další funkce, která testuje, jestli se +secti pro určité hodnoty +chová správně.

    +

    Kód si opiš do souboru test_secteni.py, +v novém prázdném adresáři. +Pro pytest je (ve výchozím nastavení) +důležité, aby jména jak souborů s testy, tak +samotných testovacích funkcí, začínala na +test_.

    +
    def secti(a, b):
    +    return a + b
    +
    +def test_secti():
    +    assert secti(1, 2) == 3
    +

    Co se v té testovací funkci děje?

    +

    Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, +vyvolá výjimku, která způsobí, že test selže. +Můžeš si představit, že assert a == b dělá následující:

    +
    if not (a == b):
    +    raise AssertionError('Test selhal!')
    +

    Zatím assert nepoužívej jinde než v testovacích funkcích. +V „normálním” kódu se assert může chovat trochu jinak než výše, +ale do toho teď nebudeme zabředávat.

    +

    Spouštění testů

    +

    Testy se spouští zadáním příkazu +python -m pytest -v následovaným názvem souboru s testy. +Tedy v překladu: Pythone, pusť +modul pytest, +v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

    +
    $ python -m pytest -v test_secteni.py
    +
    ============================= test session starts ==============================
    +platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
    +cachedir: .pytest_cache
    +rootdir: naucse, inifile:
    +collecting ... collected 1 item
    +
    +test_secteni.py::test_secti PASSED                                       [100%]
    +
    +=========================== 1 passed in 0.00 seconds ===========================
    +

    Tento příkaz projde zadaný soubor, zavolá v něm všechny funkce, +jejichž jméno začíná na test_, a ověří, že nevyvolají žádnou +výjimku – typicky výjimku z příkazu assert. +Pokud výjimka nastane, dá to pytest velice červeně +najevo a přidá několik informací, které můžou +usnadnit nalezení a opravu chyby.

    +

    Argument s názvem souboru můžeš vynechat: python -m pytest -v. +V takovém případě pytest projde aktuální adresář a spustí testy +ze všech souborů, jejichž jméno začíná na test_. Místo souboru +lze též uvést adresář: pytest vyhledá testy v něm.

    +

    Zkus si změnit funkci secti (nebo její test) a podívat se, +jak to vypadá když test „neprojde“.

    +

    Testovací moduly

    +

    Testy se většinou nepíšou přímo ke kódu, +ale do souboru vedle. +Je to tak přehlednější a taky to pak zjednodušuje +distribuci – předání kódu někomu, kdo ho chce +jen spustit a testy nepotřebuje.

    +

    Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +a v test_secteni.py nech jenom test. +Do test_secteni.py pak na začátek přidej from secteni import secti, +aby byla funkce testu k dispozici.

    +

    Test by měl opět projít.

    +

    Spouštěcí moduly

    +

    Automatické testy musí projít „bez dozoru“. +V praxi se často automaticky spouští, případné chyby se automaticky +oznamují (např. e-mailem) a fungující otestovaný kód se automaticky +začne používat dál (nebo se rovnou vydá zákazníkům).

    +

    Co to znamená pro nás? +Funkce input v testech nefunguje. Nemá koho by se zeptala; „za klávesnicí“ +nemusí nikdo sedět.

    +

    To může někdy „ztěžovat práci“. Ukážeme si to na složitějším projektu: +na 1D piškvorkách.

    +

    Učíš-li se z domu, dodělej si Piškvorky než budeš pokračovat dál! +Zadání najdeš (prozatím) +v projektech pro PyLadies +na straně 2.

    +

    Kód pro 1D Piškvorky může rámcově vypadat zhruba takto:

    +
    import random  # (příp. import jiných věcí, které budou potřeba)
    +
    +def tah(pole, cislo_policka, symbol):
    +    """Vrátí pole s daným symbolem umístěným na danou pozici"""
    +    ...
    +
    +def tah_hrace(pole):
    +    """Zeptá se hráče kam chce hrát a vrátí pole se zaznamenaným tahem"""
    +    ...
    +    input('Kam chceš hrát? ')
    +    ...
    +
    +def piskvorky1d():
    +    """Spustí hru
    +
    +    Vytvoří hrací pole a střídavě volá tah_hrace a tah_pocitace
    +    dokud někdo nevyhraje"""
    +    while ...:
    +        ...
    +        tah_hrace(...)
    +        ...
    +
    +# Puštění hry!
    +piskvorky1d()
    +

    Když tenhle modul naimportuješ, Python v něm postupně, odshora dolů, +provede všechny příkazy.

    +

    První příkaz, import, jen zpřístupní nějaké proměnné a funkce; +je-li importovaný modul správně napsaný, nemá vedlejší účinek. +Definice funkcí (příkazy def a všechno v nich) podobně jen definují funkce. +Ale zavoláním funkce piskvorky1d se spustí hra: +funkce piskvorky1d zavolá funkci tah_hrace() a ta zavolá input().

    +

    Importuješ-li tenhle modul z testů, input selže a import se nepovede.

    +

    A kdybys modul importoval/a odjinud – například bys chtěl/a funkci +tah použít v nějaké jiné hře – uživatel si bude muset v rámci importu +zahrát Piškvorky!

    +

    Volání funkce piskvorky1d je vedlejší efekt, a je potřeba ho odstranit. +No jo, ale po takovém odstranění +už nejde jednoduše spustit hra! Co s tím?

    +

    Můžeš na to vytvořit nový modul. +Pojmenuj ho hra.py a dej do něj jenom to odstraněné volání:

    +
    import piskvorky
    +
    +piskvorky.piskvorky1d()
    +

    Tenhle modul nebudeš moci testovat (protože nepřímo volá funkci input), +ale můžeš ho spustit, když si budeš chtít zahrát. +Protože k němu nemáš napsané testy, nepoznáš +z nich, když se takový spouštěcí modul rozbije. +Měl by být proto nejjednodušší – jeden import a jedno volání.

    +

    Původní modul teď můžeš importovat bez obav – ať už z testů nebo z jiných +modulů. +Test může vypadat třeba takhle:

    +
    import piskvorky
    +
    +def test_tah_na_prazdne_pole():
    +    pole = piskvorky.tah_pocitace('--------------------')
    +    assert len(pole) == 20
    +    assert pole.count('x') == 1
    +    assert pole.count('-') == 19
    +

    Pozitivní a negativní testy

    +

    Testům, které kontrolují, že se program za správných podmínek chová správně, +se říká pozitivní testy. +Můžeš ale testovat i reakci programu na špatné nebo neočekávané podmínky.

    +

    Testy, které kontrolují reakci na „špatný“ vstup, +se jmenují negativní testy. +Můžou kontrolovat nějaký negativní výsledek (např. +že volání jako cislo_je_sude(7) vrátí False), +a nebo to, že nastane „rozumná“ výjimka.

    +

    Například funkce tah_pocitace by měla způsobit +chybu (třeba ValueError), když je herní pole už plné.

    +

    Vyvolat výjimku je mnohem lepší než alternativy, např. kdyby takové volání +„tiše“ – bez oznámení – zablokovalo celý program. +Když kód pak použiješ ve větším programu, +můžeš si být jistá, že při špatném volání +dostaneš srozumitelnou chybu – tedy takovou, +která se co nejsnadněji opravuje.

    +

    Na otestování výjimky použij příkaz with a funkci raises naimportovanou +z modulu pytest. +Jak příkaz with přesně funguje, se dozvíme později; +teď stačí říct, že ověří, že odsazený blok kódu +pod ním vyvolá danou výjimku:

    +
    import pytest
    +
    +import piskvorky
    +
    +def test_tah_chyba():
    +    with pytest.raises(ValueError):
    +        piskvorky.tah_pocitace('oxoxoxoxoxoxoxoxoxox')
    +
    \ No newline at end of file diff --git a/lessons/tuple/index.html b/lessons/tuple/index.html new file mode 100644 index 00000000..9b573845 --- /dev/null +++ b/lessons/tuple/index.html @@ -0,0 +1,125 @@ +

    N-tice

    +

    Když už známe seznam, podívejme se na jeho sestřičku: takzvanou +n-tici (angl. tuple).

    +

    N-tice, podobně jako seznam, +může obsahovat n prvků. +N-tice se dvěma prvky je dvojice +neboli pár (angl. pair); se třemi +prvky trojice (angl. 3-tuple), +se čtyřmi čtveřice (angl. 4-tuple), atd.

    +

    Existují i n-tice s jedním prvkem (hmm… „jednice”?) +a s nula prvky (prázdné n-tice, angl. empty tuple), +ale těmi se ze začátku nebudeme zabývat.

    +

    N-tice se tvoří jako seznamy, jen kolem sebe nemají hranaté závorky. +Stačí čárky mezi prvky.

    +

    Chovají se skoro stejně jako seznamy, jen nejdou měnit. +Nemají tedy metody jako append +a pop a nedá se jim přiřazovat do prvků. +Dají se ale použít v cyklu for +a dají se z nich číst jednotlivé prvky.

    +
    osoby = 'máma', 'teta', 'babička'
    +for osoba in osoby:
    +    print(osoba)
    +print('První je {}'.format(osoby[0]))
    +

    Vypadá to povědomě? Aby ne! +N-tice jsme už použili dříve: +for jmeno in 'Hynek', 'Vilém', 'Jarmila': +ve skutečnosti používá n-tici!

    +

    Když chceš n-tici předat do funkce, +narazíš na problém, že čárka odděluje jednotlivé +argumenty funkce. +V podobných případech musíš n-tici +uzavřít do závorek, aby bylo jasné, že jde o jednu +hodnotu (byť složenou).

    +
    seznam_dvojic = []
    +for i in range(10):
    +    # `append` bere jen jeden argument; dáme mu jednu dvojici
    +    seznam_dvojic.append((i, i**2))
    +print(seznam_dvojic)
    +

    N-tice se hodí, pokud chceš z funkce vrátit +víc než jednu hodnotu. +Prostě v příkazu return oddělíš vracené hodnoty čárkou. +Vypadá to, že vracíš několik hodnot, ale +ve skutečnosti se vrací jen jedna n-tice.

    +
    def podil_a_zbytek(a, b):
    +    return a // b, a % b
    +

    Tahle funkce už mimochodem v Pythonu je: jmenuje se +divmod a je vždy k dispozici +(nemusí se importovat).

    +

    Python umí ještě jeden trik: pokud chceš přiřadit +do několika proměnných najednou, stačí je na levé +straně rovnítka oddělit čárkou a na pravou stranu +dát nějakou „složenou” hodnotu – třeba právě +n-tici.

    +
    podil, zbytek = podil_a_zbytek(12, 5)
    +

    N-tice se k tomuto účelu hodí nejvíc, ale +jde to se všemi hodnotami, které jdou použít ve for:

    +
    x, o = 'xo'
    +jedna, dva, tri = [1, 2, 3]
    +

    Funkce, které vracejí n-tice

    +

    zip je zajímavá funkce. +Používá se ve for cyklech, podobně jako funkce range, která „dává” čísla.

    +

    Když funkce zip dostane dva seznamy +(či jiné věci použitelné ve for), +„dává” dvojice, a to tak, že nejdřív spáruje +první prvek jednoho seznamu s prvním prvkem +druhého seznamu, +pak druhý s druhým, třetí s třetím a tak dál.

    +

    Hodí se to, když máš dva seznamy se stejnou +strukturou – příslušné prvky k sobě „patří” +a chceš je zpracovávat společně:

    +
    osoby = 'máma', 'teta', 'babička', 'vrah'
    +vlastnosti = 'hodná', 'milá', 'laskavá', 'zákeřný'
    +for osoba, vlastnost in zip(osoby, vlastnosti):
    +    print('{} je {}'.format(osoba, vlastnost))
    +

    Když zip dostane tři seznamy, +bude tvořit trojice, ze čtyř seznamů nadělá čtveřice a tak dále.

    +

    Další funkce, která vrací dvojice, je enumerate. +Jako argument bere seznam (či jinou věc použitelnou +ve for) a vždy spáruje index (pořadí v seznamu) s příslušným prvkem. +Jako první tedy dá +(0, první prvek seznamu), potom +(1, druhý prvek seznamu), +(2, třetí prvek seznamu) +a tak dále.

    +
    prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    +
    +for i, prvocislo in enumerate(prvocisla):
    +    print('Prvočíslo č.{} je {}'.format(i, prvocislo))
    +

    Malé n-tice

    +

    Jak vytvořit n-tici s žádným nebo jedním prvkem? Takhle:

    +
    prazdna_ntice = ()
    +jednoprvkova_ntice = ('a', )
    +

    Druhý příklad jde i bez závorek – +jednoprvkova_ntice = 'a', – +ale to vypadá jako zapomenutá čárka. +Když budeš opravdu potřebovat jednoprvkovou +n-tici, radši ji pro přehlednost ozávorkuj.

    +

    Kdy použít seznam a kdy n-tici?

    +

    Seznamy se používají, když předem nevíš, +kolik v nich přesně bude hodnot, +nebo když je hodnot mnoho. +Například seznam slov ve větě, +seznam účastníků soutěže, seznam tahů ve hře +nebo seznam karet v balíčku. +Oproti tomu for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN': +používá n-tici.

    +

    N-tice se často používají na hodnoty +různých typů, kdy má každá „pozice” +v n-tici úplně jiný význam. +Například seznam můžeš použít na písmena abecedy, +ale dvojice index–hodnota z enumerate +je n-tice.

    +

    Prázdné n-tice a n-tice s jedním +prvkem se zapisují trochu divně a má to své důvody: +může-li nastat situace, kdy takovou sekvenci budeš +potřebovat, většinou je lepší sáhnout po seznamu. +Například seznam hracích karet v ruce nebo +seznam lidí aktuálně přihlášených do soutěže +může být občas prázdný.

    +

    Seznamy i n-tice mají i technické limity: +n-tice nejdou měnit a až se naučíme pracovat se slovníky, +zjistíme že seznamy tam nepůjdou použít jako klíče.

    +

    Často není úplně jasné, který typ použít +– v takovém případě je to pravděpodobně jedno. +Řiď se instinktem. :)

    \ No newline at end of file diff --git a/lessons/turtle/index.html b/lessons/turtle/index.html new file mode 100644 index 00000000..849f05b8 --- /dev/null +++ b/lessons/turtle/index.html @@ -0,0 +1,412 @@ +

    🐍 🐢

    +

    V této lekci si vyzkoušíš želví kreslení.

    +

    Pusť Python v interaktivním módu (bez souboru .py).

    +
    $ python
    +
    +>>>
    +

    (Znaky > a $ píše počítač, ne ty. +Na Windows bude místo $ znak +> a před $ nebo +> může být ještě něco dalšího.)

    +

    Pak napiš:

    +
    from turtle import forward
    +
    +forward(50)
    +

    Ukáže se okýnko se šipkou, které nezavírej. +Dej ho tak, abys viděla i příkazovou řádku +i nové okýnko.

    +

    A kde je ta želva?

    +

    Želva je zrovna převlečená za šipku. +Ale funkce shape ji umí odmaskovat:

    +
    from turtle import shape
    +
    +shape('turtle')
    +

    Modul turtle obsahuje spoustu dalších funkcí, kterými můžeš želvu ovládat. +Pojďme se na ně kouknout zblízka.

    +

    Otáčení

    +

    Želva se umí otáčet (doleva – left a doprava – right) a lézt po papíře +(dopředu – forward). +Na ocase má připevněný štětec, kterým při pohybu kreslí čáru.

    +
    from turtle import forward, left, right
    +
    +forward(50)
    +left(60)
    +forward(50)
    +right(60)
    +forward(50)
    +

    Zkus chvíli dávat želvě příkazy. +Když se ti výsledek nelíbí, můžeš zavřít kreslící okno a zkusit to znovu. +(Nebo místo zavření okna můžeš naimportovat a použít funkci clear().)

    +

    Želví program

    +

    Interaktivní mód je skvělý na hraní, +ale teď přejdeme zase na soubory.

    +

    Vytvoř si v editoru nový soubor. +Ulož ho do adresáře pro dnešní lekci pod jménem zelva.py.

    +

    Jestli adresář pro dnešní lekci ještě nemáš, vytvoř si ho! +Pojmenuj ho třeba 02.

    +

    Soubor nepojmenovávej turtle.py – z modulu turtle budeš importovat.

    +

    Jestli chceš pro soubor použít jiné jméno, můžeš, ale +nepojmenovávej ho turtle.py.

    +

    Do souboru napiš příkazy na nakreslení obrázku +a – pozor! – na konci programu zavolej funkci exitonclick +(naimportovanou z modulu turtle).

    +

    Otázka

    +

    Co dělá funkce exitonclick, kterou voláš na konci programu?

    +

    Přerušovaná čára

    +

    Funkce penup řekne želvě, aby zvedla ocásek se štětcem: bude se tak hýbat +aniž by za sebou nechávala stopu. +Funkcí pendown můžeš želvě říct, aby kreslit zase začala. +Zkus si to:

    +
    from turtle import forward, penup, pendown, exitonclick
    +
    +forward(30)
    +penup()         # od teď želva nekreslí
    +forward(5)
    +pendown()       # od teď želva zase kreslí
    +forward(30)
    +
    +exitonclick()
    +

    Až to budeš mít hotové, zkus začít kreslit trochu složitější obrázky:

    +

    Čtverec

    +

    Nakresli čtverec.

    +

    Želví čtverec

    +

    Čtverec má čtyři rovné strany +a čtyři rohy po 90°.

    +
    +

    Řešení

    + + +

    Obdélník

    +

    Nakresli obdélník.

    +

    Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

    +

    Želví obdélník

    +
    +

    Řešení

    + + +

    Tři čtverce

    +

    Nakresli tři čtverce, každý otočený třeba o 20°.

    +

    Tři želví čtverce

    +
    +

    Řešení

    + + +

    Tolik kódu! Tohle musí jít nějak zjednodušit!

    +

    Jde. +Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

    +

    Jak opakovat – a neopakovat se

    +

    Udělej v editoru nový soubor a ulož ho jako cykly.py. +Budeš v něm zkoušet cykly.

    +

    První opakovací program, který napíšeš, bude dělat tohle:

    +
      +
    • Stokrát po sobě:
        +
      • Napiš "Nikdy nebudu odsazovat o tři mezery!"
      • +
      +
    • +
    +

    Přeložené do jazyka Python to vypadá následovně:

    +
    for i in range(100):
    +    print('Nikdy nebudu odsazovat o tři mezery!')
    +

    Na ono for i in range(100) se detailněji podíváme za chvíli, +teď to pro nás bude “hlavička”, která říká “opakuj stokrát”.

    +

    Podobnou “hlavičku” už jsi viděl/a u příkazu if. +Stejně jako u if tu je na konci dvojtečka a za ní následuje +odsazený blok – tělo příkazu; to na co se hlavička vztahuje. +Tělo příkazu if se provede jen někdy; +tělo příkazu for se opakuje několikrát dokola.

    +

    Výčet

    +

    Zkus napsat ještě jeden vzorový program, který v češtině zní:

    +
      +
    • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
        +
      • Vypiš pozdrav a za ním vykřičník.
      • +
      +
    • +
    +

    A v Pythonu:

    +
    for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN':
    +    print(pozdrav + '!')
    +

    Opět je tu hlavička a tělo příkazu. +Tentokrát se na hlavičku podívej pozorněji. +Pythonní for promenna in sekvence +znamená „Pro každé promenna ze sekvence“.

    +

    Jméno proměnné si volíš sám/sama. +Příkaz for danou proměnnou vždy nastaví na aktuální +hodnotu a pak provede všechno, co je v odsazeném těle cyklu. +Program výše tedy funguje úplně stejně, jako kdybys napsal/a:

    +
    pozdrav = 'Ahoj'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hello'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hola'
    +print(pozdrav + '!')
    +
    +pozdrav = 'Hei'
    +print(pozdrav + '!')
    +
    +pozdrav = 'SYN'
    +print(pozdrav + '!')
    +

    Range

    +

    Vraťme se k for i in range(100). +Už víš, že to znamená „Pro každé i ze sekvence range(100)“. +Co je ale to range? Když si ho vypíšeš, nevypadne nic vysvětlujícího:

    +
    >>> range(100)
    +range(0, 100)
    +

    Je ale použité jako „sekvence“ +v for promenna in sekvence. +Je to nějaký výčet, nějaká posloupnost hodnot. +A teď už umíš vypsat, jaké to jsou!

    +
    for i in range(5):   # Doporučuju použít jen 5 místo 100
    +    print(i)
    +

    neboli česky:

    +
      +
    • Pro každé irange(5):
        +
      • Vypiš i
      • +
      +
    • +
    +

    Program spusť. Jaká čísla se vypíšou? (Neboli: co je v sekvenci range(5)?)

    +
    +

    Řešení

    + + +

    Funkce range(n) vrací sekvenci čísel. +Začíná od 0 a čísel v ní je přesně n. +(Na samotné n se tedy už nedostane.)

    +

    Často budeš potřebovat Pythonu říct, ať něco „n-krát zopakuje“. +Na to můžeš použít for i in range(n) („pro každé i od 0 do +n-1“) s tím, že proměnná i – „počitadlo“ – tě nezajímá. +V programu ji jednoduše nepoužiješ.

    +

    Teď by už mělo být jasné, jak funguje původní program:

    +
    for i in range(100):
    +    print('Nikdy nebudu odsazovat o tři mezery!')
    +
      +
    • Zopakuj 100krát:
        +
      • Vypiš 'Nikdy nebudu odsazovat o tři mezery!'
      • +
      +
    • +
    +

    Python píše hlášky, jednu za druhou, a u toho si v promněnné i +počítá, jak už je daleko.

    +

    Proměnná i se v matematice typicky používá pro celá čísla; +je to zkratka z termínu index (číslo prvku). +V programování se tradičně používá pro číslo průchodu cyklem, +jako v příkladu výše. +Pro lepší pochopení bývá dobré použít popisnější jméno proměnné, tady +například cislo_vypisu; v krátkých a přehledných cyklech – a zvlášť v těch +které proměnnou nepoužívají – se ale často setkáš s krátkým i, j, k

    +

    Někteří programátoři pojmenovávají ignorovanou proměnnou _ (podtržítko). +To je pro Python jméno jako jakékoli jiné, ničím se neliší od i nebo x:

    +
    for _ in range(100):
    +   print('Nikdy nebudu odsazovat o tři mezery!')
    +

    Dlouhá přerušovaná čára

    +

    Už víš, že pomocí penup a pendown lze nakreslit přerušenou čáru:

    +
    from turtle import forward, penup, pendown, exitonclick
    +
    +forward(30)
    +penup()         # od teď želva nekreslí
    +forward(5)
    +pendown()       # od teď želva zase kreslí
    +forward(30)
    +
    +exitonclick()
    +

    Zkus nakreslit dlouhou přerušovanou čáru.

    +

    Želva a přerušovaná čára

    +
    +

    Řešení

    + + +

    Pak zkus zařídit, aby jednotlivé čárky byly postupně +větší a větší.

    +

    Želva a přerušovaná čára

    +

    Nápověda

    +

    První čárka je dlouhá 1 jednotku, druhá 2 jednotky, třetí 3, atd.

    +

    Dokonce můžeš na začátek dát prázdnou čárku (0 jednotek) +a mít tak délky 0, 1, 2, 3, 4, …

    +

    V jaké proměnné máš při prvním průchodu cyklem 0, ve druhém 1, atd.?

    +
    +

    Řešení

    + + +

    Čtverec II

    +

    A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

    +

    Čtverec se kreslí následovně:

    +
      +
    • Čtyřikrát:
        +
      • Popojdi dopředu (a kresli přitom čáru)
      • +
      • Otoč se o 90°
      • +
      +
    • +
    +

    Želví čtverec

    +
    +

    Řešení

    + + +

    Tři čtverce

    +

    Nakonec nakresli 3 čtverce, každý otočený o 20°. +Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu +for, ne kopírováním kódu.

    +

    Tři želví čtverce

    +
      +
    • Třikrát:
        +
      • Nakresli čtverec (viz jedna z předchozích úloh)
      • +
      • Otoč se o 20°
      • +
      +
    • +
    +
    +

    Řešení

    + + +

    Úkol navíc

    +

    Máš-li hotovo, zkus nakreslit schody:

    +

    Želví schody

    +

    A máš-li i schody, zkus nakreslit těchto šest (nebo sedm?) šestiúhelníků:

    +

    Želví plástev

    \ No newline at end of file diff --git a/lessons/turtle/turtle-dashed.png b/lessons/turtle/turtle-dashed.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4610f46da179370dee6ede27dfe388c0e24ed8 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^hk#g*g9%7}WeuDUq?n7HJVQ7*IBq}me*oli7I;J! zGcfQAfiR=u>`%r(!9|`fjv*Dd-rg|eYf#{E2(0?=eEndk_(qpE)xylooc1goXJic2 zQ(Af^2pTa-Dk=k64sItnfGnVZ6Ofg1q$6U>exqNNZqFA~O;5eDbjhU|DOWTW?*ft= zmt0S-nsM>zsdr(SpWM~1PkmxiBz2ObTzSux8!Hw6yZNL(5uaUKH5Fij(iRV0uC2<{$Cmyu_(hjbGt=U`s zA+R?6xAfjW%$C(XhlHoi|6k-#_~_iM->2o)*6iAmRC{;Yt5{uW>F?X}-xsyUiF>ZS z8!lUOmGS>8hwoQ}{S7lD7JmNHd`4=Y@86|BYFWi{2}X!3kX(Rp8dUIjn6+P$$AK$X RG=QFD@O1TaS?83{1OP@}c@Y2r literal 0 HcmV?d00001 diff --git a/lessons/turtle/turtle-hexagons.png b/lessons/turtle/turtle-hexagons.png new file mode 100644 index 0000000000000000000000000000000000000000..04e329742b6d048f5531a3b8eb9d10b7c9b82af8 GIT binary patch literal 1735 zcmai#c~DbV7{y;8O^GeqreFmNo$b%s>!?q!I-etfUGe38o2K+^9mqbipzK zSq({`(7^_m24$^LK+z&h1Qecw29QO96_Mh?B2uLHCg{*{I{o9#&3*aq`R+UKchCDN zcw?aH5{o4Wf|#hr}ftxuMJHe zo->N~kxG$ZH-;9mCzS|OD>485yCkhl8X;*ON_gPY8a}#~!$C9WWZpCV42||(H78`AB;27Gy8NGR?!EU!K)D8;eh+>guHIT&FlT_KHJT^Mz$~?nb z&2niFCS2Zp#~trU#zaST*ykv)GSi6Kiy;(u{O6=A!ULtuSc1fX(`NVZ&J$0@We2k2P#@E6#;8YhMnQQZ=FTR|;P?ux=6Ybh3L!WWAx)7^x{z&C1du zydKZ=d{HjkNbM1`8#>!YNu}d_w^ZD~dXkAP%4R$!j`Xy44%;>=2vKg9s4(EOow0;E zXVA^4jc0~}KR6%N=}yKG3SkfbqHKM^N@kWeb!8Q?X}_8k54WZa7)#6LnO&X?TjkZ$ zNqoUi@!K}xIJYflp!KXyg8ebkPn$FrbJ3GRhkNnhQ8V5dKSrTvfk_CMbcE#&1c{~9 zG`5%uoH<%e?W8FMZ1Ewx79m5a4cb%PMM)GaD!5A(&Ct4%#Jivw3jS}i*Ie}WT`H@1 zHeO^?5LIi#H}~1W&>N_Zvl#uPfD9dsL1|9kEG@+5wuZ{O&e%D9p*OClEMf4w?`_~q zn%p?l{pZjIXq}+&`f&KHbt9!}ecAAPCnygk*uw1fC{qBOO4X(-v%4rOgtaAb)4RFP zPwk|W181jdL?42R5s{Zwz<8?yr`JJjVow__>5|nPp>_YoEvdoi$tG%&Cw*}=>4^v#z0f)^a4k&={FWQN-(># zz|pw9Q=XoqzoU-YBa&NooP8Hp=FE!zU~1)viNT33Y9CqPY%GVfD{&w<`1mG@9ONN0Xgu7b8fcO zpkGdyJp~3oKw`7zCwK&5-45VQ?6n#DZTl`w++v?}H zL3xI`ZOm57=Jf5J8XTRB`QP+^>kART`ZDH-nMwXlHO&!xiV)WNjsE59BEF!Z|^vAH7E$QT~yoie`@aYW4_Xk_4msgI^-s^7+$Te z7rFad&_FEN5QdH=>A=vLh@MiH+`CIxpZfgw{x12~w-$bvy>_Yc!@4rL?u`;qWQfpe zmEW?y7oJO;KkQ{*+4qu7s$X&0Y@6dH=Ic3r+QA$NbS=!0Kr4angj=TnlKE4G;-kMe S!j1!jfWgz%&t;ucLK6Uwvx~0) literal 0 HcmV?d00001 diff --git a/lessons/turtle/turtle-square.png b/lessons/turtle/turtle-square.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e3e29e38b6e79efc67e4094230b132d942dee0 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^IY6As!2~4LxhH}In2Vh}LpV4%Za?&Y0OWEOctjR6 zFz^e3Fr(t^PsTvOXPz#OAr-gY-f`q}Fc5GER4)Fn9iDWtS5|jw<$s1l#yTF-Yq$EI zza{9^=LvWD-x&aUcRf2^#LnqkJK4Q^av43CR7Ne&R%9DIgF?L*cJ$qH-xt^51lcnIs zbI&eYCf`~0_U_ze@2ij4wM{MW^S^BVptbD)J4Xi=n_v#UU&iq2n&PACom;$sK4$QA L^>bP0l+XkK7}jnw literal 0 HcmV?d00001 diff --git a/lessons/turtle/turtle-squares.png b/lessons/turtle/turtle-squares.png new file mode 100644 index 0000000000000000000000000000000000000000..e76e8b804a72c66a2791042877f0954a1d0eab19 GIT binary patch literal 890 zcmeAS@N?(olHy`uVBq!ia0vp^%|Kkv!2~4N|4Fd}Qq09po*^6@9Je3(KLBz$3p^r= z85sD5K$uZ+_9tVY5?N0d$B>F!Z|9!OV^QRBIr!**{m$YJqpoG?Rmp{taj}bCmdUq9 z&fSw6?Zjkc$EYHpqR^%$&367 zfu-_(-L4;R?-wzLJN7=D?@u`*G+Ng^xABPLozmS?SxfXK0q zj{e^j%L8BR`tLHMwEuB*a6jXTcQd~Ij!Cs?>&{$o_22QA6DqP(<&6CIm|jW^eqoaS zLS?EEgY(B1G2w%>8jIv#%U@qA)&ttuk1|KRqOihcXmTC&}=?6=^FW<0FP!|G?o z*6cAoq|9w)`hh(s?h6CG6%f6nJ$~D{von+vc+B@9%_~!<$dq$Zh8| zn|WM(uC*`2dtJHXA96P7O9O@C&DZBNg%{`4Y!^~lZlJjxsIWXYWv-1J)9vl;Zh8-= zZdr9@8>iIyq{Tgf-h1Zn;5a<-rYO(j!>>1O3NCAVb1!wh>9%Jfp_SY_ALq4S`8qAS zJxXtGW~W!QqF?Z@NdXdzvkZEA_U~5jlfJxrW#c(9_Z~mJa~JflJe;h~cDQ1~{JYBX z(>J!q=4WQNCdy{K*mt?%I9H)}gU1_&ZAw>O^{ezp_o}{d&+j|9m(Q>Bb%Wa8h~)wk z&%fBx{!zleUr2#_V#d=R_Ik%}MZ43Ft!w%ChH?FyDE}8j zPmf1tYR^3Wut#~+Y(2W^-vQwX3W*Om(>8MWW29hc;sz)07q8e`_Z)w|o7)MPYZw?j MUHx3vIVCg!0Qz5kZvX%Q literal 0 HcmV?d00001 diff --git a/lessons/turtle/turtle-stairs.png b/lessons/turtle/turtle-stairs.png new file mode 100644 index 0000000000000000000000000000000000000000..e6afc1f7cebc907b8541b7ad6c07a7304cc45aae GIT binary patch literal 1055 zcmeAS@N?(olHy`uVBq!ia0y~yV2lUiG!7=9i0dN0%|ME|*vT`5gM;JtL;nXrE@y#9 zWHAE+zYqvBD$f373{-N+)5S5Q;?~={j$DTfL|iZ0o&2}`kBo(hl2i1os&h;%^&dY? z=JUDD`{3+h4u(>OD~ti`4zlPBbUw0*D~w`OU1S^j8!eU#e)O;0@a|W^i}%;xF?{3L z&3vb@)*`QegY|*AlNa(G_;-bI+I_)Wa)qu2XQZx`zSz6a>cFJ#!<_GhuQ0yhE`BHL zAcfs}pmjJUN*S;@80tV|cS8J@PQ@ zqin*uwTc#z46hhgFfZV1umUrn6r7L5KvhVL1kf-fqZjZUSjwaPK($kG0pFRerYv)G za7HIi2?yC8+~JHj0vgu03C_{SW;Z!eiq|T1*Czx%z8A0Gna=ad;QF;>Hg#^yČtverec +

    Teď se vrátíme do základní školy a zkusíme si napsat program, +který vypočítá obsah a obvod čtverce, u kterého známe délku strany.

    +

    Vytvoř si v editoru nový soubor a ulož ho do adresáře pro dnešní lekci +pod jménem ctverec.py. +Zkus do něj napsat program, který spočítá a vypíše obvod a obsah čtverce +se stranou 356 cm.

    +

    Po spuštění by se mělo vypsat něco jako:

    +
    Obvod čtverce se stranou 356 cm je 1424 cm
    +Obsah čtverce se stranou 356 cm je 126736 cm2

    Pro připomenutí, obvod čtverce se stranou a +se dá vypočítat jako O = 4a +a obsah jako S = a².

    +

    Matematika!

    +

    Doufám, že tenhle příklad nikoho neodradí, +ale „počítač“ je holt od slova počítat. +Není třeba se děsit; +na základy programování si vystačíme s matematickými +znalostmi ze základní školy.

    +

    Výsledky by měl spočítat Python; číslo 1424 nebo 126736 přímo do programu nepiš.
    +Jestli si nevíš rady, podívej se na program printing.py +z lekce o print, kde jeden řádek dělá něco podobného.

    +

    Až budeš mít program hotový, nebo až budeš chtít vyzkoušet rozepsaný kousek, +spusť ho:

    +
      +
    • pokud ti už na začátku příkazové řádky nesvítí (venv), +aktivuj si virtuální prostředí,
    • +
    • pomocí cd donaviguj do adresáře s programem,
    • +
    • zadej python ctverec.py.
    • +
    +

    Funguje? Jestli ne, oprav ho a zkus to znovu! +Když už jsi v příkazové řádce ve správném adresáři, spuštění znamená zadat +znovu příkaz python ctverec.py. +Abys to nemusel/a celé psát, můžeš se k předchozímu příkazu vrátit +pomocí šipky nahoru, .

    +
    +

    Řešení

    + + +

    Menší čtverec

    +

    Jestli všechno funguje, zkus změnit program tak, +aby počítal obsah a obvod čtverce o straně 123 cm.

    +
    +

    Řešení

    + + +

    Proměnné

    +

    Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? +Baví tě přepisování čísel? +Kdyby byl program delší (několikastránkový), +jak bys zajistil/a, že jedno z těch čísel nepřehlédneš?

    +

    Existuje způsob, jak program napsat, +aniž bys musela pokaždé přepisovat všechna čísla: +stranu čtverce si „pojmenuješ“ a potom používáš jenom její jméno. +V Pythonu na pojmenovávání hodnot slouží proměnné (angl. variables). +Používají se takto:

    +
    strana = 123
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Neboli: napíšeš jméno, pak rovnítko a za rovnítkem výraz, +jehož hodnota se do proměnné přiřadí. +Když potom napíšeš jméno proměnné ve výrazu, +použije se zapamatovaná hodnota.

    +

    Je zvykem dát před i za rovnítko po jedné mezeře.

    +

    To nás vede k jedné ze základních programátorských +zásad: „neopakuj se“ (anglicky Don't repeat yourself, DRY). +Když se někde opakuje stejná hodnota, stejný výraz +nebo stejný kus kódu, +dobrý programátor +ten kus programu pojmenuje +a dál pak používá jen jméno. +Často se totiž stává, že je program potřeba změnit – +buď je v něm chyba nebo se změní zadání. +A potom je mnohem jednodušší změnu udělat jen na jednom místě.

    +

    Kromě toho dobrá jména usnadňují čtení programu: +u 4 * 183 není moc jasné, co ta čísla znamenají. +Výraz 4 * strana je na tom mnohem líp.

    +

    Kruhy

    +

    Tohle je příklad navíc! Klidně ho přeskoč.

    +

    Změna zadání! +Zkus program doplnit tak, aby kromě čtverce počítal +i obvod a obsah kruhu se stejným poloměrem, +jakou má čtverec stranu.

    +

    Pro připomenutí, obvod kruhu s poloměrem r +je o = 2πr, obsah S = πr² +a π je zhruba 3,1415926.

    +

    Všechna čísla, která matematici označují jen jedním +písmenkem (klidně řeckým), vhodně pojmenuj.

    +

    Komentáře

    +

    Program si teď zpřehledníme komentářem. +V Pythonu komentář začíná dvojkřížkem (#), +za který můžeš napsat úplně cokoliv – až do konce +řádku bude Python všechno ignorovat.

    +

    Komentáře jsou důležité: programy nečte jen počítač, ale i lidé. +Do komentářů si můžeš poznamenat, co dělá celý program, +vysvětlit, jak funguje nějaká složitější část, +nebo vyjasnit něco, co není jasné přímo z programu.

    +

    Vždycky, když píšeš program, snaž se vžít do role někoho, +kdo potom ten program bude číst, +a všechno, co by mohlo být nejasné, upřesnit v komentářích. +(Nejčastěji to budeš číst sám/sama, třeba po několika měsících, +takže tím pomáháš sám/sama sobě!)

    +
    # Tento program počítá obvod a obsah čtverce.
    +
    +strana = 123  # v centimetrech
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +

    Píšeš-li komentáš na stejný řádek jako kód, je zvykem před # dát dvě +mezery (nebo i víc). +Za # pak patří právě jedna.

    +

    Načítání vstupu

    +

    Nakonec se podíváme, jak zařídit, aby číslo nemuselo být +zapsáno v programu, ale aby ho mohl uživatel zadat sám.

    +

    Stejně jako když ses naučil/a používat print +i tady jen řeknu, že na to použijeme funkce. +Detaily si vysvětlíme později; +pro teď to budou kouzelná zaříkadla.

    +

    Pozor, záleží na typu hodnoty který chceš získat: text nebo číslo. +Vybírej pečlivě!

    +
      +
    • Chceš-li načíst text, použij:

      +
      promenna = input('Zadej text: ')
      +
    • +
    • Chceš-li načíst celé číslo, použij:

      +
      promenna = int(input('Zadej číslo: '))
      +
    • +
    • Chceš-li načíst desetinné číslo, použij:

      +
      promenna = float(input('Zadej číslo: '))
      +
    • +
    +

    Místo textu 'Zadej …' se dá napsat i jiná výzva. +A výsledek se samozřejmě dá uložit i do jiné proměnné než promenna.

    +

    Hotový program může vypadat takto:

    +
    # Tento program počítá obvod a obsah čtverce.
    +
    +strana = float(input('Zadej stranu čtverce v centimetrech: '))
    +print('Obvod čtverce se stranou', strana, 'je', 4 * strana, 'cm')
    +print('Obsah čtverce se stranou', strana, 'je', strana * strana, 'cm2')
    +
    \ No newline at end of file diff --git a/lessons/venv-setup/dirs.png b/lessons/venv-setup/dirs.png new file mode 100644 index 0000000000000000000000000000000000000000..5126a1ec959266b389419bb4812e0a96dde02713 GIT binary patch literal 3429 zcmai1X*3&JyN*vwYiK^yRLY@62ScftTj#4dsJUuZw9%kM)I3Cj9Mp+fQ4}3g+Cxn# zH795dMbhHXQjIZYLI{!Rrgze0;rD8 zj>$D`L`OxrcCl=~ zUawVh^YbC3>OcQ%Tz*wmH9fXGTzvJJWZ30qjd6JtmwjMmWAmX=J!<=ht-U?a-QE4R ztLyZTi>qsXK>^6mQ&?DdbJEMrEx`UD#)N;ua5T`2yOfugM`g0KP-1VGkc@CsM zOY{Wt#*O4_T1rYuRTapR;;a6nU%vb&A%QJZ%AP~Rg<#O0E zkWd48uP#LFS2U?Day=j*fFNV$?k>wKl%u0K3b8Dx$UG#ZHc$5Q9EnJzBnc|Wh_ku{ z6ZiHa!otG(zODhC79cARjLp7dFGjHUN9wCF7z|{j1Y}dJbG(AopDv-6s-B;hcLM@> z$*!cubz-sDukdk2SRy}S<}z<*#c>Dk$88XB3r?0ggK#`%-x512blwpV*pW=&0v5~;4Xwy#mW(zX;T z$QpfRZL;^-jK0g0!+8}I(b%n5)FO6RUPSDDvEcU*5kEIq zVG^rT?eg}F-k}nYj7171Z1PTY=5vZ#Fjc$Lt358ohv@O4sg`=Jf3nVJnL5|&)fp#Q zHD(2cQbh5!8ymqaBt9YZN?%So_y7u<={mZn>z}9XlE$?C8RmkI; zCt{wgm1`Mr=(M78VkEJY12qKaQ(=(vY!; zgH7uJyix3Zxj1iY>!BR@KBKgppsimT>dI(JprM9Y`*=YGMK(BoTY$kvD#R{|ol-C{ zm|xyXNlB^k?(`@NS@0UpSd?Habv|2X!q4(9%Yw_UshcbLJO0Duwe~M(OurkVm}Jui z)O-Ah@nKMx%oJxL5fu0*-Rt!J-d;{==}?gm(#p)NHz(`5;~~5_P!=>LValJ@+wJO; z0P>4NAXraoNjb))eN+j@Lv!#5$I}KK^M?(A8bq}d12N6PbJAidKH$?xv7he09sIZ7 z;$itrN?k+a9_z{&x$*^Ub{yjj2jXfTeSZ$(iXanq_@ngG+-o+kp4u_aYN1p=Ht(~> zalf!6-?&_B76sOO%_c|ufPQ@K1GLO5&YKn6OLa5a5N4MekL$Das;?1*|9eF#Z;gOB}RAc zUSsKIRcx(a4lvrh8`zbs6~+ug0w_4fM_di-(4_hf8VXYMTT;lLv2eKZ%$ds9(SrU6 zfSG>&bRdt~2W@!jYcfO^*{QGMiKB}pq3w5DOm~S&3&*2`^ z{--yS-Yyxt*%(Wr4rz(#o+!OgKSyo>wxJ1eXV&*KX^K42fcvw|Z!I8UC3<+GOFTUj ziXud~aQlTk4iJQ$&)6X{&GwT>9^Vw_20CGKmA3K2tiDxIm!?3Ozl(Ba=730c_GqVl zc_R>df6d@@dP9k#FJ+;FxRU9@9PFr+EO1W0kBV80Ou~-ISsHeBF9H#J?-d-a zFd3y#)ay2&1dD)>d^gZ?67>ry_ZZ&wo3v~+2z9I*7zN1asx8TMD@?iX?pJu2TKqou z%;x1>nKz7cqSrg`Hv07Tsm;FDmI;4+yj1AKBH6;KGR661n@^gh`d_T)KOYXglSc)Q z+ja-}en~6B%sDgxLvKa&_|hpsTInCWai)2**+>Aj>FL58;|-l#Mw6m`jIE<*SO)7e zdj-jR90>@4wQf<+JkSzIPpjV1j%X@V3K>1!#yP6I>FI|UXZgnPqbCZB_WrWOAD}!* zF7hcPJ{{;Y7)5+Lvgzv7o*cbj(TT=jpz?+}z&HE;|@|7Rurz2N>y sgMUBs|2)0*<#BY$m-qf%9K%sG+Q92P(!@h~UnGE)xgEInhHvtJ0dght%>V!Z literal 0 HcmV?d00001 diff --git a/lessons/venv-setup/index.html b/lessons/venv-setup/index.html new file mode 100644 index 00000000..5cbdb5d7 --- /dev/null +++ b/lessons/venv-setup/index.html @@ -0,0 +1,110 @@ +

    Nastavení prostředí

    +

    V této sekci si připravíš adresář, do kterého budeš ukládat soubory +k začátečnickým kurzům Pythonu, a aktivuješ si virtuální prostředí.

    +

    Příprava adresáře

    +

    Programátoři vytváří spoustu souborů, a víc než u mnoha jiných uživatelů +počítače záleží na tom, kde jsou ty soubory uložené.

    +

    Níže uvedený postup zdaleka není jediná možnost, jak si organizovat soubory. +Když ale použiješ tenhle ozkoušený způsob, +může to hodně zjednodušit život těm, kteří ti budou pomáhat +s případnými problémy.

    +

    Nejdřív vytvoř adresář (složku), ve kterém budeš mít soubory ke kurzu Pythonu. +Může to být třeba naucse-python ve tvém domovském adresáři. +(Můžeš ho pojmenovat i jinak, ale naucse-python používají příklady níže.)

    +

    Zvolený adresář po vytvoření nesmíš přesouvat jinam. +Proto ho nedoporučuji vytvářet na Ploše.

    +

    Kdybys někdy adresář přece jen přesunul/a jinam, +přestane fungovat virtuální prostředí, které za chvíli vytvoříme. +Musel/a bys ho smazat a vytvořit nové.

    +

    Po vytvoření adresáře si poznamenej, kde přesně je. +Budeš ho potřebovat na celý zbytek kurzu i na případné navazující kurzy.

    +

    Adresář pro každou lekci

    +

    Nový adresář je zatím prázdný. +To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější +mít obsah zorganizovaný.

    +

    Pro začátek si budeme tvořit nový podadresář pro každou lekci tohoto kurzu. +Aby byly tyhle adresáře hezky seřazené, budeme je číslovat: +tahle první lekce bude mít číslo 01, +příště si vytvoříš adresář 02 a tak dále.

    +

    Všechny budou v tvém novém adresáři, který jsi vytvořil/a před chvilkou.

    +

    Adresář 01 si vytvoř už teď. +(Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

    +

    Přepnutí

    +

    Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, +ve kterém jsi právě vytvořila 01 (t.j. ne přímo do 01). +Například:

    +
    $ cd naucse-python
    +

    Pak zkontroluj, že jsi na správném místě:

    +
      +
    • Pomocí příkazu pwd (na Windows cd) zkontroluj, +že opravdu jsi v nově vytvořeném adresáři.
    • +
    • Pomocí příkazu ls (na Windows dir) zkontroluj, +že v něm je podadresář 01.
    • +
    +

    Například:

    +
    +

    Unix (Linux, macOS)

    $ pwd
    +/home/helena/naucse-python
    +
    +$ ls
    +01
    +
    +

    Windows

    > cd
    +C:\Users\Helena\naucse-python
    +
    +> dir
    + Directory of C:\Users\Helena\naucse-python
    +05/08/2014 07:28 PM <DIR>  01
    +

    Virtuální prostředí

    +

    Teď nainstalujeme virtuální prostředí pro Python.

    +

    Virtuální prostředí je něco, co nám zajistí, že se všechny počítače budou +chovat zhruba stejně. +Až ho zprovozníme, nebudeme potřebovat instrukce zvlášť pro Linux, +zvlášť pro Windows a zvlášť pro macOS.

    +

    V budoucnu využijeme druhou výhodu: každé virtuální prostředí je oddělené od +ostatních, takže když doinstalujeme nějakou knihovnu (rozšíření pro Python), +projeví se to jen v jednom virtuálním prostředí. +Pokud by se při práci na projektu něco pokazilo, neohrozí to další projekty +ve tvém počítači.

    +

    Jak na to? +Na každém systému jinak!

    +
      +
    • normální Linux (pokud jsi přeskočil/a instalaci Virtualenv):

      +
       $ python3 -m venv venv
      +
    • +
    • starší Linux (pokud jsi musel/a instalovat Virtualenv):

      +
       $ virtualenv -p python3 venv
      +
    • +
    • macOS:

      +
       $ python3 -m venv venv
      +
    • +
    • Windows:

      +
       > py -3 -m venv venv
      +
    • +
    +

    Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. +Můžeš se podívat dovnitř, ale neukládej tam své soubory a nikdy tam nic neměň!

    +

    Zkontroluj si, že 01 a venv jsou pěkně vedle sebe:

    +
    +

    Unix

    $ ls
    +01
    +venv
    +
    +

    Windows

    > dir
    + Directory of C:\Users\Helena\naucse-python
    +05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:38 PM <DIR>  venv
    +

    V grafickém prohlížeči souborů to vypadá např. takto:

    +

    (adresáře '01' a 'venv' vedle sebe)

    +

    Aktivace virtuálního prostředí

    +

    Nakonec virtuální prostředí aktivuj:

    +
    +

    Unix

    $ source venv/bin/activate
    +
    +

    Windows

    > venv\Scripts\activate
    +

    Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky +(před $ nebo >) objevit slovo (venv). +Tak poznáš, že je virtuální prostředí aktivní.

    +

    Aktivační příkaz si zapiš. +Bude potřeba ho zadat vždycky, když pustíš příkazovou řádku, +ve které budeš zkoušet své programy.

    \ No newline at end of file diff --git a/lessons/while/index.html b/lessons/while/index.html new file mode 100644 index 00000000..754c2688 --- /dev/null +++ b/lessons/while/index.html @@ -0,0 +1,98 @@ +

    While

    +

    Kromě cyklu for máme ještě druhý typ cyklu: while (angl. dokud). +Na rozdíl od for, kde předem známe počet opakování, +se while používá, když cyklus závisí na nějaké podmínce. +Tělo cyklu se opakuje, dokud je podmínka splněna. +Zkus si naprogramovat následující postup pro zubaře:

    +
      +
    • Řekni, aby pacient řekl „Ááá“, a počkej na odpověď
    • +
    • Dokud pacient neřekl „Ááá“:
        +
      • Vynadej pacientovi
      • +
      • Znovu počkej na odpověď
      • +
      +
    • +
    +
    odpoved = input('Řekni Ááá! ')
    +while odpoved != 'Ááá':
    +    print('Špatně, zkus to znovu')
    +    odpoved = input('Řekni Ááá! ')
    +

    Ale pozor! Je velice jednoduché napsat cyklus, +jehož podmínka bude splněna vždycky. +Takový cyklus se bude opakovat donekonečna.

    +
      +
    • Dokud je pravda pravdivá:
        +
      • Napiš náhodné číslo
      • +
      • Napiš hlášku
      • +
      +
    • +
    +
    from random import randrange
    +
    +while True:
    +    print('Číslo je', randrange(10000))
    +    print('(Počkej, než se počítač unaví...)')
    +

    Program se dá přerušit zmáčknutím +Ctrl+C.

    +

    Tahle klávesová zkratka vyvolá v programu chybu +a program se – jako po každé chybě – ukončí.

    +

    A nakonec, existuje příkaz break, který z cyklu „vyskočí“: +začnou se hned vykonávat příkazy za cyklem.

    +
    while True:
    +    odpoved = input('Řekni Ááá! ')
    +    if odpoved == 'Ááá':
    +        print('Bééé')
    +        break
    +    print('Špatně, zkus to znovu')
    +
    +print('Hotovo, ani to nebolelo.')
    +

    Příkaz break se dá použít jenom v cyklu (while nebo for) +a pokud máš víc cyklů zanořených v sobě, vyskočí jen z toho vnitřního.

    +
    for i in range(10):  # Vnější cyklus
    +    for j in range(10):  # Vnitřní cyklus
    +        print(j * i, end=' ')
    +        if i <= j:
    +            break
    +    print()
    +

    Ale zpátky k while! +Dokážeš napsat tenhle program?

    +

    Oko bere

    +
      +
    • Začínáš s 0 body.
    • +
    • Počítač v každém kole vypíše, kolik máš bodů, +a zeptá se tě, jestli chceš pokračovat.
    • +
    • Pokud odpovíš „ne“, hra končí.
    • +
    • Pokud odpovíš „ano“, počítač „otočí kartu“ +(náhodně vybere číslo od 2 do 10), vypíše její hodnotu a přičte ji k bodům.
    • +
    • Pokud máš víc než 21 bodů, prohráváš.
    • +
    • Cílem hry je získat co nejvíc bodů, ideálně 21.
    • +
    +
    +

    Řešení

    + + +
    \ No newline at end of file From 50bbbaed9a28e2c63ed46235b5dc3c6008a13196 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 1 Feb 2022 12:18:17 +0000 Subject: [PATCH 07/31] Compiled From e1c7d3539d823f1021391b5a1b469a16aace9c88 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 1 Mar 2022 11:00:17 +0000 Subject: [PATCH 08/31] Compiled --- lessons/and-or/index.html | 8 +- lessons/asteroids/index.html | 24 +- lessons/async/index.html | 40 +- lessons/basic-functions/index.html | 28 +- lessons/basics/index.html | 36 +- lessons/branching/index.html | 8 +- lessons/circular-imports/index.html | 12 +- lessons/class/index.html | 32 +- lessons/click/index.html | 32 +- lessons/cmdline/index.html | 40 +- lessons/collaboration/index.html | 44 +- lessons/comparisons/index.html | 16 +- lessons/course.json | 30 +- lessons/cython/index.html | 88 +++- lessons/decorators/index.html | 28 +- lessons/def/index.html | 28 +- lessons/deployment/index.html | 8 +- lessons/deployment/pythonanywhere.html | 12 +- lessons/dict/index.html | 20 +- lessons/distribution/index.html | 60 ++- lessons/docs/index.html | 72 ++- lessons/drawing/index.html | 36 +- lessons/exceptions/index.html | 24 +- lessons/expressions/index.html | 4 +- lessons/files/index.html | 16 +- lessons/first-steps/index.html | 12 +- lessons/flask/index.html | 60 ++- lessons/fstring/index.html | 8 +- lessons/functions/index.html | 32 +- lessons/generators/index.html | 28 +- lessons/git-collaboration-2in1/index.html | 44 +- lessons/github-api/index.html | 24 +- lessons/hello-world/index.html | 8 +- lessons/http/index.html | 16 +- lessons/ignoring/index.html | 28 +- lessons/inheritance/index.html | 16 +- lessons/install-editor/atom.html | 16 +- lessons/install-editor/gedit.html | 12 +- lessons/install-editor/index.html | 16 +- lessons/install-editor/kate.html | 12 +- lessons/install-editor/notepad-plus-plus.html | 12 +- lessons/install-editor/others.html | 28 +- lessons/install-editor/vscode.html | 20 +- lessons/install/index.1.html | 12 +- lessons/install/index.2.html | 20 +- lessons/install/index.html | 4 +- lessons/install/linux.html | 16 +- lessons/install/macos.html | 4 +- lessons/install/windows.html | 4 +- lessons/installing-naucse/index.html | 41 +- lessons/json/index.html | 16 +- lessons/list/index.html | 56 ++- lessons/local-run/index.html | 445 +++++++++++------- lessons/local-run/info.yml | 2 +- lessons/local-variables/index.html | 24 +- lessons/logic/index.html | 44 +- lessons/magic/index.html | 36 +- lessons/micropython/index.1.html | 48 +- lessons/micropython/index.html | 68 ++- lessons/mini-workshop/index.html | 64 ++- lessons/mini-workshop/organizers.html | 20 +- lessons/modules/index.html | 16 +- lessons/mypy/index.html | 36 +- lessons/nested-traceback/index.html | 4 +- lessons/notebook/index.html | 8 +- lessons/numpy/index.html | 60 ++- lessons/pandas/index.html | 56 ++- lessons/pong/index.html | 36 +- lessons/print/index.html | 20 +- lessons/pyglet/index.html | 40 +- lessons/pyqt/index.html | 96 +++- lessons/reassignment/index.html | 8 +- lessons/recursion/index.html | 16 +- lessons/requests/index.html | 16 +- lessons/snake/index.html | 52 +- lessons/str-index-slice/index.html | 16 +- lessons/str-methods/index.html | 16 +- lessons/str/index.html | 36 +- lessons/submitting-a-run/index.html | 129 +++-- lessons/testing/index.1.html | 80 +++- lessons/testing/index.html | 28 +- lessons/tuple/index.html | 16 +- lessons/turtle/index.html | 60 ++- lessons/variables/index.html | 24 +- lessons/venv-setup/index.html | 24 +- lessons/while/index.html | 8 +- lessons/yaml/index.html | 30 ++ meta/branching/index.html | 8 +- meta/cmdline/index.html | 40 +- meta/course.json | 81 ++-- meta/git-collaboration-2in1/index.html | 44 +- meta/install/index.1.html | 20 +- meta/install/index.html | 4 +- meta/install/linux.html | 16 +- meta/install/macos.html | 4 +- meta/install/windows.html | 4 +- meta/installing-naucse/index.html | 40 -- meta/local-run/index.html | 445 +++++++++++------- meta/local-run/info.yml | 2 +- meta/notebook/index.html | 8 +- meta/submitting-a-run/index.html | 129 +++-- meta/venv-setup/dirs.png | Bin 0 -> 3429 bytes meta/venv-setup/index.html | 122 +++++ meta/yaml/index.html | 30 ++ mi-pyt/async/index.html | 40 +- mi-pyt/click/index.html | 32 +- mi-pyt/cmdline/index.html | 40 +- mi-pyt/cython/index.html | 88 +++- mi-pyt/deployment/index.html | 8 +- mi-pyt/deployment/pythonanywhere.html | 12 +- mi-pyt/distribution/index.html | 60 ++- mi-pyt/docs/index.html | 72 ++- mi-pyt/flask/index.html | 60 ++- mi-pyt/generators/index.html | 28 +- mi-pyt/git-collaboration-2in1/index.html | 44 +- mi-pyt/http/index.html | 16 +- mi-pyt/install/index.1.html | 12 +- mi-pyt/install/index.html | 4 +- mi-pyt/install/linux.html | 16 +- mi-pyt/install/macos.html | 4 +- mi-pyt/install/windows.html | 4 +- mi-pyt/magic/index.html | 36 +- mi-pyt/micropython/index.html | 48 +- mi-pyt/notebook/index.html | 8 +- mi-pyt/numpy/index.html | 60 ++- mi-pyt/pandas/index.html | 56 ++- mi-pyt/pyqt/index.html | 96 +++- mi-pyt/requests/index.html | 16 +- mi-pyt/testing/index.1.html | 80 +++- mi-pyt/testing/index.html | 28 +- pyladies/and-or/index.html | 8 +- pyladies/asteroids/index.html | 24 +- pyladies/basic-functions/index.html | 28 +- pyladies/basics/index.html | 36 +- pyladies/branching/index.html | 8 +- pyladies/circular-imports/index.html | 12 +- pyladies/class/index.html | 32 +- pyladies/cmdline/index.html | 40 +- pyladies/collaboration/index.html | 44 +- pyladies/comparisons/index.html | 16 +- pyladies/def/index.html | 28 +- pyladies/dict/index.html | 20 +- pyladies/exceptions/index.html | 24 +- pyladies/expressions/index.html | 4 +- pyladies/files/index.html | 16 +- pyladies/first-steps/index.html | 12 +- pyladies/fstring/index.html | 8 +- pyladies/functions/index.html | 32 +- pyladies/github-api/index.html | 24 +- pyladies/hello-world/index.html | 8 +- pyladies/ignoring/index.html | 28 +- pyladies/inheritance/index.html | 16 +- pyladies/install-editor/atom.html | 16 +- pyladies/install-editor/gedit.html | 12 +- pyladies/install-editor/index.html | 16 +- pyladies/install-editor/kate.html | 12 +- .../install-editor/notepad-plus-plus.html | 12 +- pyladies/install-editor/others.html | 28 +- pyladies/install-editor/vscode.html | 20 +- pyladies/install/index.1.html | 20 +- pyladies/install/index.html | 4 +- pyladies/install/linux.html | 16 +- pyladies/install/macos.html | 4 +- pyladies/install/windows.html | 4 +- pyladies/json/index.html | 16 +- pyladies/list/index.html | 56 ++- pyladies/local-variables/index.html | 24 +- pyladies/modules/index.html | 16 +- pyladies/nested-traceback/index.html | 4 +- pyladies/pong/index.html | 36 +- pyladies/print/index.html | 20 +- pyladies/pyglet/index.html | 40 +- pyladies/reassignment/index.html | 8 +- pyladies/str-index-slice/index.html | 16 +- pyladies/str-methods/index.html | 16 +- pyladies/str/index.html | 36 +- pyladies/testing/index.html | 28 +- pyladies/tuple/index.html | 16 +- pyladies/turtle/index.html | 60 ++- pyladies/variables/index.html | 24 +- pyladies/venv-setup/index.html | 24 +- pyladies/while/index.html | 8 +- 182 files changed, 4360 insertions(+), 1678 deletions(-) create mode 100644 lessons/yaml/index.html delete mode 100644 meta/installing-naucse/index.html create mode 100644 meta/venv-setup/dirs.png create mode 100644 meta/venv-setup/index.html create mode 100644 meta/yaml/index.html diff --git a/lessons/and-or/index.html b/lessons/and-or/index.html index d7393bda..f0c11d99 100644 --- a/lessons/and-or/index.html +++ b/lessons/and-or/index.html @@ -1,4 +1,6 @@ -

    Nebo anebo a

    +

    Nebo anebo a +# +

    Vzpomínáš na tabulku operátorů z lekce o Porovnávání? Nyní si ji doplníme o další tři operátory, @@ -44,7 +46,9 @@

    Nebo anebo a

    ... tedy „pokud platí A, a nebo je B menší než 0“. A to moc smyslu nedává. (Kdy „platí“ celé číslo?)

    -

    Šťastná/Bohatá

    +

    Šťastná/Bohatá +# +

    Pro příklad použijeme and ve vylepšeném programu, který rozdává nejapné rady do života. Zkus si ho projít a okomentovat části, které nejsou na první pohled jasné.

    diff --git a/lessons/asteroids/index.html b/lessons/asteroids/index.html index eab3f1f5..df2e3424 100644 --- a/lessons/asteroids/index.html +++ b/lessons/asteroids/index.html @@ -1,4 +1,6 @@ -

    Hra typu Asteroids

    +

    Hra typu Asteroids +# +

    Dnes to všechno – třídy, grafiku, seznamy, a tak dále – spojíme dohromady do závěrečného projektu. Doufám, že se ti bude líbit!

    @@ -15,7 +17,9 @@

    Hra typu Asteroids

    něco s čím si nebudeš vědět rady. Kdyby se to stalo, prosím, ozvi se nám! Rádi ti s projektem pomůžeme.

    -

    Vesmírná loď

    +

    Vesmírná loď +# +

    První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesnicí.

    Povedlo se? Můžeš létat vesmírem? @@ -196,24 +189,16 @@

    Kolize Každý objekt bude potřebovat mít poloměr – atribut radius.

  • Aby bylo vidět co si hra o objektech „myslí”, nakresli si nad každým objektem příslušné kolečko. -Nejlepší je to udělat pomocí -pyglet.gl -a trochy matematiky; pro teď si jen opiš funkci -draw_circle a pro každý objekt ji zavolej. -Až to bude všechno fungovat, můžeš funkci dát pryč.

    +Pyglet na to má třídu Circle v modulu +pyglet.shapes:

    def draw_circle(x, y, radius):
    -    iterations = 20
    -    s = math.sin(2*math.pi / iterations)
    -    c = math.cos(2*math.pi / iterations)
    -
    -    dx, dy = radius, 0
    -
    -    gl.glBegin(gl.GL_LINE_STRIP)
    -    for i in range(iterations+1):
    -        gl.glVertex2f(x+dx, y+dy)
    -        dx, dy = (dx*c - dy*s), (dy*c + dx*s)
    -    gl.glEnd()
    -
  • + circle = shapes.Circle(x=x, y=y, radius=radius) + circle.opacity = 120 # (ne)průhlednost, od 0 (průhledné) do 255 (plné) + circle.draw() +

    Pro zrychlení můžeš kolečka přidat do batch a vykreslovat společně se +zbytkem vesmíru.

    +

    Až to bude všechno fungovat, můžeš kolečka dát pryč.

    +
  • Když asteroid narazí do lodi, loď exploduje a zmizí. Explozi necháme na později, teď je důležité odebrání objektu ze hry. Dej ho do metody SpaceObject.delete, diff --git a/lessons/course.json b/lessons/course.json index 37d14e1f..8f1caaa2 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -2228,13 +2228,13 @@ "slug": "index", "solutions": [ { - "content": "
    def vykresli():\n    ...\n    # Vykresleni micku\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        pozice_mice[0] + VELIKOST_MICE // 2,\n        pozice_mice[1] + VELIKOST_MICE // 2,\n    )\n
    " + "content": "
    def vykresli():\n    ...\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        VELIKOST_MICE,\n        VELIKOST_MICE)\n
    " }, { - "content": "
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])]:\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            x + TLOUSTKA_PALKY,\n            y + DELKA_PALKY // 2,\n        )\n
    " + "content": "

    Existuje víc řešení.\nTřeba se vykreslit obdélník dvojnásobnou šířkou, ale na hraně okna takže\nho bude vidět jen půl:

    \n
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] :\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            TLOUSTKA_PALKY * 2,\n            DELKA_PALKY)\n
    " }, { - "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            SIRKA // 2 + 1,\n            y + DELKA_PULICI_CARKY\n        )\n
    " + "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            2,\n            DELKA_PULICI_CARKY)\n
    " }, { "content": "
    def vykresli():\n    ...\n    # A nakonec vypiseme skore obou hracu\n    nakresli_text(\n        str(skore[0]),\n        x=ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='left',\n    )\n\n    nakresli_text(\n        str(skore[1]),\n        x=SIRKA - ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='right',\n    )\n
    " @@ -2255,6 +2255,9 @@ "static_files": { "pong.png": { "path": "pong/pong.png" + }, + "pong.py": { + "path": "pong/pong.py" } }, "title": "Praktické cvičení: Pong" diff --git a/lessons/pong/index.html b/lessons/pong/index.html index 4e62ec0c..f3be3c6c 100644 --- a/lessons/pong/index.html +++ b/lessons/pong/index.html @@ -93,30 +93,29 @@

    Konstanty a stav hry ploše.

    Většina z tvarů jsou obdélníky, takže nejprve navrhněme funkci nakresli_obdelnik, která -dostane čtveřici souřadnic a pomocí modulu gl -z Pygletu vykreslí čtverec pomocí 2 trojúhelníků.

    +dostane souřadnice a velikost obdélníku a vykreslí ho. +Na to má pyglet v modulu pyglet.shapes třídu Rectangle, +která se používá následovně:

    from pyglet import gl
     ...
    -def nakresli_obdelnik(x1, y1, x2, y2):
    -    """Nakresli obdelnik na dane souradnice
    +def nakresli_obdelnik(x, y, sirka, vyska):
    +    """Nakresli obdelnik na danych souradnicich
     
         Nazorny diagram::
     
    -         y2 - +-----+
    -              |/////|
    -         y1 - +-----+
    -              :     :
    -             x1    x2
    +                sirka (velikost v ose X)
    +              |<------>|
    +
    +              +--------+     -
    +              |KRESLIME|     ^
    +              |*TENHLE*|     | vyska (velikost v ose Y)
    +              |OBDELNIK|     v
    +          y - +--------+     -
    +              :
    +              x
         """
    -    # Tady pouzijeme volani OpenGL, ktere je pro nas zatim asi nejjednodussi
    -    # na pouziti
    -    gl.glBegin(gl.GL_TRIANGLE_FAN)   # zacni kreslit spojene trojuhelniky
    -    gl.glVertex2f(int(x1), int(y1))  # vrchol A
    -    gl.glVertex2f(int(x1), int(y2))  # vrchol B
    -    gl.glVertex2f(int(x2), int(y2))  # vrchol C, nakresli trojuhelnik ABC
    -    gl.glVertex2f(int(x2), int(y1))  # vrchol D, nakresli trojuhelnik BCD
    -    # dalsi souradnice E by nakreslila trojuhelnik CDE, atd.
    -    gl.glEnd()  # ukonci kresleni trojuhelniku
    +    obdelnik = pyglet.shapes.Rectangle(x=x, y=y, width=sirka, height=vyska)
    +    obdelnik.draw()
     

    Teď začneme pracovat na funkci vykresli() Nejprve ji vytvoř prázdnou a zaregistruj ji v Pygletu na událost on_draw, jak jsme to @@ -129,8 +128,7 @@

    Konstanty a stav hry
    ...
     def vykresli():
         """Vykresli stav hry"""
    -    gl.glClear(gl.GL_COLOR_BUFFER_BIT)  # smaz obsah okna (vybarvi na cerno)
    -    gl.glColor3f(1, 1, 1)  # nastav barvu kresleni na bilou
    +    window.clear()  # smaz obsah okna (vybarvi na cerno)
     
     window = pyglet.window.Window(width=SIRKA, height=VYSKA)
     window.push_handlers(
    @@ -143,7 +141,8 @@ 

    Konstanty a stav hry vykreslení míčku na správné pozici, kterou získáš z příslušné globální proměnné. Míček je v našem případě jen malý čtvereček jehož velikost -máme uloženou v konstantě.

    +máme uloženou v konstantě. +Pozor na to, že pozice_mice určuje střed míčku, ne roh.

    Řešení

    @@ -152,13 +151,11 @@

    Řešení

    Po míčku zkus vykreslit obě pálky. @@ -174,17 +171,19 @@

    Řešení

    Ukázat řešení

    Přehlednosti hry pomůže půlící čára @@ -194,7 +193,7 @@

    Řešení

    dolů. Chce to jen vygenerovat seznam souřadnic, které budou mít dostatečné rozestupy, a na každé z nich vykreslit obdélníček. Kterou funkci z Pythonu -bys použila na získání tohoto seznamu souřadnic?

    +bys použil/a na získání tohoto seznamu souřadnic?

    Řešení

    @@ -208,9 +207,8 @@

    Řešení

    nakresli_obdelnik( SIRKA // 2 - 1, y, - SIRKA // 2 + 1, - y + DELKA_PULICI_CARKY - ) + 2, + DELKA_PULICI_CARKY)

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. @@ -220,11 +218,7 @@

    Řešení

    skóre. Objekt musíme nejdřív vytvořit. To uděláme kulatými závorkami za jménem objektu, jako bychom volali funkci, a uložíme si ho do proměnné: -napis = Label(). Normálně bychom objekt -vytvořili jen jednou a pak měnili jeho hodnotu, ale -pro jednoduchost vytvoříme vždy nový a celé to zabalíme -do funkce. V jejím závěru musíme na nadpisu zavolat -metodu draw(), jinak se nápis nevykreslí.

    +napis = Label().

    def nakresli_text(text, x, y, pozice_x):
         """Nakresli dany text na danou pozici
     
    @@ -514,4 +508,6 @@ 

    Odrážení míčku

    Hurá, prokousali jsme se k zdárnému konci Pongu! Máš teď plně funkční interaktivní grafickou -hru zakládající se na reálné předloze. :)

    \ No newline at end of file +hru zakládající se na reálné předloze. :)

    +

    Můžeš si stáhnout celý kód hry +a porovnat ho se svým řešením.

    \ No newline at end of file diff --git a/lessons/pong/pong.py b/lessons/pong/pong.py new file mode 100644 index 00000000..f3aeae5c --- /dev/null +++ b/lessons/pong/pong.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +"""Hra typu Pong + +Graficka hra pro dva hrace. Kazdy hrac ovlada "palku" na sve strane hriste, +a snazi se odpalit micek na protivnikovu stranu. + +Ovladani: +Hrac 1: klavesy W a S +Hrac 2: sipky Nahoru a Dolu +Konec: Esc + + +Hra pouziva gravickou knihovnu Pyglet, coz je Pythonova nadstavba nad OpenGL. + +Souradny system okynka je nasledujici:: + + y ^ + | + VYSKA +---------------------------------------+ + | : | + | : | + | : | + | ; [] | + |] ; [| + |] ; [| + |] ; [| + |] ; [| + | ; | + | : | + | ; | + | ; | + 0 +---------------------------------------+------> x + : : : + 0 SIRKA/2 SIRKA + +Pozor pokud mate zkusenosti s nekterymi grafickymi programy, nebo 2D +knihovnami. OpenGL pouziva matematicky souradny system, nula je vlevo *dole*. + +""" + +# Prvni radek (#!/usr/bin/env python3) je takzvany "shebang": na systemech +# zalozenych na Unixu (Linux, macOS) umoznuje spustit tenhle soubor jednoduse +# pomoci prikazu: ./pong.py + +# A ted uz k samotne hre: napred naimportujeme potrebne veci z knihovny pyglet + +import random + +import pyglet +from pyglet import gl +from pyglet.window import key + + +# Nejake konstanty: + +# Velikost okna (v pixelech) +SIRKA = 900 +VYSKA = 600 + +VELIKOST_MICE = 20 +TLOUSTKA_PALKY = 10 +DELKA_PALKY = 100 +RYCHLOST = 200 # v pixelech za sekundu +RYCHLOST_PALKY = RYCHLOST * 1.5 # taky v pixelech za sekundu + +DELKA_PULICI_CARKY = 20 +VELIKOST_FONTU = 42 +ODSAZENI_TEXTU = 30 + + +# Stav hry si budeme pamatovat v globalnich promennych. +# Profesionalni programator se nad tim zhrozi, ale pro nas je to tak zatim +# jednodussi. +# Jen nezapomente ze prikaz jako: +# pozice_mice = [0, 0] +# ve funkci by vytvoril novou lokalni promennou, ktera by s globalni +# `pozice_mice` nemela nic spolecneho. Oproti tomu prikaz jako: +# pozice_mice[0] = 0 +# nastavi prvni prvek globalni `pozice_mice`. + +pozice_palek = [VYSKA // 2, VYSKA // 2] # vertikalni pozice dvou palek +pozice_mice = [0, 0] # x, y souradnice micku -- nastavene v reset() +rychlost_mice = [0, 0] # x, y slozky rychlosti micku -- nastavene v reset() +stisknute_klavesy = set() # sada stisknutych klaves +skore = [0, 0] # skore dvou hracu + +# Pozice palek a micku vzdy bude urcovat stred daneho obdelnicku. + + +def reset(): + """Nastav pocatecni stav + + Tahle funkce se bude volat na zacatku programu, a taky potom co nektery + z hracu prohraje. + Funkce da micek doprostred obrazovky a da mu nahodnou rychlost. + + N.B. Neresetujeme tady skore ani pozici palek; ty zustavaji do dalsiho kola + """ + pozice_mice[0] = SIRKA // 2 + pozice_mice[1] = VYSKA // 2 + + # x-ova rychlost - bud vpravo, nebo vlevo + if random.randint(0, 1): + rychlost_mice[0] = RYCHLOST + else: + rychlost_mice[0] = -RYCHLOST + # y-ova rychlost - uplne nahodna + rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST + + +def obnov_stav(dt): + """Spocitej novy stav hry + + Tahle funkce se vola mockrat za sekundu. V parametru ``dt`` dostane cas + v sekundach od posledniho zavolani. Pocitac je rychly, proto to + vetsinou bude velice male cislo - kolem sedesatiny sekundy (0.0167). + """ + # Jak zname z fyziky, micek s rychlosti `v` se za cas `t` pohne o `v*t`. + # Tenhle vyraz muzeme rozlozit pro slozky x, y. + pozice_mice[0] += rychlost_mice[0] * dt + pozice_mice[1] += rychlost_mice[1] * dt + + # odraz od spodni hrany + # Kdyz je micek prilis "nizko", odrazi se, a zacne se pohybovat nahoru. + # To znamena ze bude mit kladnou y-ovou slozku rychlosti. + # x-ova slozka (vpravo/vlevo) se nezmeni. + if pozice_mice[1] < VELIKOST_MICE // 2: + rychlost_mice[1] = abs(rychlost_mice[1]) + + # odraz od vrchni hrany + # To same, ale micek je moc vysoko a musi se zacit pohybovat dolu. + if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2: + rychlost_mice[1] = -abs(rychlost_mice[1]) + + # pohyb palek - cyklus se projde dvkrat; jednou pro kazdou palku + for cislo_palky in (0, 1): + # pohyb podle klaves (viz funkce `stisk_klavesy`) + if ('nahoru', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt + if ('dolu', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt + + # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum + if pozice_palek[cislo_palky] < DELKA_PALKY / 2: + pozice_palek[cislo_palky] = DELKA_PALKY / 2 + # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum + if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2: + pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2 + + # odrazeni micku + # Pokud je micek prilis vlevo, muze se budto odrazit od leve palky, anebo + # tam palka neni a levy hrac prohral. Podobne pro pravou stranu. + # Doporucuju si to nakreslit na papir :) + + # nejdriv si poznamename minimalni a maximalni pozici, kde musi byt palka + # (t.j. stred palky), aby odrazila micek. + palka_min = pozice_mice[1] - VELIKOST_MICE/2 - DELKA_PALKY/2 + palka_max = pozice_mice[1] + VELIKOST_MICE/2 + DELKA_PALKY/2 + + # odrazeni vlevo + if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2: + if palka_min < pozice_palek[0] < palka_max: + # palka je na spravnem miste, odrazime micek + rychlost_mice[0] = abs(rychlost_mice[0]) + else: + # palka je jinde nez ma byt, hrac prohral + skore[1] += 1 + reset() + + # odrazeni vpravo + if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2): + if palka_min < pozice_palek[1] < palka_max: + rychlost_mice[0] = -abs(rychlost_mice[0]) + else: + skore[0] += 1 + reset() + + +def nakresli_obdelnik(x, y, sirka, vyska): + """Nakresli obdelnik na danych souradnicich + + Nazorny diagram:: + + sirka (velikost v ose X) + |<------>| + + +--------+ - + |KRESLIME| ^ + |*TENHLE*| | vyska (velikost v ose Y) + |OBDELNIK| v + y - +--------+ - + : + x + """ + obdelnik = pyglet.shapes.Rectangle(x=x, y=y, width=sirka, height=vyska) + obdelnik.draw() + + +def nakresli_text(text, x, y, pozice_x): + """Nakresli dany text na danou pozici + + Argument ``pozice_x`` muse byt "left" nebo "right", udava na kterou stranu + bude text zarovnany + """ + # Texty umi vypisovat Pyglet, a to tak, ze vytvorime objekt "napis" + # a pak ho nakreslime. + # (Normalne bychom tenhle objekt udelali jednou, a pak v nem jen menili + # text a vykreslovali ho, ale pro jednoduchost si ho vytvorime tady:) + napis = pyglet.text.Label( + text, + font_name='League Gothic', + font_size=VELIKOST_FONTU, + x=x, y=y, anchor_x=pozice_x) + napis.draw() + + +def vykresli(): + """Vykresli stav hry""" + window.clear() # smaz obsah okna (vybarvi na cerno) + + # micek + nakresli_obdelnik( + pozice_mice[0] - VELIKOST_MICE // 2, + pozice_mice[1] - VELIKOST_MICE // 2, + VELIKOST_MICE, + VELIKOST_MICE) + + # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic + # v tom seznamu palku vykreslime + for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] : + nakresli_obdelnik( + x - TLOUSTKA_PALKY, + y - DELKA_PALKY // 2, + TLOUSTKA_PALKY * 2, + DELKA_PALKY) + + # prerusovana pulici cara - slozena ze spousty malych obdelnicku + for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2): + nakresli_obdelnik( + SIRKA // 2 - 1, + y, + 2, + DELKA_PULICI_CARKY) + + # A nakonec vypiseme skore obou hracu + nakresli_text(str(skore[0]), + x=ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='left') + + nakresli_text(str(skore[1]), + x=SIRKA - ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='right') + + +def stisk_klavesy(symbol, modifikatory): + """Osetri stisknuti klavesy + + Kdyz hrac stiskne spravnou klavesu, do mnoziny ``stisknute_klavesy`` se + prida dvojice (n-tice) tvaru (smer, cislo palky). + Program pak muze pohybovat palkou podle toho, co je v mnozine. + """ + if symbol == key.W: + stisknute_klavesy.add(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.add(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.add(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.add(('dolu', 1)) + # N.B. klavesu ESC Pyglet osetri sam: zavre okno a ukonci funkci run() + + +def pusteni_klavesy(symbol, modifikatory): + """Osetri pusteni klavesy + + Opak funkce ``stisk_klavesy`` -- podle argumentu vynda prislusnou + dvojici z mnoziny. + """ + # Vsimnete si pouziti funkce ``discard``: na rozdil od ``remove`` + # nezpusobi chybu, kdyz prvek v mnozine neni. Takze program nespadne, + # kdyz napr. uzivatel zmackne klavesu, pak se prepne do naseho okna, + # a pak teprve klavesu pusti. + if symbol == key.W: + stisknute_klavesy.discard(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.discard(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.discard(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.discard(('dolu', 1)) + # Mimochodem, funkce pusteni_klavesy a stisk_klavesy by se daly hodne + # zjednodusit pomoci slovniku. Zkusite to? + +# Nastavime prvotni stav +reset() + +# Vytvorime okno, do ktereho budeme kreslit +window = pyglet.window.Window(width=SIRKA, height=VYSKA) + +# Oknu priradime par funkci, ktere budou reagovat na udalosti. +# Kdyz napr. uzivatel zmackne klavesu na klavesnici, +# Pyglet zavola funkci, kterou tady zaregistrujeme pod `on_key_press`, +# a preda ji prislusne argumenty. +# Jake vsechny udalosti muzou nastat, a jake argumenty se predaji prislusne +# funkci, se doctete v dokumentaci Pygletu, +# nebo pomoci `help(pyglet.window.event)`. +window.push_handlers( + on_draw=vykresli, # na vykresleni okna pouzij funkci `vykresli` + on_key_press=stisk_klavesy, # po stisknuti klavesy zavolej `stisk_klavesy` + on_key_release=pusteni_klavesy, # a mame i funkci na pusteni klavesy + ) + +# Jeste mame jednu podobnou funkci, kterou ale neprirazujeme primo +# oknu. Misto toho chceme aby ji Pyglet zavolal vzdycky kdyz "tiknou hodiny" +pyglet.clock.schedule(obnov_stav) + +pyglet.app.run() # vse je nastaveno, at zacne hra +# (funkce run() bude porad dokola volat obnov_stav, vykresli, a kdyz se mezitim +# neco stane, zavola navic funkci kterou jsme nastavili jako reakci na +# danou udalost) diff --git a/pyladies/asteroids/index.html b/pyladies/asteroids/index.html index df2e3424..3fd34f07 100644 --- a/pyladies/asteroids/index.html +++ b/pyladies/asteroids/index.html @@ -129,21 +129,14 @@

    Hra typu Asteroids def draw(): window.clear() - for x_offset in (-window.width, 0, window.width): - for y_offset in (-window.height, 0, window.height): - # Remember the current state - gl.glPushMatrix() - # Move everything drawn from now on by (x_offset, y_offset, 0) - gl.glTranslatef(x_offset, y_offset, 0) - - # Draw - batch.draw() - - # Restore remembered state (this cancels the glTranslatef) - gl.glPopMatrix() + for x_offset in (-window.width, window.width, 0): + for y_offset in (-window.height, window.height, 0): + # Set the view matrix to offset draws + matrix = pyglet.math.Mat4.from_translation(x_offset, y_offset, 0) + window.view = matrix

    Pro přehled, dokumentace k použitým funkcím je tady: -glPushMatrix, glPopMatrix, -glTranslatef.

    +window.view, + Mat4.

  • Povedlo se? Můžeš létat vesmírem? @@ -196,24 +189,16 @@

    Kolize Každý objekt bude potřebovat mít poloměr – atribut radius.
  • Aby bylo vidět co si hra o objektech „myslí”, nakresli si nad každým objektem příslušné kolečko. -Nejlepší je to udělat pomocí -pyglet.gl -a trochy matematiky; pro teď si jen opiš funkci -draw_circle a pro každý objekt ji zavolej. -Až to bude všechno fungovat, můžeš funkci dát pryč.

    +Pyglet na to má třídu Circle v modulu +pyglet.shapes:

    def draw_circle(x, y, radius):
    -    iterations = 20
    -    s = math.sin(2*math.pi / iterations)
    -    c = math.cos(2*math.pi / iterations)
    -
    -    dx, dy = radius, 0
    -
    -    gl.glBegin(gl.GL_LINE_STRIP)
    -    for i in range(iterations+1):
    -        gl.glVertex2f(x+dx, y+dy)
    -        dx, dy = (dx*c - dy*s), (dy*c + dx*s)
    -    gl.glEnd()
    -
  • + circle = shapes.Circle(x=x, y=y, radius=radius) + circle.opacity = 120 # (ne)průhlednost, od 0 (průhledné) do 255 (plné) + circle.draw() +

    Pro zrychlení můžeš kolečka přidat do batch a vykreslovat společně se +zbytkem vesmíru.

    +

    Až to bude všechno fungovat, můžeš kolečka dát pryč.

    +
  • Když asteroid narazí do lodi, loď exploduje a zmizí. Explozi necháme na později, teď je důležité odebrání objektu ze hry. Dej ho do metody SpaceObject.delete, diff --git a/pyladies/course.json b/pyladies/course.json index 5effa67f..a82a3420 100644 --- a/pyladies/course.json +++ b/pyladies/course.json @@ -1479,13 +1479,13 @@ "slug": "index", "solutions": [ { - "content": "
    def vykresli():\n    ...\n    # Vykresleni micku\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        pozice_mice[0] + VELIKOST_MICE // 2,\n        pozice_mice[1] + VELIKOST_MICE // 2,\n    )\n
    " + "content": "
    def vykresli():\n    ...\n    nakresli_obdelnik(\n        pozice_mice[0] - VELIKOST_MICE // 2,\n        pozice_mice[1] - VELIKOST_MICE // 2,\n        VELIKOST_MICE,\n        VELIKOST_MICE)\n
    " }, { - "content": "
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])]:\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            x + TLOUSTKA_PALKY,\n            y + DELKA_PALKY // 2,\n        )\n
    " + "content": "

    Existuje víc řešení.\nTřeba se vykreslit obdélník dvojnásobnou šířkou, ale na hraně okna takže\nho bude vidět jen půl:

    \n
    def vykresli():\n    ...\n    # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic\n    # v tom seznamu palku vykreslime\n    for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] :\n        nakresli_obdelnik(\n            x - TLOUSTKA_PALKY,\n            y - DELKA_PALKY // 2,\n            TLOUSTKA_PALKY * 2,\n            DELKA_PALKY)\n
    " }, { - "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            SIRKA // 2 + 1,\n            y + DELKA_PULICI_CARKY\n        )\n
    " + "content": "
    def vykresli():\n    ...\n    # prerusovana pulici cara - slozena ze spousty malych obdelnicku\n    for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2):\n        nakresli_obdelnik(\n            SIRKA // 2 - 1,\n            y,\n            2,\n            DELKA_PULICI_CARKY)\n
    " }, { "content": "
    def vykresli():\n    ...\n    # A nakonec vypiseme skore obou hracu\n    nakresli_text(\n        str(skore[0]),\n        x=ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='left',\n    )\n\n    nakresli_text(\n        str(skore[1]),\n        x=SIRKA - ODSAZENI_TEXTU,\n        y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU,\n        pozice_x='right',\n    )\n
    " @@ -1508,6 +1508,9 @@ "static_files": { "pong.png": { "path": "pong/pong.png" + }, + "pong.py": { + "path": "pong/pong.py" } }, "title": "Praktické cvičení: Pong" @@ -1845,11 +1848,6 @@ "title": "Praktické cvičení: Pong", "type": "lesson" }, - { - "external_url": "http://pyladies.cz/v1/s012-pyglet/pong.py", - "title": "Kód celé hry Pong", - "type": "link" - }, { "external_url": "https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf", "title": "Tahák na Pyglet", diff --git a/pyladies/pong/index.html b/pyladies/pong/index.html index 4e62ec0c..f3be3c6c 100644 --- a/pyladies/pong/index.html +++ b/pyladies/pong/index.html @@ -93,30 +93,29 @@

    Konstanty a stav hry ploše.

    Většina z tvarů jsou obdélníky, takže nejprve navrhněme funkci nakresli_obdelnik, která -dostane čtveřici souřadnic a pomocí modulu gl -z Pygletu vykreslí čtverec pomocí 2 trojúhelníků.

    +dostane souřadnice a velikost obdélníku a vykreslí ho. +Na to má pyglet v modulu pyglet.shapes třídu Rectangle, +která se používá následovně:

    from pyglet import gl
     ...
    -def nakresli_obdelnik(x1, y1, x2, y2):
    -    """Nakresli obdelnik na dane souradnice
    +def nakresli_obdelnik(x, y, sirka, vyska):
    +    """Nakresli obdelnik na danych souradnicich
     
         Nazorny diagram::
     
    -         y2 - +-----+
    -              |/////|
    -         y1 - +-----+
    -              :     :
    -             x1    x2
    +                sirka (velikost v ose X)
    +              |<------>|
    +
    +              +--------+     -
    +              |KRESLIME|     ^
    +              |*TENHLE*|     | vyska (velikost v ose Y)
    +              |OBDELNIK|     v
    +          y - +--------+     -
    +              :
    +              x
         """
    -    # Tady pouzijeme volani OpenGL, ktere je pro nas zatim asi nejjednodussi
    -    # na pouziti
    -    gl.glBegin(gl.GL_TRIANGLE_FAN)   # zacni kreslit spojene trojuhelniky
    -    gl.glVertex2f(int(x1), int(y1))  # vrchol A
    -    gl.glVertex2f(int(x1), int(y2))  # vrchol B
    -    gl.glVertex2f(int(x2), int(y2))  # vrchol C, nakresli trojuhelnik ABC
    -    gl.glVertex2f(int(x2), int(y1))  # vrchol D, nakresli trojuhelnik BCD
    -    # dalsi souradnice E by nakreslila trojuhelnik CDE, atd.
    -    gl.glEnd()  # ukonci kresleni trojuhelniku
    +    obdelnik = pyglet.shapes.Rectangle(x=x, y=y, width=sirka, height=vyska)
    +    obdelnik.draw()
     

    Teď začneme pracovat na funkci vykresli() Nejprve ji vytvoř prázdnou a zaregistruj ji v Pygletu na událost on_draw, jak jsme to @@ -129,8 +128,7 @@

    Konstanty a stav hry
    ...
     def vykresli():
         """Vykresli stav hry"""
    -    gl.glClear(gl.GL_COLOR_BUFFER_BIT)  # smaz obsah okna (vybarvi na cerno)
    -    gl.glColor3f(1, 1, 1)  # nastav barvu kresleni na bilou
    +    window.clear()  # smaz obsah okna (vybarvi na cerno)
     
     window = pyglet.window.Window(width=SIRKA, height=VYSKA)
     window.push_handlers(
    @@ -143,7 +141,8 @@ 

    Konstanty a stav hry vykreslení míčku na správné pozici, kterou získáš z příslušné globální proměnné. Míček je v našem případě jen malý čtvereček jehož velikost -máme uloženou v konstantě.

    +máme uloženou v konstantě. +Pozor na to, že pozice_mice určuje střed míčku, ne roh.

    Řešení

    @@ -152,13 +151,11 @@

    Řešení

    Po míčku zkus vykreslit obě pálky. @@ -174,17 +171,19 @@

    Řešení

    Ukázat řešení

    Přehlednosti hry pomůže půlící čára @@ -194,7 +193,7 @@

    Řešení

    dolů. Chce to jen vygenerovat seznam souřadnic, které budou mít dostatečné rozestupy, a na každé z nich vykreslit obdélníček. Kterou funkci z Pythonu -bys použila na získání tohoto seznamu souřadnic?

    +bys použil/a na získání tohoto seznamu souřadnic?

    Řešení

    @@ -208,9 +207,8 @@

    Řešení

    nakresli_obdelnik( SIRKA // 2 - 1, y, - SIRKA // 2 + 1, - y + DELKA_PULICI_CARKY - ) + 2, + DELKA_PULICI_CARKY)

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. @@ -220,11 +218,7 @@

    Řešení

    skóre. Objekt musíme nejdřív vytvořit. To uděláme kulatými závorkami za jménem objektu, jako bychom volali funkci, a uložíme si ho do proměnné: -napis = Label(). Normálně bychom objekt -vytvořili jen jednou a pak měnili jeho hodnotu, ale -pro jednoduchost vytvoříme vždy nový a celé to zabalíme -do funkce. V jejím závěru musíme na nadpisu zavolat -metodu draw(), jinak se nápis nevykreslí.

    +napis = Label().

    def nakresli_text(text, x, y, pozice_x):
         """Nakresli dany text na danou pozici
     
    @@ -514,4 +508,6 @@ 

    Odrážení míčku

    Hurá, prokousali jsme se k zdárnému konci Pongu! Máš teď plně funkční interaktivní grafickou -hru zakládající se na reálné předloze. :)

    \ No newline at end of file +hru zakládající se na reálné předloze. :)

    +

    Můžeš si stáhnout celý kód hry +a porovnat ho se svým řešením.

    \ No newline at end of file diff --git a/pyladies/pong/pong.py b/pyladies/pong/pong.py new file mode 100644 index 00000000..f3aeae5c --- /dev/null +++ b/pyladies/pong/pong.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +"""Hra typu Pong + +Graficka hra pro dva hrace. Kazdy hrac ovlada "palku" na sve strane hriste, +a snazi se odpalit micek na protivnikovu stranu. + +Ovladani: +Hrac 1: klavesy W a S +Hrac 2: sipky Nahoru a Dolu +Konec: Esc + + +Hra pouziva gravickou knihovnu Pyglet, coz je Pythonova nadstavba nad OpenGL. + +Souradny system okynka je nasledujici:: + + y ^ + | + VYSKA +---------------------------------------+ + | : | + | : | + | : | + | ; [] | + |] ; [| + |] ; [| + |] ; [| + |] ; [| + | ; | + | : | + | ; | + | ; | + 0 +---------------------------------------+------> x + : : : + 0 SIRKA/2 SIRKA + +Pozor pokud mate zkusenosti s nekterymi grafickymi programy, nebo 2D +knihovnami. OpenGL pouziva matematicky souradny system, nula je vlevo *dole*. + +""" + +# Prvni radek (#!/usr/bin/env python3) je takzvany "shebang": na systemech +# zalozenych na Unixu (Linux, macOS) umoznuje spustit tenhle soubor jednoduse +# pomoci prikazu: ./pong.py + +# A ted uz k samotne hre: napred naimportujeme potrebne veci z knihovny pyglet + +import random + +import pyglet +from pyglet import gl +from pyglet.window import key + + +# Nejake konstanty: + +# Velikost okna (v pixelech) +SIRKA = 900 +VYSKA = 600 + +VELIKOST_MICE = 20 +TLOUSTKA_PALKY = 10 +DELKA_PALKY = 100 +RYCHLOST = 200 # v pixelech za sekundu +RYCHLOST_PALKY = RYCHLOST * 1.5 # taky v pixelech za sekundu + +DELKA_PULICI_CARKY = 20 +VELIKOST_FONTU = 42 +ODSAZENI_TEXTU = 30 + + +# Stav hry si budeme pamatovat v globalnich promennych. +# Profesionalni programator se nad tim zhrozi, ale pro nas je to tak zatim +# jednodussi. +# Jen nezapomente ze prikaz jako: +# pozice_mice = [0, 0] +# ve funkci by vytvoril novou lokalni promennou, ktera by s globalni +# `pozice_mice` nemela nic spolecneho. Oproti tomu prikaz jako: +# pozice_mice[0] = 0 +# nastavi prvni prvek globalni `pozice_mice`. + +pozice_palek = [VYSKA // 2, VYSKA // 2] # vertikalni pozice dvou palek +pozice_mice = [0, 0] # x, y souradnice micku -- nastavene v reset() +rychlost_mice = [0, 0] # x, y slozky rychlosti micku -- nastavene v reset() +stisknute_klavesy = set() # sada stisknutych klaves +skore = [0, 0] # skore dvou hracu + +# Pozice palek a micku vzdy bude urcovat stred daneho obdelnicku. + + +def reset(): + """Nastav pocatecni stav + + Tahle funkce se bude volat na zacatku programu, a taky potom co nektery + z hracu prohraje. + Funkce da micek doprostred obrazovky a da mu nahodnou rychlost. + + N.B. Neresetujeme tady skore ani pozici palek; ty zustavaji do dalsiho kola + """ + pozice_mice[0] = SIRKA // 2 + pozice_mice[1] = VYSKA // 2 + + # x-ova rychlost - bud vpravo, nebo vlevo + if random.randint(0, 1): + rychlost_mice[0] = RYCHLOST + else: + rychlost_mice[0] = -RYCHLOST + # y-ova rychlost - uplne nahodna + rychlost_mice[1] = random.uniform(-1, 1) * RYCHLOST + + +def obnov_stav(dt): + """Spocitej novy stav hry + + Tahle funkce se vola mockrat za sekundu. V parametru ``dt`` dostane cas + v sekundach od posledniho zavolani. Pocitac je rychly, proto to + vetsinou bude velice male cislo - kolem sedesatiny sekundy (0.0167). + """ + # Jak zname z fyziky, micek s rychlosti `v` se za cas `t` pohne o `v*t`. + # Tenhle vyraz muzeme rozlozit pro slozky x, y. + pozice_mice[0] += rychlost_mice[0] * dt + pozice_mice[1] += rychlost_mice[1] * dt + + # odraz od spodni hrany + # Kdyz je micek prilis "nizko", odrazi se, a zacne se pohybovat nahoru. + # To znamena ze bude mit kladnou y-ovou slozku rychlosti. + # x-ova slozka (vpravo/vlevo) se nezmeni. + if pozice_mice[1] < VELIKOST_MICE // 2: + rychlost_mice[1] = abs(rychlost_mice[1]) + + # odraz od vrchni hrany + # To same, ale micek je moc vysoko a musi se zacit pohybovat dolu. + if pozice_mice[1] > VYSKA - VELIKOST_MICE // 2: + rychlost_mice[1] = -abs(rychlost_mice[1]) + + # pohyb palek - cyklus se projde dvkrat; jednou pro kazdou palku + for cislo_palky in (0, 1): + # pohyb podle klaves (viz funkce `stisk_klavesy`) + if ('nahoru', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] += RYCHLOST_PALKY * dt + if ('dolu', cislo_palky) in stisknute_klavesy: + pozice_palek[cislo_palky] -= RYCHLOST_PALKY * dt + + # dolni zarazka - kdyz je palka prilis dole, nastavime ji na minimum + if pozice_palek[cislo_palky] < DELKA_PALKY / 2: + pozice_palek[cislo_palky] = DELKA_PALKY / 2 + # horni zarazka - kdyz je palka prilis nahore, nastavime ji na maximum + if pozice_palek[cislo_palky] > VYSKA - DELKA_PALKY / 2: + pozice_palek[cislo_palky] = VYSKA - DELKA_PALKY / 2 + + # odrazeni micku + # Pokud je micek prilis vlevo, muze se budto odrazit od leve palky, anebo + # tam palka neni a levy hrac prohral. Podobne pro pravou stranu. + # Doporucuju si to nakreslit na papir :) + + # nejdriv si poznamename minimalni a maximalni pozici, kde musi byt palka + # (t.j. stred palky), aby odrazila micek. + palka_min = pozice_mice[1] - VELIKOST_MICE/2 - DELKA_PALKY/2 + palka_max = pozice_mice[1] + VELIKOST_MICE/2 + DELKA_PALKY/2 + + # odrazeni vlevo + if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2: + if palka_min < pozice_palek[0] < palka_max: + # palka je na spravnem miste, odrazime micek + rychlost_mice[0] = abs(rychlost_mice[0]) + else: + # palka je jinde nez ma byt, hrac prohral + skore[1] += 1 + reset() + + # odrazeni vpravo + if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2): + if palka_min < pozice_palek[1] < palka_max: + rychlost_mice[0] = -abs(rychlost_mice[0]) + else: + skore[0] += 1 + reset() + + +def nakresli_obdelnik(x, y, sirka, vyska): + """Nakresli obdelnik na danych souradnicich + + Nazorny diagram:: + + sirka (velikost v ose X) + |<------>| + + +--------+ - + |KRESLIME| ^ + |*TENHLE*| | vyska (velikost v ose Y) + |OBDELNIK| v + y - +--------+ - + : + x + """ + obdelnik = pyglet.shapes.Rectangle(x=x, y=y, width=sirka, height=vyska) + obdelnik.draw() + + +def nakresli_text(text, x, y, pozice_x): + """Nakresli dany text na danou pozici + + Argument ``pozice_x`` muse byt "left" nebo "right", udava na kterou stranu + bude text zarovnany + """ + # Texty umi vypisovat Pyglet, a to tak, ze vytvorime objekt "napis" + # a pak ho nakreslime. + # (Normalne bychom tenhle objekt udelali jednou, a pak v nem jen menili + # text a vykreslovali ho, ale pro jednoduchost si ho vytvorime tady:) + napis = pyglet.text.Label( + text, + font_name='League Gothic', + font_size=VELIKOST_FONTU, + x=x, y=y, anchor_x=pozice_x) + napis.draw() + + +def vykresli(): + """Vykresli stav hry""" + window.clear() # smaz obsah okna (vybarvi na cerno) + + # micek + nakresli_obdelnik( + pozice_mice[0] - VELIKOST_MICE // 2, + pozice_mice[1] - VELIKOST_MICE // 2, + VELIKOST_MICE, + VELIKOST_MICE) + + # palky - udelame si seznam souradnic palek, a pro kazdou dvojici souradnic + # v tom seznamu palku vykreslime + for x, y in [(0, pozice_palek[0]), (SIRKA, pozice_palek[1])] : + nakresli_obdelnik( + x - TLOUSTKA_PALKY, + y - DELKA_PALKY // 2, + TLOUSTKA_PALKY * 2, + DELKA_PALKY) + + # prerusovana pulici cara - slozena ze spousty malych obdelnicku + for y in range(DELKA_PULICI_CARKY // 2, VYSKA, DELKA_PULICI_CARKY * 2): + nakresli_obdelnik( + SIRKA // 2 - 1, + y, + 2, + DELKA_PULICI_CARKY) + + # A nakonec vypiseme skore obou hracu + nakresli_text(str(skore[0]), + x=ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='left') + + nakresli_text(str(skore[1]), + x=SIRKA - ODSAZENI_TEXTU, + y=VYSKA - ODSAZENI_TEXTU - VELIKOST_FONTU, + pozice_x='right') + + +def stisk_klavesy(symbol, modifikatory): + """Osetri stisknuti klavesy + + Kdyz hrac stiskne spravnou klavesu, do mnoziny ``stisknute_klavesy`` se + prida dvojice (n-tice) tvaru (smer, cislo palky). + Program pak muze pohybovat palkou podle toho, co je v mnozine. + """ + if symbol == key.W: + stisknute_klavesy.add(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.add(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.add(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.add(('dolu', 1)) + # N.B. klavesu ESC Pyglet osetri sam: zavre okno a ukonci funkci run() + + +def pusteni_klavesy(symbol, modifikatory): + """Osetri pusteni klavesy + + Opak funkce ``stisk_klavesy`` -- podle argumentu vynda prislusnou + dvojici z mnoziny. + """ + # Vsimnete si pouziti funkce ``discard``: na rozdil od ``remove`` + # nezpusobi chybu, kdyz prvek v mnozine neni. Takze program nespadne, + # kdyz napr. uzivatel zmackne klavesu, pak se prepne do naseho okna, + # a pak teprve klavesu pusti. + if symbol == key.W: + stisknute_klavesy.discard(('nahoru', 0)) + if symbol == key.S: + stisknute_klavesy.discard(('dolu', 0)) + if symbol == key.UP: + stisknute_klavesy.discard(('nahoru', 1)) + if symbol == key.DOWN: + stisknute_klavesy.discard(('dolu', 1)) + # Mimochodem, funkce pusteni_klavesy a stisk_klavesy by se daly hodne + # zjednodusit pomoci slovniku. Zkusite to? + +# Nastavime prvotni stav +reset() + +# Vytvorime okno, do ktereho budeme kreslit +window = pyglet.window.Window(width=SIRKA, height=VYSKA) + +# Oknu priradime par funkci, ktere budou reagovat na udalosti. +# Kdyz napr. uzivatel zmackne klavesu na klavesnici, +# Pyglet zavola funkci, kterou tady zaregistrujeme pod `on_key_press`, +# a preda ji prislusne argumenty. +# Jake vsechny udalosti muzou nastat, a jake argumenty se predaji prislusne +# funkci, se doctete v dokumentaci Pygletu, +# nebo pomoci `help(pyglet.window.event)`. +window.push_handlers( + on_draw=vykresli, # na vykresleni okna pouzij funkci `vykresli` + on_key_press=stisk_klavesy, # po stisknuti klavesy zavolej `stisk_klavesy` + on_key_release=pusteni_klavesy, # a mame i funkci na pusteni klavesy + ) + +# Jeste mame jednu podobnou funkci, kterou ale neprirazujeme primo +# oknu. Misto toho chceme aby ji Pyglet zavolal vzdycky kdyz "tiknou hodiny" +pyglet.clock.schedule(obnov_stav) + +pyglet.app.run() # vse je nastaveno, at zacne hra +# (funkce run() bude porad dokola volat obnov_stav, vykresli, a kdyz se mezitim +# neco stane, zavola navic funkci kterou jsme nastavili jako reakci na +# danou udalost) From 290caa03d6fd6e690efab61a52a4e8bfa2b385cd Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Thu, 31 Aug 2023 17:56:48 +0000 Subject: [PATCH 18/31] Compiled --- lessons/course.json | 4 +- lessons/venv-setup/dirs-00.png | Bin 0 -> 20219 bytes lessons/venv-setup/dirs.png | Bin 3429 -> 0 bytes lessons/venv-setup/index.html | 80 ++++++++++++++++++++------------ meta/course.json | 4 +- meta/venv-setup/dirs-00.png | Bin 0 -> 20219 bytes meta/venv-setup/dirs.png | Bin 3429 -> 0 bytes meta/venv-setup/index.html | 80 ++++++++++++++++++++------------ pyladies/course.json | 4 +- pyladies/venv-setup/dirs-00.png | Bin 0 -> 20219 bytes pyladies/venv-setup/dirs.png | Bin 3429 -> 0 bytes pyladies/venv-setup/index.html | 80 ++++++++++++++++++++------------ 12 files changed, 156 insertions(+), 96 deletions(-) create mode 100644 lessons/venv-setup/dirs-00.png delete mode 100644 lessons/venv-setup/dirs.png create mode 100644 meta/venv-setup/dirs-00.png delete mode 100644 meta/venv-setup/dirs.png create mode 100644 pyladies/venv-setup/dirs-00.png delete mode 100644 pyladies/venv-setup/dirs.png diff --git a/lessons/course.json b/lessons/course.json index 8f1caaa2..662cb543 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -1110,8 +1110,8 @@ }, "source_file": "lessons/beginners/venv-setup/info.yml", "static_files": { - "dirs.png": { - "path": "venv-setup/dirs.png" + "dirs-00.png": { + "path": "venv-setup/dirs-00.png" } }, "title": "Nastavení prostředí" diff --git a/lessons/venv-setup/dirs-00.png b/lessons/venv-setup/dirs-00.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3ed3219a7ece820aa769a2b46c92d9bacfe568 GIT binary patch literal 20219 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

    AHc60>H4GeHWMn-~;^F;NUd$m!9 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 IZ{d^pe`4bdbpQYW literal 0 HcmV?d00001 diff --git a/lessons/venv-setup/dirs.png b/lessons/venv-setup/dirs.png deleted file mode 100644 index 5126a1ec959266b389419bb4812e0a96dde02713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3429 zcmai1X*3&JyN*vwYiK^yRLY@62ScftTj#4dsJUuZw9%kM)I3Cj9Mp+fQ4}3g+Cxn# zH795dMbhHXQjIZYLI{!Rrgze0;rD8 zj>$D`L`OxrcCl=~ zUawVh^YbC3>OcQ%Tz*wmH9fXGTzvJJWZ30qjd6JtmwjMmWAmX=J!<=ht-U?a-QE4R ztLyZTi>qsXK>^6mQ&?DdbJEMrEx`UD#)N;ua5T`2yOfugM`g0KP-1VGkc@CsM zOY{Wt#*O4_T1rYuRTapR;;a6nU%vb&A%QJZ%AP~Rg<#O0E zkWd48uP#LFS2U?Day=j*fFNV$?k>wKl%u0K3b8Dx$UG#ZHc$5Q9EnJzBnc|Wh_ku{ z6ZiHa!otG(zODhC79cARjLp7dFGjHUN9wCF7z|{j1Y}dJbG(AopDv-6s-B;hcLM@> z$*!cubz-sDukdk2SRy}S<}z<*#c>Dk$88XB3r?0ggK#`%-x512blwpV*pW=&0v5~;4Xwy#mW(zX;T z$QpfRZL;^-jK0g0!+8}I(b%n5)FO6RUPSDDvEcU*5kEIq zVG^rT?eg}F-k}nYj7171Z1PTY=5vZ#Fjc$Lt358ohv@O4sg`=Jf3nVJnL5|&)fp#Q zHD(2cQbh5!8ymqaBt9YZN?%So_y7u<={mZn>z}9XlE$?C8RmkI; zCt{wgm1`Mr=(M78VkEJY12qKaQ(=(vY!; zgH7uJyix3Zxj1iY>!BR@KBKgppsimT>dI(JprM9Y`*=YGMK(BoTY$kvD#R{|ol-C{ zm|xyXNlB^k?(`@NS@0UpSd?Habv|2X!q4(9%Yw_UshcbLJO0Duwe~M(OurkVm}Jui z)O-Ah@nKMx%oJxL5fu0*-Rt!J-d;{==}?gm(#p)NHz(`5;~~5_P!=>LValJ@+wJO; z0P>4NAXraoNjb))eN+j@Lv!#5$I}KK^M?(A8bq}d12N6PbJAidKH$?xv7he09sIZ7 z;$itrN?k+a9_z{&x$*^Ub{yjj2jXfTeSZ$(iXanq_@ngG+-o+kp4u_aYN1p=Ht(~> zalf!6-?&_B76sOO%_c|ufPQ@K1GLO5&YKn6OLa5a5N4MekL$Das;?1*|9eF#Z;gOB}RAc zUSsKIRcx(a4lvrh8`zbs6~+ug0w_4fM_di-(4_hf8VXYMTT;lLv2eKZ%$ds9(SrU6 zfSG>&bRdt~2W@!jYcfO^*{QGMiKB}pq3w5DOm~S&3&*2`^ z{--yS-Yyxt*%(Wr4rz(#o+!OgKSyo>wxJ1eXV&*KX^K42fcvw|Z!I8UC3<+GOFTUj ziXud~aQlTk4iJQ$&)6X{&GwT>9^Vw_20CGKmA3K2tiDxIm!?3Ozl(Ba=730c_GqVl zc_R>df6d@@dP9k#FJ+;FxRU9@9PFr+EO1W0kBV80Ou~-ISsHeBF9H#J?-d-a zFd3y#)ay2&1dD)>d^gZ?67>ry_ZZ&wo3v~+2z9I*7zN1asx8TMD@?iX?pJu2TKqou z%;x1>nKz7cqSrg`Hv07Tsm;FDmI;4+yj1AKBH6;KGR661n@^gh`d_T)KOYXglSc)Q z+ja-}en~6B%sDgxLvKa&_|hpsTInCWai)2**+>Aj>FL58;|-l#Mw6m`jIE<*SO)7e zdj-jR90>@4wQf<+JkSzIPpjV1j%X@V3K>1!#yP6I>FI|UXZgnPqbCZB_WrWOAD}!* zF7hcPJ{{;Y7)5+Lvgzv7o*cbj(TT=jpz?+}z&HE;|@|7Rurz2N>y sgMUBs|2)0*<#BY$m-qf%9K%sG+Q92P(!@h~UnGE)xgEInhHvtJ0dght%>V!Z diff --git a/lessons/venv-setup/index.html b/lessons/venv-setup/index.html index 248028b6..718d9497 100644 --- a/lessons/venv-setup/index.html +++ b/lessons/venv-setup/index.html @@ -1,13 +1,17 @@

    Nastavení prostředí #

    -

    V této sekci si připravíš adresář, do kterého budeš ukládat soubory -k začátečnickým kurzům Pythonu, a aktivuješ si virtuální prostředí.

    +

    V této sekci si:

    +
      +
    • připravíš adresář, do kterého budeš ukládat soubory k začátečnickým kurzům +Pythonu a
    • +
    • aktivuješ virtuální prostředí.
    • +

    Příprava adresáře #

    -

    Programátoři vytváří spoustu souborů, a víc než u mnoha jiných uživatelů -počítače záleží na tom, kde jsou ty soubory uložené.

    +

    Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů +počítače jim záleží na tom, kde jsou ty soubory uložené.

    Níže uvedený postup zdaleka není jediná možnost, jak si organizovat soubory. Když ale použiješ tenhle ozkoušený způsob, může to hodně zjednodušit život těm, kteří ti budou pomáhat @@ -20,8 +24,10 @@

    Příprava adresáře

    Kdybys někdy adresář přece jen přesunul/a jinam, přestane fungovat virtuální prostředí, které za chvíli vytvoříme. Musel/a bys ho smazat a vytvořit nové.

    -

    Po vytvoření adresáře si poznamenej, kde přesně je. -Budeš ho potřebovat na celý zbytek kurzu i na případné navazující kurzy.

    +

    Tenhle adresář budeš potřebovat na celý zbytek kurzu i na případné +navazující kurzy. +Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak +můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

    Adresář pro každou lekci #

    @@ -30,16 +36,16 @@

    Adresář pro každou lekci mít obsah zorganizovaný.

    Pro začátek si budeme tvořit nový podadresář pro každou lekci tohoto kurzu. Aby byly tyhle adresáře hezky seřazené, budeme je číslovat: -tahle první lekce bude mít číslo 01, -příště si vytvoříš adresář 02 a tak dále.

    +tahle první lekce bude mít číslo 00, +příště si vytvoříš adresář 01 a tak dále.

    Všechny budou v tvém novém adresáři, který jsi vytvořil/a před chvilkou.

    -

    Adresář 01 si vytvoř už teď. +

    Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

    Přepnutí #

    Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, -ve kterém jsi právě vytvořila 01 (t.j. ne přímo do 01). +ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

    $ cd naucse-python
     

    Pak zkontroluj, že jsi na správném místě:

    @@ -47,7 +53,7 @@

    Přepnutí
  • Pomocí příkazu pwd (na Windows cd) zkontroluj, že opravdu jsi v nově vytvořeném adresáři.
  • Pomocí příkazu ls (na Windows dir) zkontroluj, -že v něm je podadresář 01.
  • +že v něm je podadresář 00.

  • Například:

    @@ -55,57 +61,66 @@

    Unix (Linux, macOS)

    /home/helena/naucse-python
     
     $ ls
    -01
    +00
     

    Windows

    > cd
     C:\Users\Helena\naucse-python
     
     > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     

    Virtuální prostředí #

    -

    Teď nainstalujeme virtuální prostředí pro Python.

    -

    Virtuální prostředí je něco, co nám zajistí, že se všechny počítače budou +

    Teď si vytvoříš virtuální prostředí pro Python.

    +

    Virtuální prostředí je něco, co zajistí že se všechny počítače budou chovat zhruba stejně. -Až ho zprovozníme, nebudeme potřebovat instrukce zvlášť pro Linux, +Až ho zprovozníme, nebudu už potřebovat instrukce zvlášť pro Linux, zvlášť pro Windows a zvlášť pro macOS.

    -

    V budoucnu využijeme druhou výhodu: každé virtuální prostředí je oddělené od -ostatních, takže když doinstalujeme nějakou knihovnu (rozšíření pro Python), +

    V budoucnu využiješ i druhou výhodu: každé virtuální prostředí je oddělené od +ostatních, takže když doinstaluješ nějakou knihovnu (rozšíření pro Python), projeví se to jen v jednom virtuálním prostředí. -Pokud by se při práci na projektu něco pokazilo, neohrozí to další projekty -ve tvém počítači.

    +Kdyby se pak při práci na projektu něco pokazilo, neohrozí to další +projekty ve tvém počítači.

    Jak na to? Na každém systému jinak!

      -
    • normální Linux (pokud jsi přeskočil/a instalaci Virtualenv):

      +
    • Linux:

      +

      Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

       $ python3 -m venv venv
      -
    • -
    • starší Linux (pokud jsi musel/a instalovat Virtualenv):

      +

    A jestli dostaneš chybu No module named venv, zkus místo toho:

     $ virtualenv -p python3 venv
     
  • macOS:

     $ python3 -m venv venv
     
  • Windows:

    +

    Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

     > py -3 -m venv venv
    +

    A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

    +
     > python3 -m venv venv
     
  • Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. Můžeš se podívat dovnitř, ale neukládej tam své soubory a nikdy tam nic neměň!

    -

    Zkontroluj si, že 01 a venv jsou pěkně vedle sebe:

    +

    Zkontroluj si, že 00 a venv jsou pěkně vedle sebe:

    Unix

    $ ls
    -01
    +00
     venv
     

    Windows

    > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     05/08/2014 07:38 PM <DIR>  venv
     

    V grafickém prohlížeči souborů to vypadá např. takto:

    -

    (adresáře '01' a 'venv' vedle sebe)

    +

    (adresáře '00' a 'venv' vedle sebe)

    Aktivace virtuálního prostředí #

    @@ -114,9 +129,14 @@

    Aktivace virtuálního prostředí

    Unix

    $ source venv/bin/activate
     

    Windows

    > venv\Scripts\activate
    +

    Jestli používáš příkazovou řádku ve Visual Studio Code, +je příkaz pro Windows složitější:

    +
    > &powershell -ExecutionPolicy bypass
    +> venv/Scripts/Activate.ps1
     

    Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

    -

    Aktivační příkaz si zapiš. -Bude potřeba ho zadat vždycky, když pustíš příkazovou řádku, -ve které budeš zkoušet své programy.

    \ No newline at end of file +

    Aktivační příkaz si zapiš.

    +

    Vždycky, když pustíš příkazovou řádku ve které budeš zkoušet své programy, +budeš muset pomocí cd přepnout do naucse-python a zadat tento +aktivační příkaz.

    \ No newline at end of file diff --git a/meta/course.json b/meta/course.json index 3076768e..f127c260 100644 --- a/meta/course.json +++ b/meta/course.json @@ -147,8 +147,8 @@ }, "source_file": "lessons/beginners/venv-setup/info.yml", "static_files": { - "dirs.png": { - "path": "venv-setup/dirs.png" + "dirs-00.png": { + "path": "venv-setup/dirs-00.png" } }, "title": "Nastavení prostředí" diff --git a/meta/venv-setup/dirs-00.png b/meta/venv-setup/dirs-00.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3ed3219a7ece820aa769a2b46c92d9bacfe568 GIT binary patch literal 20219 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

    AHc60>H4GeHWMn-~;^F;NUd$m!9 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 IZ{d^pe`4bdbpQYW literal 0 HcmV?d00001 diff --git a/meta/venv-setup/dirs.png b/meta/venv-setup/dirs.png deleted file mode 100644 index 5126a1ec959266b389419bb4812e0a96dde02713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3429 zcmai1X*3&JyN*vwYiK^yRLY@62ScftTj#4dsJUuZw9%kM)I3Cj9Mp+fQ4}3g+Cxn# zH795dMbhHXQjIZYLI{!Rrgze0;rD8 zj>$D`L`OxrcCl=~ zUawVh^YbC3>OcQ%Tz*wmH9fXGTzvJJWZ30qjd6JtmwjMmWAmX=J!<=ht-U?a-QE4R ztLyZTi>qsXK>^6mQ&?DdbJEMrEx`UD#)N;ua5T`2yOfugM`g0KP-1VGkc@CsM zOY{Wt#*O4_T1rYuRTapR;;a6nU%vb&A%QJZ%AP~Rg<#O0E zkWd48uP#LFS2U?Day=j*fFNV$?k>wKl%u0K3b8Dx$UG#ZHc$5Q9EnJzBnc|Wh_ku{ z6ZiHa!otG(zODhC79cARjLp7dFGjHUN9wCF7z|{j1Y}dJbG(AopDv-6s-B;hcLM@> z$*!cubz-sDukdk2SRy}S<}z<*#c>Dk$88XB3r?0ggK#`%-x512blwpV*pW=&0v5~;4Xwy#mW(zX;T z$QpfRZL;^-jK0g0!+8}I(b%n5)FO6RUPSDDvEcU*5kEIq zVG^rT?eg}F-k}nYj7171Z1PTY=5vZ#Fjc$Lt358ohv@O4sg`=Jf3nVJnL5|&)fp#Q zHD(2cQbh5!8ymqaBt9YZN?%So_y7u<={mZn>z}9XlE$?C8RmkI; zCt{wgm1`Mr=(M78VkEJY12qKaQ(=(vY!; zgH7uJyix3Zxj1iY>!BR@KBKgppsimT>dI(JprM9Y`*=YGMK(BoTY$kvD#R{|ol-C{ zm|xyXNlB^k?(`@NS@0UpSd?Habv|2X!q4(9%Yw_UshcbLJO0Duwe~M(OurkVm}Jui z)O-Ah@nKMx%oJxL5fu0*-Rt!J-d;{==}?gm(#p)NHz(`5;~~5_P!=>LValJ@+wJO; z0P>4NAXraoNjb))eN+j@Lv!#5$I}KK^M?(A8bq}d12N6PbJAidKH$?xv7he09sIZ7 z;$itrN?k+a9_z{&x$*^Ub{yjj2jXfTeSZ$(iXanq_@ngG+-o+kp4u_aYN1p=Ht(~> zalf!6-?&_B76sOO%_c|ufPQ@K1GLO5&YKn6OLa5a5N4MekL$Das;?1*|9eF#Z;gOB}RAc zUSsKIRcx(a4lvrh8`zbs6~+ug0w_4fM_di-(4_hf8VXYMTT;lLv2eKZ%$ds9(SrU6 zfSG>&bRdt~2W@!jYcfO^*{QGMiKB}pq3w5DOm~S&3&*2`^ z{--yS-Yyxt*%(Wr4rz(#o+!OgKSyo>wxJ1eXV&*KX^K42fcvw|Z!I8UC3<+GOFTUj ziXud~aQlTk4iJQ$&)6X{&GwT>9^Vw_20CGKmA3K2tiDxIm!?3Ozl(Ba=730c_GqVl zc_R>df6d@@dP9k#FJ+;FxRU9@9PFr+EO1W0kBV80Ou~-ISsHeBF9H#J?-d-a zFd3y#)ay2&1dD)>d^gZ?67>ry_ZZ&wo3v~+2z9I*7zN1asx8TMD@?iX?pJu2TKqou z%;x1>nKz7cqSrg`Hv07Tsm;FDmI;4+yj1AKBH6;KGR661n@^gh`d_T)KOYXglSc)Q z+ja-}en~6B%sDgxLvKa&_|hpsTInCWai)2**+>Aj>FL58;|-l#Mw6m`jIE<*SO)7e zdj-jR90>@4wQf<+JkSzIPpjV1j%X@V3K>1!#yP6I>FI|UXZgnPqbCZB_WrWOAD}!* zF7hcPJ{{;Y7)5+Lvgzv7o*cbj(TT=jpz?+}z&HE;|@|7Rurz2N>y sgMUBs|2)0*<#BY$m-qf%9K%sG+Q92P(!@h~UnGE)xgEInhHvtJ0dght%>V!Z diff --git a/meta/venv-setup/index.html b/meta/venv-setup/index.html index 248028b6..718d9497 100644 --- a/meta/venv-setup/index.html +++ b/meta/venv-setup/index.html @@ -1,13 +1,17 @@

    Nastavení prostředí #

    -

    V této sekci si připravíš adresář, do kterého budeš ukládat soubory -k začátečnickým kurzům Pythonu, a aktivuješ si virtuální prostředí.

    +

    V této sekci si:

    +
      +
    • připravíš adresář, do kterého budeš ukládat soubory k začátečnickým kurzům +Pythonu a
    • +
    • aktivuješ virtuální prostředí.
    • +

    Příprava adresáře #

    -

    Programátoři vytváří spoustu souborů, a víc než u mnoha jiných uživatelů -počítače záleží na tom, kde jsou ty soubory uložené.

    +

    Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů +počítače jim záleží na tom, kde jsou ty soubory uložené.

    Níže uvedený postup zdaleka není jediná možnost, jak si organizovat soubory. Když ale použiješ tenhle ozkoušený způsob, může to hodně zjednodušit život těm, kteří ti budou pomáhat @@ -20,8 +24,10 @@

    Příprava adresáře

    Kdybys někdy adresář přece jen přesunul/a jinam, přestane fungovat virtuální prostředí, které za chvíli vytvoříme. Musel/a bys ho smazat a vytvořit nové.

    -

    Po vytvoření adresáře si poznamenej, kde přesně je. -Budeš ho potřebovat na celý zbytek kurzu i na případné navazující kurzy.

    +

    Tenhle adresář budeš potřebovat na celý zbytek kurzu i na případné +navazující kurzy. +Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak +můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

    Adresář pro každou lekci #

    @@ -30,16 +36,16 @@

    Adresář pro každou lekci mít obsah zorganizovaný.

    Pro začátek si budeme tvořit nový podadresář pro každou lekci tohoto kurzu. Aby byly tyhle adresáře hezky seřazené, budeme je číslovat: -tahle první lekce bude mít číslo 01, -příště si vytvoříš adresář 02 a tak dále.

    +tahle první lekce bude mít číslo 00, +příště si vytvoříš adresář 01 a tak dále.

    Všechny budou v tvém novém adresáři, který jsi vytvořil/a před chvilkou.

    -

    Adresář 01 si vytvoř už teď. +

    Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

    Přepnutí #

    Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, -ve kterém jsi právě vytvořila 01 (t.j. ne přímo do 01). +ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

    $ cd naucse-python
     

    Pak zkontroluj, že jsi na správném místě:

    @@ -47,7 +53,7 @@

    Přepnutí
  • Pomocí příkazu pwd (na Windows cd) zkontroluj, že opravdu jsi v nově vytvořeném adresáři.
  • Pomocí příkazu ls (na Windows dir) zkontroluj, -že v něm je podadresář 01.
  • +že v něm je podadresář 00.

    Například:

    @@ -55,57 +61,66 @@

    Unix (Linux, macOS)

    /home/helena/naucse-python
     
     $ ls
    -01
    +00
     

    Windows

    > cd
     C:\Users\Helena\naucse-python
     
     > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     

    Virtuální prostředí #

    -

    Teď nainstalujeme virtuální prostředí pro Python.

    -

    Virtuální prostředí je něco, co nám zajistí, že se všechny počítače budou +

    Teď si vytvoříš virtuální prostředí pro Python.

    +

    Virtuální prostředí je něco, co zajistí že se všechny počítače budou chovat zhruba stejně. -Až ho zprovozníme, nebudeme potřebovat instrukce zvlášť pro Linux, +Až ho zprovozníme, nebudu už potřebovat instrukce zvlášť pro Linux, zvlášť pro Windows a zvlášť pro macOS.

    -

    V budoucnu využijeme druhou výhodu: každé virtuální prostředí je oddělené od -ostatních, takže když doinstalujeme nějakou knihovnu (rozšíření pro Python), +

    V budoucnu využiješ i druhou výhodu: každé virtuální prostředí je oddělené od +ostatních, takže když doinstaluješ nějakou knihovnu (rozšíření pro Python), projeví se to jen v jednom virtuálním prostředí. -Pokud by se při práci na projektu něco pokazilo, neohrozí to další projekty -ve tvém počítači.

    +Kdyby se pak při práci na projektu něco pokazilo, neohrozí to další +projekty ve tvém počítači.

    Jak na to? Na každém systému jinak!

      -
    • normální Linux (pokud jsi přeskočil/a instalaci Virtualenv):

      +
    • Linux:

      +

      Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

       $ python3 -m venv venv
      -
    • -
    • starší Linux (pokud jsi musel/a instalovat Virtualenv):

      +

    A jestli dostaneš chybu No module named venv, zkus místo toho:

     $ virtualenv -p python3 venv
     
  • macOS:

     $ python3 -m venv venv
     
  • Windows:

    +

    Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

     > py -3 -m venv venv
    +

    A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

    +
     > python3 -m venv venv
     
  • Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. Můžeš se podívat dovnitř, ale neukládej tam své soubory a nikdy tam nic neměň!

    -

    Zkontroluj si, že 01 a venv jsou pěkně vedle sebe:

    +

    Zkontroluj si, že 00 a venv jsou pěkně vedle sebe:

    Unix

    $ ls
    -01
    +00
     venv
     

    Windows

    > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     05/08/2014 07:38 PM <DIR>  venv
     

    V grafickém prohlížeči souborů to vypadá např. takto:

    -

    (adresáře '01' a 'venv' vedle sebe)

    +

    (adresáře '00' a 'venv' vedle sebe)

    Aktivace virtuálního prostředí #

    @@ -114,9 +129,14 @@

    Aktivace virtuálního prostředí

    Unix

    $ source venv/bin/activate
     

    Windows

    > venv\Scripts\activate
    +

    Jestli používáš příkazovou řádku ve Visual Studio Code, +je příkaz pro Windows složitější:

    +
    > &powershell -ExecutionPolicy bypass
    +> venv/Scripts/Activate.ps1
     

    Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

    -

    Aktivační příkaz si zapiš. -Bude potřeba ho zadat vždycky, když pustíš příkazovou řádku, -ve které budeš zkoušet své programy.

    \ No newline at end of file +

    Aktivační příkaz si zapiš.

    +

    Vždycky, když pustíš příkazovou řádku ve které budeš zkoušet své programy, +budeš muset pomocí cd přepnout do naucse-python a zadat tento +aktivační příkaz.

    \ No newline at end of file diff --git a/pyladies/course.json b/pyladies/course.json index a82a3420..70fe9c9b 100644 --- a/pyladies/course.json +++ b/pyladies/course.json @@ -1083,8 +1083,8 @@ }, "source_file": "lessons/beginners/venv-setup/info.yml", "static_files": { - "dirs.png": { - "path": "venv-setup/dirs.png" + "dirs-00.png": { + "path": "venv-setup/dirs-00.png" } }, "title": "Nastavení prostředí" diff --git a/pyladies/venv-setup/dirs-00.png b/pyladies/venv-setup/dirs-00.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3ed3219a7ece820aa769a2b46c92d9bacfe568 GIT binary patch literal 20219 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

    AHc60>H4GeHWMn-~;^F;NUd$m!9 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 IZ{d^pe`4bdbpQYW literal 0 HcmV?d00001 diff --git a/pyladies/venv-setup/dirs.png b/pyladies/venv-setup/dirs.png deleted file mode 100644 index 5126a1ec959266b389419bb4812e0a96dde02713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3429 zcmai1X*3&JyN*vwYiK^yRLY@62ScftTj#4dsJUuZw9%kM)I3Cj9Mp+fQ4}3g+Cxn# zH795dMbhHXQjIZYLI{!Rrgze0;rD8 zj>$D`L`OxrcCl=~ zUawVh^YbC3>OcQ%Tz*wmH9fXGTzvJJWZ30qjd6JtmwjMmWAmX=J!<=ht-U?a-QE4R ztLyZTi>qsXK>^6mQ&?DdbJEMrEx`UD#)N;ua5T`2yOfugM`g0KP-1VGkc@CsM zOY{Wt#*O4_T1rYuRTapR;;a6nU%vb&A%QJZ%AP~Rg<#O0E zkWd48uP#LFS2U?Day=j*fFNV$?k>wKl%u0K3b8Dx$UG#ZHc$5Q9EnJzBnc|Wh_ku{ z6ZiHa!otG(zODhC79cARjLp7dFGjHUN9wCF7z|{j1Y}dJbG(AopDv-6s-B;hcLM@> z$*!cubz-sDukdk2SRy}S<}z<*#c>Dk$88XB3r?0ggK#`%-x512blwpV*pW=&0v5~;4Xwy#mW(zX;T z$QpfRZL;^-jK0g0!+8}I(b%n5)FO6RUPSDDvEcU*5kEIq zVG^rT?eg}F-k}nYj7171Z1PTY=5vZ#Fjc$Lt358ohv@O4sg`=Jf3nVJnL5|&)fp#Q zHD(2cQbh5!8ymqaBt9YZN?%So_y7u<={mZn>z}9XlE$?C8RmkI; zCt{wgm1`Mr=(M78VkEJY12qKaQ(=(vY!; zgH7uJyix3Zxj1iY>!BR@KBKgppsimT>dI(JprM9Y`*=YGMK(BoTY$kvD#R{|ol-C{ zm|xyXNlB^k?(`@NS@0UpSd?Habv|2X!q4(9%Yw_UshcbLJO0Duwe~M(OurkVm}Jui z)O-Ah@nKMx%oJxL5fu0*-Rt!J-d;{==}?gm(#p)NHz(`5;~~5_P!=>LValJ@+wJO; z0P>4NAXraoNjb))eN+j@Lv!#5$I}KK^M?(A8bq}d12N6PbJAidKH$?xv7he09sIZ7 z;$itrN?k+a9_z{&x$*^Ub{yjj2jXfTeSZ$(iXanq_@ngG+-o+kp4u_aYN1p=Ht(~> zalf!6-?&_B76sOO%_c|ufPQ@K1GLO5&YKn6OLa5a5N4MekL$Das;?1*|9eF#Z;gOB}RAc zUSsKIRcx(a4lvrh8`zbs6~+ug0w_4fM_di-(4_hf8VXYMTT;lLv2eKZ%$ds9(SrU6 zfSG>&bRdt~2W@!jYcfO^*{QGMiKB}pq3w5DOm~S&3&*2`^ z{--yS-Yyxt*%(Wr4rz(#o+!OgKSyo>wxJ1eXV&*KX^K42fcvw|Z!I8UC3<+GOFTUj ziXud~aQlTk4iJQ$&)6X{&GwT>9^Vw_20CGKmA3K2tiDxIm!?3Ozl(Ba=730c_GqVl zc_R>df6d@@dP9k#FJ+;FxRU9@9PFr+EO1W0kBV80Ou~-ISsHeBF9H#J?-d-a zFd3y#)ay2&1dD)>d^gZ?67>ry_ZZ&wo3v~+2z9I*7zN1asx8TMD@?iX?pJu2TKqou z%;x1>nKz7cqSrg`Hv07Tsm;FDmI;4+yj1AKBH6;KGR661n@^gh`d_T)KOYXglSc)Q z+ja-}en~6B%sDgxLvKa&_|hpsTInCWai)2**+>Aj>FL58;|-l#Mw6m`jIE<*SO)7e zdj-jR90>@4wQf<+JkSzIPpjV1j%X@V3K>1!#yP6I>FI|UXZgnPqbCZB_WrWOAD}!* zF7hcPJ{{;Y7)5+Lvgzv7o*cbj(TT=jpz?+}z&HE;|@|7Rurz2N>y sgMUBs|2)0*<#BY$m-qf%9K%sG+Q92P(!@h~UnGE)xgEInhHvtJ0dght%>V!Z diff --git a/pyladies/venv-setup/index.html b/pyladies/venv-setup/index.html index 248028b6..718d9497 100644 --- a/pyladies/venv-setup/index.html +++ b/pyladies/venv-setup/index.html @@ -1,13 +1,17 @@

    Nastavení prostředí #

    -

    V této sekci si připravíš adresář, do kterého budeš ukládat soubory -k začátečnickým kurzům Pythonu, a aktivuješ si virtuální prostředí.

    +

    V této sekci si:

    +
      +
    • připravíš adresář, do kterého budeš ukládat soubory k začátečnickým kurzům +Pythonu a
    • +
    • aktivuješ virtuální prostředí.
    • +

    Příprava adresáře #

    -

    Programátoři vytváří spoustu souborů, a víc než u mnoha jiných uživatelů -počítače záleží na tom, kde jsou ty soubory uložené.

    +

    Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů +počítače jim záleží na tom, kde jsou ty soubory uložené.

    Níže uvedený postup zdaleka není jediná možnost, jak si organizovat soubory. Když ale použiješ tenhle ozkoušený způsob, může to hodně zjednodušit život těm, kteří ti budou pomáhat @@ -20,8 +24,10 @@

    Příprava adresáře

    Kdybys někdy adresář přece jen přesunul/a jinam, přestane fungovat virtuální prostředí, které za chvíli vytvoříme. Musel/a bys ho smazat a vytvořit nové.

    -

    Po vytvoření adresáře si poznamenej, kde přesně je. -Budeš ho potřebovat na celý zbytek kurzu i na případné navazující kurzy.

    +

    Tenhle adresář budeš potřebovat na celý zbytek kurzu i na případné +navazující kurzy. +Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak +můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

    Adresář pro každou lekci #

    @@ -30,16 +36,16 @@

    Adresář pro každou lekci mít obsah zorganizovaný.

    Pro začátek si budeme tvořit nový podadresář pro každou lekci tohoto kurzu. Aby byly tyhle adresáře hezky seřazené, budeme je číslovat: -tahle první lekce bude mít číslo 01, -příště si vytvoříš adresář 02 a tak dále.

    +tahle první lekce bude mít číslo 00, +příště si vytvoříš adresář 01 a tak dále.

    Všechny budou v tvém novém adresáři, který jsi vytvořil/a před chvilkou.

    -

    Adresář 01 si vytvoř už teď. +

    Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

    Přepnutí #

    Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, -ve kterém jsi právě vytvořila 01 (t.j. ne přímo do 01). +ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

    $ cd naucse-python
     

    Pak zkontroluj, že jsi na správném místě:

    @@ -47,7 +53,7 @@

    Přepnutí
  • Pomocí příkazu pwd (na Windows cd) zkontroluj, že opravdu jsi v nově vytvořeném adresáři.
  • Pomocí příkazu ls (na Windows dir) zkontroluj, -že v něm je podadresář 01.
  • +že v něm je podadresář 00.

    Například:

    @@ -55,57 +61,66 @@

    Unix (Linux, macOS)

    /home/helena/naucse-python
     
     $ ls
    -01
    +00
     

    Windows

    > cd
     C:\Users\Helena\naucse-python
     
     > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     

    Virtuální prostředí #

    -

    Teď nainstalujeme virtuální prostředí pro Python.

    -

    Virtuální prostředí je něco, co nám zajistí, že se všechny počítače budou +

    Teď si vytvoříš virtuální prostředí pro Python.

    +

    Virtuální prostředí je něco, co zajistí že se všechny počítače budou chovat zhruba stejně. -Až ho zprovozníme, nebudeme potřebovat instrukce zvlášť pro Linux, +Až ho zprovozníme, nebudu už potřebovat instrukce zvlášť pro Linux, zvlášť pro Windows a zvlášť pro macOS.

    -

    V budoucnu využijeme druhou výhodu: každé virtuální prostředí je oddělené od -ostatních, takže když doinstalujeme nějakou knihovnu (rozšíření pro Python), +

    V budoucnu využiješ i druhou výhodu: každé virtuální prostředí je oddělené od +ostatních, takže když doinstaluješ nějakou knihovnu (rozšíření pro Python), projeví se to jen v jednom virtuálním prostředí. -Pokud by se při práci na projektu něco pokazilo, neohrozí to další projekty -ve tvém počítači.

    +Kdyby se pak při práci na projektu něco pokazilo, neohrozí to další +projekty ve tvém počítači.

    Jak na to? Na každém systému jinak!

      -
    • normální Linux (pokud jsi přeskočil/a instalaci Virtualenv):

      +
    • Linux:

      +

      Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

       $ python3 -m venv venv
      -
    • -
    • starší Linux (pokud jsi musel/a instalovat Virtualenv):

      +

    A jestli dostaneš chybu No module named venv, zkus místo toho:

     $ virtualenv -p python3 venv
     
  • macOS:

     $ python3 -m venv venv
     
  • Windows:

    +

    Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících + příkazů. + Bude je rychlejší vyzkoušet než popsat kdy je který správný, + takže nejdřív zkus:

     > py -3 -m venv venv
    +

    A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

    +
     > python3 -m venv venv
     
  • Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. Můžeš se podívat dovnitř, ale neukládej tam své soubory a nikdy tam nic neměň!

    -

    Zkontroluj si, že 01 a venv jsou pěkně vedle sebe:

    +

    Zkontroluj si, že 00 a venv jsou pěkně vedle sebe:

    Unix

    $ ls
    -01
    +00
     venv
     

    Windows

    > dir
      Directory of C:\Users\Helena\naucse-python
    -05/08/2014 07:28 PM <DIR>  01
    +05/08/2014 07:28 PM <DIR>  00
     05/08/2014 07:38 PM <DIR>  venv
     

    V grafickém prohlížeči souborů to vypadá např. takto:

    -

    (adresáře '01' a 'venv' vedle sebe)

    +

    (adresáře '00' a 'venv' vedle sebe)

    Aktivace virtuálního prostředí #

    @@ -114,9 +129,14 @@

    Aktivace virtuálního prostředí

    Unix

    $ source venv/bin/activate
     

    Windows

    > venv\Scripts\activate
    +

    Jestli používáš příkazovou řádku ve Visual Studio Code, +je příkaz pro Windows složitější:

    +
    > &powershell -ExecutionPolicy bypass
    +> venv/Scripts/Activate.ps1
     

    Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

    -

    Aktivační příkaz si zapiš. -Bude potřeba ho zadat vždycky, když pustíš příkazovou řádku, -ve které budeš zkoušet své programy.

    \ No newline at end of file +

    Aktivační příkaz si zapiš.

    +

    Vždycky, když pustíš příkazovou řádku ve které budeš zkoušet své programy, +budeš muset pomocí cd přepnout do naucse-python a zadat tento +aktivační příkaz.

    \ No newline at end of file From 5ec08733a596078f64bf7fc63babe86c7f744737 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Thu, 31 Aug 2023 18:39:20 +0000 Subject: [PATCH 19/31] Compiled --- lessons/circular-imports/index.html | 2 +- lessons/cmdline/index.html | 4 +- lessons/comparisons/index.html | 2 +- lessons/course.json | 60 ++++++++++++++- lessons/def/index.html | 71 +----------------- lessons/exceptions/index.html | 4 +- lessons/flask/index.html | 6 +- lessons/install/macos.html | 2 +- lessons/install/windows.html | 57 ++++++++++---- .../install/windows_add_python_to_path.png | Bin 70057 -> 80173 bytes lessons/list/index.html | 4 +- lessons/prefer-return/index.html | 68 +++++++++++++++++ lessons/variables/index.html | 2 +- lessons/with/index.html | 45 +++++++++++ meta/cmdline/index.html | 4 +- meta/course.json | 8 +- meta/install/macos.html | 2 +- meta/install/windows.html | 57 ++++++++++---- meta/install/windows_add_python_to_path.png | Bin 70057 -> 80173 bytes mi-pyt/cmdline/index.html | 4 +- mi-pyt/course.json | 8 +- mi-pyt/flask/index.html | 6 +- mi-pyt/install/macos.html | 2 +- mi-pyt/install/windows.html | 57 ++++++++++---- mi-pyt/install/windows_add_python_to_path.png | Bin 70057 -> 80173 bytes pyladies/cmdline/index.html | 4 +- pyladies/comparisons/index.html | 2 +- pyladies/course.json | 64 +++++++++++++++- pyladies/def/index.html | 71 +----------------- pyladies/exceptions/index.html | 4 +- pyladies/install/macos.html | 2 +- pyladies/install/windows.html | 57 ++++++++++---- .../install/windows_add_python_to_path.png | Bin 70057 -> 80173 bytes pyladies/list/index.html | 4 +- pyladies/prefer-return/index.html | 68 +++++++++++++++++ pyladies/variables/index.html | 2 +- pyladies/with/index.html | 45 +++++++++++ 37 files changed, 553 insertions(+), 245 deletions(-) create mode 100644 lessons/prefer-return/index.html create mode 100644 lessons/with/index.html create mode 100644 pyladies/prefer-return/index.html create mode 100644 pyladies/with/index.html diff --git a/lessons/circular-imports/index.html b/lessons/circular-imports/index.html index 9118a6ca..3d42fc4c 100644 --- a/lessons/circular-imports/index.html +++ b/lessons/circular-imports/index.html @@ -49,7 +49,7 @@

    Cyklické importy být nadefinované. A až potom, co dokončí import ai.py, se vrátí k souboru piskvorky.py -a pokračuje v provádění příkazů def které v něm jsou. +a pokračuje v provádění příkazů def, které v něm jsou. Takový nekompletní modul může být občas užitečný, ale ve většině případů se chová skoro nepředvídatelně a tudíž nebezpečně.

    diff --git a/lessons/cmdline/index.html b/lessons/cmdline/index.html index 9c30397c..57530a9c 100644 --- a/lessons/cmdline/index.html +++ b/lessons/cmdline/index.html @@ -206,8 +206,8 @@

    Windows

    > <
     

    Na macOS vyber text myší a pak stiskni ⌘ Command+C.

    Na Windows v menu příkazové řádky (ikonce vlevo nahoře) vyber EditMark, text vyber myší a zkopíruj pomocí Enter.

    -

    Otevření v prohlížeče souborů -# +

    Otevření v prohlížeči souborů +#

    Na Linuxu záleží na programu, který používáš. Buď:

      diff --git a/lessons/comparisons/index.html b/lessons/comparisons/index.html index 757ab4ba..cbfdc796 100644 --- a/lessons/comparisons/index.html +++ b/lessons/comparisons/index.html @@ -92,7 +92,7 @@

      Porovnávání

      Tady je vidět, jak počítač dělá přesně, co se mu řekne. Nepřemýšlí o významu. Bylo by dobré uživateli, který zadá záporné číslo, přímo říct, že zadal blbost. Jak na to?

      -

      Nejdřív zkus nastavit proměnnou která bude True, +

      Nejdřív zkus nastavit proměnnou, která bude True, když uživatel zadal kladné číslo.

      Řešení

      diff --git a/lessons/course.json b/lessons/course.json index 662cb543..a95d9914 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -436,7 +436,7 @@ "pages": { "index": { "attribution": [ - "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Martin Pavlásek (2023)" ], "content": { "path": "install/index.html" @@ -450,7 +450,7 @@ }, "linux": { "attribution": [ - "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Martin Pavlásek (2023)" ], "content": { "path": "install/linux.html" @@ -465,7 +465,7 @@ }, "macos": { "attribution": [ - "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Martin Pavlásek (2023)" ], "content": { "path": "install/macos.html" @@ -480,7 +480,7 @@ }, "windows": { "attribution": [ - "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017, Martin Pavlásek (2023)" ], "content": { "path": "install/windows.html" @@ -840,6 +840,27 @@ "static_files": {}, "title": "Chybové hlášky ze zanořených funkcí" }, + "beginners/prefer-return": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017." + ], + "content": { + "path": "prefer-return/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/prefer-return/index.md", + "title": "Vrátit nebo vypsat?", + "vars": {} + } + }, + "source_file": "lessons/beginners/prefer-return/info.yml", + "static_files": {}, + "title": "Vrátit nebo vypsat?" + }, "beginners/print": { "pages": { "index": { @@ -1141,6 +1162,27 @@ "static_files": {}, "title": "Cyklus While" }, + "beginners/with": { + "pages": { + "index": { + "attribution": [ + "Pro PyLadies Brno napsal Petr Viktorin, 2014-2021." + ], + "content": { + "path": "with/index.html" + }, + "license": "cc-by-sa-40", + "slug": "index", + "solutions": [], + "source_file": "lessons/beginners/with/index.md", + "title": "Kontext: with a finally", + "vars": {} + } + }, + "source_file": "lessons/beginners/with/info.yml", + "static_files": {}, + "title": "Kontext: with a finally" + }, "beginners/zip-enumerate": { "pages": { "index": { @@ -2699,6 +2741,11 @@ "title": "Chybové hlášky ze zanořených funkcí", "type": "lesson" }, + { + "lesson_slug": "beginners/prefer-return", + "title": "Vrátit nebo vypsat?", + "type": "lesson" + }, { "lesson_slug": "beginners/print", "title": "Print a chybové hlášky", @@ -2759,6 +2806,11 @@ "title": "Cyklus While", "type": "lesson" }, + { + "lesson_slug": "beginners/with", + "title": "Kontext: with a finally", + "type": "lesson" + }, { "lesson_slug": "beginners/zip-enumerate", "title": "Iterátory n-tic", diff --git a/lessons/def/index.html b/lessons/def/index.html index ba6677b7..270d1ea8 100644 --- a/lessons/def/index.html +++ b/lessons/def/index.html @@ -57,7 +57,7 @@

      Definice funkce

      Tělo může začít dokumentačním řetězcem (angl. docstring), který popisuje co funkce dělá. To může být jakýkoli řetězec, ale tradičně se uvozuje třemi uvozovkami -(i v případě že je jen jednořádkový).

      +(i v případě, že je jen jednořádkový).

      Příkazem return pak můžeš z funkce vrátit nějakou hodnotu.

      Při volání funkce se hodnoty, se kterými funkci zavoláš, přiřadí jednotlivým parametrům. @@ -161,71 +161,4 @@

      Řešení

      print('Škoda.')

    Stejně jako if nebo break je return příkaz, ne funkce. Kolem „své“ hodnoty nepotřebuje závorky.

    -

    Vrátit nebo vypsat? -# -

    -

    Podívejme se teď na následující program, který vypíše obsah elipsy:

    -
    from math import pi
    -
    -def obsah_elipsy(a, b):
    -    return pi * a * b
    -
    -print('Obsah elipsy s poloosami 3 a 5 je', obsah_elipsy(3, 5), 'cm2')
    -

    Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic -nevrací. -Procedura může výsledek třeba vypsat na obrazovku:

    -
    from math import pi
    -
    -def obsah_elipsy(a, b):
    -    print('Obsah je', pi * a * b)  # Pozor, `print` místo `return`!
    -
    -obsah_elipsy(3, 5)
    -

    Program takhle funguje, ale přichází o jednu z hlavních výhod funkcí: -možnost vrácenou hodnotu použít i jinak jež jen v print.

    -

    Funkci, která vrací výsledek, můžeš použít v dalších výpočtech:

    -
    def objem_eliptickeho_valce(a, b, vyska):
    -    return obsah_elipsy(a, b) * vyska
    -
    -print(objem_eliptickeho_valce(3, 5, 3))
    -

    ... ale s procedurou, která výsledek přímo vypíše, by to nešlo. -Proto je dobré psát funkce, které spočítané hodnoty vrací, -a zpracování výsledku (např. vypsání) nechat na kód mimo funkci.

    -

    Další důvod proč hodnoty spíš vracet než vypisovat je ten, že jedna funkce se -dá použít v různých situacích. -Proceduru s print by nešlo rozumně použít tehdy, když nás příkazová -řádka vůbec nezajímá – třeba v grafické hře, webové aplikaci, nebo pro ovládání -robota.

    -

    Podobně je to se vstupem: když použiju v rámci své funkce input, bude se -moje funkce dát použít jen v situacích, kdy je u počítače klávesnice a za ní -člověk. -Proto je lepší funkcím potřebné informace předávat jako argumenty -a volání input (nebo čtení textového políčka či měření čidlem robota) -nemít ve funkci, ale vně, v kódu, který funkci volá:

    -
    from math import pi
    -
    -def obsah_elipsy(a, b):
    -    """Vrátí obsah elipsy s poloosami daných délek"""
    -    # Jen samotný výpočet:
    -    return pi * a * b
    -
    -# print a input jsou "venku":
    -x = float(input('Zadej délku poloosy 1: '))
    -y = float(input('Zadej délku poloosy 2: '))
    -print('Obsah je', obsah_elipsy(x, y))
    -

    Samozřejmě existují výjimky: procedura, která přímo vytváří textový výpis -(např. tabulku), může používat print; funkce, která načítá textové informace -(jako ano_nebo_ne výše), zase input. -Když ale funkce něco počítá, nebo když si nejsi jistý/á, -je dobré ve funkci print ani input nemít.

    -

    None -# -

    -

    Když funkce neskončí příkazem return, -automaticky se vrátí hodnota None.

    -

    Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, -a znamená „nic“.

    -
    def nic():
    -     """Tahle funkce nic nedělá """
    -
    -print(nic())
    -

    Procedury v Pythonu vracejí právě toto „nic“.

    \ No newline at end of file + \ No newline at end of file diff --git a/lessons/exceptions/index.html b/lessons/exceptions/index.html index bcee2034..7f42a513 100644 --- a/lessons/exceptions/index.html +++ b/lessons/exceptions/index.html @@ -51,7 +51,7 @@

    Výjimky s mezerou na začátku, např. s ' 3'. Funkce isdecimal ale takový řetězec odmítne. -

    Chceš-li zjistit jestli funkce int umí daný řetězec převést na číslo, +

    Chceš-li zjistit, jestli funkce int umí daný řetězec převést na číslo, nejlepší je použít přímo funkci int.

    Ošetření chyby # @@ -151,7 +151,7 @@

    Další přílohy k try #

    Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

    -

    Často se to stává když píšeš nějakou obecnou funkci. +

    Často se to stává, když píšeš nějakou obecnou funkci. Třeba funkci na výpočet obsahu čtverce. Co se stane, když někdo zavolá obsah_ctverce(-5)?

      diff --git a/lessons/flask/index.html b/lessons/flask/index.html index b1323143..1eb018e4 100644 --- a/lessons/flask/index.html +++ b/lessons/flask/index.html @@ -76,7 +76,7 @@

      Dynamické routy #

      Když vytváříte dynamický web, ne vždy můžete všechna URL znát dopředu. -Budete například chctít zobrazit informace o uživatelích na adresách +Budete například chtít zobrazit informace o uživatelích na adresách jako /user/hroncok/, ale nemůžete při každé registraci nového uživatele přidávat novou funkci do kódu. Musíte použít dynamické routy:

      @@ -85,7 +85,7 @@

      Dynamické routy return 'User {}'.format(username)

      Proměnnou část cesty ohraničíte lomenými závorkami a použijte jako parametr funkce. Pokud chcete, můžete specifikovat, na jaký obsah se pravidlo vztahuje. -Například číselný idenifikátor článku pro adresy jako /post/42/ můžete zadat +Například číselný identifikátor článku pro adresy jako /post/42/ můžete zadat takto:

      @app.route('/post/<int:post_id>/')
       

      Můžete použít různá pravidla, např.:

      @@ -95,7 +95,7 @@

      Dynamické routy
    • float akceptuje i desetinná čísla s tečkou (a předá je jako float)
    • path akceptuje text i s lomítky
    -

    Rout můžte definovat i víc pro jednu funkci. +

    Rout můžete definovat i víc pro jednu funkci. Často se to používá s výchozí hodnotou argumentu:

    @app.route('/hello/')
     @app.route('/hello/<name>/')
    diff --git a/lessons/install/macos.html b/lessons/install/macos.html
    index 0ed8ac39..0e3c99dc 100644
    --- a/lessons/install/macos.html
    +++ b/lessons/install/macos.html
    @@ -5,7 +5,7 @@ 

    Instalace Pythonu pro macOS instalaci aplikací a knihoven, které budeme potřebovat pro programování. Jak na to?

    Spusť v příkazové řádce příkaz:

    -
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    +
    $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
     

    Pak zadej následující příkaz a Python bude nainstalovaný:

    $ brew install python3
     

    Zkontroluj si, že máš verzi 3.6 nebo vyšší:

    diff --git a/lessons/install/windows.html b/lessons/install/windows.html index 8e692c91..c75117a7 100644 --- a/lessons/install/windows.html +++ b/lessons/install/windows.html @@ -1,26 +1,53 @@

    Instalace Pythonu pro Windows #

    -

    Běž na stahovací stránku Pythonu -a stáhni si instalátor nejnovější stabilní verze Pythonu. -Ověř si že je to verze 3.6.0 nebo novější – -verze 3.6.0 má jistá vylepšení, která budeme v tomto kurzu používat.

    -

    Jak poznat, který instalátor je ten pravý? -Pokud má tvůj počítač 64bitovou verzi Windows, -stáhni si Windows x86-64 executable installer. -Pokud máš starší počítač s 32bitovými Windows, -stáhni si Windows x86 executable installer. -(Rozdíl je v x86-64 versus x86.)

    +

    Zjisti, jestli už máš Python nainstalovaný +# +

    +

    Otevři si příkazovou řádku (pokud nevíš o co jde, přečti si o ní tady).

    +

    Napiš python a zmáčkni na klávesnici Enter. +Teď se může stát několik různých věcí:

    +
      +
    1. Otevře se ti Microsoft Store → okno zavři a pokračuj v kroku Stažení
    2. +
    3. Zobrazí se ti text podobný tomuto níže?
      > python
      +Python 3.8.1 (...)
      +Type "help", "copyright", "credits" or "license" for more information.
      +>>>
      To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou +(např.Python 3.11.2 je 3.11, Python 3.8.1 je 3.8 atd.). +Třetí číslo za tečkou není tady podstatné.
        +
      • Je verze 3.6 nebo novější? Výborně, máš instalaci hotovou! +Okénko s příkazovou řádkou můžeš zavřít. +Až ho budeš znovu potřebovat, můžeš otevřít nové. +Pokračuj dále Nastavením prostředí. +V opačném případě přejdi na Stažení
      • +
      +
    4. +
    +

    +

    Stažení +# +

    +
      +
    • Běž na stahovací stránku
    • +
    • klikni na Latest Python 3 Release
    • +
    • v části Files, ve sloupci Version, vyber vhodný Windows installer pro tvou verzi Windows (32 nebo 64bit).
    • +

    Kde zjistíš, zda máš 32bitové nebo 64bitové Windows? Otevři nabídku Start, vyhledat „Systém“ a otevřít Systémové informace. Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

    Screenshot zjišťování verze systému

    -

    Stažený instalátor spusť. -Na začátku instalace zaškrtni Install launcher for all users -a také Add Python to PATH. -Tyto volby ti zjednoduší vytvoření virtuálního prostředí.

    +

    Instalace +# +

    +

    Stažený instalátor spusť.

    +

    Na začátku instalace zaškrtni:

    +
      +
    • Use admin privileges when installing py.exe
    • +
    • a také Add python.exe to PATH. +Tyto volby ti zjednoduší vytvoření virtuálního prostředí.
    • +

    (Jestli nemáš administrátorské oprávnění, volbu -Install launcher for all users nezaškrtávej.)

    +Use admin privileges when installing py.exe nezaškrtávej.)

    Screenshot instalace Pythonu

    Pak zmáčkni Install now a dále se drž instrukcí.

    Máš-li otevřenou příkazovou řádku, po instalaci Pythonu ji zavři a otevři diff --git a/lessons/install/windows_add_python_to_path.png b/lessons/install/windows_add_python_to_path.png index 1718d677041ea8dccb9fe1d77192e3588a5eb0d7..c7b40d2955718a3e06ef2f585b0a47acaccacf8d 100644 GIT binary patch literal 80173 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

    5m$b$~ zI&mbG!b!d6EJMYP4UVdnDuNYH8m=uLkA=;;Mo=kCT(abGDv1FYT|aksGY}H!F;H6U zhh4F+?R`Lx!MAOBuV{;Xzpaa4h4d)|ew%Pv2tgjyWj1cgsb=QzGc zp0T&Ww*@!Q7PYA)|H#fP*G$sO;Z~wtz@v)B&H=NjA7jIj|JIfBY<5twqtJB0vO6~- zj&VN~%k9DMS3Ro~X9$O#f%%Mmr37Z`%RJQrUR7$PHlveKitolo0ehaKuGt4RcfNn_ zaA1#s7{HDz{}p~N#HPVb0Je**57eLfnPG%^HTLs2=7y2Zo|YDNgq|@g%ab8eR>Xey zF3EuoIAtU02q2$T?h!6KBu-wH9iL+t%Y)+cI(U7^;#r$HF-$!wKG<^10RFWRh_znH z13VBId}OEpz!FLG0dC=(%_?wfZo2{CM~pcBo;;b?V52>ZMG|@f*~q_qnDIsvA}fb-7-UN$R=8Z>s% zvM3o#jCz4HU@Wu)4?SMuIx#8J9cDR-}oMs1NgL(w1VIuTo=klG#So zt0;rB<~f$7s#$y_1BKB#6b;FpxX0W^{e@9L5FDR?o{nHet92+VgiWU}>6+DwoJ`NG zprOB{Nnm0G|La8eMKq5!(V{6l1^A0Rb3AJxZn^2(T_+T|WXsp7xH3rk($yLoJ|%Zd zQdrH3T}pOl1LL7nFhFXR2a7G9Qw|rZVB}*JY^dEkUf6b(SO6t)8O6qZ+F^K{^_ ziY+p(FDWUZ{!RP8DlpriDQ2CqwyK-$QT?ja7V%XV5h(r)UJ!5J%f_Q&Y}q!J;_Epb zzV>J2+}g^HAXo>-FY6BD4SY|Q?!nk9U6<94Z*hV@^to=>GpQ>>mg=RxoS1Ve&0!ja z2{FPcAxwgiJ%R5R@61&1n6Ya@X#M)%IwMJY9-lgry$4@-)Kk7%iI$gtY&m>x0htB& zW)9?D&`~dG}jn7V$sX&}zAO^mQPYWBrWu>0s*oQ@ULX+-zv} zPng)ys9NIiVovL~$fDKgz;LOa3d_Am{dT-k7+qCGnLu%7h$#HX`8bO&8gHvhSD$AM z*ZF_700lf=N=-&ADk9XI5xtGPDXj>x)8)wB$-wfVWU75!m)cW(L5Joqv2a3J<&dAY z&M<~4W8kcI;r@wzH(Ier%}S8OhvL-N?t|&SSEev)Lj|Drckp)AsY@xlMA-QGKmVPi_nsw5um*_BeGXJ?cbn~{1+xnUQ+ zX1>}wrHnrcJK z$iOJ2;rpoS!Kw>=(|?&Gs=hE#bPtRz)I~JMATfj6b6q#h z(FF81v#x9fAMU|IvQCg#5>ouj;L9u3cF;uHPuG=)5lk}FBv9T9M|R*tmZ=BEe_pcV zXT5U(DTaVVhGEeK5O@$BDma_6y5uMpZ&y=zqFZc<-!{^r5Z2%t9Y_`CY)2yw{>zC1 z_Qy!_Ok0I;UNRoYro1{d#Tn&EmU4i**+IMyZA zntEtXEP7AXrVg2_w!Bpw^3mb%J_RAcWRAA^-dVHJ4oLikWV23FLxKDnJD_LWv_?sw zQF*xOfHOvDx;(;mHKa%nM=)rl!|;Y)9B&xwbUg!r99q7HL%=#9EuRI7Lf3e~QH-Gb zp)A`O)b6J3BqC{k-OT+zIft1OBe3Er;w=t&?>Clum*)QDm*c9@7+$%&h@Df+x3kp6 zsL3D2H|TW?PNLk4iGHV>>`WeNIImQXJOZV&X&?f*MyzOUay{lJ|FkT#J9tPeB7^`+ znzsj?=C#U;w)q-=Zg)`aYT9Z=`fInoZP|34)~!^{;`qyCL4k5v`8N61P_~MMZ_Qgw zu#I>*i~x!TwVt16ZPU9&3gO?y6m@_yKmT3v>mr;4-^hOs@Vfw=*HPt2;SU$la-5Gf z+dU_wD~cod0b@(TB1hqrMDrx?au(Y$MHA8_bI+2ffF4Z3)bXZHecRcZ{A}Y?M z#8E~H9WZ4ljL#6A4-irNvt#3}!c_(iua@tXd}ziI2A{InTVkXo+S0;7$ub_hOp)}!DvIiGiKaJ9r(khKpfG4gyw2& z#64mRHpUWbvE_|r>6Uz96>-^?(RIOuT%rKyfX;tq%|$eXDp(bIDW@{=@Kw&I(tUJV z3$3-+goxu=Es_wct53aU{`=UrJ8hURvunJH(<+?66jq9fR8V6F=B;8*pGMo&8wdJd- z_eu%gdp^aNXnxB5*uVxruzd?{Nm%d+K>|->^=Nrogk;#P2almY)oZcsK`QzRw9xg* z-wq@3ZEvy+*Bl`ROlB8&L|povHB7z4{2g)GkouiX&&FrFiT? zJX|H3616xlHC)Pgqs4YIwajO06DPOLgDFBJO6Hj1;$#eKX@cL2)rX{sf%!s zm;z+44}9)huDm0xe>Jp5M}`KiV$WqRHlCV%XA`sgC+A&zu5GH`bNDo#iB9I@MZPyI{%JgDxtEdmr~))K;0fc~o3 zJj9VoEWP%H`=3MD*;75M^=LL&EcTRS$+aQIY=fLuE0-Z2`fq4yNR4;cT}=BWRG!fU zuo+D>OygVbm5)m%$mBR`is6+_sMs6eUkk?L7~UVR(vbuRRae`u#RDynjepw|!lo1v z$e$>fW%8BEUjl9$C7k?HVI|!bdgsdDA9i|g`a;?QiMoIDMe+vk2(>HxWwZU;WxieY z5=nGvu$}N5fBRVv&<&L00P=G*?Ma{2IiNt6*pTFJ0n*Sn>?(Ea@*q0p1n){F)rjM@F-^wdPsh9@R$qq~w7VhN(`VTnPLje8HQ4 z+g$e4yf}U68Ew?~ZcrZm65Ia1yF8c)xv?~?w)lgKQh)Jg_5i3XSS;*4L_fM0TEB<2 zO-xvz4)#lMEbMwPo???TPrp@&s9dmHb^Z*$S3yW0!d6g4IC}lZuQc^U*XW*6%g6I( zhDO!P9`iq21_XZ|x2U17HZNl}+~As;+IIJDiaHhPlqZAZFt3D-!&mzm!gx_!j1|37 zu9cBm*@`3H>-rm)pOTzm+}N1Ni(EQvm+-_}3v~)lMKUs{50L=n&rkB;k((d`#gcFK+ zaKf&2S0H|uSw{_0Ljp-f9sl**n=Gi~#(j5#Bk-lLZY*PU!b8Tt>q8Y(#|u~*J;$%( zsaG*~ZzlMy^{?$efA2dgt}LWjcwA)NRsDW!>2-KjKN%Eft@p{gnIe`_3wn{*!B z_xQK}>@Sa~p)!sMKM62xQY<1x0+UE27I+}Rh-I^rV^$7iCnl{ZUx$sr zd#9dsLo{kmyUzkY}4LrW3^S^9)PcyT~|7p!jGn@&pDK1_y?e?;^!BV}s zpVlIA*!E|hU?D4P&60$;WkfRF683^)9tdSKgJfu&rkE~9K8z^sba~FPWXx`+X_1(9 zV6s5m%|P^TM&auxv0b7ntS}LMkJ_Cr|Mo_2LRVli&^*pxI!I@G-|n(%H0k2c8`CS- z{x>f1Evzomdved?`#T>c=1SS4lk8$S(U#Rf5Zsj#y?jdd!mqzuF1+Xqh*n}s%NIIt zWBrH*n4W5%5{JF_yKA(*f~1md(Cl76?`wt}t3}l?B>tz9*ujWsW`IOu`10U2&0|z1 zJ0=!(4!S)O=rN{UIi6PIU|B>5qIi8m#>f3c>*GR3W7|P6QCv#r$cwD42TBoR>3kYy zI|WVCbe^I`*n=3A(<+%$G=;b66M0bAOYrb$e@!3KSpgj8)|=~mY`H@?J~gtZ$fUcp zv68O|^(ku7KHW55x|Ab#4?YG>7a%$Rrolc(+Q)#n9*8@|DJ+Ddt}q(Zqo6(S2QR@9^oY>+I;Dtz@_=J{Mez-Yx%pe}+ZJN5Sg!r2mgM?- zq4`-yN;{<-RUZ{qr<$-{+Cq=Fb1%p1bQjjUe>}tL4j5>Y#RWV>IKen7)h}5K1gZQ! zi)@(BR$}$LxjWqjUplfhT>edoFh-RqwA3`41{Fyas}6Xo8@__Rf*L<$pa)CX;mkb} z9+Hxb-|bZ{qAq=4302EJOQ)>=~;KsJqt#n$emAzAzOi z{U;5?_$W)U)Ldw({(zwt3D0vt43FKZ97z>L-Bzs_ZfkqVx4bB=g>CRXVzW)ay(U^u zc7`wddGEE>SoQcq^}QM`eM6Y#Ow_kT;=_u-b3-?jfXr;|<*vSpN%``GKIHb7!~R>) zpwTYv>?JEKAsQnPeWK#46ZJv-dQ3=!$+o-P8X{txA3a8A%q9(nmw0-Wft+}mcp8E9< zTr+;*w}-#+R1gbKUVL+w6D1rZ<65XHj11hdP;x{c5eW+t*ILSWWWGku3@xA`BY~>X z&V##JSooDNOBt&fZ0x?-jahV=FwO}B-*gZ(66QcRtJ^WE8Zc-VjeJ|wLI*VDoBmvN z37Vce{Hwc8$nZy@8J&IC3H~S5 z`{JVFAF03dw$*!T5nNY9tJRnui`+Mk(gmzl6C!OmFio?|t2SSMGhnVB9FI#9AD!d3 zxeZ5zMB=K};1Bb#1}`v3m%9Dld^u_f4>BXf78kXZ?mIzB$&#y#k3T%)h8D+?Y7dO+ zbSP=TE67^-fz!H=_&=wK3XyY0TdN`DRFcbpYy{yV8H&+iAY?z+bw!M2=sjdQ(k$m9 zQ_r3;izsHlanXDv`%QI00k0)+Sl5eW4TtxbID80eiB$IGV)-A<{F?GHadj1U6lc@t zabz09F>h}6kag?~^-_s;TTyF~zL1V0JBtI$f>zfEr7@GPViwK^4_)b-MlZ&`kCgM9-(LW%+DEAt8xd2(mw1z%{flhEQw8Le!DlA} zn^T70SC{GvCO}?B5r%G}E#;hLG-kK)_5nrt$N?AXL@f~%(N(x}rfB~eTpL_4v&CjF zcEoXKI5yr)F>3>8d&*@vt41&qjGet$8N@O^+cUoON4Pza587!L6P?}^t2nBQ_f1?p z7ZfyFYX23Gx*>ElaBe*+g!R3YGd)kvZXs*&8~DVY)_BXKsb|0%>?>6=Qn&iuKu5p^ znzkEMoq%b6R*ltiom3se4{c~d>OB$u#fLG^tf46ByLtOc9wAPmg^IYHSKlDx_@ldE zm_m&fEKetaqI-5h?VfkaQyhhW7Kl$&c9(&umMKBh(&h(F|6k(bC{7Xj;1ZzY7qJu& z$4RGUf}Ga#o!4-kUk6VypWjs@eO zLP}%5s>+fcX@=>9nyL>~7a;fMQkfG~EABHU85exVACST|SoGP6P)6wQ>OMbhET+$5 zj|A<|T@MIMteZ*noo`SO`Ox3!U8NEb1Ec0WVP=-5A?44s<`F)@2Y{B8J`>IoA{Pb% zz_h_oyLiF@?8r0i0zna*(%Te#oTV-cGb7v!SYV^gf^$Zk|5xwceN3!Y#F5ox;ZEX@ zdrni3E-|3STh&L{7Nu}kCSs7fwJPA?vLO7L1=2}l4p?90bA%=A!PuR+Y#NcqYX!A4 zMK7rW+DaVSpW5$zK;yiN@*=7dbQ{?YooZBXdw$d7dY3?%^bD!1Pug_$+cwTLIYqD# z{82nKYb8ng6+O>KB(9N`&Wv!P|*;ST-?S3#^q(gYRH~l#VomM@~VIT zvTGeWEi!%4kX)buESft>@Ld5M7ia z+)ttsLlqBSjz1pC%Ue($K=>c$(~KYJCpoIV_ayu0lWf3*Nn1>dRRa)?6fGJ~94f^L zG*SfjOlCir#`>grV@(rEbR6 z$!+>eNp2`b=k&fG52Zn5U0?*a5#7N73Dk&!&KWyT)$Od-nEQ8wCW_ zOd;jihOb>U9db9KcO18b;!rc)x?=)(MogK`nyOvz|MCc!iEFAK5Z|eyYM+3$`7X+R zfm74?EaN4(FY0SqOR0l~L%cdn7$C^J$r%aBZ{}8MEg2+-8m_UK@1+{)_CnTG1h-Oh z7PKHnv~-k0Jq%^kmEN+)MCm$3MEekk21mXv*5NmOr8X%fGb;Pewd1@L$Y;k0yD7z! zrASAF*kn16tw{^Issd&c#$`;+XV@&hL!PaMTA5!qitp!C1=>#n7P;>z3v~YbTBsaF z8sPYk=~KoZQSO9$eU+tPqCM4zdAASOMq?r8cXCko{4*_kYqJfF&)0wT2dfY(cng{( zsSZ0QKN8G1+#Lrv+$!ad+*s{x@Iu!a#^h(a>v>Wt{VMsX57H1Qmg1U~BkE47 zC#a=0`AbKx{SSXF@3*r8PbJy5<@d{MfH<^DL^X#u61%tB@80ty3}9FES-UQyO_je& zhwkq3O^juiW*Efj+y(qgJPf$_VauNJI57dF8q_5)r%@s*Wi)p!!nC-{_sc(aBoADB zVa7UnvbOA$lIB1+WN7oZvlvHCXcRKX6+PVJ0g8@v*%tJUg4e{6cJ|(CbWq_@%C6X_ z#B@S#NqxDyw8%YQ(FZd$TP-bvpW2#zv!`z%_Hg3g7EP@TM_h`}A!*K(#FQD+SDbG}fIwczRSsVPn6LhUO#6i*4};H(bhh)O$o zeRX+{dN3}QA`<1{Ms2j(wCLRxv0EjKk~O*}w$n;ZRS@Cjpi{!t@wB!0+0{YYZ`G$k zF0p2rDqCG#F>p$+#G)~g{ChM1#dGGJD5fJ;Z&D$5-n)AdX8GZOWl^$Mge^du+j~niDt_*cSdCVAE>wQ-RQ`(s z%y{@?2UbRfk73ICDtxHp%ovW!6qA*C73kK}>~+MQ%2+X1 zFV!yG8#ecZTo%|%LQ7K}jIkD!q18WzHCF=|?cSO~WKnVPE>K`}UG=!*kTQwPQPz1U z5#>y{s2k*$ctq+u_;CAmu^NGNu)~vLS@wQqn9-kjio;ot03jq&69hooXe0+b&FBd+ zwC!Is@^vjtR9?AI1{$6f+8IxjQ;tK+y9*2O2~vHPXleKChja*yNOA;k6y!v=9z6VO zXjD<8#G&B=$F*M*e1V#&y9r=R0Tt+yppBWm-FJ7e2`;D>18XEhWW1s~~RR zj-z7JzVJkx$14o`n?B~x!hD`BZveBPAA_7%;{#WSKvlfB>?%r8=7@ZBdo0)>jiV`f z@TtF(IC7C?GkL7s`NbExu7lpa4$WW-;ZT%0E8aDBq2tPlm>Pkw1iM*^GHr^;HCK_d zMUC#TbBzywLB3Cy!aHFx(I3l(XGbr zuOb=914HrlNm483X7BN+ak)a6UXmCnGkV0dOx{^gU56LOmk{crsAFcTs0L#$e=aOeq-AI#89Gjnp-_t6|OsC9IWe^g@<%zi- z_}&H}!?R=Tmb&oJVKLHZS%fs((GKHG1$mKSfL~|%Ybd2hf8A74XuUVed9OF7Toe?J zviai!g{4NqPJc^yzpE?jJ9TA33l5?qi0QmHtquyEoT#@?++KJgZdBuswB<}qR%*A# zK+()Pfa<&3I=@J8BII6SBsD-!SQFF79b!f};`Sjb#tkeu+jf>i=4|~co>=euN8Mtb z;~%I$;1Y|dzEs33Y3OyB%k&f!zL-?9l5apJ!(N{E{Z91=d?Fe~d@+w?+a{?o9zh}l zn8Sl{m&X|O)wYn7mGa8Z9*BL?w{8dGn&D-`eAT~o#?13ExR=aWCAH;>lT`!q)AtyT zw9GwTX_9T?uldC$D1NR)8b#@WEv(cqwDL$s#j?YjA?zAzrj)y;*|PODOJTst*F~tD z(q(&K((Fu3b^;@jC3yEht}dQucBAght2}jwMC(p)Sl9QPoitg3K!s!TpyOh~|J4Gd z{O2Yu=n^>(N~K*>zg%W@!~(;;oBg7vfGuCWO~xZe{@9+GLNKe$7lj?Q3fwj8=7bjL zwWv(GACR*ZP()|jGgIyTqPx?>RPi9GT!~9Nieo-#-?T$QTV6+|QYfw6bSe;rqzbwi z)A-4WPCzV(Zh0t5Vq3tqPkE7?_9pHqz42$m8-|PGhr#pVbv)rMzPPr&qeQhG1(?h4 zf2Gg1d?oa-kNKrwg-N;O^6XL8xRLcf}*m{Sv;No-_Tk{!j#$5UBZTxu!iMGTTyJ!lC9&6h|2^8GOG`^`JRN%6g}vR^sr zlB%2WiRQulbgiY@h2X~57_@QZNUgI_)}c1X(+)D)M$B2|6Qpc9I@zVQdmf!+dKp8R zGsqMFlRe&OE*CJ03Kfvr#4e(hZ&#gQC=!oAGrv$&Z__i(@d;D%5T zaqxfFNsl{!_SpVl8U38$H8o$3Q)4n9(1+da}|8Tu zEJFoB)db<1GovlP=hndQ)EsTq?$oAPeGAe>t5z8wO3GVZiMiTd(qeJHg6sPzm)FBe z>r;L^1e1ll^&83YYpb?8 ztwZaEPtzVPyorWdS?3fxZ}I_n7~c537~mP5Xgckh_gc_>Q|t+u)zR1fEd+ zc@S9{xcI&62)s+l`E(`g_jnz1u~XAD$$K?y({>g1`ZxI>qd7-}uNq?isCoV4067{p zyjmk&@BSS~qBr+u+i<OAhjdgX0a?T>zJ;-lC%l@uG8bL2Gh`4rU@$1inU0|J6gK4bIj+}V)t<| zJy);3l{i?wD<0^sfU9r=Ar`ab8RipU7w#jX=U<$8r)h??Jz*oi<>#Sg689}%vu;O2 z#Dk#sS*Ppqx=)C$ZwnCRe>e^DK99pu2{@qacI)i<4gBMd>}`H>kZ_atX=bORZ(|63 zCU;OKVW%5-wI|`d4_h3)EBr}D=rF~Jk{vT0a9ToNW zMLUE7g0z%$N=S-yr*wxjgCHO=ba!`mC?$<_gLH><=fKcI56v6>{@#24&6+hcYd-g$ z*k_-8?lpV(q?zr)X-zZM^ckUWTc+FV#cx7v)1nB^- z$H}Ct*kEF2)`G#QP6hP_>0L+aU5DTcKTim@s>|~nY9>?M^j8v;b5d?6@5c_C_AQpB z-B**#Uopn`8DFU6N7SJewReySG5c!)F$e>s)3gx4Obn09J9j0(3{eFX)MFFLJM*vt zm`~BxL24K%>eO(J>oKc%%Deu;HLI!2@y4R_4Dhu4e7O3SCf;IvyP3yt!uOg=uvQvh zu{1xfJ2_%ERK{%#^pw7zpp7i*gYpFw)q2B43wT<+$q>_Tl z>jA4F8t%oE@%X*8%gwlf#m1Cf^x#U8cOZ@WE2{}_T=3cMCvaG5XGf$Ax$h~!UC_QY zbz*arfub9lWvE^)+=Nmk$oMQ|4598gox)t3di%|8GuR^KW*Yt}W(a~Y%0zpUIxFFh z{Om+TC^VNGt0omDcrt(vGfcD9w&m)CdaYE#Ja>j(Z;ZMNJ|3L-YhMj+V{OUDI!{}d z#LjMByKnZ!+y33b6-w`lZp3DB>MUX^!Sbf859XI6N2x5xuk@uV4FhJYk#M)UZk4r!g>F zYQ|3;R9O`-Vq=nx3d#r_=3*8)H zJKngoAn#6nHRSa;775@Nycm_Zxul|*o;MPRgsiXi66SjU!lt3(QSSW6!02`_^sokB zzGMr5y~^EbJ9LDk5wOohX9GuP?$+f;Lw6TXrHCgNyiUEr?Zc|bJjdB&X;p2!UN4BJ_B1&bf-3CI6BW93LtB@JgZLJuJ(kTbGM0T z`y9iA^XcaHsuKkwyOOODcH2d*?*?;^m)A-Y(}CB_>_?GZAYq z6s#F)$Ogb1Yf{y+N=z!F#_jO$bn@0Jp;82n39eV%GY^X9D(+DI+GSLgTW>}8Z(*c5 zhNmV1xfCClL~lW)n}Y_r4-JzIO;~KG6QvS)N)vcZr2?-at&{H35UmUf|El z;<(4B<=^VLmY+U{TKL$YSG7AKusv_}7XWPSG;2`4ZD^Cf?6|w87uIGwJl$7zx*1-V zZbQ=7yfCNuBpr*_f4QXxA5YZrB8WF%-qnHXhd$|)BsQT7Rr*Nu>s}61or+1q zfKuW_svxTf)fbaI2s0!I>ejC;UriKEp;V-Y%88M}?_MDV#1TiS85PsmK`oqEQ;xcw z#oZ4n<3CpL6;-G^jWuOv1sZYn%2M#na$I?ty`L{JF@Hq=9aG=V$k%kJMWAr-NBolm|()HT;ES*LX<%XVlv%)X7{E9ak$3htJ z9eJmN-LpJ)eHmeyOn42qsKQ!RRi^DhMnF`c=GnMckLYYp-r_8|UQeWk3$f{=^L4x@ zo1nE$J6Q?kznRAx1BETQlU+vG69=;;k-fqinu5zTx?!|b8iNRLEpA~GsXkhZk+%8c$C|2btVN+gL z+Zy-xZcgln`*4r;uV6yVwmB@3%DuaB#c+)!!?$If9u*TVwJ;udi%I}P537eNY*RAd z)ycQYMOmW1znYlL+6gnm&wBL>{yC>qgIP`uK5!_>Y0QT%dD3pN2gyP1`&LuYR2;5& z@qi=UxoW;`Rwnme(|PNqNtJ zr?B+ih6Dp`Drpw%bd2xx3TroZbEg3%CRm?ClFUoko5kToa%j7S#9i}6Qk@V(_Cj?7 z_zeBo?VjX>YP-L2tto82YIDxQWtZj(>cdX1m?GR7EVI_(m+Bhh_RCX1Fu=g;c=WDO zmKc`P0VBxG;)0w#!0qSR+WKH!b>Pedcc?5olgsml2@bDZ7#tw{bHujSPYh>Ie^c<7 zv8zmPRweY0Gnx1hxD0bQD?ahV#3+e&UR2^h9=_I#vZyfT&2oXT;sdkSsUVG>((I5Z z9^KH=j@k99&=q`6zIdh#9~beOBpotJ2M+_Pyfwa{6rGmv;^D`>(Jl0$))JAO`n!;u z7f>b+n350H((rc1G82w1=_np!^2PBb_sy+)2U*zm6?1)F7{rOw=EJ-)`3nl~Z*Ozg z*ZMBlas))buDM@$H7mGaSV&&L)8ey>JPYgAh}}opoxo}kU}7NS+~y2l7{-1&t3AO3 z)|4K#6Y`qS)Zd(s6!N;AH4r?%x$YVeI^Z>I4UT4+_q3fGS{|2rSbIA!2B_M6Ldn6K zcQX`Df(^hir!6MzCxrrE9Q6UOn*ysgT~G#9vD^>V+~)dt1`7f;9r9_MSs`vZf2*ah z13%9<+$#)r=8ARC8*@w1Gw+0pOzTRLLmVE?O?SC{NuDL%(P*?QZU;zDUkT!5?>Bg~ zUTNz<9lu`%Pu7XfjY@wWv8SbHKRbH-Eg5XUp~abUf%Vf z%c*tDPvwSG8~UUrl6)v5&q_DOq$+o1T4ML8`0gaR&~{h}6bKP{Y885zc;0P)OB?$i z&wcB*8BAz@Ot8gGJ#|83I8^W18kd^RSEx$=rsBLs2^kA}ggNdo-&Q`FBvOLJViH%b zeaxhqzux2}mzv?~yrf85?!s={r*?X)s2R{^bu89&eg~Rw(8+~bWtc)X=8*wg9_Pb5JrSz<|S$r&|uQsieOi7S6%`wt# z^da~>loU)_oK_pAvYZ%$=jwbSK^H5H`L8E}d@h+zGrs|PX+J`!aO9n-W$|UlM8PbT2Fe}M zOaJ&4_?LZ<(P)tdIj9K=|9HmY11nC^sf>wUV*5=xu{;-xlkQ=TY}mlb=L)fk6Szc;P6Nloz7kULQkquo8Pp}-c|T! zTFjS!$eA^#?Y-dzciS~QmR**$j(M8HA6c5xPQ+9rYXlUvW$274DGQUH18FH-OOK7;% zwLc*kq^+c!+V1tzZTB*^`+284zP3XBW~%n*Nfyx8necD*_AtJ$ce(`M#LZBDQLEn3 z>bM;4sl17@O3QZPLS*w0S8_g!C}0vfq%xDjkt%k)`Lm|mSB-Hpr8f-cbOrHoaN*1u z0Q2paV^{j^!Tue!zgWHb+mT z$1L#8l9=>ePi`{^-&>{B%R+1(StqHVHm5->2CELtkaQ)giOUhMdGbOJfV>XI>}m>E z`$>`qKHzGp8?Ugq=|n0f;7d1T6J(kIb;Jw61aS~fxVHGb1F{1X42aFCPcCXd&<&9t z?(@&{$N-Z39v3zg=nS7QP;9>w)fjH1G#E6RVg+aKI{+N%js_2Rx6eIpkFGOswrZE% zwju_6f+50Ne1^WqEIGcdE8xxhv*Eyl$faG>3vwW9^2>3ebzx!qp<1isuYF&2`McWdH+&}DOsoA2Kh=S4Lm z!7GjmP3CPVVE(D!nqsiXY-WCgyH`FAX<*Rvjp5MBmzO6^CPMUsb*vfLRe?GBQOCu} z+g)W#u&JpF^tU`H`-uVE-H?=o4LrISGyoD`#MB@SZ>%xKDIc{XqT7pcnlKtctaHO; z7KKyF*e>E2*zl7{Y z5Y6x_lr8lSER_jCFf=v!8>#au3gKDu{mB6H#JAC*N%>Z{^IEJ;c|E{*)&Sue=~*vO zCOy9Laz)(O@V+<6!%*mTWa}!MR%5 zV47$JCEriv!v4|+e1P0sp@aS(13okEZBO$)Hx`?t?SG4$*8E)S!(Xs@xQoZg`)9=y z2(yc)T;qq1HYaqX02*MHn*G-t>CO7m#st)#;ym~@U#rVePDXj{CSkW!G9~gmYT}mm zIzHZ>XzZwtQ@q(>M}k|goD1;A@%ptWzA<{q8$;YjS~|@O!6y2 zdg!5y3t`@P2!kSOvl}_xJXF1L?B9Pa7>s^%f_aKeJ^o#ltx;*y5evFuO#x_{a)!CM zfoEZ-!Jc~c@3%0dy{-ytZz6<`d*1R+jdeH{LRd==xI$O7Uo+gbRF=Y_p?kwH@WGTy z?znleWey^=^%TZi+aA3Be&YVmz)6?7oqp3xsoPhOGY_MCoZMgrWuqM-0q?Belo7PUsl^E{WTWlTHgYUfuIVyoRzh%`SEYt;oBr!1c}1}b~!!M@DaYP zHo~T&>Z`GTbOF<8p9KXIaPDH@!Xx(49g8oPVu^$FDTmC>*Cq(A7>_}~1gKF3912A6 z%f0mD?Uy4DF9J2<3yq|;PA1BM+o0G$dGb%PU*>;6?+<<{G0sCi?Oc!ZU3!bqgdKMj z#PlY6dB90Oc`Vj;>K4i+0BnDRcJdk0ptVmq zvYmmisba6X!Wy0QJ8NU-$JfCZ`pmYM?i0|B+*F7+WDLEg%q@DrbGu4tBYA;(MRz6b6Pzqc)JTT(9nkfUEw<`Pf1sFieAWn!Yfi z#2GY#u|J+XG~W|T_eukb!IJ{9Nw}s_c}xc&r)=aD>jZ15Nqa3Rbq z!&@$D`C_>B3rjl|IQd}=DGs(_kMQml-5`RA>VhXg93Z-(w!NUDIb;eJpo4{Uf&I$r zP*+uZVAIQPJGEqRDo9tbBGu+Exlrjc@cLogqA}y%8D1PyuvpE!smzR4N zM?S$v>E_Z5#Y$MS0G!--3@Z!hci=N_PGP?;rJq zVtL%{|GaJVy>GNAN=}jsp#(s@$#j`P3XDGvTP)2Cl7#78wt44>$f!}E2JPek_+%|H zXeKQmteX7E0U2IBM(MB+po9UfxBftm?|obZ8=1q)C9@Nc=u;l02j?=$!#z)b!a8j+%u%~B`!`ssC?XF6}Ym#9LSsxP65|@Cik$*V!N%w+k{y~@%1r< znyaL6`61so+i%pMe%=@W(m49!*l3l6FHpwDt*ho?jdzj`M;(>k#0K_Hqy|gsR(I7argWq4an*u-8`>6`cULe ztP2^jFFE2r|DxiB(u)R0@}t|3SbTwD{MoMuTx$L~Vp7)R)scD9S$(7Of50_FPnnX< zpe1U@L3LmZ-mSE##ci4#d-F*K^T%PFgYYExDv3?+4Q^?7@%Di&$NG<%-=`ZAtC7fl zvsUoql^*j3;Dc<*?{ep6@@ecKq}ML4I4vg)G_ek*)Nxw&f|L*gN@({_14@IJkoJU& z8`d~i1Q|*e|Bc9ug+K!o7i1NHKGsz3EKE}905y{+>Q~AwZ|Li~e<+=Oh24K;K_^0t zjy?)*>nfiwM%XcMtEQbz>k!P-d7gS2;-8gTWxBv9+!+w*PqKc_kh$z(BD@wQ z(z*Nl`#hJFf%%mo7gq;YS3-k%s-R^V=S=DXZoE{Ss@>p0y)weB!d@6HRipYjdHk>=XN>EKT=6=$!@d*Pu>SE0r^R%ao(` z(y@|iHOf*W+mWNum_)BJITT3J^@RcVtN2iQ_2&w!56Xw7bAIQQ=-fg2mD7E~exzNA zD1jV*bt9JsC`K+kc5JBbv_}E2ES=m5WtlmKz%a1gfZw4%E5H&B6BC0WwOO3>Fs%g- zSJr?^1v!8)VXwHizEzwy*_`i7Y6GF=zXD}*7qy`G;MWn^E@R41G7jb}M@kucFndfj zEWIT2gnG+k4jo&yC&@DY!@RgX8ETi^L zoTD^T1^2Nq4WJh!X~l&5X~+}}fx%&8)HqCSH}kMP)mv1RhnOR#{z^Lh^cbK6mpL@|8mfvO!z}QlCA-Uy@V?}dUxc^>< zGz<;ANjMS+p<8%Qi@LJ@g8romg6iAIEmWiad2$RyRqT3Iw1UzYd#Ms9Jj-&ca=rV1 z{akn~dx=&M6NKQ$rMzvl%WpUbYGCrI=VvFZnJJE1GR)8a7QP2kyt$E-buO!pK8k0O z2*n3J8YC-6KOhv%k+kc-`IAT=i~JIV>;||H)?YzN&6e436vpb7i(;=tYNbo_phTt$ zT$6Ai?fdkeW*<{SdO<&|piENrnH5=0t!LhatfV>SIMMF^*%PifdmyQ1K#|ZKBVBV0 zs$uj8J{m5X4_85c#UYho+1;c*;}=N?m%8cliS5HaymGs8G;j$zvN#Wr|?y@DR+=sJY9uQeCTUfVS=07Ka5hADf{3e zed)e&z98|FeiJ`7n!};w_sM}A(%7gNA+8;`Gy3PGj^l$I`G@Edp2GiE3*d3H!TgC< zfyU-nP`oGfmp*I!d7WJe_@mRRzu+*QNgQdH?#gTyTMtBt(lD-l;K3XFCExKHy1Nq@ zHb3@z^k(LQYA1c|SsX*3B6hB6(V+r%AHQUkyhTssZ_xkJQ_p+4xENGm2@Xauaz6(m zvKw?Gt4bh5QUiuD0Fs2yC9G?s)L~1YKr}S*ahvp6;lffevH|$p`B1_h6Nct0_kz0tYnnC^~D0)nZ4)y6Q_k3l(xPcjPHb+e0^9#O~=<+|BJT8e?_R9q& zK9iqL6>Z4m4{ndCmC1OG{C?2jrMD4UadCK_4r|Itsm@)^cABZ=9>2=|jLR1a&J=Gs zz?FrO%X=~0Ge^^xBq=shsnV87U365DXPj{^2pz};WK`h>06147D^6}*31qN~EsZV} zKA1R0U1k*1chx!U0M;qD{3B69^yDe;I|g{=Xk%P4PiYIv-vwxFIh8Wf5839yI;5|Q z5z`zi>k4g>Ri|J3|I%T>QO{yRjg){l09+BWh{s#QHBvy0rAaZgk(~H=V?^6F8|a?^ zF9FO2by%?@lm+5zK9sZ^EC55qjzp0<Mn{FOPHZ^%Cu zHT?Nca~6W-FM0xn=3j6=jWTuxyR38cxT7$cDF(J=J35oDHjMB>nEYqR1~l^AT9gJR zf!u9%A!N>eW#{R-E2||(0xg`TGQ^P<=3rb}@`yV(&X*ae;IJ$imCsZKLiQ^tQ*VBcVPvteAVv~80pP&5c`}ZkFzCqOTyEKm1s#PgH;^S z8Mu^G7hhS7(3z4 zqq2eH#epGw-=M0RBWB@(|JjaGh$v=9gyKFy&hMz0yamRtHQIA?2n@8-6mq%3)D~qK4{=H zIVlv)ax_(JAz7W2lo$Dz9>B1*B(k+d0|OTwWOg2HVlGrVFp)hgP5xg5$iny62(~8* z$+#+3vJA%kjV->ai(KbjG($$9mH(Q9gAVK;slvh z-=yr}s4Vr>U_tYfcU9aB_T(E=uVn81h-SPP^d!FjR)R$twDZBahT@6wov?&549utFmb`Jn;7u=dLgWtTDd ze>1vYzIMk*ekT`OeR1KE&EZFFd*K~3*nC^8&JjIi7Cb9kIBa#6Q>^HvutLR&P-hJFCeAc z=BO%gr>_$ABJLFc=r6jn#8@{X$7h%Wu!qKJ1lakgVoeQXG|6^C-doozm;d+B@WBWr zpb5x8I{-Y)n~4e{#c@n&I>4sy1Cjnfi!P<+2h6;1`W#;j=Ah%~!dASGWz2W8>ur(< zs;pb;O~VEvTf7XkmW)$Z`%K;ny$1?en&y0>j2aa5b9<3`?N^tuBz}Zsn;$2G_zU2! zJw(%kaP<2Ng9aKHe>uOmdcX4H$$zx!rVDi(7!4HV92-Zx*TSy;tR{CF%o`&9asZSi zYlO#n(k`>tXGRmtKpe+G?_}^*8h*=*Vh2$5L$IK9FGm2n<2ltJ2R~J%uI41(f-iob zM*sW<&L~nE4eCAR8p>c`Akwej_?H#qmWYFa*bzv}{u`nSQr=l%=42+!*4+P*w@n79 zV5|B7SD(3$`DQ9Z*@l&JTW~LpI|YUBC>-Pf{kCzEUixwQd1JF8)!`>| zAjjzuyx|mGGB<<7hl^4Y8zkb6ZvCoMIt<~?FzNqCLiZd?Qo_^gK8W;CIKThU4e}ds z4b#@C(9&TgTv%9ZFUni!pb(tX!7z`s(Z_FT!(?jQW0qb_H`1D1+FSxN6n zF?G6H_sI!4AOs7+^?hm>hpDeG1z+Kk0?qhWvJthh6tmrf$&-7-{y$}J+8lKVYMMS* zz~jf2Lp_Q8gwRi>KS?>ZXlpJ?EzO~`uij>64!AaiNqUdcI2ii71F*&1u{MN$b1b+5 zJ|Z+GP0K$@qK1pw8xw5ljL$`BM7*->{U0)bOU2>2u24P|-s)>}tuadD3Nd*nwuVXN z#9e7YDq~-QqrliDuy3Zs*qxd}^7>U(Q3mH)4z-7*GcDwouJk5+bvAX^woh82rMqOC zh8kQ{117yhGEQ`-54>H2l;yvP;yHfrApB*RtG4a)B<{fASjaxc-OCLza_7 z4cpw%GBe*g>kDB>tg07mMbK08QtNkk>GIdKYoOe1!0VUaqdKev^@b|7bk0E)p2?;B zMWAw!XpdEJT0)w+T=3S@lTU@{N_6-{-!%J9mgx2 zmmsrNMSJX83=r1-@0^(dTmY>=*37%uE2fYa!T)LUn`lrA_)F9k7W9s1(Mn+*<}5MW zVe+2$d-s?I^Ro?UBdx7_txEmVX*HzFwg-=ok9oGQ7H5jdMYGm8=-enKVGfIHCzZ${ zfs-)r_FUX*R^*^vqDq489!22zYm^wSz&Jm_0QHa&98ttV1AB7O7y#Sm#?f8E3#DLD zm%@wBOJ5u~CfJ*FzM^h)Qx9p#{f8O5{_+4DUc8$I;dulM)mqbZ!0BxoPcExTE_N5ajd=6*Mdc)aUT(umcMP# zzZx_by0~p#t;%UihHYyZOsb?W;?l3*&WmV+z4|I1=k)A0GuI#J8yXwWutXj$oeY{z@cN8Z z$fd$ZIXmdbDWfRO{5;ri#W5ZWgw^H+yW76oD^Z$&|7W||5|rHPf4aKdL52gW*Y~~g zWE<^xJkCs|CWNI+3+94W8p>s-U&cifT;4V-29*O|oz0Mcdx*|= z*k@MsXXNk5=Ih^PN(EoiDd^9r=Df(BA3r{CC2uXwxqu)4D#;C584UT+#**?Nqm;)R zASUQXWtJxN<^|_qC6Ie!5Gn40lGugfe8W8Ff5PZc9NGDIASm|i1{4(2CJIwvZP6Q{BobO)mop8iI{ z(y(X@kj*r-UC9#f-Ox{(GR@f(4EP$y@d1ThaDx`2ifYE{t4+Y@%T*N|lKKp~Hu>L_ z6bg>4CUJUm0*@x1=JCbaJgKzi-3%?B9C<#;7d2HTG~ByvQ%P2_4HAo5C2@q`?jVbK zRbJE|N6h^o$zftXx}c6S-DCj)0k?}Wp0jZQ=!VF1^!jfD*LCm5m+57Byuae(<2T?f zh2bX}1W_z;s`z&YH12-lx4Qas`uUztI%9nT5+B?DO@w#ZTi^`Br9SW81b#~DntHe0 zRtA=S%`HyNb=Q%}2tRdfT=b2ixhmMNWGb$ZMz6IY+3DIlwh~*nf>V-X85_q`juH^L zgFCKFa|rc@dfse{JONjn=MAnn?6@Uq73_&N(z@DkaX6v@oEtiWd57RRFc`LrLyz>D zJM|4>IE!=0f4CIG^_Bl+7m$>OSLSBp=jZN_jh!s{Oaa~S% zr9XiE(^1R>j%>9)4gwpE_1vGji$3?UFRyDRrJ06e`ImC~ZrDW|kp9QWU{c5Ru)}FY z4h&!g39?GE==>$H5n*HLGgoqj3Y|O2aXy~@SO6{c5wvR383CS2ob`{xf_fc7*gT^+ ziVk{XfJrQU<`WJcUKuMZui;}a-zcQt%_6Mv56t%r^#vP@vhHkU5yv2qXDgHm{kAuL zm8cn_i`c)(aHX0{V_~+13)%iYeZ1_R@R-?owNB=~+WA2EJRMG!DpmC#yNifibBL&Q ze{VkykKS?y#^d(12n!V;X{yrv6?%#5w`}@tex1HBX!TO+Tv`Vdba!b9pZehV6GbB$ z)Oxa1K7P{PE_8HqV%n^4>gZS-;}BdvJVD5&|NG>Gl@m!%Pp=7*qYg(OZqJV}(Ee1P z9R9k1ui;=ZR+Ggc`K2|ogVHPFZQiZ!aZFCGhK7dH;b!5NgjeivretGl2UhL7F9gc5 zFg`Tw-%T**i@k#1pq+m9ghI3C`;6HCCP5=5B$<$EnGCO7oT^&xto6`^}V*J+6GeG^ZHy-JeFc>&A*GFliSl< zfBFc&wc5_4`SeDn^RBE3w)Wl&>bc%W@w7={T2Es2`<%!ZIL@W;bTbL*GzBpNrg7buUh! zn>yvc+KLweagmLn7DH-PY=%sNPHmfAZlfu2&vO9ZPp-+JIr~dhPwO+hfkr+7ZLk`9!#2e}5BB z(TRe!w%&shde3J5a1Yh*UABOojiW%fEqqV#eGdNI$Ds_>jsm;i`hqamy$%iZn?7ua zc{ ze&e%S5*qt~i8!9?U)Gih6D^%?e*G}lE(4enP2|#_{v|GXb0Ol31Z}&(B=^2leduO; zK!oREYexkoVwjyB+!Z(ersj^vW4rCm+#576us@1bCHSsm%k+=7gpyLp3@L6)W!Z^c zA>&V_?Cyz&(TRuWqjt}4Wb@gOTRw=!toNy6d|q**tZvOh$}z8!H1YDPr91!VsA%@A z70KGZ0SmU$ijL@KvuJ~^#4a-rk7?PSNeXdb!6S_!`&X7YGP}IFqTplh#W_n31;R&+g&;dGV1wZ77;^)auJAQ5r%aEG4e}Y@tcnQC=lEGYR=X@%qEa>`3 z7tkPdiLE(1E4x38keq9TDkhx!v!x~CXO2fi^jn^k@%z2}*mIcg^GiZDL-5KX*SD_* z5+kMkYDKUs|F;hZ+3UFMV?D997TX7(5!qtdC1&QCt*oaW?klu{Hg>R!Z}+rCJ#QBUx;xS&Utg4@Pi!f} z>gRddn~)Q+yHC}-vBP|J%vgR)cnqxQUu*diLwzsXBPNXQr+tSh9+Z{iD;4`LL52C_qOAikYbm~jPySl_!^?4@Y~+#)fF4d#rDvg-c$;fG6%nZj(j39{ZCKJeN41GsbdkI0I@ z2B<>WhVNFpb9czMJ&|&ILV^XL>grR4?t+1m{olE!xKiCJW*)t|Dth$=Rp_x=p?%-{W<3fVt&a#SH=BL_H*5C&A zM4n45uz}j7;`Y1Rg3mlK@mFoXnaSpU*U%^b z=Zo9UKJ*#H#Bb24l)qaBH{+(n(_yqMY$capZIyXpKq@JP7N<4}f%|h-+z#qnW*m`; z9uj#)MaBKB=9LfCgh|a`h$H7O1t*$+RaE@a@X^8+rySn>-t^|x3wnBbY&B}S8I2bg zPA|*e7|LyR6TDD0BPK>qU#DjneyT-9*Gd|bV&q<4sVdj?WOzdex4m8nuXo%Vfp zeK@EZ$1car;{Vh3z(M8s*Tdo{y8;2av~hi4VgOlL=b+B^=U3rhv>IF5Y{CVSytUN$ zd8+5=7Q3ibBlA$nq^j#xwToA8azc&hEp?n^QV+kZeFJw2VVKHBtrukSpt&qt22 zEsd9;_LoiDbERSoq?vlpuR0{W1o3Lo-Sin5`?J$p|0C^U=}bV|udU}7pTMh$g}0s0 zsq?z+74Z*}{+)MrzMnxXrvyWFN*HnfTMi@ywAw3zNN$SAg0cR^1_JpXDx$Jt{K?(D zOsqQvDk(#x(o%?D-^b5^FK%&FN6pJra}Y! zTa}hE9(-0-B4`?_CzWRmi8tqWO3|bH(O~6|M+l@$t^2;}jt&l|n2>w(w1MU8h3AfZ z+AcMWPDe2KF9ODGbWz2LeN$xVi2Onv&Vv7HugNJ^Ey8PU2)}50Kf!wGLa?nV#EdAU z&~3$Br0!xxQFBBKXp z%P)pDy_Q!#$}w6U9*|njg`9<}^2me2O!pInM|Fmr#3)}BsF9atlybOGrPPzIkeO>J zQ4=nw{?D%6>{Xd)4M#n+ypaE7z6yp<+)U50o3?x%GM~N|WC@ zYXMuy02BptZijD1j~iz?wjiaYOiRm+=R>z#`pu^tyYY%K&I7blvmaA2Fk{&5ZNd&p z{h|-8hBSV%zi0<==m(J!a7CTuxgYn&K0m&{ZgU;;R~EXOiMaoZj)v^Q{##;WDnw!_ z941zB@?ac-$OyczQ5^W^?me4am<2wmn`i ze?1;Xuvxywu6K4u7V}F=C@sa%)YJ_L3As7#!CL$U!V74Ub^92}5wf{y5)$$5PS7M23*{VlsrkjaoMWTdC)Fz2Lk| zk)@3#*tLPD#_tw{Gncke+b@T@S%E$NKMN7_XThz`yVo9EB#AZoAxacd+*GbqJ?X}p z%G@WwRJhmbmEL)q*|}LiZ@ArqB?2Bz=gJavPvBW|%f5h204u)SUmw@i*T+XVH~#$T z_-%1&e0NN5^0VXZ`IngID`huGwh{b}5k8;$<@NLax4sj~KIeF>1}*wboQ523j3s4d zz{k6*uNCeWW4WN6;pB*$(O~vQvkCDzImQ?7-!THD`QVR$UJuGp4Ww$1A(!NjO`cUX(8HKxo39L};%?%LXpbUl(IFOK|K)y2FV zbu5Me7TvK{N`8=ift}=EuF0+EAeq&+@-2CW_P4AYYStZYie3YRa?6aW+DTWvLwB!~ zs;C_23yvVIoGI|tTCsGK;?#_=i^4NP{=VhbYbt2Qk;(rCnJ%HIe)mTxId!re2Rr-k z3EwBj?>cy#)ToF#Zd;LpcYFDT3(}CMkd_vYj>|$e9ApGI#Q4$a>lYvY2RD7hY^tuI zVauHyPA0T8JH^#&Xlq~GcRv5KGOzQY7fM;YV(RL6zNaX@qU!4Ej2)c06Rn4=oWv$X zDND&lBQUR}M%zMqfgTwP;SB{SwnQL#4wgiI$mES+oikY`Pvg{zS|od|^Y01{{8u=) zUO^l#YlnL1{W|Bjs1xc$H0H@xxGNl&S69`(&pw!>yr;&iZV()YX3tX(R}cLm68>{n zQ>x^TDmY#y zEiLUG-5C67YOOSBxVh`$IKe?(ol4Q@By%p#4X(S!%g*vS*?fDIDo;W27xq9js ze)u0gYF(@g!FcCHy|dL@(?_U-vEkOV1Ft|+fMX>-WN(8kMKXEEa8LASE z3?(d+@5oL`A+WMOlndetlfO^GW3#V3f`^EY zwkw11)wi^>qd`@p3(z$(nrLx8{Ay)YS}equD*BO|yV`b@pM-=&?l=gWuH&a*Zc7FU zi8l9Sn+Nw;v}HyH=gh3dpgF#H|C}W9N0%!2!EqxQ{Bz|MG})LdS!0W$aY`@hD$DY} zD84Td9bZ2A>tSjT_Wt0ImI>o>DeJg^G>lhuAQ73R_?}7GINU@`$ zNE^84?sK^+^i4=L9*W!8k(jMCwt3&`Kw=6P=CW%cq9epIME_R{kh1FNmEA7mnz-tn zv?jGW7df__1(bobzz9!TPg|1NA+emCx#`|m5uuU9>p z2Ws{lZ}tajE69AOrL`-w9ilv$5n%BS7X>RCFKD{ZsXPn$q3_95k6O<}JCk`D7^ zKdw{^dqhowtQv2?*Y`29)G8eg8Cx9tJpJs6SO}4jk~ehn?bl1zUfXZizgJa3x#(gq z$#-r8$w()526r65F;GUD7oL3Hdr8Z=0+^nJK2)%*<*t$`K7QUCud~9BFhRcSEWW{^ zh&2Yj8{9Thqn~A-Y>P+oN4z^rx%^HU?dTnkN)GlAwCi4o@Y-yy0W{!HD|}qY zAWP7(@>|=lNG^QXW!7GiwK9Zr*P#SrQh4}llv{s8cp26ycH&0pM8=RhqIzk{_CR_L z-%YSb#nIp0@Ch(MXi50&4a_2T1z_4HBl$ZsmbclZ|o zfq^_}85wyU9XX|?rLAf@ZCi#23SrT@`Nh2S*n{`BdTVWiO)c?K1HIKcC-0_QQr;cv zE`B4{bIV6{B4ss>l4A7#i7eMdJUiE1xhlb|s@384Oy?D;9!Z?1?Rml5e7@09kB*KC*F%9yMXp)SpFP(ZBA0#*x4#W z&`FnO$HF-)YbmL+mK$K2F`zI)0`xAuZ{&6vnJ(9z`X71ZE4u^_UAO`Z%I`rlsE(6hFxhvCUa%t z_&(_Ogj!zp&J?Ab4y#Fc%EDJiK@LL)Llb ziAfRUZDiDY*VHS>YGF%o(7Mo~Y0NBO3g5;9j)m%ExCfm0cus&k=&WlKAe$~Gi?HTi zM>hd``H6GW3B8?*8TjXTFS{R*-K(4J)+a{pV?f^qjwlRVZQ9|bWGb2&$Gy%#aCamq zM9LC=qWq*P_`@$CPeWP#*DVZF$n_iXq#KPAd=(;GOM`@aT$tF!i?o7#WFcVb` zFN{Ik{jcxtSkM22THJ>E-k=oywD_C6R$H7K>-&KL%jh;A;$5_?ClU*ZWPlZsj>sC{ zG+A(zNU^l#wit0lTu=Pw2;L^jP-RIL{Ek<#UL}w+mjbdd#5Y>GXE__CbfPFvsXl30 zuTQ+CuTKAUhPZXGUMoXG|ttgW96DvIV`5}*?&A+xBD2Tn>U)VW4N3p zpt$43(r?iLx8+raz3>WGwi6@i&YkgXFUMM)_24-h@+r?deKyGW?~ba*o;fo6BTWxO zp$0)jFJ>61^%FP&)*J;nt^J)aalSR7cmG5PLO(D~p8`jTg&gHU5adJPY8aN5i%(0ORX*0Hjsq{@1edvuGbhR}#H*XDx z))H%MK95$lO`+mQK z|5MagMzztcZMQr{iaWvGt+>0pyAxcC7T4hJ4#kTXw-$H!DAr zHEZ_leaj{H!0biwuFtnu5#xLGs{y-KE;TmgV=QIzAa+eLV<0X7LPemF?w@bzFysr?%|&@P``L(4{)IKIo6WH&##pBBbA88hS! z4S25!wiFxXgzv`lhZ8KysuG z)(7}6w=v?seM@kH6KXoxS}TuQ!vOql{Yr-5n?eOJf%a_CQ%H7}}|QsaV~1i)nhQiK(NBuP!3xPeJp+E|>FKVb(F=;5jG&qB-kiGh8WihmO( zH*2T`DeYKw+#f%G(p)N<)UnRvJrT54te7?HgM8jCh8B622cmUcIB%rM%bCd>-~7>( ztaOoEA^6e#5`Pg^Pa=!*oLFF98L;7t(S2`D>I0vKUJ2~U5!697L?1*i9zlw6_P%~kl`xUtJ zYst6Kv;Lf2T{Wbr!cn|cPLZ)sl4s)-?C(5#ie?pjK`>b1Hnk2XC-AuE!1*IZRAo)7 zi;+batC~+1%LF5aerH3Bd4xbcP_&D&necKq3Ghj;vEm>Y0&3W$> zelBq=cCSFnoS*3d6E(8?B@zGlb{_EuP-XQ`j*(Io_yc;9N$#cgV$LF^)6RVQ5MK>D^xYLqESJA2efhkm^j5>RM`4`T)7w zw=yg6aUDvO|ANYj@-q1}{mN~xa5qT$Os}i3>09fN@R2Q1H>MsJ7>hI&#z@zNyas(& z5SU8K%p^zRnGuH9b_avGv-3TArPEjl-fHbq&Q&4gT>DUwuJHP**y z%akV(tDY1WM>=rFoITdZtk5r*GD{2C8>#8|3SWA$O300*b;UgGFLYa2S%vGoZeUeA z*=|NfEX;g5g25^d)h(`{|7!N^W4ACTig?)`*+^=%H5WnYh3&PCw6e5p9O3oGD?Sk> zMuUn0LY{w_B#(}ZxX2E-Hm7aEw~%jftizpwP!iXN*ZaYBCd)X8O)WPz3@Pp_xAyb< zWM`NEGB7*{7Qia&kr|EL$E3f zBqYFCIXupmeoy{g=lv;n43nky&#|kA)_uz~A*p+VaYP3XG`e+m6*WkAn?UkDPjiN9`Knh-Kpm+q=Zj( z|1xlp$*D({H=zmu37Q{)P8}Nhw4Y(U)Zv11jp8B87e#7u=rAfAFy;BAPEWX-mL5e>mBr%i9YKT~y4@04xtz6?bj5ZV9-t|{{@~r8c z?zQI>-tGr@Ucm{Xrb_+p!YW$)_Z0tSaX#gWcHn(uqHY2?B2XSA-=yLh;G#(9sJ|~L zvaD}Q8y@sGx5Z*3WTBY=)x1aIP>fGVs?kGJH{&X)6jbjrqv4To;ulAdO1%7m;Gmhx zk6i$*cIX`EV;n^zfTYzcth|9!(_TI-4}2i-u(#7~EY9lH92R*w6o0NYLwrd$NIEF5SU5D&-g>Z;>GrKHQ|Ca#%J<7tve)7VDD1v$zXzG+ zNlW~X5OosqaecD7??U4WDo0g6=;IRI3 z5@OUXjw|Vkz2*Hfr2g&-&$*a!>NwhxrMcB+=<+`0_%o03sUzF)#M9jUYWR@eil<@sb&~4AhpE>NM#H&*$O*6sn^!TwlXx7h7=2 z%{hGj$Kb4!C!&4ul|<+Xk0aFk-qB8_0!rNaMB*P?k!0-7*|+aeGwi^ntxI4x>vw@< z&sGSpHm!bpAO6FX$t%BKe+RSbThVB2|E&fcKxRcY<#4=}OiJVRyXm150z6hTdyHp8G$FEu{ZZM;TO8vpPC#>FrH%yJP6eTOhe} z;M=HeT0Cxz; z8lQE_R(=O3_*S}L`uNR+8Sn*9Yj<<9s%=lIfIiLOD z>+t1~@lC1o!%!A!_sg*k*w;JDc^okKmM#R}aFTCb^cTzPtcIuk4`T^)-~Qv8kjLxz zK;&S2sS#)3mveC3I<3KY0hr?8aYBd4Hm;m%P#^C=S9&|u6{0GKVL%+_CSic&)qu5I-MJ2FDh~xr}~?=$NbU?dr4qxlq_aMYOBjy}0|ze0N=4f-?YFeFKmyg_QU{ z_@l$$MUVYL%I|zoS2ry7xYssnCCUN(%1L0orzbCs%C+nIR1mXulDIsEB_8jwyT0IN zcfl4Y6MT`c{1R$wYnT4`3L&qiC4C!0>kJt7yf~S>6`l^dVSm3G`heaq@t`wb8!$ZtLmknN^|LAh2K)ScOFS=bngfKaMZ3dQI5^O^ z>FeXe!(X(=(a}-x`D#|79#`4@Q$1}fd;{$v-;A8~W#`R{*k5#}IR#vI(-0Ww+prFx zS0B9+NIjpaMOH3}0;ivi^yNDPhtW1dorTlK(Xp8m-Hcj4d0~lv;Na+kC(Ye17ZIBH ztJ;*ub))6}tV*X!hb^Jr6NYr(SMQG7YOz=OYu{5K;mmtOxk1EIRqJ1j|vU4v{%kPJ#x;Y=~No9RNR?x6#rc^^$$**-X?if*8>I-Ji*bmmx+q!6X zM4Qr>ww~wbuFGixsGBvJBfgHDlXa)V_2b&v#wif0s%_u#-r;GEQA6X9r(4sf`j?nh z`_-=iP#X=^?(jG`D5I#q-j^(Q!y{878S2>)Kn)#ttL)h5}V>79t*p1dm$L5nVgpCYvTKdtLq}pd1_(d z)A26GA>Xvp0*Q6#@739X5pdlExvnpt(LUyy+ddg>hQFV%dn1o;h!75ow#+i1TyVME z++v4W7@N-MIP!53$$Q)&`}7T|BR*wpk5`>NCvSIiVhKuo_S?!i%KzHc{q}G3$r^Vy z*9AVQCNqnMshJG=KX7Y#c(^q%D+DGr8{Ij(7L4~2QNB4`q+tWW49oFV#rRrY!Dl8civQg@Yr=M#* zlLXThO{6Y$9|9-3^g6JxMs<<0A43HRkOo5%XE3Dp-j3=~HAnr56in6Bm7q_Omcy}D zk_mci!Q>3GFGmWC0~1?IFf+@`>3A6iHM8s((4*PIs$sXEI2~ywl_WRH$uoLM{~f>d ze<*9KB*~G`sKQ#~Zpeg?d!FE66}8546_LQwK+L0c@g~0sZ$C@Ax1aIJ_EZIBqtomJ z9&b}s4wjHx0E@tD{={BE9W+ehgx`N6si^JsLa#;c@g;*#a!H6~zB|O0be}B3tKGdW z@8pPor2bA4Kw`G96lC~(?m&;m@jGxChmBVcOx8~^Sl{#D1$gsg&YUZ*jbU)=)1<_G zZFDY^fu6uv>Q#%y;hsIAm8pmHap4kgZO#4Dr`hK}*WWHfFYkttzFp>h@}>}e`C}b0 zXp+9T`9^5t5w))RwdHta?Wc)gEBE?q#+A@5-o=Y^pGi8_EJSny$)4H6!vhF898Zmb zHjjp~E=OEe5I zdbu8AGD(&+r0qUQ4ThK;o@w@R=$NHc>Ryu4;OYw5Xgu)=j`cnAl#%o2v%qdi3LQm~ z;B}n@mt?1#bS8PCT*V5B%RZVSlfa4NaaO# zp=+Jx`&duwwco4tpdizFzG~u^QiKAn54<2Ucz7W0@jG+&-s|P?>m0{hpII6KpFK0z zof8EDvnGzgf*0ek0rxq+8Di^La-8$}>J``qEe>X5>C8XY4i^*av5=NJ5x{83-O8rs=Y*zU zh&#NPoTh^iEJemtFv@O3mGpYL@hlL8lO%Jv_X|vW#BY3xIygXd%B)b!>mBa)At%cB z6q$BOO*%21Hvmi7trm}e#d^r)l+*phHoc>U6bn1ca^z^S&DswT_qUFll}*Lk|i*mkko#pKP!y6 zltjWy;a%~J+JSNuA;##OO&{pJRBp#dwD4wFGM;-$Fh8Y8XH)8oCownk4Vf3&^>06 z9cNr9ardo6N0(a~;0F2H+5MBFb!XWiKgT0xXyucD!6_+BMYEN;dC1n*7HkbyhsU{vnOuw&-~}@J1u%_ zQ$wGm=3ON3qG5ARi%Rvo3hdH0DKRF!!)1k|;yCiTB!h!RuG6bJt#8~&arYCS56;Du zJ^y44{nk8{KHVLzkWh`T@Fg*3N^mj!edl+$eV31w#^&S3Ip@};Pi;pH^iFdTQAxu!f#O(w6mX$ zuf`FJjn)az^Q~RY)q{he@Q8@}%}_KDG4YW5mKILB1o^w2ot<1^|L~q3LWi}E zv=0nZcDoxwOwEv+?4;bOY&hwEd%r;8!O4)^z9PI-FvEGFPrP0fy5KY2E`Q&fbv zD$4WC7ix{}x=g;gIq;6`-o2shBV}6;e4AJBhK!V;0rp5i6(R5#jE5 zyFDHK{da4A1Q@P}O#Se18eab!2JjAF*X6Euw)Vn=<;2x(!uk3mo{iD$@I+n?M$mLP zp+w5l&A1ke@d?;nobv0O7UOS1yTzL+xE2Q|nw$%rCskl#kQKPI%DrDrK1Ng>0g7-$ z36UOTarz2Kad+`=TSpYve??c<%466XRO9a@yBm7Aq+S|{Amw9A*3T8DzLiJRL35=a zYk2)QFl1fee^W+NV8VPt@)xcxXJT=Fv4S7&YTB7?xBl>D@68+BEICOr&49nf-q88O zaUE^SIsFA-ma2DLX_-7cacLL}YcQJh%QeZ$v&JN8Ef689^(3$59`zMjf^FOD~m!PwYzS>Va(2W4Ut7#d=0GXFfcoAJa zkpc-|tec>uHZQ<);x)cmE)B2yOQr`Y$f!-m{rs zh+JI11aaC!R;foE-?mrSuD@<#cHddDqM&FsHLZTGDDAS)Yz$IOeyQraGHw%7azyFX z$Q+&$`5-+>*lp?Mm7AT-dAu;Mk%AMev%UZ~r-4LGZ6YMDr$1EhZe*Hx{2pK3FXjMVyeu-ieV@BkGYLu@ zXYELqTCyMP&sazMu8(S@8Uni0DVMJTofL-9Eg#iyg`{sN3Cz zUy%zbP))vwvXvezlPwkORdw6irZWjpPe({m03}_a{YH1p69LP(h2B458(V(shO zaadjK&94&??~u(bwK#nE(7uWshtmA{PjplUW9v?b9_4TZ20%!>I}GWOjbSqdr{PCQ z$-Nz9Pnj%?E9zhfgY6wQb(h?H%#<~)9=L^!^|p{fN>xA5QH$QmzOB@>o=Io=5kFN0 zf2yO)^2tvP$zn2?SE2owxBdCOzv5rmN+lF%)2Ua05|_Wit)CGNZsbb=Xv* z@?%=Mw0&fgnEZBw==R&EXirzF*00bGfO}X?+QrlR3(~EkQtf_(9V|=ZWYLFkJFmy4 zCXZ#Xao7jfNyzPB@vBlxQmr58o8=u1V|V{%y}5-24HJ{@@#AHwC`Y3_ zN_%kxAfG9`y8wcp;ddV#dTPLb0flLKz16#n1+|&RAfXd5mdqwZ# zrbRyV^jqXNGhbKReSt#`LnyO~1i8QcL?;gaR=mp(pmn zo}uW<~F6N zo8FkzIA+*I%{1rK8twQHh$ecFD#Q#Twhb?AN-qhw0aYl3Q(pgIVNLgY_5YDz>O^sb%E~GmM@K;Y{_yayEgAqKCA9|B-wrL&K>DuthFUev@4C(c zyXP0R#+!fs`3Jbw`g$`xE|9ZjtQ4S7Ngh)I1ctzAGq8F!-}eNB>r|#m;;I^HEcRSg zvyN{?RPVYJkfSJmF5Xdz)6dr$DUE)DoSSc;ltEz=Ns5b8Vq=w5H8g&v|EzIXTvPR@9&p`Oc=7X*CPJ=nBYt$HwpT-jBIG-7Ok?dwGC2Y7;J*eg1Phv!(z3FBj!xi3Uh^QtFmy1o7Ghd^@^!#{j=q0nl_6u_^FEa=Stf;f~loSTXF8&`w{KRHgHA4%2&UBRF-(}Lpwt3yd z33zI<@v%+x_haWQ@TeQ)z=DbNu7yaJm!l7SbA{dV*P)@vS#r|SwCz5B;NnoO-A`;R zXCG)v&cHkRF=N5a>9R6Gks~I58J3<~zafw##G~T_*(#eON>coXWz%!nQuQG6*lqm; zm?pU3ekk>*8|-2nH+JtA&6Sy3Kf%&S_sAc8hY0o#a+j)v5}WrpPLKb=_s>nYixY(9 zX||w}WIY37UC%dlfLeJINDU6lO;OX+7?<~c^lUU~^7UqYKEhAulq@D)lGsv;%F66O zGZv0Q2$Wfmiq5r%GvT9cgK1XNJl!K*^%E|tEzGXWX0lO8yj=P^{hkuAdQH_8idxXN1+gGmZkO{u6fADeIXvs~yCYyeYUduSOFf-E;5+K{vjPyGoG zJX@qU?@7AK-;9kb=KGPKMF%m4H5ZlWQbPJ~(;DXyGp;DY@Wx2wOOi`8gy(g8Rk5Te zm}^sIHU%=8xzp(or`52r)JVxK4Cf4oT%&-AdjArS!VB+a^Z~fcu|$I&(2ulz+=2lN z4V-`(6QLMAM3Z3vXlXITKVEE0)f%?{RdP8e6FyZ>EicQvxp4rFm%kuK_*MuPtu;rR zb&9XOogI)UsF@&!XWh~kik1`~aQy}jz4Ci{EgQMrWp!O`h*lU_1d5PNK3KJN=EP~ioDhZP58|5RDzOw+w;Rjy)ki8 zM8KSCHmY3-2ltR9a%8TgcvW?v6c^mEtdB^di8j9`oIJ8Ku#YT4NW2ROD%VsW{+BwV zY9mG1U7pvjw9mbPULP;K1&kkVQiP@001>3z_0cp4kPzCNSMBDBDkvZ^Gc)VjgFtN) zv;~HdU_whj;GdY}- z;>?_`!cdF$4|QWNtJ!_Po$>ZQ3n*Jv)QnP!ytRHg7#4e!eq3(lJ^s`Df`Oila-2P4 zp;0Qn1tSKMR*Y3*<1l(dEuW)`i4}f@hRn{zr)1=qo}JAU^J|K!1_#%X6DC-lWL~#O z6$@89maAljUcG{IkfB#~hjDKkE6kO}=_pOsm^^lBIeFwA-CMJgtdR&Z?EK4fA+!o? zny&D83dmPrY1H4E*$m@Rq+VV;W2=9mmi_p@NrbiT=%N;fK1oL_~G~+sV55WAIf!BXc*FiF0#V7GmT3FZuw#R@0aTH>2QGzUYp! zWdGM~dI!9$CkW-3=i|{fH4SaK?sp$909E3#6ew@h1KO>jy)m6HH8uGQ4~I;F4D-FU z;{@sI+ujqU`~{EgvbbsLcLA0HU}Q(fKY-Q9x$7S7>el4o?qUas#~45>q7?seZy7~! za;Gq&KwoSu};< zB;~n=%M#^JMd1W=Rim_uOp%xYg3x+6dPD7&fx*BJHi9DmC*Z-f11xi|7g4nNZKV_Q z`jriOWv+ZcYbq`y1D~b1Ps3QKfth5{sMmG1n_=T**Aaz)%Nzk2)I?-7hcW2V zlZCDQrZUubY~yS{aGR^;)I!!?tTd0U+gX;+D%h2_oNXt=8sivS+EthxAF-g3CKs$4 ztFjLwE$G$3U}jc2d2khY-5n#IdJGD`4iHDR^Nwo?*afu;M zrREwt?coxw=MQG>1>`cQ7^AI6HKj+AcVdRWV|J%6@e?!c2kzDn?gAzmf47; zhR;ssB~n2!P@(rQatbBLPnp*we?-3C5HB;28$b$7!}Pi+#&EK06Wzn)gzYald|mrT zvo<(Mugu2-n$gy7&+qkF#fkQ8*M(1O+jAO1JKec*& z%Jy*l65ZKcemkhmb=vC0QHm>%sc#Z|LhYN32U{>31Bh7E6uez%e4i{w4HP6UdUqU+ z*x<&t4t+Jc2D8KKgvL-=vw^KfF4sJ(`EtOKYzA z5Z2e=a7`#A?UwD*;k=97toZ<$_H#_&yH<35qg9x`8^UR+f4pmW_`TracdM++4a zWm=yCrsibmrMLqefDnnDyX-E8+`6zZOWj2CSvTbGjr-sCEyhTmz(QF}Ha0AT)|{Po zCv$MMS<5+oLhTGmIkF94n=Q(`XOzTk9ZM&rjpC^W4&GL1?%OCLW4YY6(IkKA>@F{y z&$4RjO4bm&EF00XJ&u~!cAfC!Cm{{n$(>SRyjJi__*FGDR zMmZKIrCe^=qQ%VE^$-3u@hGm$pnuFl@WGxcMC!bAl$Eg6h1>5p{XJb7#%rX^*fJ&;IeaBc80GAIIq503SIiWyxA`(~$oM5Gm=0 literal 70057 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 diff --git a/lessons/list/index.html b/lessons/list/index.html index fe056e21..37d929d5 100644 --- a/lessons/list/index.html +++ b/lessons/list/index.html @@ -35,7 +35,7 @@

    Seznamy #

    Důležitá vlastnost seznamů je, že se dají měnit.

    -

    Než vysvětlíme o co jde, připomeňme si jak fungují hodnoty, které se měnit +

    Než vysvětlíme, o co jde, připomeňme si, jak fungují hodnoty, které se měnit nedají – např. čísla, řetězce, True, False, None.

    Vyzkoušej si následující kousek kódu. Co je na něm „špatně“?

    kamaradka = 'Žaneta'
    @@ -61,7 +61,7 @@ 

    Seznamy

    A jak jsou na tom seznamy? Ty se měnit dají.

    -

    Základní způsob jak změnit seznam je přidání +

    Základní způsob, jak změnit seznam, je přidání prvku na konec pomocí metody append. Ta nic nevrací (resp. vrací None), ale „na místě” (angl. in place) změní seznam, se kterým pracuje. Vyzkoušej si to:

    diff --git a/lessons/prefer-return/index.html b/lessons/prefer-return/index.html new file mode 100644 index 00000000..0fbe7935 --- /dev/null +++ b/lessons/prefer-return/index.html @@ -0,0 +1,68 @@ +

    Vrátit nebo vypsat? +# +

    +

    Podívejme se teď na následující program, který vypíše obsah elipsy:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    return pi * a * b
    +
    +print('Obsah elipsy s poloosami 3 a 5 je', obsah_elipsy(3, 5), 'cm2')
    +

    Takový program se teoreticky dá napsat i s procedurou, tedy funkcí, která nic +nevrací. +Procedura může výsledek třeba vypsat na obrazovku:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    print('Obsah je', pi * a * b)  # Pozor, `print` místo `return`!
    +
    +obsah_elipsy(3, 5)
    +

    Program takhle funguje, ale přichází o jednu z hlavních výhod funkcí: +možnost vrácenou hodnotu použít i jinak než jen v print.

    +

    Funkci, která vrací výsledek, můžeš použít v dalších výpočtech:

    +
    def objem_eliptickeho_valce(a, b, vyska):
    +    return obsah_elipsy(a, b) * vyska
    +
    +print(objem_eliptickeho_valce(3, 5, 3))
    +

    ... ale s procedurou, která výsledek přímo vypíše, by to nešlo. +Proto je dobré psát funkce, které spočítané hodnoty vrací, +a zpracování výsledku (např. vypsání) nechat na kód mimo funkci.

    +

    Další důvod, proč hodnoty spíš vracet než vypisovat je ten, že jedna funkce se +dá použít v různých situacích. +Proceduru s print by nešlo rozumně použít tehdy, když nás příkazová +řádka vůbec nezajímá – třeba v grafické hře, webové aplikaci nebo pro ovládání +robota.

    +

    Podobně je to se vstupem: když použiju v rámci své funkce input, bude se +moje funkce dát použít jen v situacích, kdy je u počítače klávesnice a za ní +člověk. +Proto je lepší funkcím potřebné informace předávat jako argumenty +a volání input (nebo čtení textového políčka či měření čidlem robota) +nemít ve funkci, ale vně, v kódu, který funkci volá:

    +
    from math import pi
    +
    +def obsah_elipsy(a, b):
    +    """Vrátí obsah elipsy s poloosami daných délek"""
    +    # Jen samotný výpočet:
    +    return pi * a * b
    +
    +# print a input jsou "venku":
    +x = float(input('Zadej délku poloosy 1: '))
    +y = float(input('Zadej délku poloosy 2: '))
    +print('Obsah je', obsah_elipsy(x, y))
    +

    Samozřejmě existují výjimky: procedura, která přímo vytváří textový výpis +(např. tabulku), může používat print; funkce, která načítá textové informace +(jako ano_nebo_ne výše), zase input. +Když ale funkce něco počítá, nebo když si nejsi jistý/á, +je dobré ve funkci print ani input nemít.

    +

    None +# +

    +

    Když funkce neskončí příkazem return, +automaticky se vrátí hodnota None.

    +

    Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, +a znamená „nic“.

    +
    def nic():
    +     """Tahle funkce nic nedělá """
    +
    +print(nic())
    +

    Procedury v Pythonu vracejí právě toto „nic“.

    \ No newline at end of file diff --git a/lessons/variables/index.html b/lessons/variables/index.html index 6d880643..23db02b3 100644 --- a/lessons/variables/index.html +++ b/lessons/variables/index.html @@ -139,7 +139,7 @@

    Řešení

    i tady jen řeknu, že na to použijeme funkce. Detaily si vysvětlíme později; pro teď to budou kouzelná zaříkadla.

    -

    Pozor, záleží na typu hodnoty který chceš získat: text nebo číslo. +

    Pozor, záleží na typu hodnoty, který chceš získat: text nebo číslo. Vybírej pečlivě!

    -

    Chceš-li zjistit jestli funkce int umí daný řetězec převést na číslo, +

    Chceš-li zjistit, jestli funkce int umí daný řetězec převést na číslo, nejlepší je použít přímo funkci int.

    Ošetření chyby # @@ -151,7 +151,7 @@

    Další přílohy k try #

    Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

    -

    Často se to stává když píšeš nějakou obecnou funkci. +

    Často se to stává, když píšeš nějakou obecnou funkci. Třeba funkci na výpočet obsahu čtverce. Co se stane, když někdo zavolá obsah_ctverce(-5)?

    Převádění typů -# +#

    Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky. @@ -71,7 +71,7 @@

    Řešení

    …a jak si poradit s chybou, která nastane, když použiješ špatnou hodnotu, si řekneme později.

    Převádění a input -# +#

    Převádění typů se často používá při načítání vstupu, třeba takto:

    cislo = int(input('Zadej číslo: '))
    @@ -86,7 +86,7 @@ 

    Převádění a input # ╰────────────┬────────────╯ cislo = 42

    Matematické funkce -# +#

    Matematika je občas potřeba, takže se pojďme podívat, jak v Pythonu pracovat s čísly.

    @@ -121,7 +121,7 @@

    Převádění a input math.py, bude se snažit importovat sin z něho místo z předpřipravené sady matematických funkcí.

    Náhoda -# +#

    Nakonec si ukážeme dvě funkce, které vrací náhodná čísla. Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají @@ -150,7 +150,7 @@

    Převádění a input

    Pamatuj, když importuješ z modulu random, nesmí se tvůj soubor jmenovat random.py.

    A další -# +#

    Python dává k dispozici obrovské množství dalších funkcí a modulů, i když ne všem budeš ze začátku diff --git a/lessons/basics/index.html b/lessons/basics/index.html index ca513193..c4698f26 100644 --- a/lessons/basics/index.html +++ b/lessons/basics/index.html @@ -1,5 +1,5 @@

    Git -# +#

    Ať už programuješ nebo píšeš dokumenty, stává se, že vytvoříš několik verzí. @@ -29,13 +29,13 @@

    Git

    Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat že jde o příkaz.

    Instalace -# +#

    Popis instalace Gitu najdeš zde. Jestli jsi instalaci přeskočil/a, projdi si ji teď.

    Repozitář -# +#

    Každý projekt, který budeš verzovat, musí mít pro sebe vyhrazený adresář. @@ -62,7 +62,7 @@

    Repozitář A „nothing to commit” říká, že je adresář prázdný – nejsou tu žádné soubory k verzování.

    První revize -# +#

    Teď si zkus do Gitu něco přidat!

    Vytvoř soubor basnicka.txt a napiš do něj @@ -169,7 +169,7 @@

    První revize

    Tento příkaz nastaví aktuální terminál: když si otevřeš nové okno s příkazovou řádkou, bude ho potřeba zadat znovu.

    Druhá revize -# +#

    Udělej v básničce nějakou malou změnu – změň slovo, uprav interpunkci nebo přidej sloku. @@ -277,13 +277,13 @@

    První revize -Holka modrooká, nesedávej tam +Holka modrooká +Nesedávej tam

    Diagram -# +#

    Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládám tento diagram:

    Diagram revizí

    Log -# +#

    Teď, když máme za sebou první(ch) pár revizí, si ukážeme několik příkazů, které nám umožní se @@ -322,14 +322,14 @@

    Log napiš git show 5ff0b, kde místo 5ff0b uveď prvních několik čísel z označení revize.

    gitk -# +#

    Z příkazové řádky se dá vyčíst všechno potřebné, ale chce to trochu praxe. Někdy je přehlednější použít grafické „klikátko“ jménem gitk, které se dá spustit příkazem gitk --all:

    -
    $ gitk --all
    +
    $ gitk --all
     

    Tenhle program vypadá celkem šeredně (skoro jako by ho psali programátoři, které místo designu zajímá, co je @@ -338,7 +338,7 @@

    gitk udělej dalších pár revizí a koukni se na ně přes git log a gitk --all.

    Závěr -# +#

    A to je všechno, co z Gitu zatím budeš potřebovat. Vždycky, když uděláš git add soubor diff --git a/lessons/branching/index.html b/lessons/branching/index.html index 8be73081..15403799 100644 --- a/lessons/branching/index.html +++ b/lessons/branching/index.html @@ -1,5 +1,5 @@

    Větvení v Gitu -# +#

    Takže, Git už znáš! Teď to začne být trošičku složitější :)

    @@ -82,7 +82,7 @@

    Větvení v Gitu

    A až je některá větev hotová, může se začlenit zpátky do master. Podívejme se jak na to.

    Sloučení -# +#

    Nedávalo by smysl historii projektu rozdvojovat, kdyby pak jednotlivé větve nešly zase sloučit dohromady. diff --git a/lessons/circular-imports/index.html b/lessons/circular-imports/index.html index 3d42fc4c..11a08915 100644 --- a/lessons/circular-imports/index.html +++ b/lessons/circular-imports/index.html @@ -1,5 +1,5 @@

    Cyklické importy -# +#

    V domácích úkolech budeš rozdělovat piškvorkový projekt na několik modulů. Tento text si doporučuju číst až když narazíš na příslušný úkol, @@ -58,7 +58,7 @@

    Cyklické importy

    Téhle situaci se budeš chtít vyvarovat.

    Jak na to? Máš dvě možnosti.

    Organizace modulů podle závislostí -# +#

    První možnost je importovat funkci tah v modulu ai a používat ji odtamtud. @@ -75,7 +75,7 @@

    Organizace modulů podle závislost │ def tah │ │ def tah_hrace │ │ │ │ │ └──────────────────┘ └───────────────┘

    Pomocný modul -# +#

    Druhá možnost je definovat nový, sdílený modul, který se použije jak v piskvorky.py tak v ai.py.

    diff --git a/lessons/class/index.html b/lessons/class/index.html index efd512c4..40358206 100644 --- a/lessons/class/index.html +++ b/lessons/class/index.html @@ -1,5 +1,5 @@

    Hodnoty a objekty -# +#

    Než se dnes začneme zabývat třídami, podíváme na objekty.

    @@ -28,7 +28,7 @@

    Hodnoty a objekty Funkce len ale funguje i na objektech, které s řetězci nemají nic společného.

    Třídy -# +#

    Data každého objektu jsou specifická pro konkrétní objekt ("abc" obsahuje jiné znaky než @@ -64,7 +64,7 @@

    Hodnoty a objekty

    Například <class 'int'> obsahuje všechno, co je společné všem celým číslům: že (a jak) se dají sčítat, jak takové číslo převést na řetězec, a tak dále.

    Tvoření objektů třídy -# +#

    Většinu tříd jde navíc v Pythonu zavolat, jako by to byly funkce, a vytvořit tak nový objekt dané třídy:

    @@ -88,7 +88,7 @@

    Tvoření objektů třídy Třída tedy většinou obsahuje nejen „popis“, jak se její objekty budou chovat, ale „umí“ takové objekty i vytvořit.

    Vlastní třídy -# +#

    A proč najednou tolik informací o třídách? Protože si zkusíme napsat třídu vlastní.

    @@ -137,7 +137,7 @@

    Vlastní třídy volání Kotatko() vytvoří nový objekt tvé třídy, který už můžeš použít.

    Mňau!

    Atributy -# +#

    Objekty vytvořené z „vlastních“ tříd mají funkčnost, kterou třídy jako str nedovolují: máš možnost si definovat vlastní @@ -167,7 +167,7 @@

    Atributy micka.zamnoukej = 12345 micka.zamnoukej()

    Parametr self -# +#

    Teď se na chvíli vraťme k metodám. Konkrétně k parametru self.

    Každá metoda má přístup ke konkrétnímu objektu, na @@ -206,7 +206,7 @@

    Atributy mourek.jmeno = 'Mourek' mourek.snez('ryba')

    Metoda __init__ -# +#

    Co se stane, když koťátku zapomeneš nastavit jméno? Metoda zamnoukej přestane fungovat:

    @@ -245,7 +245,7 @@

    Atributy
    mourek = Kotatko('Mourek')  # 'Mourek' je hodnota prvního argumentu pro __init__ (po self)
     micka = Kotatko(jmeno='Micka')  # 'Micka' je hodnota argumentu `jmeno`
     

    Metoda __str__ -# +#

    Podobných „opodtržítkovaných“ (speciálních) metod je víc. Třeba metodu __str__ Python zavolá, když je potřeba diff --git a/lessons/click/index.html b/lessons/click/index.html index 310268af..dcd5b151 100644 --- a/lessons/click/index.html +++ b/lessons/click/index.html @@ -1,5 +1,5 @@

    click -# +#

    Knihovna click slouží k vytváření rozhraní pro příkazovou řádku (angl. command line interface, CLI). @@ -7,9 +7,9 @@

    click

    Click je dobré používat s knihovnou colorama, která se stará o obarvování textu na příkazové řádce ve Windows (a na Unixu nedělá nic). Nainstalujte si tedy obě:

    -
    $ python -m pip install click colorama
    +
    $ python -m pip install click colorama
     

    Argumenty příkazové řádky -# +#

    Nástroje na zpracování argumentů z CLI jsou i přímo ve standardní knihovně, a dokonce jich není málo: sys.argv, argparse, optparse, getopt. @@ -28,19 +28,19 @@

    click @click.option('--name', prompt='Your name', metavar='NAME', help='The person to greet.') def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" + """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo(f'Hello {name}!') if __name__ == '__main__': hello()

    Vyzkoušejte si ji! Máte-li ji uloženou jako hello.py, zkuste:

    -
    $ python hello.py
    -$ python hello.py --help
    -$ python hello.py --name Pythonista
    -$ python hello.py --count 5
    +
    $ python hello.py
    +$ python hello.py --help
    +$ python hello.py --name Pythonista
    +$ python hello.py --count 5
     

    Příkazy a přepínače -# +#

    Funkce s dekorátorem @click.command je příkaz – když ji zavoláte, click zpracuje argumenty příkazové řádky a zavolá původní funkci @@ -80,16 +80,16 @@

    click if __name__ == '__main__': hello() -

    $ python hello.py
    +
    $ python hello.py
     Hello world!
    -$ python hello.py --name Guido
    +$ python hello.py --name Guido
     Hello Guido!
    -$ python hello.py --name Jane -v
    +$ python hello.py --name Jane -v
     Hello Jane!
     Nice to meet you.
    -$ python hello.py -n 'Mr. Git'
    +$ python hello.py -n 'Mr. Git'
     Hello Mr. Git!
    -$ python hello.py --help
    +$ python hello.py --help
     Usage: hello.py [OPTIONS]
     
     Options:
    @@ -98,7 +98,7 @@ 

    click --help Show this message and exit.

    Přepínač --help přidává click sám.

    Argumenty -# +#

    Kromě přepínačů podporuje click i argumenty. Přepínače musí uživatel na řádce pojmenovat; argumenty se zadávají beze jména, @@ -112,7 +112,7 @@

    Argumenty
    @click.command()
     @click.argument('directory')
     def cd(directory):
    -    """Change the current directory"""
    +    """Change the current directory"""
         click.echo(f'Changing to directory {directory}')
     

    Proměnný počet argumentů se zadává pomocí nargs=-1 (0 nebo víc argumentů) nebo nargs=-1, required=True (1 nebo víc).

    @@ -122,11 +122,11 @@

    Argumenty @click.argument('source', nargs=-1, required=True) @click.argument('destination') def mv(source, destination): - """Move any number of files to one destination""" + """Move any number of files to one destination""" for filename in source: click.echo(f'Moving {filename} to {destination}')

    Soubory -# +#

    Má-li uživatel zadat jméno souboru, nepoužívejte řetězce, ale speciální typ click.File(). @@ -139,14 +139,14 @@

    Argumenty
    @click.command()
     @click.argument('files', nargs=-1, type=click.File('r'))
     def cat(files):
    -    """Print out the contents of the given files"""
    +    """Print out the contents of the given files"""
         for file in files:
             print(file.read(), end='')
     

    Existuje i varianta click.Path(), která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto poskytuje i jiné další typy.

    Validace vstupů -# +#

    Vstupy získané z přepínačů i argumentů lze ověřit pomocí vlastních podmínek a podle toho naprogramovat chování včetně @@ -173,7 +173,7 @@

    Validace vstupů if __name__ == '__main__': email()

    Podpříkazy -# +#

    Click má dobrou podporu pro podpříkazy známé z verzovacích systémů jako git: příkaz git sám o sobě nedělá nic, jen sdružuje podpříkazy jako git add @@ -195,7 +195,7 @@

    Validace vstupů for file in files: click.echo(f'Adding {file}')

    A další -# +#

    Tahle lekce není popis všeho, co click umí – je to jen ochutnávka, abyste věděli, co od téhle knihovny očekávat.

    diff --git a/lessons/cmdline/index.html b/lessons/cmdline/index.html index 57530a9c..2d2fcbcb 100644 --- a/lessons/cmdline/index.html +++ b/lessons/cmdline/index.html @@ -1,5 +1,5 @@

    Příkazová řádka -# +#

    V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, které programátoři používají na zadávání textových příkazů.

    @@ -51,7 +51,7 @@

    Windows

    >
     Ctrl++ a
     Ctrl+- (příp. se Shift).

    První příkaz -# +#

    Začněme ale příkazem, který je všude stejný. Napiš whoami (z angl. who am I? – kdo jsem?) @@ -69,7 +69,7 @@

    Windows

    > <
     takže ho nepiš sám/sama! Zadej jen whoami a Enter.

    Stejně tak počítač sám vypíše přihlašovací jméno.

    Aktuální adresář -# +#

    Příkazová řádka pracuje vždy v nějakém adresáři neboli složce (angl. directory, folder). @@ -94,7 +94,7 @@

    Windows

    > <
     části uvedeno který adresář zrovna ukazují.
     Příkazová řádka umí soubory ukazovat taky – ale musíš si o to říct.

    Co v tom adresáři je? -# +#

    Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) ti vypíše co aktuální adresář obsahuje: všechny soubory, @@ -115,7 +115,7 @@

    Windows

    > <
     05/08/2014 07:28 PM <DIR>  Music
     
     

    Změna aktuálního adresáře -# +#

    Aktuální adresář se dá změnit pomocí příkazu cd (z angl. change directory – změnit adresář). @@ -127,11 +127,11 @@

    Windows

    > <
     

    Používáš-li Windows, cd už jsi používal/a – tento příkaz se chová různě podle toho, jestli něco napíšeš za něj nebo ne.

    -

    Unix

    $ cd Desktop
    +                

    Unix

    $ cd Desktop
     $ pwd
     /home/helena/Desktop
     
    -

    Windows

    > cd Desktop
    +                

    Windows

    > cd Desktop
     > cd
     C:\Users\helena\Desktop
     

    Poznámka pro Windows

    @@ -139,26 +139,26 @@

    Windows

    > <
     například D: místo C:, je potřeba kromě cd
     zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    Vytvoření adresáře -# +#

    Co takhle si zkusit vytvořit adresář? To se dělá příkazem mkdir (z angl. make directory – vytvořit adresář). Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě zkouska:

    -

    Unix

    $ mkdir zkouska
    +                

    Unix

    $ mkdir zkouska
     

    Windows

    > mkdir zkouska
     

    Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

    -

    Unix

    $ cd zkouska
    +                

    Unix

    $ cd zkouska
     

    Windows

    > cd zkouska
     

    Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

    V grafickém hledátku -# +#

    Často nebudeš pracovat jenom s příkazovou řádkou. Vyplatí se umět aktuální adresář z příkazové řádky otevřít i v jiných @@ -195,7 +195,7 @@

    Unix

    $ 
                     

    Windows

    > cd
     C:\Users\helena\Desktop\zkouska
     

    Kopírování z příkazové řádky -# +#

    Na Linuxu vyber text myší a pak buď:

      @@ -207,7 +207,7 @@

      Windows

      > <
       

      Na Windows v menu příkazové řádky (ikonce vlevo nahoře) vyber EditMark, text vyber myší a zkopíruj pomocí Enter.

      Otevření v prohlížeči souborů -# +#

      Na Linuxu záleží na programu, který používáš. Buď:

        @@ -226,7 +226,7 @@

        Otevření v prohlížeči souborů

        Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na prohlížení adresářů: zjistíš, že se adresář opravdu vytvořil.

        Vkládání do příkazové řádky -# +#

        Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. @@ -240,10 +240,10 @@

        Vkládání do příkazové řádky

        Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš ", např:

        -
        $ cd "můj super adresář"
        +
        $ cd "můj super adresář"
         

        Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

        Pozorování změn -# +#

        Vyzkoušej si, že se v řádce projeví i změny, které na počítači uděláš jiným způsobem.

        @@ -255,7 +255,7 @@

        Vkládání do příkazové řádky

        Na počítači máš jen jednu sadu souborů, se kterou umí manipulovat jak grafické programy tak příkazová řádka.

        O úroveň nahoru -# +#

        A poslední věc: jsi-li teď v adresáři Desktop/zkouska (nebo Plocha/zkouska, Desktop\zkouska atp.), jak se dostat zpátky do Desktop?

        @@ -267,17 +267,17 @@

        O úroveň nahoru

        Nadřazený adresář má speciální jméno .., dvě tečky. Přejdi do něj zadáním cd .. a pak se ujisti, že jsi opravdu v Desktop:

        -

        Unix

        $ cd ..
        +                

        Unix

        $ cd ..
         $ pwd
         /home/helena/Desktop
         
        -

        Windows

        > cd ..
        +                

        Windows

        > cd ..
         > cd
         C:\Users\helena\Desktop
         

        Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

        Konec -# +#

        Příkazů existuje samozřejmě daleko víc.

        Když se je naučíš, můžeš z příkazové řádky plnohodnotně ovládat @@ -298,7 +298,7 @@

        Konec
        $ exit
         

        A tím je úvod do příkazové řádky hotový.

        Přehled -# +#

        Tady je tabulka základních příkazů, se kterými si do začátku vystačíš:

        diff --git a/lessons/collaboration/index.html b/lessons/collaboration/index.html index cff52fc2..d15b81dd 100644 --- a/lessons/collaboration/index.html +++ b/lessons/collaboration/index.html @@ -1,5 +1,5 @@

        Spolupráce -# +#

        „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým.

        @@ -18,7 +18,7 @@

        Spolupráce naucse/prezencka. Nasdílej s účastníky příkaz na jeho naklonování (přes https).

        Open Source -# +#

        Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. @@ -102,7 +102,7 @@

        Spolupráce Zveřejňovat zdrojový kód se hodí už jen pro to, aby ti s ním mohli zkušenější programátoři snadněji pomáhat.

        GitHub -# +#

        Na Internetu existuje spousta stránek, kam se dají nahrávat gitové repozitáře s kódem – např. GitLab, @@ -114,11 +114,11 @@

        GitHub

        Jestli ještě nemáš uživatelský účet na github.com, jdi tam a založ si ho.

        Naklonování repozitáře (git clone) -# +#

        Pro začátek zkusíme práci s repozitářem, který už vytvořil někdo jiný. V příkazové řádce zadej příkaz, který ti oznámí kouč; něco jako

        -
        $ git clone https://github.com/naucse/prezencka
        +
        $ git clone https://github.com/naucse/prezencka
         

        Vytvoří se ti nový repozitář – adresář se jménem prezencka, ve kterém je nějaký soubor.

        Na URL (adresu), kterou jsi v tomhle příkladě @@ -142,7 +142,7 @@

        Naklonování repozi
      • nesdílej nic, co nemáš právo sdílet (např. texty moderních písní).
      • Vytvoření větve -# +#

        Pomocí git branch zjisti, na jaké jsi aktuálně větvi. Měla by to být větev master.

        @@ -151,10 +151,10 @@

        Vytvoření větve Proto když chceš do projektu přispět, jako první krok si pro svůj příspěvek udělej novou větev a přepni se do ní. Například pomocí:

        -
        $ git branch pridani-jmena
        -$ git checkout pridani-jmena
        +
        $ git branch pridani-jmena
        +$ git checkout pridani-jmena
         

        Posílání změn (git push) -# +#

        Teď se do projektu zapoj. Přidej soubor pojmenovaný podle tvého jména (nebo přezdívky) @@ -213,7 +213,7 @@

        Vytvoření větve a kam se dají posílat změny. Seznam těchhle adres ti ukáže příkaz git remote -v. Třeba:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/naucse/prezencka (fetch)
         origin  https://github.com/naucse/prezencka (push)
         

        Tenhle výstup znamená, že pod zkratkou „origin” @@ -243,7 +243,7 @@

        Vytvoření větve https://github.com/tvojejmeno/prezencka v prohlížeči a ujisti se, že tam tvoje změny jsou.

        Žádost o začlenění (pull request) -# +#

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. @@ -276,7 +276,7 @@

        Žádost o začlenění < a pomocí git push tvojejmeno pridani-jmena pull request aktualizuj.

        Aktualizace (git pull) -# +#

        Když budou tvé změny – a změny od ostatních – začleněné, můžeš si aktualizovat lokální repozitář. (To je ten, @@ -295,7 +295,7 @@

        Aktualizace (git pu které většina programátorů dělá denně: udělání nějaké změny, odeslání kolegům na kontrolu a začlenění a stažení změn od ostatních.

        Hlášení chyb (issues) -# +#

        Občas nastane situace, kdy v nějakém projektu na GitHubu najdeš chybu, ale nemáš čas nebo @@ -311,7 +311,7 @@

        Hlášení chyb (issues

        README: Informace pro ostatní -# +#

        Pokud vytváříš projekt a chceš, aby do něj přispívali i ostatní, je potřeba aby věděli, co tvůj projekt dělá, k čemu se hodí, @@ -350,7 +350,7 @@

        Hlášení chyb (issues

        Licence -# +#

        Aby sdílení fungovalo i pro právní stránce, nestačí když nahraješ kus kódu na Internet. diff --git a/lessons/comparisons/index.html b/lessons/comparisons/index.html index cbfdc796..3f529682 100644 --- a/lessons/comparisons/index.html +++ b/lessons/comparisons/index.html @@ -1,5 +1,5 @@

        Porovnávání -# +#

        Pamatuješ si ještě, co je to operátor?

        V domácím projektu jsme si ukázali základní aritmetické operátory. @@ -75,7 +75,7 @@

        Porovnávání
        print(True)
         print(False)
         

        Podmínky -# +#

        Teď oprášíme program na výpočet obvodu a obsahu.

        Otevři si v editoru nový soubor. @@ -140,7 +140,7 @@

        Řešení

        takže když pak na jednom programu spolupracuje více lidí, musí se shodnout. No a na čtyřech mezerách se shodla většina Pythonního světa.

        Další podmíněné příkazy -# +#

        Někdy není else vůbec potřeba. V následujícím programu se nedělá nic navíc, pokud je číslo nenulové:

        @@ -168,7 +168,7 @@

        Řešení

        # Nenastala ani nedna ze situací výše – muselo to být záporné print('Pro návštěvy z budoucnosti bohužel nemáme nic v nabídce.')

        Zanořování -# +#

        Příkazy if se dají zanořovat (angl. nest). V odsazeném (podmíněném) bloku kódu může být další if s dalším odsazeným diff --git a/lessons/course.json b/lessons/course.json index a95d9914..bbc9f6af 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -1,7 +1,7 @@ { "api_version": [ 0, - 3 + 4 ], "course": { "description": "Seznam udržovaných lekcí bez ladu a skladu.", @@ -19,7 +19,23 @@ "content": { "path": "generators/index.html" }, + "ids": [ + "dalsi_pouziti_generatoru", + "delegace_na_podgenerator_codeyield_fromcode", + "generatory", + "iterace", + "obousmerna_komunikace", + "vraceni_hodnot_z_generatoru" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_pouziti_generatoru", + "#delegace_na_podgenerator_codeyield_fromcode", + "#generatory", + "#iterace", + "#obousmerna_komunikace", + "#vraceni_hodnot_z_generatoru" + ], "slug": "index", "solutions": [], "source_file": "lessons/advanced/generators/index.md", @@ -40,7 +56,17 @@ "content": { "path": "and-or/index.html" }, + "ids": [ + "emneboem_anebo_emaem", + "stastnabohata" + ], "license": "cc-by-sa-40", + "links": [ + "#emneboem_anebo_emaem", + "#stastnabohata", + "naucse:page?lesson=beginners/comparisons", + "naucse:page?lesson=beginners/exceptions" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/and-or/index.md", @@ -61,7 +87,31 @@ "content": { "path": "basic-functions/index.html" }, + "ids": [ + "a_dalsi", + "matematicke_funkce", + "nahoda", + "prevadeni_a_codeinputcode", + "prevadeni_typu", + "solution-0", + "uzitecne_funkce", + "vstup_a_vystup" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#matematicke_funkce", + "#nahoda", + "#prevadeni_a_codeinputcode", + "#prevadeni_typu", + "#uzitecne_funkce", + "#vstup_a_vystup", + "https://cs.wikipedia.org/wiki/Radi%C3%A1n", + "https://docs.python.org/3/library/functions.html", + "https://docs.python.org/3/library/math.html", + "https://github.com/pyvec/cheatsheets/raw/master/basic-functions/basic-functions-cs.pdf", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -86,7 +136,17 @@ "content": { "path": "circular-imports/index.html" }, + "ids": [ + "cyklicke_importy", + "organizace_modulu_podle_zavislosti", + "pomocny_modul" + ], "license": "cc-by-sa-40", + "links": [ + "#cyklicke_importy", + "#organizace_modulu_podle_zavislosti", + "#pomocny_modul" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/circular-imports/index.md", @@ -107,7 +167,29 @@ "content": { "path": "class/index.html" }, + "ids": [ + "atributy", + "hodnoty_a_objekty", + "metoda_code__init__code", + "metoda_code__str__code", + "parametr_codeselfcode", + "tridy", + "tvoreni_objektu_tridy", + "vlastni_tridy" + ], "license": "cc-by-sa-40", + "links": [ + "#atributy", + "#hodnoty_a_objekty", + "#metoda_code__init__code", + "#metoda_code__str__code", + "#parametr_codeselfcode", + "#tridy", + "#tvoreni_objektu_tridy", + "#vlastni_tridy", + "naucse:page?lesson=beginners/functions", + "naucse:page?lesson=beginners/inheritance" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/class/index.md", @@ -129,7 +211,43 @@ "content": { "path": "cmdline/index.html" }, + "ids": [ + "aktualni_adresar", + "co_v_tom_adresari_je", + "konec", + "kopirovani_z_prikazove_radky", + "o_uroven_nahoru", + "otevreni_vprohlizeci_souboru", + "pozorovani_zmen", + "prehled", + "prikazova_radka", + "prvni_prikaz", + "vgrafickem_hledatku", + "vkladani_do_prikazove_radky", + "vytvoreni_adresare", + "zmena_aktualniho_adresare" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualni_adresar", + "#co_v_tom_adresari_je", + "#konec", + "#kopirovani_z_prikazove_radky", + "#o_uroven_nahoru", + "#otevreni_vprohlizeci_souboru", + "#pozorovani_zmen", + "#prehled", + "#prikazova_radka", + "#prvni_prikaz", + "#vgrafickem_hledatku", + "#vkladani_do_prikazove_radky", + "#vytvoreni_adresare", + "#zmena_aktualniho_adresare", + "naucse:static?filename=linux-file-browser.png", + "naucse:static?filename=macos-file-browser.png", + "naucse:static?filename=windows-cmd-properties.png", + "naucse:static?filename=windows-file-browser.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/cmdline/index.md", @@ -163,7 +281,22 @@ "content": { "path": "comparisons/index.html" }, + "ids": [ + "dalsi_podminene_prikazy", + "podminky", + "porovnavani", + "solution-0", + "zanorovani" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_podminene_prikazy", + "#podminky", + "#porovnavani", + "#zanorovani", + "http://en.wikipedia.org/wiki/George_Boole", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -188,7 +321,24 @@ "content": { "path": "def/index.html" }, + "ids": [ + "cviceni", + "definice_funkce", + "definice_funkci", + "kcemu_jsou_funkce", + "solution-0", + "vraceni_ukoncuje_funkci" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#definice_funkce", + "#definice_funkci", + "#kcemu_jsou_funkce", + "#vraceni_ukoncuje_funkci", + "naucse:page?lesson=beginners/functions", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -215,7 +365,27 @@ "content": { "path": "dict/index.html" }, + "ids": [ + "a_to_je_zatim_ke_slovnikum_vse", + "iterace", + "jak_udelat_slovnik", + "meneni_slovniku", + "slovniky", + "typy_klicu_a_hodnot", + "zapln_prazdny_slovnik" + ], "license": "cc-by-sa-40", + "links": [ + "#a_to_je_zatim_ke_slovnikum_vse", + "#iterace", + "#jak_udelat_slovnik", + "#meneni_slovniku", + "#slovniky", + "#typy_klicu_a_hodnot", + "#zapln_prazdny_slovnik", + "https://docs.python.org/3.0/library/stdtypes.html#mapping-types-dict", + "https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/dict/index.md", @@ -236,7 +406,13 @@ "content": { "path": "dict-with-list-values/index.html" }, + "ids": [ + "vice_hodnot_vjednom_zaznamu_slovniku" + ], "license": "cc-by-sa-40", + "links": [ + "#vice_hodnot_vjednom_zaznamu_slovniku" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/dict-with-list-values/index.md", @@ -257,7 +433,24 @@ "content": { "path": "exceptions/index.html" }, + "ids": [ + "dalsi_prilohy_kcodetrycode", + "druhy_chyb", + "nechytej_je_vsechny", + "osetreni_chyby", + "vyjimky", + "vyvolani_chyby" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_prilohy_kcodetrycode", + "#druhy_chyb", + "#nechytej_je_vsechny", + "#osetreni_chyby", + "#vyjimky", + "#vyvolani_chyby", + "https://docs.python.org/3/library/exceptions.html#exception-hierarchy" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/exceptions/index.md", @@ -278,7 +471,13 @@ "content": { "path": "expressions/index.html" }, + "ids": [ + "vyhodnocovani_vyrazu" + ], "license": "cc-by-sa-40", + "links": [ + "#vyhodnocovani_vyrazu" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/expressions/index.md", @@ -299,7 +498,23 @@ "content": { "path": "files/index.html" }, + "ids": [ + "automaticke_zavirani_souboru", + "iterace_nad_soubory", + "psani_souboru", + "solution-0", + "soubory" + ], "license": "cc-by-sa-40", + "links": [ + "#automaticke_zavirani_souboru", + "#iterace_nad_soubory", + "#psani_souboru", + "#soubory", + "https://en.wikipedia.org/wiki/UTF-8", + "naucse:page?lesson=beginners/str", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -327,7 +542,17 @@ "content": { "path": "first-steps/index.html" }, + "ids": [ + "interaktivni_rezim_pythonu", + "prvni_prikaz", + "ukonceni" + ], "license": "cc-by-sa-40", + "links": [ + "#interaktivni_rezim_pythonu", + "#prvni_prikaz", + "#ukonceni" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/first-steps/index.md", @@ -348,8 +573,17 @@ "content": { "path": "fstring/index.html" }, + "ids": [ + "metoda_format", + "sablony_formatovaci_retezce" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#metoda_format", + "#sablony_formatovaci_retezce", + "https://docs.python.org/3.6/reference/lexical_analysis.html#formatted-string-literals" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/fstring/index.md", @@ -370,7 +604,31 @@ "content": { "path": "functions/index.html" }, + "ids": [ + "argumenty", + "delka_retezce", + "funkce", + "funkce_je_potreba_volat", + "pojmenovane_argumenty", + "prehled_funkci", + "procedury", + "solution-0", + "volani_funkce_jako_vyraz" + ], "license": "cc-by-sa-40", + "links": [ + "#argumenty", + "#delka_retezce", + "#funkce", + "#funkce_je_potreba_volat", + "#pojmenovane_argumenty", + "#prehled_funkci", + "#procedury", + "#volani_funkce_jako_vyraz", + "naucse:page?lesson=beginners/basic-functions", + "naucse:solution?solution=0", + "naucse:static?filename=call-anatomy.svg" + ], "slug": "index", "solutions": [ { @@ -399,7 +657,19 @@ "content": { "path": "hello-world/index.html" }, + "ids": [ + "prvni_program", + "spusteni" + ], "license": "cc-by-sa-40", + "links": [ + "#prvni_program", + "#spusteni", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install", + "naucse:page?lesson=beginners/install-editor", + "naucse:page?lesson=beginners/venv-setup" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/hello-world/index.md", @@ -420,7 +690,20 @@ "content": { "path": "inheritance/index.html" }, + "ids": [ + "dedicnost", + "generalizace", + "polymorfismus", + "prepisovani_metod_a_codesupercode" + ], "license": "cc-by-sa-40", + "links": [ + "#dedicnost", + "#generalizace", + "#polymorfismus", + "#prepisovani_metod_a_codesupercode", + "https://en.wikipedia.org/wiki/Liskov_substitution_principle" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/inheritance/index.md", @@ -441,7 +724,16 @@ "content": { "path": "install/index.html" }, + "ids": [ + "instalace_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu", + "naucse:page?lesson=beginners/install&page=linux", + "naucse:page?lesson=beginners/install&page=macos", + "naucse:page?lesson=beginners/install&page=windows" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install/index.md", @@ -455,7 +747,24 @@ "content": { "path": "install/linux.html" }, + "ids": [ + "check-tkinter", + "doinstalovani_virtualenv", + "instalace_pythonu_3", + "instalace_pythonu_na_linux", + "install-virtualenv", + "kontrola_tkinter" + ], "license": "cc-by-sa-40", + "links": [ + "#check-tkinter", + "#doinstalovani_virtualenv", + "#instalace_pythonu_3", + "#instalace_pythonu_na_linux", + "#install-virtualenv", + "#kontrola_tkinter", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "linux", "solutions": [], "source_file": "lessons/beginners/install/linux.md", @@ -470,7 +779,15 @@ "content": { "path": "install/macos.html" }, + "ids": [ + "instalace_pythonu_pro_macos" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu_pro_macos", + "http://brew.sh", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "macos", "solutions": [], "source_file": "lessons/beginners/install/macos.md", @@ -485,7 +802,26 @@ "content": { "path": "install/windows.html" }, + "ids": [ + "download", + "instalace", + "instalace_pythonu_pro_windows", + "stazeni", + "zjisti_jestli_uz_mas_python_nainstalovany" + ], "license": "cc-by-sa-40", + "links": [ + "#download", + "#instalace", + "#instalace_pythonu_pro_windows", + "#stazeni", + "#zjisti_jestli_uz_mas_python_nainstalovany", + "https://www.python.org/downloads/windows/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/venv-setup", + "naucse:static?filename=windows_32v64-bit.png", + "naucse:static?filename=windows_add_python_to_path.png" + ], "slug": "windows", "solutions": [], "source_file": "lessons/beginners/install/windows.md", @@ -514,7 +850,21 @@ "content": { "path": "install-editor/atom.html" }, + "ids": [ + "instalace_atomu", + "kontrola_stylu_zdrojoveho_kodu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_atomu", + "#kontrola_stylu_zdrojoveho_kodu", + "#nacvik_odsazovani", + "#nastaveni", + "https://atom.io", + "https://www.python.org/dev/peps/pep-0008/" + ], "slug": "atom", "solutions": [], "source_file": "lessons/beginners/install-editor/atom.md", @@ -529,7 +879,21 @@ "content": { "path": "install-editor/gedit.html" }, + "ids": [ + "instalace_geditu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_geditu", + "#nacvik_odsazovani", + "#nastaveni", + "https://wiki.gnome.org/Apps/Gedit", + "naucse:static?filename=gedit_indent.png", + "naucse:static?filename=gedit_linenums.png", + "naucse:static?filename=gedit_prefs.png" + ], "slug": "gedit", "solutions": [], "source_file": "lessons/beginners/install-editor/gedit.md", @@ -544,7 +908,28 @@ "content": { "path": "install-editor/index.html" }, + "ids": [ + "co_programatorsky_editor_umi", + "ide", + "instalace_editoru", + "volba_a_nastaveni_editoru" + ], "license": "cc-by-sa-40", + "links": [ + "#co_programatorsky_editor_umi", + "#ide", + "#instalace_editoru", + "#volba_a_nastaveni_editoru", + "https://eclipse.org/", + "https://www.jetbrains.com/pycharm/", + "https://www.kdevelop.org/", + "naucse:page?lesson=beginners/install-editor&page=atom", + "naucse:page?lesson=beginners/install-editor&page=gedit", + "naucse:page?lesson=beginners/install-editor&page=kate", + "naucse:page?lesson=beginners/install-editor&page=notepad-plus-plus", + "naucse:page?lesson=beginners/install-editor&page=others", + "naucse:page?lesson=beginners/install-editor&page=vscode" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install-editor/index.md", @@ -558,7 +943,18 @@ "content": { "path": "install-editor/kate.html" }, + "ids": [ + "instalace_kate", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_kate", + "#nacvik_odsazovani", + "#nastaveni", + "https://kate-editor.org/get-it/" + ], "slug": "kate", "solutions": [], "source_file": "lessons/beginners/install-editor/kate.md", @@ -573,7 +969,18 @@ "content": { "path": "install-editor/notepad-plus-plus.html" }, + "ids": [ + "instalace_notepadu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_notepadu", + "#nacvik_odsazovani", + "#nastaveni", + "https://notepad-plus-plus.org/" + ], "slug": "notepad-plus-plus", "solutions": [], "source_file": "lessons/beginners/install-editor/notepad-plus-plus.md", @@ -588,7 +995,26 @@ "content": { "path": "install-editor/others.html" }, + "ids": [ + "cislovani_radku", + "instalace_editoru", + "kontrola_stylu_zdrojoveho_kodu", + "nacvik_odsazovani", + "nastaveni", + "obarvovani", + "odsazovani" + ], "license": "cc-by-sa-40", + "links": [ + "#cislovani_radku", + "#instalace_editoru", + "#kontrola_stylu_zdrojoveho_kodu", + "#nacvik_odsazovani", + "#nastaveni", + "#obarvovani", + "#odsazovani", + "https://www.python.org/dev/peps/pep-0008/" + ], "slug": "others", "solutions": [], "source_file": "lessons/beginners/install-editor/others.md", @@ -603,7 +1029,24 @@ "content": { "path": "install-editor/vscode.html" }, + "ids": [ + "instalace_visual_studio_code", + "nacvik_odsazovani", + "nastaveni", + "odesilani_telemetrickych_dat", + "stazeni_a_instalace" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_visual_studio_code", + "#nacvik_odsazovani", + "#nastaveni", + "#odesilani_telemetrickych_dat", + "#stazeni_a_instalace", + "https://code.visualstudio.com/", + "https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting", + "https://privacy.microsoft.com/en-us/privacystatement" + ], "slug": "vscode", "solutions": [], "source_file": "lessons/beginners/install-editor/vscode.md", @@ -635,7 +1078,19 @@ "content": { "path": "interfaces/index.html" }, + "ids": [ + "rozhrani", + "rozhrani_funkce", + "vyzkousej_si_to" + ], "license": "cc-by-sa-40", + "links": [ + "#rozhrani", + "#rozhrani_funkce", + "#vyzkousej_si_to", + "naucse:static?filename=tkui.py", + "naucse:static?filename=yn.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/interfaces/index.md", @@ -663,7 +1118,40 @@ "content": { "path": "list/index.html" }, + "ids": [ + "dalsi_zpusoby_jak_menit_seznamy", + "mazani_prvku", + "meneni_prvku", + "meneni_seznamu", + "nemenitelne_hodnoty", + "razeni", + "seznam_jako_podminka", + "seznamy", + "seznamy_a_nahoda", + "seznamy_a_retezce", + "tvoreni_seznamu", + "vybirani_ze_seznamu", + "zname_operace_se_seznamy" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_zpusoby_jak_menit_seznamy", + "#mazani_prvku", + "#meneni_prvku", + "#meneni_seznamu", + "#nemenitelne_hodnoty", + "#razeni", + "#seznam_jako_podminka", + "#seznamy", + "#seznamy_a_nahoda", + "#seznamy_a_retezce", + "#tvoreni_seznamu", + "#vybirani_ze_seznamu", + "#zname_operace_se_seznamy", + "https://github.com/pyvec/cheatsheets/blob/master/lists/lists-cs.pdf", + "naucse:page?lesson=beginners/str-index-slice#slicing-diagram", + "naucse:static?filename=methods.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/list/index.md", @@ -688,7 +1176,25 @@ "content": { "path": "local-variables/index.html" }, + "ids": [ + "lokalni_nebo_globalni", + "lokalni_promenne", + "prirazeni", + "rada_na_zaver", + "skryvani_detailu", + "solution-0", + "zakryvani_jmena" + ], "license": "cc-by-sa-40", + "links": [ + "#lokalni_nebo_globalni", + "#lokalni_promenne", + "#prirazeni", + "#rada_na_zaver", + "#skryvani_detailu", + "#zakryvani_jmena", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -713,7 +1219,15 @@ "content": { "path": "main-module/index.html" }, + "ids": [ + "negativni_testy", + "spousteci_moduly" + ], "license": "cc-by-sa-40", + "links": [ + "#negativni_testy", + "#spousteci_moduly" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/main-module/index.md", @@ -736,7 +1250,62 @@ "path": "micropython/index.html" }, "css": ".part-green { outline: 2px solid hsla(113, 100%, 50%, 1);\n background-color: hsla(113, 100%, 50%, 0.25); }\n.part-cyan { outline: 2px solid hsla(180, 100%, 50%, 1);\n background-color: hsla(180, 100%, 50%, 0.25); }\n.part-blue { outline: 2px solid hsla(236, 100%, 50%, 1);\n background-color: hsla(236, 100%, 50%, 0.25); }\n.part-yellow { outline: 2px solid hsla( 60, 100%, 50%, 1);\n background-color: hsla( 60, 100%, 50%, 0.25); }\n.part-orange { outline: 2px solid hsla( 42, 100%, 50%, 1);\n background-color: hsla( 42, 100%, 50%, 0.25); }\n.part-red { outline: 2px solid hsla( 0, 100%, 50%, 1);\n background-color: hsla( 0, 100%, 50%, 0.25); }\n.pull-right, .pull-left { margin: 1em; }\n.highlight { background-color: hsla( 0, 100%, 50%, 0.1); }\n.img-fluid { max-width: 100%; }\n.highlight-nocolor{ background-color: hsla( 60, 100%, 50%, 0.75); }\n.highlight-red { background-color: hsla( 0, 100%, 50%, 0.25); }\n.highlight-green { background-color: hsla(113, 100%, 50%, 0.25); }\n.highlight-blue { background-color: hsla(236, 100%, 50%, 0.25); }\n", + "ids": [ + "barevna_svetylka", + "dalsi_ovladani", + "instalace", + "linux", + "macos", + "micropython_na_malem_zarizeni", + "micropython_taky_python", + "napeti", + "obvod", + "pousteni_kodu_ze_souboru", + "poznamka_o_napajeni_a_napeti", + "rotace", + "solution-0", + "tony_a_melodie", + "velice_rychle_blikat", + "vstup", + "vystup", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#barevna_svetylka", + "#dalsi_ovladani", + "#instalace", + "#linux", + "#macos", + "#micropython_na_malem_zarizeni", + "#micropython_taky_python", + "#napeti", + "#obvod", + "#pousteni_kodu_ze_souboru", + "#poznamka_o_napajeni_a_napeti", + "#rotace", + "#tony_a_melodie", + "#velice_rychle_blikat", + "#vstup", + "#vystup", + "#windows", + "http://docs.micropython.org/en/latest/pyboard/pyboard/tutorial/repl.html", + "http://kig.re/2014/12/31/how-to-use-arduino-nano-mini-pro-with-CH340G-on-mac-osx-yosemite.html", + "http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html", + "https://en.wikipedia.org/wiki/Hertz", + "https://en.wikipedia.org/wiki/UART", + "https://onedrive.live.com/?authkey=%21AKLO1lLajaeTmo4&id=182EF9BC3A8BDDA4%2166743&cid=182EF9BC3A8BDDA4", + "https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf", + "https://tzapu.com/ch340-ch341-serial-adapters-macos-sierra/", + "naucse:solution?solution=0", + "naucse:static?filename=circuits/led_bb.svg", + "naucse:static?filename=circuits/led_bb_off.svg", + "naucse:static?filename=nodemcu-devkit.jpg", + "naucse:static?filename=nodemcu-popisky.svg", + "naucse:static?filename=noty.py", + "naucse:static?filename=putty-config.jpg", + "naucse:static?filename=usb-ttl.png" + ], "slug": "index", "solutions": [ { @@ -786,7 +1355,19 @@ "content": { "path": "modules/index.html" }, + "ids": [ + "adresar_pro_kazdy_projekt", + "moduly", + "vedlejsi_efekty", + "vlastni_moduly" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdy_projekt", + "#moduly", + "#vedlejsi_efekty", + "#vlastni_moduly" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/modules/index.md", @@ -807,7 +1388,13 @@ "content": { "path": "nested-list/index.html" }, + "ids": [ + "vnorene_seznamy" + ], "license": "cc-by-sa-40", + "links": [ + "#vnorene_seznamy" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/nested-list/index.md", @@ -828,7 +1415,13 @@ "content": { "path": "nested-traceback/index.html" }, + "ids": [ + "vypisy_chyb_ze_zanorenych_funkci" + ], "license": "cc-by-sa-40", + "links": [ + "#vypisy_chyb_ze_zanorenych_funkci" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/nested-traceback/index.md", @@ -849,7 +1442,15 @@ "content": { "path": "prefer-return/index.html" }, + "ids": [ + "none", + "vratit_nebo_vypsat" + ], "license": "cc-by-sa-40", + "links": [ + "#none", + "#vratit_nebo_vypsat" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/prefer-return/index.md", @@ -871,7 +1472,22 @@ "path": "print/index.html" }, "css": ".err-lineno {\n display: inline-block;\n background-color: #FCC;\n}\n.err-exctype {\n display: inline-block;\n background-color: #CFC;\n}\n", + "ids": [ + "dalsi_prikazy", + "jak_cist_chyby", + "jak_funguje_program", + "print_a_chybove_hlasky", + "print_a_vyrazy" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_prikazy", + "#jak_cist_chyby", + "#jak_funguje_program", + "#print_a_chybove_hlasky", + "#print_a_vyrazy", + "naucse:page?lesson=beginners/variables" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/print/index.md", @@ -892,7 +1508,13 @@ "content": { "path": "range/index.html" }, + "ids": [ + "range_sekvence_cisel" + ], "license": "cc-by-sa-40", + "links": [ + "#range_sekvence_cisel" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/range/index.md", @@ -913,7 +1535,17 @@ "content": { "path": "reassignment/index.html" }, + "ids": [ + "prepisovani_promennych", + "prepisovani_vcyklu", + "solution-0" + ], "license": "cc-by-sa-40", + "links": [ + "#prepisovani_promennych", + "#prepisovani_vcyklu", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -938,7 +1570,19 @@ "content": { "path": "recursion/index.html" }, + "ids": [ + "kontrolovane_zanoreni", + "lokalni_promenne", + "pro_matematiky", + "rekurze" + ], "license": "cc-by-sa-40", + "links": [ + "#kontrolovane_zanoreni", + "#lokalni_promenne", + "#pro_matematiky", + "#rekurze" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/recursion/index.md", @@ -960,7 +1604,32 @@ "content": { "path": "str/index.html" }, + "ids": [ + "cviceni", + "novy_radek", + "sekvence_se_zpetnym_lomitkem", + "solution-0", + "trojite_uvozovky", + "uvozovky", + "uvozovky_vuvozovkach", + "zapis_retezcu", + "znaky", + "zpetne_lomitko" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#novy_radek", + "#sekvence_se_zpetnym_lomitkem", + "#trojite_uvozovky", + "#uvozovky", + "#uvozovky_vuvozovkach", + "#zapis_retezcu", + "#znaky", + "#zpetne_lomitko", + "naucse:solution?solution=0", + "naucse:static?filename=quote-comic.svg" + ], "slug": "index", "solutions": [ { @@ -989,7 +1658,30 @@ "content": { "path": "str-index-slice/index.html" }, + "ids": [ + "cviceni", + "sekani_retezcu", + "slicing-diagram", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "vyber_znaku", + "vyber_zretezcu" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#sekani_retezcu", + "#vyber_znaku", + "#vyber_zretezcu", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4" + ], "slug": "index", "solutions": [ { @@ -1026,7 +1718,23 @@ "content": { "path": "str-methods/index.html" }, + "ids": [ + "a_dalsi", + "inicialy", + "metody", + "retezcove_funkce_a_metody", + "solution-0" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#inicialy", + "#metody", + "#retezcove_funkce_a_metody", + "https://docs.python.org/3/library/stdtypes.html#string-methods", + "https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -1051,7 +1759,22 @@ "content": { "path": "testing/index.html" }, + "ids": [ + "instalace_knihovny_pytest", + "psani_testu", + "spousteni_testu", + "testovaci_moduly", + "testovani" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_knihovny_pytest", + "#psani_testu", + "#spousteni_testu", + "#testovaci_moduly", + "#testovani", + "naucse:page?lesson=beginners/install" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/testing/index.md", @@ -1072,7 +1795,17 @@ "content": { "path": "tuple/index.html" }, + "ids": [ + "kdy_pouzit_seznam_a_kdy_varnvar-tici", + "male_varnvar-tice", + "varnvar-tice" + ], "license": "cc-by-sa-40", + "links": [ + "#kdy_pouzit_seznam_a_kdy_varnvar-tici", + "#male_varnvar-tice", + "#varnvar-tice" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/tuple/index.md", @@ -1093,7 +1826,28 @@ "content": { "path": "variables/index.html" }, + "ids": [ + "ctverec", + "komentare", + "kruhy", + "mensi_ctverec", + "nacitani_vstupu", + "promenne", + "solution-0", + "solution-1" + ], "license": "cc-by-sa-40", + "links": [ + "#ctverec", + "#komentare", + "#kruhy", + "#mensi_ctverec", + "#nacitani_vstupu", + "#promenne", + "naucse:page?lesson=beginners/print", + "naucse:solution?solution=0", + "naucse:solution?solution=1" + ], "slug": "index", "solutions": [ { @@ -1121,7 +1875,24 @@ "content": { "path": "venv-setup/index.html" }, + "ids": [ + "adresar_pro_kazdou_lekci", + "aktivace_virtualniho_prostredi", + "nastaveni_prostredi", + "prepnuti", + "priprava_adresare", + "virtualni_prostredi" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdou_lekci", + "#aktivace_virtualniho_prostredi", + "#nastaveni_prostredi", + "#prepnuti", + "#priprava_adresare", + "#virtualni_prostredi", + "naucse:static?filename=dirs-00.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/venv-setup/index.md", @@ -1146,7 +1917,17 @@ "content": { "path": "while/index.html" }, + "ids": [ + "oko_bere", + "solution-0", + "while" + ], "license": "cc-by-sa-40", + "links": [ + "#oko_bere", + "#while", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -1171,7 +1952,15 @@ "content": { "path": "with/index.html" }, + "ids": [ + "kontext_codewithcode_a_codefinallycode", + "kontrola_vyjimek" + ], "license": "cc-by-sa-40", + "links": [ + "#kontext_codewithcode_a_codefinallycode", + "#kontrola_vyjimek" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/with/index.md", @@ -1192,7 +1981,25 @@ "content": { "path": "zip-enumerate/index.html" }, + "ids": [ + "enumerate_ocislovani_sekvence", + "iteratory_n-tic", + "rozbalovani_v_cyklu_for", + "solution-0", + "solution-1", + "zip_longest_pro_ty_co_chteji_vsechno", + "zip_vic_iteraci_najednou" + ], "license": "cc-by-sa-40", + "links": [ + "#enumerate_ocislovani_sekvence", + "#iteratory_n-tic", + "#rozbalovani_v_cyklu_for", + "#zip_longest_pro_ty_co_chteji_vsechno", + "#zip_vic_iteraci_najednou", + "naucse:solution?solution=0", + "naucse:solution?solution=1" + ], "slug": "index", "solutions": [ { @@ -1221,7 +2028,23 @@ "content": { "path": "http/index.html" }, + "ids": [ + "http_jak_funguje_internet", + "http_metody", + "pozadavek_a_odpoved", + "url-anatomy", + "webove_adresy" + ], "license": "cc-by-sa-40", + "links": [ + "#http_jak_funguje_internet", + "#http_metody", + "#pozadavek_a_odpoved", + "#webove_adresy", + "https://en.wikipedia.org/wiki/List_of_HTTP_status_codes", + "https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html", + "naucse:static?filename=url-anatomy.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/http/index.md", @@ -1246,7 +2069,23 @@ "content": { "path": "install/index.1.html" }, + "ids": [ + "poznamky", + "unix_linux_macos", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#poznamky", + "#unix_linux_macos", + "#windows", + "https://docs.python.org/3/library/venv.html", + "https://packaging.python.org/tutorials/managing-dependencies/", + "https://pipenv.readthedocs.io/en/latest/", + "https://virtualenvwrapper.readthedocs.io/en/latest/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/install/index.md", @@ -1267,8 +2106,14 @@ "content": { "path": "yaml/index.html" }, + "ids": [ + "o_formatu_yaml" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#o_formatu_yaml" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/yaml/index.md", @@ -1290,7 +2135,34 @@ "path": "basics/index.html" }, "css": ".green { color: #0a0; }\n.red { color: #a00; }\n.yellow { color: #a50; }\n.strong { font-weight: bold; }\n.blue { color: #0aa; }\n", + "ids": [ + "diagram", + "druha_revize", + "git", + "gitk", + "instalace", + "log", + "prvni_revize", + "repozitar", + "zaver" + ], "license": "cc-by-sa-40", + "links": [ + "#diagram", + "#druha_revize", + "#git", + "#gitk", + "#instalace", + "#log", + "#prvni_revize", + "#repozitar", + "#zaver", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=git/install", + "naucse:static?filename=diagram.svg", + "naucse:static?filename=dropbox.png", + "naucse:static?filename=gitk.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/basics/index.md", @@ -1321,7 +2193,18 @@ "content": { "path": "branching/index.html" }, + "ids": [ + "slouceni", + "vetveni_v_gitu" + ], "license": "cc-by-sa-40", + "links": [ + "#slouceni", + "#vetveni_v_gitu", + "naucse:static?filename=branch1.png", + "naucse:static?filename=branches.png", + "naucse:static?filename=merge.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/branching/index.md", @@ -1352,7 +2235,67 @@ "content": { "path": "collaboration/index.html" }, + "ids": [ + "aktualizace_smallcodegit_pullcodesmall", + "github", + "hlaseni_chyb_smallemissuesemsmall", + "licence", + "naklonovani_repozitare_smallcodegit_clonecodesmall", + "open_source", + "posilani_zmen_smallcodegit_pushcodesmall", + "readme_informace_pro_ostatni", + "spoluprace", + "vytvoreni_vetve", + "zadost_o_zacleneni_smallempull_requestemsmall" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace_smallcodegit_pullcodesmall", + "#github", + "#hlaseni_chyb_smallemissuesemsmall", + "#licence", + "#naklonovani_repozitare_smallcodegit_clonecodesmall", + "#open_source", + "#posilani_zmen_smallcodegit_pushcodesmall", + "#readme_informace_pro_ostatni", + "#spoluprace", + "#vytvoreni_vetve", + "#zadost_o_zacleneni_smallempull_requestemsmall", + "http://choosealicense.com/", + "http://creativecommons.org/choose/", + "https://bitbucket.org", + "https://choosealicense.com/licenses/agpl-3.0/", + "https://choosealicense.com/licenses/cc-by-sa-4.0/", + "https://choosealicense.com/licenses/mit/", + "https://chromium.googlesource.com/chromium/src.git", + "https://cs.wikipedia.org/wiki/Markdown", + "https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software", + "https://en.wikipedia.org/wiki/Richard_Stallman", + "https://github.com", + "https://github.com/", + "https://github.com/GNOME/gedit", + "https://github.com/Microsoft/vscode", + "https://github.com/aosp-mirror", + "https://github.com/atom/atom", + "https://github.com/django/django", + "https://github.com/jupyter/notebook", + "https://github.com/kennethreitz/requests", + "https://github.com/matplotlib/matplotlib", + "https://github.com/mitsuhiko/flask", + "https://github.com/mozilla/gecko-dev", + "https://github.com/naucse/prezencka", + "https://github.com/numpy/numpy", + "https://github.com/pytest-dev/pytest/", + "https://github.com/python/cpython", + "https://github.com/pyvec/naucse.python.cz", + "https://github.com/torvalds/linux", + "https://gitlab.com/", + "https://launchpad.net/", + "https://opensource.org/licenses", + "https://pagure.io/", + "https://www.gnu.org/gnu/manifesto.en.html", + "naucse:static?filename=gh-workflow-diagram.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/collaboration/index.md", @@ -1377,7 +2320,45 @@ "content": { "path": "git-collaboration-2in1/index.html" }, + "ids": [ + "aktualizace_codegit_pullcode", + "git_a_github", + "log_codegit_logcode", + "open-source_a_free_software", + "posilani_zmen_codegit_pushcode", + "prace_s_lokalnim_repozitarem", + "prvni_revize_codegit_commitcode", + "spoluprace_a_git", + "spoluprace_na_projektu", + "stav_repozitare_codegit_statuscode", + "zadost_o_zacleneni_pull_request" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace_codegit_pullcode", + "#git_a_github", + "#log_codegit_logcode", + "#open-source_a_free_software", + "#posilani_zmen_codegit_pushcode", + "#prace_s_lokalnim_repozitarem", + "#prvni_revize_codegit_commitcode", + "#spoluprace_a_git", + "#spoluprace_na_projektu", + "#stav_repozitare_codegit_statuscode", + "#zadost_o_zacleneni_pull_request", + "https://choosealicense.com", + "https://creativecommons.org", + "https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software", + "https://en.wikipedia.org/wiki/Richard_Stallman", + "https://github.com", + "https://github.com/asgeirrr/prezencka", + "https://github.com/asgeirrr/prezencka/", + "https://opensource.org", + "https://www.root.cz/knihy/katedrala-a-trziste/", + "naucse:page?lesson=beginners/cmdline", + "naucse:static?filename=diagram.png", + "naucse:static?filename=gh-workflow-diagram.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/git-collaboration-2in1/index.md", @@ -1405,7 +2386,27 @@ "content": { "path": "ignoring/index.html" }, + "ids": [ + "automaticke_pridavani", + "dalsi_haraburdi", + "format_ignorovaciho_souboru", + "ignorovani_souboru", + "osobni_poznamky", + "priprava", + "vystupy_programu_a_pomocne_soubory_spolecnych_nastroju" + ], "license": "cc-by-sa-40", + "links": [ + "#automaticke_pridavani", + "#dalsi_haraburdi", + "#format_ignorovaciho_souboru", + "#ignorovani_souboru", + "#osobni_poznamky", + "#priprava", + "#vystupy_programu_a_pomocne_soubory_spolecnych_nastroju", + "https://git-scm.com/docs/gitignore", + "https://inkscape.org/" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/ignoring/index.md", @@ -1426,7 +2427,24 @@ "content": { "path": "install/index.2.html" }, + "ids": [ + "config", + "git", + "linux", + "macos", + "nastaveni", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#config", + "#git", + "#linux", + "#macos", + "#nastaveni", + "#windows", + "https://git-scm.org" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/install/index.md", @@ -1447,7 +2465,51 @@ "content": { "path": "async/index.html" }, + "ids": [ + "a_dalsi", + "alternativni_smycky_udalosti", + "async_funkce_a_task", + "asynchronni_cykly_a_kontexty", + "asyncio", + "event_loop", + "fan-out_a_fan-in", + "jeden_standard", + "komunikace", + "soubeznost_v_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#alternativni_smycky_udalosti", + "#async_funkce_a_task", + "#asynchronni_cykly_a_kontexty", + "#asyncio", + "#event_loop", + "#fan-out_a_fan-in", + "#jeden_standard", + "#komunikace", + "#soubeznost_v_pythonu", + "http://www.tornadoweb.org/en/stable/", + "https://creativecommons.org/licenses/by-nc/2.5/", + "https://docs.python.org/3/library/asyncio-dev.html#asyncio-dev", + "https://docs.python.org/3/library/asyncio-eventloop.html#executor", + "https://docs.python.org/3/library/asyncio-protocol.html#tcp-echo-server-protocol", + "https://docs.python.org/3/library/asyncio-sync.html", + "https://docs.python.org/3/library/asyncio-task.html#asyncio.gather", + "https://greenlet.readthedocs.io/en/latest/", + "https://imgs.xkcd.com/comics/standards.png", + "https://pypi.org/project/asyncqt/", + "https://pypi.org/project/uvloop/", + "https://trio.readthedocs.io/en/stable/tutorial.html", + "https://twistedmatrix.com/trac/", + "https://www.python.org/dev/peps/pep-0249/", + "https://www.python.org/dev/peps/pep-3156/", + "https://www.python.org/dev/peps/pep-3333/", + "https://xkcd.com/927/", + "naucse:page?lesson=advanced/generators", + "naucse:page?lesson=intro/cython", + "naucse:page?lesson=intro/pyqt" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/async/index.md", @@ -1468,7 +2530,41 @@ "content": { "path": "click/index.html" }, + "ids": [ + "a_dalsi", + "argumenty", + "argumenty_prikazove_radky", + "click", + "podprikazy", + "prikazy_a_prepinace", + "soubory", + "validace_vstupu" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#argumenty", + "#argumenty_prikazove_radky", + "#click", + "#podprikazy", + "#prikazy_a_prepinace", + "#soubory", + "#validace_vstupu", + "https://click.palletsprojects.com/en/7.x/", + "https://click.palletsprojects.com/en/7.x/api/#click.BadParameter", + "https://click.palletsprojects.com/en/7.x/api/#click.File", + "https://click.palletsprojects.com/en/7.x/api/#click.Path", + "https://click.palletsprojects.com/en/7.x/api/#click.UsageError", + "https://click.palletsprojects.com/en/7.x/api/#types", + "https://click.palletsprojects.com/en/7.x/arguments/", + "https://click.palletsprojects.com/en/7.x/options/", + "https://click.palletsprojects.com/en/7.x/options/#callbacks-for-validation", + "https://docs.python.org/3/library/argparse.html", + "https://docs.python.org/3/library/functions.html#open", + "https://docs.python.org/3/library/getopt.html", + "https://docs.python.org/3/library/optparse.html", + "https://docs.python.org/3/library/sys.html#sys.argv" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/click/index.md", @@ -1489,7 +2585,81 @@ "content": { "path": "cython/index.html" }, + "ids": [ + "anotace", + "c_api", + "cpython", + "cython", + "direktivy", + "doplneni_typu", + "externi_knihovny", + "gil", + "hodnoty_a_vyjimky", + "kompilace_pythonu", + "modul_v_c", + "pouziti_knihoven_z_c", + "pouzivani_numpy", + "preklad", + "pyobject", + "reference_counting", + "rychlost", + "struktury_ukazatele_a_dynamicka_alokace", + "tri_typy_funkci", + "tridy", + "video", + "zkratky_codepyximportcode_a_codecythoncode" + ], "license": "cc-by-sa-40", + "links": [ + "#anotace", + "#c_api", + "#cpython", + "#cython", + "#direktivy", + "#doplneni_typu", + "#externi_knihovny", + "#gil", + "#hodnoty_a_vyjimky", + "#kompilace_pythonu", + "#modul_v_c", + "#pouziti_knihoven_z_c", + "#pouzivani_numpy", + "#preklad", + "#pyobject", + "#reference_counting", + "#rychlost", + "#struktury_ukazatele_a_dynamicka_alokace", + "#tri_typy_funkci", + "#tridy", + "#video", + "#zkratky_codepyximportcode_a_codecythoncode", + "http://cffi.readthedocs.io/en/latest/", + "http://cython.readthedocs.io/en/latest/src/tutorial/cdef_classes.html", + "http://valgrind.org/", + "https://cython.readthedocs.io/src/userguide/source_files_and_compilation.html#compiler-directives", + "https://cython.readthedocs.io/src/userguide/source_files_and_compilation.html#how-to-set-directives", + "https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong", + "https://docs.python.org/3/c-api/module.html#c.PyModuleDef_Slot", + "https://docs.python.org/3/c-api/refcounting.html#c.Py_DECREF", + "https://docs.python.org/3/c-api/refcounting.html#c.Py_INCREF", + "https://docs.python.org/3/c-api/structures.html#c.PyObject", + "https://docs.python.org/3/distutils/apiref.html#distutils.core.Extension", + "https://docs.python.org/3/library/ctypes.html", + "https://en.wikipedia.org/wiki/GNU_Debugger", + "https://github.com/hroncok/", + "https://github.com/joerick/cibuildwheel#cibuildwheel", + "https://github.com/pypa/manylinux", + "https://github.com/python/cpython/blob/3.5/Include/floatobject.h#L15", + "https://github.com/python/cpython/blob/3.5/Include/listobject.h#L23", + "https://github.com/python/cpython/blob/3.5/Include/longintrepr.h#L89", + "https://github.com/python/cpython/blob/3.5/Include/object.h#L106", + "https://pypi.python.org/pypi/pytest-profiling", + "https://travis-ci.org/", + "https://wiki.python.org/moin/WindowsCompilers", + "https://www.appveyor.com/", + "https://www.youtube.com/watch?v=Ksv4RA6yhkY", + "naucse:static?filename=test_matmul.py" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/cython/index.md", @@ -1514,7 +2684,27 @@ "content": { "path": "decorators/index.html" }, + "ids": [ + "dekoratory", + "napoveda_pro_funkce", + "predavani_vsech_argumentu", + "priklad_0_registrace_funkci", + "priklad_1_trasovani_volani_funkci", + "priklad_2_opakovani_http_pozadavku", + "solution-0", + "teorie_do_zacatku" + ], "license": "cc-by-sa-40", + "links": [ + "#dekoratory", + "#napoveda_pro_funkce", + "#predavani_vsech_argumentu", + "#priklad_0_registrace_funkci", + "#priklad_1_trasovani_volani_funkci", + "#priklad_2_opakovani_http_pozadavku", + "#teorie_do_zacatku", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -1539,7 +2729,20 @@ "content": { "path": "deployment/index.html" }, + "ids": [ + "deployment_webovych_aplikaci", + "wsgi" + ], "license": "cc-by-sa-40", + "links": [ + "#deployment_webovych_aplikaci", + "#wsgi", + "http://gunicorn.org/", + "https://www.python.org/dev/peps/pep-0333/", + "https://www.pythonanywhere.com/", + "naucse:page?lesson=intro/deployment&page=pythonanywhere", + "naucse:page?lesson=intro/flask" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/deployment/index.md", @@ -1553,7 +2756,20 @@ "content": { "path": "deployment/pythonanywhere.html" }, + "ids": [ + "aktualizace", + "deployment_soukromych_udaju", + "deployment_webovych_aplikaci_na_pythonanywhere" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace", + "#deployment_soukromych_udaju", + "#deployment_webovych_aplikaci_na_pythonanywhere", + "https://help.pythonanywhere.com/pages/environment-variables-for-web-apps/", + "https://www.pythonanywhere.com/", + "https://www.pythonanywhere.com/forums/topic/12878/#id_post_52160" + ], "slug": "pythonanywhere", "solutions": [], "source_file": "lessons/intro/deployment/pythonanywhere.md", @@ -1575,8 +2791,55 @@ "content": { "path": "distribution/index.html" }, + "ids": [ + "dalsi", + "datove_soubory", + "extra_soubory_do_zdrojoveho_balicku", + "instalace_pomoci_pip", + "moduly", + "nahrani_na_pypi", + "programy_pro_prikazovou_radku", + "setuppy", + "slovnicek_pojmu", + "soubor_requirementstxt", + "specifikace_zavislosti", + "spousteni_modulu", + "vice_argumentu_pro_setup", + "vice_souboru_s_python_kodem", + "wheel_binarni_balicky" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#dalsi", + "#datove_soubory", + "#extra_soubory_do_zdrojoveho_balicku", + "#instalace_pomoci_pip", + "#moduly", + "#nahrani_na_pypi", + "#programy_pro_prikazovou_radku", + "#setuppy", + "#slovnicek_pojmu", + "#soubor_requirementstxt", + "#specifikace_zavislosti", + "#spousteni_modulu", + "#vice_argumentu_pro_setup", + "#vice_souboru_s_python_kodem", + "#wheel_binarni_balicky", + "https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt", + "https://docs.python.org/3/distutils/sourcedist.html#specifying-the-files-to-distribute", + "https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e", + "https://packaging.python.org/", + "https://packaging.python.org/distributing/#package-data", + "https://packaging.python.org/distributing/#setup-args", + "https://packaging.python.org/glossary", + "https://pypi.org", + "https://pypi.org/account/register/", + "https://pypi.org/pypi?%3Aaction=list_classifiers", + "https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins", + "https://test.pypi.org/account/register/", + "https://wiki.python.org/moin/TestPyPI" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/distribution/index.md", @@ -1597,7 +2860,61 @@ "content": { "path": "docs/index.html" }, + "ids": [ + "_doctest", + "_testcleanup", + "_testcode", + "_testoutput", + "_testsetup", + "autodoc", + "co_do_dokumentace_psat", + "doctest", + "dokumentace", + "import_z_vlastniho_kodu", + "kompletni_priklad", + "nastaveni_a_rozsireni", + "odkazy_na_tridy_a_moduly", + "read_the_docs", + "readmerst", + "sphinx", + "textovy_obsah_v_dokumentaci", + "travis_ci" + ], "license": "cc-by-sa-40", + "links": [ + "#_doctest", + "#_testcleanup", + "#_testcode", + "#_testoutput", + "#_testsetup", + "#autodoc", + "#co_do_dokumentace_psat", + "#doctest", + "#dokumentace", + "#import_z_vlastniho_kodu", + "#kompletni_priklad", + "#nastaveni_a_rozsireni", + "#odkazy_na_tridy_a_moduly", + "#read_the_docs", + "#readmerst", + "#sphinx", + "#textovy_obsah_v_dokumentaci", + "#travis_ci", + "http://www.sphinx-doc.org/", + "http://www.sphinx-doc.org/en/master/domains.html#cross-referencing-python-objects", + "http://www.sphinx-doc.org/en/master/ext/autodoc.html#directive-automodule", + "http://www.sphinx-doc.org/en/master/ext/doctest.html", + "http://www.sphinx-doc.org/en/master/ext/napoleon.html", + "http://www.sphinx-doc.org/en/master/markup/inline.html#role-ref", + "http://www.sphinx-doc.org/en/master/markup/misc.html#index-generating-markup", + "http://www.sphinx-doc.org/en/stable/rest.html", + "http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/", + "https://github.com/ralsina/rst-cheatsheet", + "https://readthedocs.org/", + "https://recommonmark.readthedocs.io/en/latest/auto_structify.html#embed-restructuredtext", + "https://www.sphinx-doc.org/en/master/usage/markdown.html", + "naucse:page?lesson=intro/testing" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/docs/index.md", @@ -1618,7 +2935,69 @@ "content": { "path": "flask/index.html" }, + "ids": [ + "a_dalsi", + "blueprint_moduly", + "create_app_factory", + "dynamicke_routy", + "escaping", + "filtry", + "flask", + "ladici_rezim", + "logovani", + "sablony", + "staticke_soubory", + "vetsi_flask_aplikace", + "vlastni_podtrida_flask", + "webove_aplikace_flask", + "ziskani_url" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#blueprint_moduly", + "#create_app_factory", + "#dynamicke_routy", + "#escaping", + "#filtry", + "#flask", + "#ladici_rezim", + "#logovani", + "#sablony", + "#staticke_soubory", + "#vetsi_flask_aplikace", + "#vlastni_podtrida_flask", + "#webove_aplikace_flask", + "#ziskani_url", + "http://127.0.0.1:5000/hello/", + "http://www.pylonsproject.org/", + "https://cs.wikipedia.org/wiki/Diazotypie", + "https://cs.wikipedia.org/wiki/Model-view-controller", + "https://developer.mozilla.org/en-US/docs/Web", + "https://developer.mozilla.org/en-US/docs/Web/CSS", + "https://developer.mozilla.org/en-US/docs/Web/HTML", + "https://docs.python.org/3/library/logging.html#module-logging", + "https://flask-pymongo.readthedocs.io/en/latest/", + "https://flask-sqlalchemy.palletsprojects.com/en/2.x/", + "https://flask.palletsprojects.com", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Blueprint", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.register_blueprint", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.route", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.url_for", + "https://flask.palletsprojects.com/en/1.1.x/blueprints/", + "https://flask.palletsprojects.com/en/1.1.x/cli/", + "https://flask.palletsprojects.com/en/1.1.x/extensions/?highlight=extensions", + "https://flask.palletsprojects.com/en/1.1.x/logging/", + "https://flask.palletsprojects.com/en/1.1.x/patterns/appfactories/", + "https://flask.palletsprojects.com/en/1.1.x/quickstart/", + "https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules", + "https://jinja.palletsprojects.com/en/2.10.x/api/#jinja2.Markup", + "https://jinja.palletsprojects.com/en/2.10.x/templates/", + "https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters", + "https://jinja.palletsprojects.com/en/2.10.x/templates/#for", + "https://www.djangoproject.com/", + "naucse:page?lesson=fast-track/http#url-anatomy" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/flask/index.md", @@ -1639,7 +3018,34 @@ "content": { "path": "json/index.html" }, + "ids": [ + "hezky_vystup", + "jina_kodovani", + "json", + "kodovani", + "kodovani_dat", + "toml", + "typy", + "yaml" + ], "license": "cc-by-sa-40", + "links": [ + "#hezky_vystup", + "#jina_kodovani", + "#json", + "#kodovani", + "#kodovani_dat", + "#toml", + "#typy", + "#yaml", + "http://en.wikipedia.org/wiki/Bencode", + "http://json.org/", + "http://www.yaml.org/", + "https://docs.python.org/3/library/json.html", + "https://docs.python.org/3/library/pickle.html", + "https://github.com/toml-lang/toml", + "https://yaml.org/" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/json/index.md", @@ -1660,7 +3066,34 @@ "content": { "path": "magic/index.html" }, + "ids": [ + "a_dalsi", + "dekoratory", + "deskriptory", + "konstruktor", + "magie", + "metatridy", + "specialni_metody", + "ukol", + "velka_moc_a_velka_zodpovednost" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#dekoratory", + "#deskriptory", + "#konstruktor", + "#magie", + "#metatridy", + "#specialni_metody", + "#ukol", + "#velka_moc_a_velka_zodpovednost", + "http://docs.pylonsproject.org/projects/pyramid/en/latest/_modules/pyramid/decorator.html", + "https://docs.python.org/3/library/pathlib.html", + "https://docs.python.org/3/reference/datamodel.html#special-method-names", + "https://www.python.org/download/releases/2.3/mro/", + "https://www.youtube.com/watch?v=NiSqG6s8skA" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/magic/index.md", @@ -1681,7 +3114,48 @@ "content": { "path": "micropython/index.1.html" }, + "ids": [ + "blikani", + "drivery_a_pripojeni", + "flashovani", + "komunikace", + "led_pasek_ws2812", + "micropython", + "micropython_na_esp8266nodemcu", + "ovladani_konzole", + "popis_desky", + "souborovy_system", + "vstup_a_vystup", + "webrepl" + ], "license": "cc-by-sa-40", + "links": [ + "#blikani", + "#drivery_a_pripojeni", + "#flashovani", + "#komunikace", + "#led_pasek_ws2812", + "#micropython", + "#micropython_na_esp8266nodemcu", + "#ovladani_konzole", + "#popis_desky", + "#souborovy_system", + "#vstup_a_vystup", + "#webrepl", + "http://api.thingspeak.com/channels/1417/field/2/last.txt", + "http://docs.micropython.org/en/latest/esp8266/", + "http://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#onewire-driver", + "http://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#software-spi-bus", + "http://docs.micropython.org/en/latest/esp8266/library/machine.I2C.html#machine-i2c", + "http://micropython.org/download#esp8266", + "http://micropython.org/webrepl/", + "http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html", + "https://github.com/espressif/esptool#usage", + "https://github.com/stlk/micropython/tree/master/workshop", + "https://naucse.python.cz/2019/brno-podzim-pondeli/sessions/micropython/", + "https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf", + "https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/micropython/index.md", @@ -1702,8 +3176,34 @@ "content": { "path": "mypy/index.html" }, + "ids": [ + "a_mnohem_vice", + "alternativni_zpusoby_definice", + "definice_typu_a_jejich_kontrola", + "globalni_promenne", + "instalace_a_spusteni", + "mypy", + "slozitejsi_definice_a_modul_codetypingcode", + "staticka_a_dynamicka_typova_kontrola", + "vlastni_datove_typy" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#a_mnohem_vice", + "#alternativni_zpusoby_definice", + "#definice_typu_a_jejich_kontrola", + "#globalni_promenne", + "#instalace_a_spusteni", + "#mypy", + "#slozitejsi_definice_a_modul_codetypingcode", + "#staticka_a_dynamicka_typova_kontrola", + "#vlastni_datove_typy", + "https://docs.python.org/3/library/typing.html", + "https://mypy.readthedocs.io/en/stable/index.html", + "https://pypi.org/project/pytest-mypy/", + "https://www.python.org/dev/peps/pep-0585/" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/mypy/index.md", @@ -1724,8 +3224,17 @@ "content": { "path": "notebook/index.html" }, + "ids": [ + "jak_na_notebook", + "jupyter_notebook" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#jak_na_notebook", + "#jupyter_notebook", + "https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages" + ], "modules": { "katex": "0.7.1" }, @@ -1749,7 +3258,67 @@ "content": { "path": "numpy/index.html" }, + "ids": [ + "booleovske_hodnoty_poli", + "broadcasting_a_zmeny", + "dalsi_operace", + "datove_typy", + "indexovani", + "matematika_a_grafy", + "maticove_nasobeni", + "nejednoznacnost_a_zkratky", + "numpy", + "obrazky", + "priklady_pouziti", + "reshape", + "tvoreni_matic_cast_2", + "zakladni_operace", + "zvuk" + ], "license": "cc-by-sa-40", + "links": [ + "#booleovske_hodnoty_poli", + "#broadcasting_a_zmeny", + "#dalsi_operace", + "#datove_typy", + "#indexovani", + "#matematika_a_grafy", + "#maticove_nasobeni", + "#nejednoznacnost_a_zkratky", + "#numpy", + "#obrazky", + "#priklady_pouziti", + "#reshape", + "#tvoreni_matic_cast_2", + "#zakladni_operace", + "#zvuk", + "data:audio/wav;base64,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", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "http://legacy.python.org/dev/peps/pep-0465/", + "https://commons.wikimedia.org/wiki/File:Ball_python_lucy.JPG", + "https://creativecommons.org/licenses/by-sa/3.0/deed.en", + "https://docs.python.org/3/library/array.html", + "https://en.wikipedia.org/wiki/", + "https://en.wikipedia.org/wiki/Piano_key_frequencies", + "https://en.wikipedia.org/wiki/User:HCA", + "https://matplotlib.org/", + "https://matplotlib.org/contents.html", + "https://matplotlib.org/gallery/index.html", + "naucse:page?lesson=intro/notebook", + "naucse:static?filename=python.jpg", + "naucse:static?filename=sample.wav", + "naucse:static?filename=secret.png" + ], "modules": { "katex": "0.7.1" }, @@ -1783,7 +3352,57 @@ "content": { "path": "pandas/index.html" }, + "ids": [ + "analyza_dat_v_pythonu", + "grafy", + "groupby", + "indexer_codeiloccode", + "indexer_codeloccode", + "indexy", + "merge", + "nan_neboli_null_ci_na", + "pandas", + "presypani_dat", + "proces_analyzy_dat", + "sloupce", + "tabulky", + "tabulky_a_vybirani_prvku" + ], "license": "cc-by-sa-40", + "links": [ + "#analyza_dat_v_pythonu", + "#grafy", + "#groupby", + "#indexer_codeiloccode", + "#indexer_codeloccode", + "#indexy", + "#merge", + "#nan_neboli_null_ci_na", + "#pandas", + "#presypani_dat", + "#proces_analyzy_dat", + "#sloupce", + "#tabulky", + "#tabulky_a_vybirani_prvku", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAY0AAAEVCAYAAAAckrn/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdcltX/x/HXYSPgANwL914ogpp7ZFaapjlTU9PMcv3K\n8bVv2TJLs/JbZmIOtBwNc5R7lJqDIS6cIAIOFNkg8z6/P+5b00RF9vg8Hw8eN/e5z3Wuc6Hy9hrn\nHKW1RgghhMgMs/zugBBCiMJDQkMIIUSmSWgIIYTINAkNIYQQmSahIYQQItMkNIQQQmSahIYQQohM\nk9AQQgiRaRIaQgghMs0ivzuQ05ydnbWLi0t+d0MIIQoVX1/fCK112cfVK3Kh4eLigo+PT353Qwgh\nChWl1OXM1JPLU0IIITJNQkMIIUSmSWgIIYTItCJ3TyMjqamphIWFkZSUlN9dKVZsbGyoUqUKlpaW\n+d0VIUQOKRahERYWhoODAy4uLiil8rs7xYLWmlu3bhEWFkaNGjXyuztCiBxSLC5PJSUl4eTkJIGR\nh5RSODk5ydmdEEVMsTjTACQw8oH8zIXIO7fikzFTCmtLM6zMzbAwz51zgmITGkIIURQdD41m3vZz\nHLgYcV+5uZnC2sLM9GV+N0ysLU3v//VZZklo5JN9+/ZhZWVF27Zt87srQohC6OKNOOZvP8+209dx\ntLNiSre6lLK1IDnNQEqageQ0A8lp6cbX1H++v/ez+OS0u59lloRGPtm3bx/29va5Ghpaa7TWmJkV\ni1tXQhQLoZGJfLnrAhuOhVHCyoIp3eoyun0N7K2z9+tcTctcPfltksO8vLxo2rQpzZo14+WXX2bz\n5s24u7vTokULunXrRnh4OMHBwSxevJgvvviC5s2bs3//fm7evMmLL76Im5sbbm5uHDx4EICbN2/S\nvXt3XF1dGTduHNWrVyciwngaumDBAho3bkzjxo358ssvAQgODqZBgwa8/vrruLq68uGHHzJlypS7\n/fP09GTq1Kl5/4MRQmTLzbhkZm86TZfP97H5xFVGP1WDv6Z1ZlK3OtkOjCdy53+jReWrZcuW+t8C\nAgIeKMsNp06d0nXr1tU3b97UWmt969YtHRkZqQ0Gg9Zaa09PTz116lSttdbvvfeenjdv3t1tBw8e\nrPfv36+11vry5cu6fv36WmutJ0yYoOfMmaO11nrr1q0a0Ddv3tQ+Pj66cePGOj4+XsfFxemGDRtq\nPz8/fenSJa2U0ocOHdJaax0fH69r1qypU1JStNZat2nTRp84cSIPfhpGefWzF6Koik5M0Z9tO6Pr\nv7NV15z5u57xy3F9NToxx/cD+OhM/I6Vy1M5aM+ePfTv3x9nZ2cAHB0dOXnyJAMHDuTatWukpKQ8\ndMzCrl27CAgIuPs+NjaWuLg4Dhw4wIYNGwDo2bMnZcqUAeDAgQP07dsXOzs7APr168f+/fvp3bs3\n1atXx8PDAwA7Ozu6dOnCli1baNCgAampqTRp0iTXfgZCiJxxOyWdFX8Hs/jPQGJup/J8s0pM6VaH\nmmXt87VfEho5SGv9wGOmb775JlOnTqV3797s27eP2bNnZ7itwWDg0KFD2NraPtDmw/b1MHeC5I4x\nY8YwZ84c6tevzyuvvJKJIxFCZMWJsGjOXY/D2d4aJ3srnO2tcbSzwsbSPNNtpKQZWOcTyv92X+BG\nXDKd65Xlrafr0ahSqVzseeZJaOSgrl270rdvX6ZMmYKTkxORkZHExMRQuXJlAFauXHm3roODA7Gx\nsXff9+jRg6+//pq3334bAH9/f5o3b85TTz3F+vXrmT59Ojt27CAqKgqADh06MHLkSGbMmIHWmg0b\nNrBq1aoM++Xu7k5oaCh+fn6cOHEitw5fiGJLa83yg8F89HsAhgz+P+dgbXE3RJzsrXCyt8bZzgpn\nB2uc7O4EjBUnr8Twxc4LhEQm0trFkW+GuuLm4pj3B/QIEho5qFGjRsyaNYuOHTtibm5OixYtmD17\nNgMGDKBy5cp4eHhw6dIlAJ5//nn69+/Pxo0b+d///sfChQuZMGECTZs2JS0tjQ4dOrB48WLee+89\nBg8ezLp16+jYsSMVK1bEwcEBV1dXRo4cSevWrQHj2USLFi0IDg7OsG8vvfQS/v7+dy9vCSFyRkqa\ngf/+dop1PqF0b1ieGc/UJ/Z2KhHxKdyKT+ZWQgo344yvt+KTuRSRgE9wFJGJKWR0waBhxZIsf8WN\nTnXLFsgBsupRlzkKo1atWul/L8J05swZGjRokE89yp7k5GTMzc2xsLDg0KFDjB8/Hn9//ydu57nn\nnmPKlCl07do1F3r5cIX5Zy/E40TEJzN+tS/ewVG80bk2U7vXxcwsc7/o0w2ayIQUbiUkcys+hYj4\nZBxsLOhUt1ym28hJSilfrXWrx9WTM40CLiQkhJdeegmDwYCVlRWenp5PtH10dDStW7emWbNmeR4Y\nQhRlZ67FMmalDxHxySwc3ILezSo90fbmZoqyDtaUdbDOpR7mDgmNAq5OnTocO3Ysy9uXLl2a8+fP\n52CPhBDbT19nyjp/HGws+Om1NjStUjq/u5RnJDSEECKTtNZ8vecin+88T7OqpVnyckvKl7TJ727l\nKQkNIYTIhNsp6Uz75QSbj1/lheaVmPti0yd6lLaokNAQQojHuB6TxKtePpy6GsP0nvV5rWPNAvlk\n05NISU/hcuxlAmMCCYoOyvR2EhpCCPEIx0KiGLvKl8TkNDxfbkW3huXzu0tPJDk9meCYYIJigrgY\nfZGg6CACYwIJiQ0hXRtntzVTMjV6gXP9+nUmT56Mt7c31tbWuLi48OWXX9KvXz9OnTr10O38/f25\nevUqvXr1AmD27NnY29vz1ltvPVC3bdu2/P3337l2DEIUNxuOhTH9l5OUL2nN6tHtqFfBIb+79I/k\neIi9CrFXIPYqSXHXCE6JIjA1msBk42tQagwhqXEYMA6tMEdR1cKBWpal6OZQn9pWpallUZLqFg7Y\nkrmBvxIaeUBrTd++fRkxYgRr164FjGEQHh7+2G39/f3x8fG5GxqPIoEhRM5IN2jmbT/H4j8D8ajp\nyKKhLXG0s8qbnWsNSdGmQPgnFIyv1/4pT44BINZM8XXp0vxU0p400yUzc62pnppGndRUnk5JpXZq\nKjVTUnFJTSW7R1HsQuP9zacJuBr7+IpPoGGlkrz3fKOHfr53714sLS157bXX7pY1b978vtHbSUlJ\njB8/Hh8fHywsLFiwYAHt2rXj3Xff5fbt2xw4cICZM2cCEBAQQKdOnQgJCWHy5MlMnDgRAHt7e+Lj\n4+/OceXs7MypU6do2bIlq1evRinFH3/8wdSpU3F2dsbV1ZWgoCC2bNmSoz8PIQqzuKRUJq/1Z/fZ\nGwx1r8bs3o2wzKWlU+/j5wUHvzIGQmrivz5UYF8eSlYCp1pQowPaoSKb0iJYcG0P0amJ9K35PB4V\n3aldqibVS1bH0twUD3fvvah73qv7P1MK3s/cPZpiFxr54c4v7kf55ptvADh58iRnz56lR48enD9/\nng8++AAfHx++/vprwHh56uzZs+zdu5e4uDjq1avH+PHjsbS0vK+9Y8eOcfr0aSpVqkS7du04ePAg\nrVq1Yty4cfz111/UqFGDwYMH584BC1FIxSSmMnDJIS7ciOfDPo14uY1L3uz45M+waSJUbgl1exrD\noWQlKFnZ+GpfHsz/+Td+LvIcc47Mwe+GH03LNmWx+zs0cMqbmReKXWg86owgPx04cIA333wTgPr1\n61O9evWHDsp79tlnsba2xtramnLlyhEeHk6VKlXuq9O6deu7ZXfOauzt7alZs+bd6dkHDx7MkiVL\ncvGohCg8UtIMjFvtQ9DNBJaPdKND3bJ5s+PAvbDhNajeFob9CpYPH/cRlxLHIv9FrDm7hpJWJfmg\n7Qf0qd3niW5kZ9dj96SUWqaUuqGUOnVPmaNSaqdS6oLptYypXCmlFiqlLiqlTiilXO/ZZoSp/gWl\n1Ih7ylsqpU6atlmoTM+xPWwfhVGjRo3w9fV9ZJ0nmQPM2vqfaQfMzc1JS0vLVJ2iNs+YEDlFa83M\nX09yOCiSz/o3zbvAuHoM1g0D57ow6MeHBobWmi1BW+j9W29+OPMDL9Z5kc19N9O3Tt88DQzI3HKv\nK4Ce/yqbAezWWtcBdpveAzwD1DF9jQW+BWMAAO8B7kBr4L17QuBbU9072/V8zD4KnS5dupCcnHzf\nvFHe3t5cvnz57vsOHTrwww8/AHD+/HlCQkKoV68eDg4OxMXF5Ug/6tevT1BQ0N17KevWrcuRdoUo\n7P635yK/+IUxpVtdXmhROW92eisQVvcHW0cY9gvYZjwVycWoi4zaPoqZ+2dSoUQF1jy7hv+2+S+l\nrPNnfY3HhobW+i8g8l/FfYA7i0OsBF64p9zLtHrgYaC0Uqoi8DSwU2sdqbWOAnYCPU2fldRaHzIt\nN+j1r7Yy2keho5Riw4YN7Ny5k1q1atGoUSNmz55NpUr/THD2+uuvk56eTpMmTRg4cCArVqzA2tqa\nzp07ExAQQPPmzbP9S97W1pZFixbRs2dPnnrqKcqXL0+pUgVjYRch8stvx66wYOd5+rlWZmLX2nmz\n07hwWNUX0PDyBihZ8YEqCakJzPeez4DNA7gQfYF327zL6l6raeScv5fYs3pPo7zW+hqA1vqaUqqc\nqbwyEHpPvTBT2aPKwzIof9Q+HqCUGovxbIVq1apl8ZByV6VKlVi/fv0D5XfGaNjY2LBixYoHPnd0\ndMTb2/uh7d47xiM+Ph6ATp060alTp7vld26iA3Tu3JmzZ8+itWbChAm0avXYmZCFKLKOXopk2s8n\n8KjpyNx+TfNmlHdSDKx+ERIiYMRmcL4/qLTWbA/ezjzvedy4fYMX67zIJNdJlLEpGFfoc/pGeEY/\ncZ2F8ieitV4CLAHjehpPun1x4unpycqVK0lJSaFFixaMGzcuv7skRL64FJHA2FU+VHG0ZfGwllhZ\n5MG9gdQkWDsUbp6BIeugyv1PVQbFBDHnyByOXDtCA8cGLOi8gGZlm+V+v55AVkMjXClV0XQGUBG4\nYSoPA6reU68KcNVU3ulf5ftM5VUyqP+ofYhsmDJlClOmTMnvbgiRryITUnhl+VHMlGL5SDdKl8iD\ngXuGdNgwFoL3Q98lULsbWmsCowPxDvfG+7o3e0P3Ymthyyz3WQyoOwBzs4I3IWJWQ2MTMAKYa3rd\neE/5G0qptRhveseYfulvB+bcc/O7BzBTax2plIpTSnkAR4DhwP8esw8hhMiypNR0xnr5cDUmiTWv\nelDdyS73d6o1bJ2GDthIUMe38LbWeO/7P3zCfYhMMt4yrmBXgRfrvMj4ZuNxsnXK/T5l0WNDQym1\nBuNZgrNSKgzjU1BzgfVKqdFACDDAVP0PoBdwEUgEXgEwhcOHwJ2L8x9ore/cXB+P8QktW2Cr6YtH\n7EMIIbJEa820n0/gczmKr4e0oGX13L1PoLXmUswlvPd/zNGQvfjUqkNkyHoIgfIlytOuUjvcKrjh\nVsGNyvaVC8XMuY8NDa31w4YNP7B2qOkJqAkPaWcZsCyDch+gcQbltzLahxBCZNUXO8+z6fhVpvWs\nx3NNn2x51szQWnMp9hLe17zvXnK6cyZRzqEMbat3o3VFd1pVaEUV+yqFIiT+rdiNCBdCFE8/+YSy\ncM9FBraqyviOtXK8/cTURF7f/Tq+4caBvOVKlKOtXTXcwi7iVq4lVQb/jLLIo0kPc1HeDiUsxszN\nzWnevPndr7lz5wLGx2N9fHyeuD1/f3/++OOPHO1jr169iI6OztE2hSgI/r4YwcxfT/JUbWc+6ts4\nx/+Hn5KewsS9E/G/4c9brd7i976/s6vV+3xybDv9Stan6sA1RSIwQM408oytrS3+/v451t6jpkxP\nS0vDwuLJ/2hzOoSEKAgu3ojjtdW+1HC2Y9Ew1xyfsTbNkMa0v6Zx5NoRPn7qY3rX6g3XT8HaIVCm\nOgz9Cazy4GZ7Hil+obF1Blw/mbNtVmgCz8zNdjM7duzgvffeIzk5mVq1arF8+XLs7e3x9vZm0qRJ\nJCQkYG1tzc6dOx+YMv3MmTNcvXqV4OBgnJ2dWbZs2QNTrXfu3JkVK1awadMmEhMTCQwMpG/fvnz2\n2WcAuLi44OPjg7OzM15eXsyfPx+lFE2bNmXVqlX89NNPvP/++5ibm1OqVCn++uuvbB+zELkpIj6Z\nV1Z4Y2VhzrKRbpS0sXz8Rk/AoA3M/ns2u0N2M6P1DGNgRF02Dt6zsjNOQFjCMUf3md+KX2jkk9u3\nb9O8efO772fOnMnAgQPvvo+IiOCjjz5i165d2NnZ8emnn7JgwQJmzJjBwIEDWbduHW5ubsTGxlKi\nRIkMp0z39fXlwIED2Nra8vnnnwMPTrUOxrOUY8eOYW1tTb169XjzzTepWvWf4TWnT5/m448/5uDB\ngzg7OxMZabyR98EHH7B9+3YqV64sl7FEgZeUms6rXj7cjEtm3dg2VHUskaPta62Z5z2PjYEbeb3Z\n6wxtMNQ4ynt1P0i7Da9sg9JVH99QIVP8QiMHzgiy4nGXpw4fPkxAQADt2rUDICUlhTZt2nDu3Dkq\nVqyIm5sbACVLlnxoG71798bW1hZ49FTrXbt2vTvnVMOGDbl8+fJ9obFnzx769++Ps7MzYJzKBKBd\nu3aMHDmSl156iX79+mXp5yBEXjAYNFPX++MfGs23Q1vSrGrGkwFmKGgfRFyAlARIvQ2ppteUxPu+\nX2yIYLVFIsOS4LUd8+H3D4yLJ1nYGOeTKt8w144vPxW/0CigtNZ0796dNWvW3Fd+4sSJTN+0s7P7\n57rpo6ZBf9zU6lrrDPe5ePFijhw5wu+//07z5s3x9/fHyangDkISxddn28/xx8nrvPNsA3o2rpD5\nDf/+GnbMur/MwgYsSxgvN1nagmUJVluls8gikT7mjrztXA9V2c5Yx7IE1OkOVVvn7AEVIBIaBYSH\nhwcTJkzg4sWL1K5dm8TERMLCwqhfvz5Xr17F29sbNzc34uLisLW1feyU6XemWu/Spct9U637+fk9\nti9du3alb9++TJkyBScnJyIjI3F0dCQwMBB3d3fc3d3ZvHkzoaGhEhqiwFm6P4jFfwYyzKMao5+q\nkfkND31jDIwGvaHXfFNIlACz+2+cb7y4kU8PvkO3at2Y3XEeZmbF69eoPHKbR+7c07jzNWPG/cuD\nlC1blhUrVjB48GCaNm2Kh4cHZ8+excrKinXr1vHmm2/SrFkzunfvTlJS0mOnTH/YVOuZ0ahRI2bN\nmkXHjh1p1qwZU6dOBeDtt9+mSZMmNG7cmA4dOtCsWcGaSE2IlX8H89HvZ3i2SUVmP98o84/WHloE\n2/9jDIz+y8ChPFjbPxAYuy/v5t2/38WjogefdvgUi2IWGACqqK3m1qpVK/3vcQ9nzpyhQYO8WT9X\n3E9+9iKv/HgkhP9sOEmPhuX5ZugTPFp7eDFsmw71n4MBK+5bi/teh64eYsLuCTRwaoBnd09KWObs\njfX8ppTy1Vo/dq0EOdMQQhR6P/mE8p8NJ+lSvxz/G9Ii84FxZMk/gdF/+UMD4/jN40zaOwmXUi4s\n6rqoyAXGk5DQEEIUar8du8K0X07Qvo4zi4a6Ym2RyenEj3rC1reh3rPGwHjIiO3zUed5fdfrONs6\ns6T7knxbZrWgkNAQQhRav5+4xtT1/njUcGLJy62wsXyCwPjjLajXy3hJ6iGBERIbwrid47Axt8Gz\nhyfOts451/lCqvjdxRFCFAnbT19n4tpjtKruyPcjW2FrlcnA8P7eGBh1n4EBKx8aGOEJ4YzdOZY0\nQxoreq6gsn3lDOsVNxIaQohCZ8/ZcN740Y+mVUqx7BU3Slhl8leZzzL4fSrUeRpeenhgRCdFM27n\nOKKSovj+6e+pVTrnZ8UtrCQ0hBCFyp/nb/LaKj8aVCzJildaY2+dyV9jvitgyxRjYAxcBRYZP4Ke\nkJrA+F3jCY0LZXH3xTR2fmC5n2JN7mnkkTtTozdu3JgBAwaQmJiYp/v/+OOP744RuXea9oULFz5x\nW++88w5ffvllLvRSiEf7+2IEY718qF3OHq9RrSllm8kJCH1XwuZJUKfHIwMjKimKCbsncCbyDJ93\n+hy3Cm452PuiQUIjj9yZe+rUqVNYWVmxePHiXN9nenr63e9nzZqFv78//v7+d/vi7+/PxIkTc70f\nQuSEo5ciGb3SBxcnO1aPcad0iUyuT+G3CjZPhNrd4KWHB4b/DX8GbB7AiZsn+KT9J3Sq2innOl+E\nFLvLU58e/ZSzkWdztM36jvWZ3np6puu3b9+eEydOALBgwQKWLTOugjtmzBgmT57MZ599ho2NDRMn\nTmTKlCkcP36cPXv2sHv3bpYvX87q1asfOo26i4sLo0aNYseOHbzxxhsMGjTosf25dOkSo0aN4tat\nW5QvX57ly5dTpUqVh5bf64svvsDT0xNLS0uaNGnC6tWrn+AnJ0Tm+F6O4pXlR6lU2obVY9xxtMtk\nYBxbDZvehFpdYeAPYGnzQBWtNV4BXnzp+yUV7CqwutdqGjoVzckGc4KcaeSxtLQ0tm7dSpMmTfD1\n9WX58uUcOXKEw4cP4+npybFjx+jQoQP79+8HwMfHh/j4eFJTUzlw4ADt27e/bxp1Pz8/WrVqxYIF\nC+7uw8bGhgMHDmQqMMA45ciYMWM4ceIEAwYMYPLkyY8sv9dnn32Gv78/x48fvztNuxA56URYNCOX\nHaWsgzU/vupBWYfMTYfDsR9g4xtQqzMM+jHDwIhJjmHi3onM95lPp6qdWP/8egmMxyh2ZxpPckaQ\nk+5dT6N9+/aMHj2ab7/9lr59+96dnbZfv37s37+f8ePH4+vrS1xcHNbW1ri6uuLj48P+/ftZuHDh\nQ6dRv+PedToy48iRI2zZsgWA4cOH89///veR5fdq1KgRw4YNo0+fPrzwwgtP+FMR4tFOXYlh2NIj\nlLaz5MdXPShf8sFf/Bny/xE2ToCanR4aGKciTvHWn28RnhjOdLfpDG0wNMeXgS2Kil1o5JeM1tN4\n2LxflpaWuLi4sHz5ctq2bUvTpk3Zu3cvgYGBNGjQgMDAwAynUb/j3inSc9v27dv5888/2bhxIx99\n9BGnTp3C3DyTz8sL8Qhnr8fy8vdHcLCx5McxHlQqbfvoDQzpcHGXceDexZ3GwBi8xjid+T201vx4\n9kfm+8ynnG05vHp60aRsk1w7jqJGLk/low4dOvDbb7+RmJhIQkICGzZsoH379nc/mz9/Ph06dKB9\n+/YsXryY5s2bo5TCw8ODgwcPcvHiRQASExPvLrCUFR4eHqxfvx6A1atX06FDh0eW35Genk5YWBhd\nunRh3rx53Lx5M8+fChNF0/HQaIYtPYKVhRk/vur+6FX3Em7BgS9gYXP48SXjcs6dZsLgtQ8ERlxK\nHP/35/8x9+hcnqr0FOufXy+B8YTkTCMfubq6MnLkSFq3Ni7YMmbMGFq0aAEYL2F9/PHHtGnTBjs7\nO2xsbO4Gyr3TqCcnJwPw0UcfUbdu3Sz14+uvv2b06NF88sknd294P6r8jrS0NIYMGUJcXBwGg4Hp\n06fj4OCQpT4IAZCYksYXO8/z/YFLlHOw4YdX3anulMGZs9ZwxRe8l8KpXyE9GVzaQ/cPjJMPZjDx\nYMCtAN768y2uxl/l/1r+HyMajZDLUVkgU6OLXCU/e5FZ+y/c5D8bThIaeZsh7tWY3rP+g+MwUhLh\n1C/GsLjmD1b20GwwuI2Gchn/PdNa89P5n/j06KeUtinN/I7zaVGuRR4cUeGS2anR5UxDCJGvohJS\n+PD3AH71u0JNZzvWjfXAvea/VoS8FWicAuTYakiKhrINjKvrNRsE1g8/u01ITeD9Q++z9dJW2lVu\nxydPfUIZmzK5fERFm4SGECJfaK3ZdPwqH2wOIOZ2Km90rs0bXWr/M1OtIR0u7DDe2A7cDWYW0OB5\ncBsD1dvBYy4tnY86z//t+z9C4kKY5DqJUY1HYabkNm52ZSs0lFJTgDGABk4CrwAVgbWAI+AHvKy1\nTlFKWQNeQEvgFjBQax1samcmMBpIByZqrbebynsCXwHmwFKt9dys9lVrLdcv81hRu/Qpcs6V6Nv8\n97dT7Dl7g2ZVSrF6dGsa2CfC5X1w44zx69JfEBMCDhWh03/AdTiUrPjYttMN6WwM3MicI3MoaVWS\npT2WynQgOSjLoaGUqgxMBBpqrW8rpdYDg4BewBda67VKqcUYw+Bb02uU1rq2UmoQ8CkwUCnV0LRd\nI6ASsEspdeeO7jdAdyAM8FZKbdJaBzxpX21sbLh16xZOTk4SHHlEa82tW7ewscnkc/WiWEg3aNb9\ndZxte/ZQm1C21o6jvlkYyuuM8bLTHXbloFJzePoj45oXD1lR7w6DNuB/w5/twdvZcXkHEbcjcK/o\nztz2c2UNjByW3ctTFoCtUioVKAFcA7oAQ0yfrwRmYwyNPqbvAX4GvlbG3+B9gLVa62TgklLqItDa\nVO+i1joIQCm11lT3iUOjSpUqhIWFcfPmzSc+QJF1NjY2D0w7IoqR9FS4dgJuBMCNMySEnST56imG\nGCIZcucq0c1SxhvYjfpCuYbG78s1ALvH/6LXWnMi4oQxKIJ3EJ4YjrW5Ne0rt6dnjZ50q9YNczMZ\nM5TTshwaWusrSqn5QAhwG9gB+ALRWus0U7Uw4M7KJZWBUNO2aUqpGMDJVH74nqbv3Sb0X+XuGfVF\nKTUWGAtQrVq1Bz63tLSkRo0aT3iEQogsS46H1f0g9AgAqWbWBKZV5pJZU2o2cqNxcw9UuQZQstJj\n703cS2tNwK0AtgdvZ3vwdq4mXMXSzJJ2ldsxpeUUOlXthJ1l3g1uLY6yc3mqDMb/+dcAooGfgGcy\nqHrnwnZGfzP0I8ozumOV4UVyrfUSYAkYH7l9ZMeFELkrLRnWDYMwby57fMA7p8pzMMKO3s2r8N/n\nGuJkn8m5o0y01pyLOnc3KELjQrFQFrSp1IYJLSbQuWpnHKxkfFBeyc7lqW7AJa31TQCl1K9AW6C0\nUsrCdLZRBbhqqh8GVAXClFIWQCkg8p7yO+7d5mHlQog8km7QxCenEZeUSnxyGvFJacQlpRF39/tU\n0+dpJNzjwa5dAAAgAElEQVROYnDIe7gm7OcLuyl8ta82lUvb8v0rjelcr1ym9qe1Jjk9mZC4EHYE\n72B78HaCY4MxV+Z4VPTg1Sav0qVaF0pZl8rlIxcZyU5ohAAeSqkSGC9PdQV8gL1Af4xPUI0ANprq\nbzK9P2T6fI/WWiulNgE/KqUWYLwRXgc4ivEMpI5SqgZwBePN8jv3SoQQucBg0Fy4Ec/RS7c4fCkS\n70uR3IhLfux2SoGDtRlzzJbgatjPModxHChTlzY1jtK4ii37Iw+w60Ayt9Nuk5yeTFJaEknpSSSl\nJd33PjktmaT0pLvtmikz3Cq4MbzRcLpV6yZjLAqA7NzTOKKU+hnjY7VpwDGMl4h+B9YqpT4ylX1v\n2uR7YJXpRnckxhBAa33a9ORVgKmdCVrrdACl1BvAdoyP3C7TWp/Oan+FEA9KN2gCrsZy5NItjl6K\nxDs4kqjEVAAqlrKhTS0najrbY29jgYO1hfHVxgJ76zuvljjYWFDC0gy1YxYc3oPuOAPrCtUI9P4M\nnagJCrTBxsIGG3Pjq7W5NbYWtthZ2OFk43S3/N91HG0caV+lvTz9VMAUi2lEhBBGKWkGTl6JuRsS\nvsFRxCUbn1up7lSC1i6OuNd0wr2GI1XK2Gb+EfV9n8K+OSS3HsuHJa3ZGLiRTlU78clTn2BvZZ+L\nRyRyikwjIoRAa41fSBQHLtziaPAtfC9HkZRqAKB2OXt6N69E6xqOuNdwokKpLI6pObwY9s0hvGl/\nphjCOBl4ivHNxvNas9dkBHYRJKEhRBGktebP8zf5avcFjoVEoxQ0qFCSQW7V8KjpSCsXR5yf8Cmm\nDPmvgW3TOVa3M1NSA7l9+zZfdv6SrtW6Zr9tUSBJaAhRhGit2XfOGBb+odFULm3LRy805vmmlShV\n4tGjqp/YmS2wcQI/1XBlTvplKtlUYmmPpdQuUztn9yMKFAkNIYoArTV7z93gq10XOB4WQ+XStszp\n24T+LatgZZELl4iC9pH68yt8UrU2PxFBu4rt+LT9p/IYbDEgoSFEIaa1ZveZGyzcc4ETYTFUKWPL\n3H5N6OeaS2EBEOZDxLqhTK1ciWPmtxnVeBQTW0yUKTuKCQkNIQohrTU7A8JZuOcCp67EUs2xBJ+9\n2JS+rpWxNM/Fm8/hAZxaN4BJFRyJtbRkXruP6FmjZ+7tTxQ4EhpCFCIGg2ZHQDgLd18g4Fos1Z1K\nMK9/U15okcthARAZxMb1/fjAyY6yduVY3XUR9Rzr5e4+RYEjoSFEIWAwaLafvs5Xuy9w9nocLk4l\nmD+gGS80r4RFbocFkBodyuc/9eGHkpa4OzVmXrdFMjq7mJLQEKKAuxAex5trjnH2ehw1ne1Y8FIz\nejfLm7AAiIwK4u1f+3LUBoZV7cH/dfoUCzP51VFcyZ+8EAXYxRvxDPY0Ti/+5cDmPN+sEuZmebOQ\nmEEbOH7lEDN2vU6EeTof1xtBb4+382TfouCS0BCigLoUkcAQz8OAZu1YD2qXy93pv1MNqQTcCsAv\n3A+/q4c5dsOPmPQkyqen4dV8Co1ajs3V/YvCQUJDiAIo5FYiQzwPk2bQrHk1dwIjMTWR4zeP43fD\nD79wP07cPE5SunFG2+qpaXRJSsLVogyd271DqSYDc3z/onCS0BCigAmLSmSw52Fup6bz4xgP6lXI\nmcCISoq6GxB+4X6ciTxDuk7HDEU9M1tejInCNTEBV0snnBsPgCYDoHzjJ1pZTxR9EhpCFCDXYm4z\n2PMwcUmp/PiqBw0rlcxWe0lpSSw8tpCDVw4SFBMEgJWZFY0dqjHKugotrwTQLC4Se5syxnW6mwyA\nqu5gJhMNioxJaAhRQITHJjF4yWGiE1JZNcadxpWzNyVHSnoKU/ZN4eCVg7Sr3I7ny7bCNeoqjc/t\nwypwD1jaQf1njUFRqzOY5/DcVKJIktAQogC4EZfEYM/D3IxLxmu0O82rls5We6mGVKb9NY0DVw7w\nrnNbBpz1gYjzYGYJtbtBjw+h3jNgZZdDRyCKCwkNIfLZrfhkhnoe4Vp0EitHtaZl9ewNmks3pDNr\n/yx2h+xmRmoJBnivhepPQZsJ0KA3lHDMoZ6L4khCQ4h8FJWQwtClRwiNSmT5yNa0rpG9X+gGbeC9\nv99ja/BWJsckMjQxBgb9aLwMJUQOkNAQIp/EJKYy7PsjBEUksGyEG21qOWWrPa01cw59wMbAjYyP\nimG0fV0YvgxKV8uhHgshoSFEvohNSmX4siNcCI9nyfCWPFXHOVvtaa2Zv38W6y5t5pXoWMY3HAFd\n35Wb2yLHSWgIkcfiklIZsewoAddiWTysJZ3qlct2m19vfx2v8AMMTkhhSs8lqHpP50BPhXiQhIYQ\neSghOY1RK7w5ERbDN0Nc6dqgfPYaTEnEc8NAliQF86KhBDOG/IEqXTVnOitEBiQ0hMgjt1PSGb3S\nG7+QaBYOakHPxhWy1+CNs6z6bSgLrVN4tkQ1/vvCr5hZWudMZ4V4CBn2KUQeSEpNZ4yXN0cvRbLg\npWY827Ri1hvTGo6tZv0PPfnMOoXuTs346MWNmEtgiDwgZxpC5LKE5DTGrvLh78BbzO/fjD7NK2e9\nseR4+P3/2Bi0mQ/LOtGxggefdlsk61uIPCN/04TIRTGJqYxccZQTYTF8PqAZ/VyrZL2x66fgp5Fs\nS7rCu+XK4lGhNZ93+xpLeUJK5CG5PCVELrkZl8wgz8OcvhLLN0Ncsx4YWoPPcljald06nhnlytG8\nXAu+6rIQa3O5JCXyVrZCQylVWin1s1LqrFLqjFKqjVLKUSm1Uyl1wfRaxlRXKaUWKqUuKqVOKKVc\n72lnhKn+BaXUiHvKWyqlTpq2WaiUzNEsCocr0bcZ+N0hgiMS+H5kq6zf9DYYYOt02DKZA1Wb8XaZ\nEjRybsyibosoYVkiZzstRCZk90zjK2Cb1ro+0Aw4A8wAdmut6wC7Te8BngHqmL7GAt8CKKUcgfcA\nd6A18N6doDHVGXvPdj2z2V8hct2liAReWnyIm3HJrBrdmvZ1ymatofRU+O01OPodR11fYrJ5JLVL\n1+bb7t9iZykTDYr8keXQUEqVBDoA3wNorVO01tFAH2ClqdpK4AXT930AL210GCitlKoIPA3s1FpH\naq2jgJ1AT9NnJbXWh7TWGvC6py0hCqSz12MZsPgQt1PTWTPWg1YuWZxLKvU2rHsZTqzDv+1Y3og7\nTlWHqnzX/TtKWmVvjQ0hsiM7Zxo1gZvAcqXUMaXUUqWUHVBea30NwPR6Z7hrZSD0nu3DTGWPKg/L\noPwBSqmxSikfpZTPzZs3s3FIQmTdsZAoBn53GAszxfpxHllfDyMpFlb3h/PbCOg8jdcjDlKuRDk8\ne3hSxiZ7M+AKkV3ZCQ0LwBX4VmvdAkjgn0tRGcnofoTOQvmDhVov0Vq30lq3Kls2i5cChMiGvwMj\nGLb0CKVsLfnptTZZX9M7IQJWPgehhwl8Zg7jrm3D3soez+6eONtmb34qIXJCdkIjDAjTWh8xvf8Z\nY4iEmy4tYXq9cU/9e+c3qAJcfUx5lQzKhShQdp8JZ+RybyqVtuWn19pQ1TGLN6hjwmBZT7h5jtAX\nFvLq5Z+xMLNgaY+lVLTPxmBAIXJQlkNDa30dCFVK1TMVdQUCgE3AnSegRgAbTd9vAoabnqLyAGJM\nl6+2Az2UUmVMN8B7ANtNn8UppTxMT00Nv6ctIQqEzcevMm6VL/XKO7BuXBvKl7TJWkMRF+D7pyE+\nnOsDvmfMeS9SDal4dvekWkmZ2lwUHNkd3Pcm8INSygoIAl7BGETrlVKjgRBggKnuH0Av4CKQaKqL\n1jpSKfUh4G2q94HWOtL0/XhgBWALbDV9CVEgrDkawn82nMTNxZHvR7TCwSaLg+yu+sPqFwGIGPwD\nrx6bR2xKLEufXkrtMrVzsMdCZJ8yPphUdLRq1Ur7+PjkdzdEEbd0fxAf/X6GjnXLsnhYS2ytzLPW\nUPBBWDMIbEoRM3AVo3w+IjQulMXdFuNa3vXx2wuRQ5RSvlrrVo+rJ9OICPEEtNZ8uesCX+2+QK8m\nFfhyYAusLLJ4lff8dlg/HEpXI2HQD4w/MptLMZf4pus3EhiiwJLQECKTtNZ8uOUMyw5eon/LKszt\n1wQL8ywGxomfjAP3yjfm9qAfmXBoFgG3Avii0xe0qdQmZzsuRA6S0BAiE5LT0vnPr6f4xS+MkW1d\nePe5hpiZZXFWm6Oe8Mfb4PIUKQNWMOXQO/iF+zG3/Vw6V+ucsx0XIodJaAjxGLfik3lttS/ewVFM\n7laHSV3rkKVp0LSGv+bD3o+gXi/S+nky/e//cvDKQd5v+z69avbK+c4LkcMkNIR4hLPXYxm9woeI\n+GQWDm5B72aVstaQwQA7ZsHhRdBsMIbnF/LuodnsCtnFdLfp9KvTL2c7LkQukdAQ4iF2BYQzae0x\n7KwtWD+uDc2qln7yRgwGuLAdDnwBoUfA/TV0jzl8fHQOm4M280bzNxjWcFjOd16IXCKhIcS/aK35\n7q8gPt12lsaVSuE5vBUVSj3hoL30VDj5Mxz8Cm6egVLV4Pmv0C2Gs8DvC9afX8+oxqMY23Rs7hyE\nELlEQkOIeySnpTPz15P86neFZ5tWZH7/Zk82BiMlAfy84O+vITYMyjWEvkugcT8wt2Tx8W9ZcXoF\ng+oNYrLr5KzdGxEiH0loCGFyMy6Zcat88AuJZkq3ukzsWjvzv9QTbsHR7+DoErgdBdXawnNfQJ3u\nYGrD67QXi/wX0btWb2a6z5TAEIWShIYQQMDVWF718uFWQjLfDHHl2aaZnCAwOsR4VuHnBWm3oV4v\naDcZqrnfrRIWF4ZXgBdrzq6he/XuvN/2fcyUrLQsCicJDVHsbTt1nSnr/Clla8nPr7XN3DoY4aeN\n9ytO/mw8k2g6ENpOhHL171bxv+GPV4AXu0N2Y4YZL9Z5kVnus7Awk392ovCSv72i2NJas2hfIPO2\nn6NZ1dJ4vtySco+apVZrCDkEB740PhFlaQfur0Gb16GUcRb/NEMae0L2sDJgJSdunsDByoGRjUYy\npP4QytuVz6MjEyL3SGiI4iU9DZKiSY6PYuFWX/zOh/DfWjYMb1EGy4ATxlXzkmMhKcb0GvvPa1I0\nJNyEEk7QeRa4jYESxuVc41Pi2XBxAz+c+YEr8Veo6lCVma1n8kLtFyhhmcX1NYQogCQ0RPFx4yys\n7gexV7AG3gawAq6Yvu6wtAObkmBd0vhqUxpKVzO+r9gUmg0BK2MQXIu/xg9nfuCXC78QnxqPazlX\n3m71Np2qdsLcLIsz3wpRgEloiOIh/DSs7E2qVvzPfDThqTa89FQjWtat/k84WJu+zB//z+JUxCm8\nTnux4/IOAHpU78HLDV+mSdkmuX0kQuQrCQ1R9F07AV59SMaSF+JnEFOiOktHu9GwUsknaibdkM6+\n0H14BXjhd8MPe0t7hjUYxtAGQ2U5VlFsSGiIou2qP3j14bay5bnY6ViWrcVvo1tTziHzI7zTDen8\ncekPlpxYQnBsMJXsKjHNbRp9a/fF3so+FzsvRMEjoSGKriu+sKovCcqOZ6Kn4Vy1LstHtqZUicwt\ny5puSGdb8DYWH19McGwwdcrUYV6HeXSr3k0emxXFlvzNF0VTqDes7kesmQPPRE2jZp0GfPdyS0pY\nPf6vfLohne3B21l8YjGXYi5Ru3RtPu/4Od2qd5NBeaLYk9AQRU/IYfTq/kSblaZX1DSaNWrEV4Ob\nY23x6KeZ0g3p7Li8g8XHFxMUE0Tt0rWZ33E+3at3l7AQwkRCQxQtwQfQP7zELTMnno2eRoeWTfnk\nMcuyGrSBHcHGsAiMCaRWqVrM6ziPHtV7SFgI8S8SGqLoCPoT/eNAws3K8XzMNHo/5cqsXg0euiyr\nQRvYeXkni48v5mL0RWqWqsm8DvPoXr27jLEQ4iEkNETRELgHvWYwV1VF+sROY3h3N97skvEstQZt\nYNflXXx7/FsuRl+kRqkafNbhM3pU7yFhIcRjSGiIwu/CTvTaoYSYVaJv3HQmPu/ByHY1HqiWlJbE\nvtB9eJ705HzUeVxKujC3/Vx6uvSUsBAikyQ0ROF2bht6/csEqaq8lDCdWQPa8WLLKnc/TjWkcujq\nIbZd2sae0D0kpCbgUtKFT9p/wjMuz0hYCPGEJDRE4XVmC/qnkZxX1Rl6ewafDG1Pj0YVSDek4xvu\ny9bgrey8vJOY5BgcrBx42uVperr0pHWF1hIWQmSRhIYonAI2on8eRQA1GZU6gy9HdsC+1BXmHl3B\n9uDtRNyOwNbCls5VO/NMjWdoW6ktVuZW+d1rIQq9bIeGUsoc8AGuaK2fU0rVANYCjoAf8LLWOkUp\nZQ14AS2BW8BArXWwqY2ZwGggHZiotd5uKu8JfAWYA0u11nOz219RBJz6Bf3LqxynFuMsX6Fz+3N8\neHwJVxOuYmVmRYcqHehZoycdqnTA1sI2v3srRJGSE2cak4AzwJ3Z3z4FvtBar1VKLcYYBt+aXqO0\n1rWVUoNM9QYqpRoCg4BGQCVgl1Kqrqmtb4DuQBjgrZTapLUOyIE+i8LqyBKCds9iWSkXNtvbY7D8\nlu2hFnhU8uCNFm/QuWpnmQ9KiFyUrdBQSlUBngU+BqYq4/ONXYAhpiorgdkYQ6OP6XuAn4GvTfX7\nAGu11snAJaXURaC1qd5FrXWQaV9rTXUlNPKZwaD5bPs5NvlfeXzlh9AYF8LTaNOr8T33vdd365qp\nW3Sw8+Sq/RXOVK4AOo2mztV5oe7rdKvWjTI2ZbJ/YEKIx8rumcaXwDTAwfTeCYjWWqeZ3ocBlU3f\nVwZCAbTWaUqpGFP9ysDhe9q8d5vQf5W7Z9QJpdRYYCxAtWrVsnE44nHS0g3M+PUkP/uG0bleWZzt\nrbPcllKgUMZXBdz53vRZqk7kWupRrqb8yY20c+xWUD3dkVb2/XjrqUE0Kl81pw5LCJFJWQ4NpdRz\nwA2tta9SqtOd4gyq6sd89rDyjOZv0BmUobVeAiwBaNWqVYZ1RPalpBmYvO4Yf5y8zuRudZjUtU6G\ng+eyIzk9mf1h+/k96Hf+CvuLFEMK1dIVr8XF0ct9Ki4eE3N0f0KIJ5OdM412QG+lVC/ABuM9jS+B\n0kopC9PZRhXgqql+GFAVCFNKWQClgMh7yu+4d5uHlYs8djslnddW+/Ln+Zu882wDxrSvmWNtpxvS\n8Qn34feg39l1eRdxqXE42TjxUsV29Dq+mcZpoAb+AC7tcmyfQoisyXJoaK1nAjMBTGcab2mthyql\nfgL6Y3yCagSw0bTJJtP7Q6bP92ittVJqE/CjUmoBxhvhdYCjGM9A6piexrqC8Wb5nXslIg/FJaUy\neqUP3sGRzOnbhCHu2b8EqLXmbORZfg/6na2XtnLj9g1KWJSgW/VuPFvjWVpfO4fFH2+BYy14ZS04\n5lxICSGyLjfGaUwH1iqlPgKOAd+byr8HVpludEdiDAG01qeVUusx3uBOAyZordMBlFJvANsxPnK7\nTGt9Ohf6Kx4hKiGFEcuPEnA1li8HNqdP88qP3+gxdgTv4Bv/bwiKCcLCzIKnKj/F2zXfpmOVjtia\nWcHOd+HQ11CrCwxYATalsn8gQogcoe48oVJUtGrVSvv4+OR3N4qEG7FJDPv+CMG3Elk0xJVuDctn\nq72I2xHMOTKHnZd3UrdMXQbWG0iP6j0obVPaWCEpFn4ZAxe2Q+tx8PQcMJfxp0LkBaWUr9a61ePq\nyb9IkaGwqESGLT3Cjbhklo90o11t5yy3pbVmS9AW5h6dS1JaEpNcJzGy0cj7l0yNugxrBsHNc/Ds\n5+A2JgeOQgiR0yQ0xAMCb8YzbOkREpLTWDXanZbVsz4G4nrCdT449AH7r+ynednmvN/ufWqW+tf9\niZAjsHYIpKfCsJ+Nl6WEEAWShIa4T8DVWIYvO4LWsGasB40qZe1+gtaany/8zOc+n2PQBma0nsGg\neoMenCjw+DrY9AaUrAxD1kPZuhk3KIQoECQ0xF1+IVGMXHYUO2sLVo12p3a5rE3HERoXyvt/v8+R\n60doXaE1s9vOpqrDvwbiGQyw9yPY/zm4tIeXvKCEYw4chRAiN0loCAD+vhjBGC8fyjpYs3q0O1Ud\nSzx6g7hwCD1yX1G6NrAm/DALr+zADDPerd6H/mXdUKHHMD5Id4+T6+HMZnAdDr0+BwuZgVaIwkBC\nQ7D7TDjjf/DDxakEq0e7U66kzaM3OLcVfhsPt6PuFgVZWvCesxP+Nta0T7zNuxGRVAj83yMaUdDj\nY2gz4c4cIkKIQkBCo5jbfPwqU9b506BiSVaOao2j3SP+x5+WArveg8OLoEJTGLSGNMsSrAjewreB\nv2BjZsWcBiN4ruJTj59exLYMlMr+mA8hRN6S0CjG1h4NYeaGk7hVd+T7ka1wsLF8eOXIIPh5FFw9\nZhxD0eNDzsUG8+7f7xJwK4Du1bvzH/f/4Gyb9UdzhRAFn4RGMfX9gUt8uCWADnXL8t2wlthaPWL5\n01O/wKZJYGYGA1dzplxtfvGZxy/nf6GkdUk+7/g5PVx65F3nhRD5RkKjGPp6zwXm7zjP043Ks3Bw\nC6wtHhIYqbdh2wzwXUFMlZb84dqfDRdXceboGazMrOhduzdTXKf8M6JbCFHkSWgUI1obF0/6dl8g\nfVtUZl7/pliYZzQDPXDzHIafRuIdG8ivDduxKzmclJPfUt+xPjNbz+TZms9SylrmhBKiuJHQKCYM\nBs0HWwJY8Xcwg1tX4+MXGmNmlsHNaq25fnQxG4/MY4OdLVcqlschPZp+dfrRr04/Gjg1yPvOCyEK\nDAmNYiDdoJnxywl+8g1j9FM1eOfZBg883ZSansq+S1v59fA8/k6LwlDKDveyzXmz/iC6VuuKjcVj\nHsMVQhQLEhpFXGq6gSnr/Nly4hoTu9ZhSrf7V9sLjA7k1wu/suXCb0SmxlIuLY0xTs15ofNcqpaq\nno89F0IURBIaRVhSajpv/OjHrjM3mPlMfcZ1rHX3s5T0FN7+8232hO7BAjM6JybSN9WCts9/h3mN\nDvnYayFEQSahUUQlpqQx1suXAxcj+LBPI15u43L3M4M28M7Bd9gTuofXLcrzUqAvTjW7Qt/FYCfj\nLIQQDyehUQTFJqUyark3fiFRzB/QjP4tq9z3+RdHP2Prpa1Mik9lzK1j0PV9aPOGcRyGEEI8goRG\nEROVkMLwZUc5cy2W/w125dmmFf/5MCWB1TsnsyLiMINi4xhdsjG88ANUbpl/HRZCFCoSGkXIjbgk\nXl56lEu3ElgyvCVd6puWZ02OB29Ptvsu4rNS1nRV9sx4fjHKpV2+9lcIUfhIaBQRV6JvM9TzMDfi\nklkx0o22tZ2Na24fXQKHvsFbJzCzYgWal6rF3OfWYC6P0AohskBCowgIjkhg6NIjxCalsmp0a1qW\nN4c/58GhryEpmou1OzJJhVPFrjz/e2aFjLkQQmSZ3Pks5M6HxzHgu0MkpqSxbngDWl5aAl82Ma6K\nV60N11/+hdesE7GxtGNxt8Uy9YcQIlvkTKOQSk038OORED7fcY5yFomsa3EMp3WjITkW6j0LHacR\n61yT8VtHEJ8az4qeK6hkXym/uy2EKOQkNAqhvedu8PHvZ7hx4zrvl91Hn6RNmPnGQ4PnocM0qNiU\nlPQUJu96jeDYYL7tZpxoUAghsktCoxA5Hx7HR7+fwed8KFNL7mGEwyYs42KhYR9jWFRoDBgH7806\nMAvv69580v4TPCp65HPPhRBFhYRGIRCZkMIXO8/z89FAhlvt4TuHTdimRELdZ6DLLKjQ5L76n/t8\nzrbgbUxtOZXnaj6XT70WQhRFEhoFWEqaAa9DwXy9+yw90/ZyyG4jpVPDoXJ76PoeVHV7YBuv0154\nBXgxpP4QRjYamed9FkIUbVl+ekopVVUptVcpdUYpdVopNclU7qiU2qmUumB6LWMqV0qphUqpi0qp\nE0op13vaGmGqf0EpNeKe8pZKqZOmbRaqf8/nXURprdlx+jpPL9jL8a3fs83iLeZaLKF0uaowfCOM\n3JJhYGy7tI15PvPoXr0709ymPTD9uRBCZFd2zjTSgP/TWvsppRwAX6XUTmAksFtrPVcpNQOYAUwH\nngHqmL7cgW8Bd6WUI/Ae0ArQpnY2aa2jTHXGAoeBP4CewNZs9LnAC7gay4ebT1Pi8k6W2vxCLatg\ncGwIXeZDvWfgIUHgfd2b/xz4D67lXPmk/SeYmz1izW8hhMiiLIeG1voacM30fZxS6gxQGegDdDJV\nWwnswxgafQAvrbUGDiulSiulKprq7tRaRwKYgqenUmofUFJrfchU7gW8QBENjRtxSSzYcZ4Q323M\ntFpPU6sL6NI1ofP30KjfIycTPB91nkl7JlHNoRoLuyzE2tw6D3suhChOcuSehlLKBWgBHAHKmwIF\nrfU1pVQ5U7XKQOg9m4WZyh5VHpZBeUb7H4vxjIRq1apl72Bymdaa+OQ0ohP/v707j66qyhI4/Nsh\nCZAQEkIYwhgIKAq2iAFRBAERnFaJli5FSkVJYwGiNsu27dLucllDW4W6bBWRSQQaZ0QoUQEVFNTC\nhMEAIpKQIGEKIROQBDLs/uNeIEAgL+Mbsr+1WHnvvHve3TfvPHbOvfecU0Ju4QlyC0tI2ZPHt19/\nzhTeZVDoVsojOsDQV5C+90KTkAu+34FjB5j4xUSaBzdnxogZNnjPGFOvap00RKQFsBh4XFULLnAe\nvbIXtAbl5xaqzgJmASQkJFS6TX0qKStn4+5cco45SSC38AT5RSXkus/zCk+QV+T+LCyhtPx0iG3I\n4y8hc5nSZANlzVvDkP8hKOEhCKl6qo+c4hwmfjGRwpJC3rrxLWJbxFZZxxhjaqNWSUNEQnASxiJV\n/cgtPigisW4vIxbIcsszgc4VqncC9rnlQ88qX+OWd6pke59yvLSMxPnJrN2ZfUZ5s5AgWoWFEtk8\nhFZhoVzUrgWRzUNpFeY8jwwLoUP5ARLWPkVo0SEY8gxNrpoITVt4tN9DhYdIXJnIvqP7mH79dC6O\nvopGyToAAA+vSURBVLg+Ds8YY85Q46Th3sk0F9iuqi9VeGkZ8ADwvPtzaYXyR0TkXZwL4fluYlkB\n/PXkXVbASOA/VTVHRI6IyECc0173A6/WNN76UFauTH3/R9buzOaZWy5hUI8YWoWFEhUWQrOQKi5E\n70+B/7sXykudu6E6JXi83wPHDjB+xXiyi7J5fcTr9G9/7p1UxhhTH2rT0xgE3AdsEZHNbtkfcJLF\n+yIyHvgVuMt97VPgZiAVKAQeBHCTw5+AJHe7505eFAcmAm8BzXEugPvMRXBV5b+WbmV5yn6evvkS\nEgd397xyxjp4Zww0jXASRhvPewmZRzJJXJlI/vF8Zt4wk75t+9YgemOMqRlxbmYKHAkJCZqcnFzv\n+5m24memr05j0tB4nryxGvM6bf8EPnwIWnWF+5ZAZKeq67gy8jNIXJlIUWkRs26YRe+Y3jWI3Bhj\nziUiG1S1ylMeNiK8Buas3cX01WmMGdCFfx9VjWsJGxfAPx6DDv1g7AcQFu1x1bS8NBJXJlKu5bw5\n6k27hmGM8QpbT6Oa3k/ew5+Xb+eWy2L58+g+no26VoW1L8GyKdB9mDOquxoJY0fODh78/EEEYd6o\neZYwjDFeYz2Nalix7QBPLU5hcM8YXrr7cpoEeZAwysth5TPwz+nQ504YPQOCQz3e59bsrTy86mHC\nQsKYM3IOXVt2rcURGGNM7VjS8NB3adlMeXsTl3eO4o3fXUnTYA+m6SgrgaWTIeU9GPAw3Pj8BUd2\nn21T1iYmfTGJyKaRzB01l44tKh3baIwxDcaShgdSMvP41/nJxMWEMW9cf8KbevBrO1EIHzwAO1fC\n8Gdg8BPnnTeqMkkHkpj85WTahrVlzsg5tA9vX4sjMMaYumFJowqpWUcZNy+JVuGhLHjoKqLCPDi1\nVJgD79wDmUlw68uQ8GC19vnd3u94dPWjdGrRidkjZ9MmrE0NozfGmLplSeMC9uYVcf/c9QQJLBx/\nFe0jq57ag4J9sPAOyEmDu95yVtWrhjV71jB1zVTio+KZecNMopt5fsHcGGPqmyWN8zh89Dj3zV3P\nkeJS3n14IN1iwquulL0TFt4ORXnwu8XQbUi19rlq9yqe/PpJekX34o0b3rDJB40xPseSRiWOFJcw\nbl4Se3OLWDj+Knp38OA/770bYdGdgDijvDtUb6T28l3LeXrd01wWcxmvj3idiNCImgVvjDH1yJLG\nWYpLypiwYAM/7S9g9v1XMqBbJaeHVOHIfqdncXgnZKfCpoXO2Iv7PobW8dXa55KdS/jjd3+kf/v+\nvDr8VcJCwuroaIwxpm5Z0qigtKycKe9s4vtdh3n57r4M7xYO+zbD4dTTCeJwKhxOgxNHT1cMCYNO\n/eH2mdDy/NOT5xXnkZqXyq78XaTmpZKWl0ZaXhqHiw8zqMMgXh72Ms2CPbhuYowxXmJJw6UHtrD8\n43e5LnM7z8UWEPtVJizdX2ELgajO0LondLkaWveAmJ7Oz4gOZ4y/uFByOCk8JJz4yHgGdxpMr+he\n3HnRnbbinjHG5zXupKHK0V++5thXL9Du4FpuA4qbRtAs7GKIGXpmYojuDiHNK1RVDhYeJD0/nYz9\na0nPT68yOfSI6kF8VDzxkfG0D2/v2RQkxhjjQxpl0thz+Cg7vvmALttnctGJ7RRrS14LGkPT/g+Q\neONVZ/QaCksKSS9IJ2PPV2QUZJCRn0FGQQa7C3ZTVFp0aruTyWFIpyFOYoiKp0dUD9qFtbPkYIwJ\nGI0iaZSXKyl78/lq617KtnzAb45+wIigTA5IW1bGPUHM4ETGdgxj2+EtLPr57VPJIb0gnazCrFPv\nIwgdW3QkLjKOhHYJdIvsRlzLOOIi42jTvI0lB2NMwAvYpFFcUsZ3adms+imLdT/9yvCiFUwIXk5H\nySYnogdZ17xG+4H30FrgvZ/f45Elr3PkxBEAIkIj6NayGwNjB55KCnEt4+jSsotddzDGNGoBlzRy\nC08wYYGzZndIST6JoV/wacgKIkLyKe3QH66bTvRFo0CEdXvX8fekv5Oen87VsVcz/rLx9IjqQXSz\naOs1GGNMJQIuaWTmFrE/M53Z7b9kYO4ygkuPQfeRcO1UgrteDTgr4E1LnsY3md/QJaILrwx7haGd\nh1qiMMaYKgRc0rikeR7LyiYh2aXQ57cw6DFofxkABScKmPnjTN7e/jZNg5sy9cqpjL1kLKFNPF/f\nwhhjGrOASxrBx/OQK6bANVMguhsAZeVlfJT6Ea9teo3c4lzu6HkHj1zxCDHNY7wcrTHG+JeASxq0\nuxRufenU06QDSfzth7+xI3cH/dr2Y8aIGVza+lIvBmiMMf4r8JJGUAgAe4/u5cXkF1m1exWx4bFM\nu24ao7qOsusWxhhTCwGXNMq1nFc2vsL8bfNpEtSEyX0nM673OJvTyRhj6kDAJY3UvFRmb5nNLd1v\n4fF+j9syqcYYU4cCLmkEBwWz8KaF9G1bvfUsjDHGVC2o6k38S/fI7pYwjDGmngRc0jDGGFN/fD5p\niMiNIrJDRFJF5Clvx2OMMY2ZTycNEWkCTAduAi4FxoiIDbIwxhgv8emkAQwAUlV1l6qeAN4FbvNy\nTMYY02j5etLoCOyp8DzTLTuDiEwQkWQRST506FCDBWeMMY2NryeNyoZv6zkFqrNUNUFVE9q0adMA\nYRljTOPk60kjE+hc4XknYJ+XYjHGmEbP15NGEtBTRLqJSChwD7DMyzEZY0yjJarnnO3xKSJyM/Ay\n0AR4U1X/UsX2RcC2Gu4uEsj3s7re3Lcdc8PV7QL8WsO6td23P9b15r79sS5AT1WNrHIrVQ2of8Ch\nWtSd5W91/TVuO+Zq161xu/bjY7Y24oO/L18/PVUTebWo+w8/rOvNfdsxN1zd2rTr2u7bH+t6c9/+\nWNfj+j5/eqq6RCRZVRO8HYcxdcnatfEVgdjTmOXtAIypB9aujU8IuJ6GMcaY+hOIPQ1jjDH1xJJG\nAxKR20VERaSXt2OpCRE5WsXra0TEJ867i0gnEVkqIjtFJE1E/tcd63O+7R8XkbCGjDGQ+HPbtnZd\nPX6bNKr6oH3UGGAdziBFj7mz/RoPiYgAHwEfq2pP4CKgBXChMT6PA15PGn7arsHadr3zlXbtt0nD\n34hIC2AQMB73iyUiQ0XkGxFZIiI/icgbIhLkvnZURJ4TkfXA1d6L/ExuzJ9UeP6aiIzzYkiVGQ4U\nq+o8AFUtA/4NeEhEwkXkBRHZIiIpIjJFRB4FOgCrRWS1F+P2S4HQtq1de86v1wh3G+tSoBUQAjyj\nqktFJA74DOcvn2uAvcBtqlrkpVABRgOfq+ovIpIjIv3c8gE4a4XsBj4H7gA+BMKBrar6316J1r/1\nBjZULFDVAhH5FUgEugFXqGqpiESrao6ITAWGqWq2F+I9g5+1a7C23VB8ol37e0+jGLhdVfsBw4AX\n3S4cQE9guqr2xhkY9VsvxXjSGJz1QHB/jnEf/6DOeiFlwDvAtW55GbC4YUMMGEIlsyG75UOAN1S1\nFEBVcxoyMA/5U7sGa9sNxSfatV/3NHB+WX8VkSFAOc5aG+3c19JVdbP7eAMQ1/DhOUSkNU7Xso+I\nKM48Wgp8yrmN4OTzYvfL5mtKOfOPjWbeCuQCtnHWf6Yi0hJnxuRdVP7F8yV+0a4hoNq2tWsP+XtP\nYyzQBrhSVfsCBzn9YR+vsF0Z3k2QdwILVLWrqsapamcgHecvrwHuLL5BwN04px582W7gUhFpKiKR\nwPXeDqgSXwJhInI/nLrY+iLwFrAS+L2IBLuvRbt1jgARDR9qpfylXUPgtG1r1x7y96QRCWSpaomI\nDAO6ejug8xgDLDmrbDFwL/A98DywFefLdvZ2PsFtjMdVdQ/wPpACLAI2eTWwSqgzYvV24C4R2Qn8\ngnPK5w/AHJzZYlNE5EeczwCcEdef+ciFcH9p1+DnbdvadfX55Yhw94M+CFyMM8lWCLAZ5w6Om9zN\nPlHVPu72TwAtVPXZho/2/ERkKPCEqt7q7ViqIiKXA7NVdYC3YwlUgdKuwX/atrXr6vN217amegNp\n7h0B57tlr8/JB6r6QoNEFaBE5PfAozj3fJv6Y+26AVm7rhm/62lU/KBVdaW34zGmLli7Nv7C75KG\nMcYY7/H3C+HGGGMakM8nDRHpLCKrRWS7iGwTkcfc8mgRWSXOxF2rRKSVW95LRL4XkePuhcKK75Xh\nDrPfLCLJ3jgeY06q47YdJSIfisjP7vv5xPQcJvD4/OkpEYkFYlV1o4hE4AxoGg2MA3JU9XkReQpo\npar/ISJtcW5RHA3kVrxYKCIZQIIvTBVhTB237fnAWlWdI86sp2GqWtslYo05h8/3NFR1v6pudB8f\nAbbjjJC9DZjvbjYf54uEqmapahJQ4oVwjfFYXbVtd1TwEGCuu90JSximvvh80qjInbDtCmA90E5V\n94Pz5QPaevAWCqwUkQ0iMqG+4jSmumrZtrsDh4B5IrJJROaISHg9hmsaMb9JGu7Mn4txbkksqOHb\nDHIngbsJmOzO7WOMV9VB2w4G+gEzVPUK4BjwVB2GaMwpfpE0RCQE50u1SFU/cosPuueET54bzqrq\nfVR1n/szC2dKAxsFaryqjtp2JpCpquvd5x/iJBFj6pzPJw13Sui5wHZVfanCS8uAB9zHD+CsP3Ch\n9wl3Lzbidt1H4syJY4xX1FXbVtUDwB4Rudgtuh74qY7DNQbwj7unrgXWAltwpokGZ4Ku9TgTjHXB\nmajrLnfRkfZAMtDS3f4ozkIwMZyeMC0YeFtVL7RMojH1qq7atrsQT1+cSetCcabJflBVcxvyeEzj\n4PNJwxhjjO/w+dNTxhhjfIclDWOMMR6zpGGMMcZjljSMMcZ4zJKGMcYYj1nSMMbL3BlqJ1V4PlRE\nPvFmTMacjyUNY7wvCphU5VbG+ABLGsZUg4jEuWtWzBGRrSKySERGiMi37voXA9z1MD4WkRQR+aeI\n/Itb91kReVNE1ojILhF51H3b54F4d52XaW5ZiwrrYyxyR48b43XB3g7AGD/UA7gLmAAkAfcC1wK/\nwRnRvQfYpKqjRWQ4sADo69btBQwDIoAdIjIDZ3LBPqraF5zTUzgz3vYG9gHfAoOAdQ1xcMZciPU0\njKm+dFXdoqrlwDbgS3WmVtgCxOEkkIUAqvoV0FpEIt26y1X1uLsQWBbQ7jz7+EFVM919bHbf1xiv\ns6RhTPUdr/C4vMLzcpzee2Wnkk7O11Oxbhnn7+17up0xDcqShjF17xtgLJw61ZRdxToZR3BOVxnj\n8+yvF2Pq3rM4q+ilAIWcnua8Uqp62L2QvhX4DFhe/yEaUzM2y60xxhiP2ekpY4wxHrOkYYwxxmOW\nNIwxxnjMkoYxxhiPWdIwxhjjMUsaxhhjPGZJwxhjjMf+H0VCpa8qrD5ZAAAAAElFTkSuQmCC\n", + "data:image/png;base64,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\n1WkeGrroAAAAAElFTkSuQmCC\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\nYwLm/wFs+GhAV4F94AAAAABJRU5ErkJggg==\n", + "http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.stack.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.unstack.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html", + "http://pandas.pydata.org/pandas-docs/stable/reshaping.html", + "http://pandas.pydata.org/pandas-docs/version/0.18.0/generated/pandas.MultiIndex.droplevel.html", + "http://pandas.pydata.org/pandas-docs/version/0.19.0/visualization.html", + "naucse:page?lesson=intro/notebook", + "naucse:page?lesson=intro/numpy", + "naucse:static?filename=actors.csv", + "naucse:static?filename=spouses.csv" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pandas/index.ipynb", @@ -1815,7 +3434,40 @@ "content": { "path": "pyglet/index.html" }, + "ids": [ + "animace", + "cas_", + "grafika", + "interaktivni_programy", + "klik_", + "pokracovani_priste", + "pyglet_", + "text", + "vykreslovani_", + "zavolej_pozdeji" + ], "license": "cc-by-sa-40", + "links": [ + "#animace", + "#cas_", + "#grafika", + "#interaktivni_programy", + "#klik_", + "#pokracovani_priste", + "#pyglet_", + "#text", + "#vykreslovani_", + "#zavolej_pozdeji", + "http://pyglet.readthedocs.org/en/latest/index.html", + "https://cs.wikipedia.org/wiki/Sprite_%28po%C4%8D%C3%ADta%C4%8Dov%C3%A1_grafika%29", + "https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf", + "https://www.google.cz/search?tbs=ift:png&tbm=isch&q=snake+icon", + "naucse:page?lesson=beginners/functions", + "naucse:page?lesson=projects/pong", + "naucse:static?filename=had.png", + "naucse:static?filename=had2.png", + "naucse:static?filename=pong.py" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pyglet/index.md", @@ -1849,7 +3501,108 @@ "content": { "path": "pyqt/index.html" }, + "ids": [ + "atributy", + "gui_v_pythonu_pyqt5", + "instalace", + "jmena_a_dokumentace", + "klikani_do_gridu", + "menu_a_modalni_dialog", + "modelview", + "moduly_qt", + "numpy", + "o_qt_pyqt_a_pyside", + "obrazky", + "prvni_aplikace", + "pyqt5", + "qlistwidget_-_paleta", + "qt5_designer", + "qt_designer", + "skladani_gui", + "smycka_udalosti_signaly_a_sloty", + "specifika_pyqt", + "sprava_pameti", + "tazeni_mysi", + "trida_pro_gui_aplikace", + "vice_tlacitek_mysi", + "vlastni_widget_-_grid" + ], "license": "cc-by-sa-40", + "links": [ + "#atributy", + "#gui_v_pythonu_pyqt5", + "#instalace", + "#jmena_a_dokumentace", + "#klikani_do_gridu", + "#menu_a_modalni_dialog", + "#modelview", + "#moduly_qt", + "#numpy", + "#o_qt_pyqt_a_pyside", + "#obrazky", + "#prvni_aplikace", + "#pyqt5", + "#qlistwidget_-_paleta", + "#qt5_designer", + "#qt_designer", + "#skladani_gui", + "#smycka_udalosti_signaly_a_sloty", + "#specifika_pyqt", + "#sprava_pameti", + "#tazeni_mysi", + "#trida_pro_gui_aplikace", + "#vice_tlacitek_mysi", + "#vlastni_widget_-_grid", + "http://doc.qt.io/qt-5/layout.html#horizontal-vertical-grid-and-form-layouts", + "http://doc.qt.io/qt-5/model-view-programming.html", + "http://doc.qt.io/qt-5/qcombobox.html#activated", + "http://doc.qt.io/qt-5/qfiledialog.html#getOpenFileName", + "http://doc.qt.io/qt-5/qfiledialog.html#getSaveFileName", + "http://doc.qt.io/qt-5/qmessagebox.html#about", + "http://doc.qt.io/qt-5/qmessagebox.html#critical", + "http://doc.qt.io/qt-5/qobject.html", + "http://doc.qt.io/qt-5/qpainter.html", + "http://doc.qt.io/qt-5/qrect.html", + "http://doc.qt.io/qt-5/qt.html#ItemDataRole-enum", + "http://doc.qt.io/qt-5/qtcore-index.html", + "http://doc.qt.io/qt-5/qtgui-index.html", + "http://doc.qt.io/qt-5/qtmodules.html", + "http://doc.qt.io/qt-5/qtmultimedia-index.html", + "http://doc.qt.io/qt-5/qtnetwork-index.html", + "http://doc.qt.io/qt-5/qtsql-index.html", + "http://doc.qt.io/qt-5/qtsvg-index.html", + "http://doc.qt.io/qt-5/qtwidgets-index.html", + "http://doc.qt.io/qt-5/qtxml-index.html", + "http://doc.qt.io/qt-5/qwidget.html", + "http://doc.qt.io/qt-5/qwidget.html#keyPressEvent", + "http://doc.qt.io/qt-5/qwidget.html#mousePressEvent", + "http://doc.qt.io/qt-5/qwidget.html#paintEvent", + "http://kenney.nl/", + "http://opengameart.org/users/kenney", + "http://pyqt.sourceforge.net/Docs/PyQt5/designer.html#the-uic-module", + "http://pyqt.sourceforge.net/Docs/PyQt5/index.html", + "http://pyqt.sourceforge.net/Docs/PyQt5/installation.html#building-and-installing-from-source", + "https://doc.qt.io/qt-5/gallery.html", + "https://github.com/cvut/MI-PYT/issues/57", + "https://github.com/pyvec/naucse.python.cz/tree/master/lessons/intro/pyqt/static/pics", + "https://pypi.org/project/PyQt5/", + "https://pypi.org/project/bresenham/", + "https://pypi.python.org/pypi/pyqt5-tools", + "https://riverbankcomputing.com/software/pyqt", + "https://wiki.qt.io/PySide", + "https://www.gnu.org/licenses/gpl-3.0.en.html", + "https://www.google.cz/search?q=game+boy+overworld+map&tbm=isch", + "https://www.qt.io/", + "https://www.qt.io/download-open-source/#section-2", + "https://www.riverbankcomputing.com/software/pyqt/download5", + "https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qobject.html", + "https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtwidgets/qabstractbutton.html", + "naucse:page?lesson=intro/cython", + "naucse:page?lesson=intro/numpy", + "naucse:static?filename=basic-screenshot.png", + "naucse:static?filename=pics/grass.svg", + "naucse:static?filename=pics/wall.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pyqt/index.md", @@ -1973,8 +3726,31 @@ "content": { "path": "requests/index.html" }, + "ids": [ + "chrante_sve_tokeny", + "github_api", + "pouziti_session", + "requests" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#chrante_sve_tokeny", + "#github_api", + "#pouziti_session", + "#requests", + "http://docs.python-requests.org/en/master/user/advanced/#session-objects", + "http://docs.python-requests.org/en/master/user/quickstart/", + "http://httpbin.org", + "https://cs.wikipedia.org/wiki/Basic_access_authentication", + "https://developer.github.com/v3", + "https://developer.github.com/v3/", + "https://docs.python.org/3/library/configparser.html", + "https://docs.python.org/3/library/urllib.request.html#module-urllib.request", + "https://github.com/settings/tokens", + "https://requests.readthedocs.io/en/master/", + "naucse:page?lesson=fast-track/http" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/requests/index.md", @@ -1995,7 +3771,85 @@ "content": { "path": "testing/index.1.html" }, + "ids": [ + "castecne_upravene_objekty_tridy_moduly_stubs", + "citlive_udaje", + "falesne_objekty_fakes", + "fixtures", + "integrace_s_pytestem", + "kam_dat_testy", + "komprimovane_citlive_udaje", + "ktere_http_pozadavky_jsou_stejne", + "kviz", + "ocekavani_mocks_spies", + "parametricke_testy", + "podvadeni", + "pytest", + "spousteni_testu_pomoci_codesetuppy_testcode", + "testovani", + "testovani_aplikaci_v_clicku", + "testovani_aplikaci_ve_flasku", + "testovani_http_komunikace_betamax", + "travis_ci", + "varovani" + ], "license": "cc-by-sa-40", + "links": [ + "#castecne_upravene_objekty_tridy_moduly_stubs", + "#citlive_udaje", + "#falesne_objekty_fakes", + "#fixtures", + "#integrace_s_pytestem", + "#kam_dat_testy", + "#komprimovane_citlive_udaje", + "#ktere_http_pozadavky_jsou_stejne", + "#kviz", + "#ocekavani_mocks_spies", + "#parametricke_testy", + "#podvadeni", + "#pytest", + "#spousteni_testu_pomoci_codesetuppy_testcode", + "#testovani", + "#testovani_aplikaci_v_clicku", + "#testovani_aplikaci_ve_flasku", + "#testovani_http_komunikace_betamax", + "#travis_ci", + "#varovani", + "http://betamax.readthedocs.io/en/latest/implementation_details.html#gzip-content-encoding", + "http://betamax.readthedocs.io/en/latest/matchers.html", + "http://blog.horejsek.com/matka-moudrosti-jak-testovat", + "http://click.pocoo.org/6/testing/", + "http://doc.pytest.org/en/latest/example/index.html", + "http://doc.pytest.org/en/latest/fixture.html", + "http://doc.pytest.org/en/latest/goodpractices.html#choosing-a-test-layout-import-rules", + "http://doc.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runner", + "http://doc.pytest.org/en/latest/parametrize.html", + "http://doc.pytest.org/en/latest/plugins.html", + "http://doc.pytest.org/en/latest/writing_plugins.html#conftest-py-local-per-directory-plugins", + "http://docs.pytest.org/en/latest/getting-started.html", + "http://flask.pocoo.org/docs/1.0/api/#flask.Response", + "http://flask.pocoo.org/docs/1.0/testing/", + "http://flexmock.readthedocs.io/en/latest/start/#creating-and-checking-expectations", + "http://pytest.org/", + "https://betamax.readthedocs.io/", + "https://betamax.readthedocs.io/en/latest/configuring.html#filtering-sensitive-data", + "https://cz.pycon.org/", + "https://docs.pytest.org/en/latest/monkeypatch.html", + "https://docs.travis-ci.com/user/languages/python/", + "https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens", + "https://flexmock.readthedocs.io/", + "https://github.com/PyConPL/Book/blob/master/2017/workshops/pytest_parametric_tests/text.md", + "https://travis-ci.com/", + "https://travis-ci.com/profile", + "https://travis-ci.org/", + "https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", + "https://www.youtube.com/watch?v=-nJ-ZW_LP7s", + "https://www.youtube.com/watch?v=iFqF5IaWfy0", + "naucse:page?lesson=beginners/testing", + "naucse:page?lesson=intro/click", + "naucse:page?lesson=intro/distribution", + "naucse:page?lesson=intro/requests" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/testing/index.md", @@ -2016,7 +3870,62 @@ "content": { "path": "turtle/index.html" }, + "ids": [ + "_", + "a_kde_je_ta_zelva", + "ctverec", + "ctverec_ii", + "dlouha_prerusovana_cara", + "jak_opakovat_a_neopakovat_emseem", + "obdelnik", + "otaceni", + "prerusovana_cara", + "range", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "solution-5", + "solution-6", + "solution-7", + "tri_ctverce", + "ukol_navic", + "vycet", + "zelvi_program" + ], "license": "cc-by-sa-40", + "links": [ + "#_", + "#a_kde_je_ta_zelva", + "#ctverec", + "#ctverec_ii", + "#dlouha_prerusovana_cara", + "#jak_opakovat_a_neopakovat_emseem", + "#obdelnik", + "#otaceni", + "#prerusovana_cara", + "#range", + "#tri_ctverce", + "#ukol_navic", + "#vycet", + "#zelvi_program", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:solution?solution=5", + "naucse:solution?solution=6", + "naucse:solution?solution=7", + "naucse:static?filename=turtle-dashed.png", + "naucse:static?filename=turtle-dashed2.png", + "naucse:static?filename=turtle-hexagons.png", + "naucse:static?filename=turtle-rect.png", + "naucse:static?filename=turtle-square.png", + "naucse:static?filename=turtle-squares.png", + "naucse:static?filename=turtle-stairs.png" + ], "slug": "index", "solutions": [ { @@ -2084,8 +3993,12 @@ "content": { "path": "installing-naucse/index.html" }, + "ids": [], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "naucse:page?lesson=meta/local-run" + ], "slug": "index", "solutions": [], "source_file": "lessons/meta/installing-naucse/index.md", @@ -2107,8 +4020,63 @@ "content": { "path": "local-run/index.html" }, + "ids": [ + "codecourseymlcode_codecoursescode_coderunscode_definice_kurzu", + "codegithubworkflowsmainymlcode_instrukce_pro_github_actions", + "codelessonscode_texty_lekci", + "codelicensescode", + "codepyprojecttomlcode_codepoetrylockcode_codegithubcode_definice_projektu_a_zavislosti", + "definice_kurzu", + "definice_lekce", + "kontrola_nastaveni_projektu", + "lokalni_spusteni", + "misto_a_cas", + "naklonovani_zakladu", + "otestovani_kurzu", + "plan_lekci", + "povinne_informace", + "priprava", + "promenne", + "struktura_repozitare", + "upravovani_a_vytvareni_materialu", + "vytvoreni_lokalniho_kurzu" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#codecourseymlcode_codecoursescode_coderunscode_definice_kurzu", + "#codegithubworkflowsmainymlcode_instrukce_pro_github_actions", + "#codelessonscode_texty_lekci", + "#codelicensescode", + "#codepyprojecttomlcode_codepoetrylockcode_codegithubcode_definice_projektu_a_zavislosti", + "#definice_kurzu", + "#definice_lekce", + "#kontrola_nastaveni_projektu", + "#lokalni_spusteni", + "#misto_a_cas", + "#naklonovani_zakladu", + "#otestovani_kurzu", + "#plan_lekci", + "#povinne_informace", + "#priprava", + "#promenne", + "#struktura_repozitare", + "#upravovani_a_vytvareni_materialu", + "#vytvoreni_lokalniho_kurzu", + "https://cs.wikipedia.org/wiki/Markdown", + "https://github.com/pyvec/naucse-python", + "https://github.com/pyvec/naucse-python/blob/main/pyproject.toml", + "https://github.com/pyvec/naucse.python.cz/issues", + "https://python-poetry.org/docs/#installation", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install", + "naucse:page?lesson=beginners/venv-setup", + "naucse:page?lesson=fast-track/yaml", + "naucse:page?lesson=git/git-collaboration-2in1", + "naucse:page?lesson=git/install", + "naucse:page?lesson=intro/notebook", + "naucse:static?filename=info.yml" + ], "slug": "index", "solutions": [], "source_file": "lessons/meta/local-run/index.md", @@ -2133,8 +4101,33 @@ "content": { "path": "submitting-a-run/index.html" }, + "ids": [ + "definice_github_actions", + "informace_o_tvem_repozitari", + "nahrani_do_vlastniho_forku", + "pridani_kurzu_na_nauc_se_python", + "pull_request", + "upravovani_kurzu" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#definice_github_actions", + "#informace_o_tvem_repozitari", + "#nahrani_do_vlastniho_forku", + "#pridani_kurzu_na_nauc_se_python", + "#pull_request", + "#upravovani_kurzu", + "https://github.com/", + "https://github.com/pyvec/naucse-python", + "https://github.com/pyvec/naucse-python/blob/main/.github/workflows/main.yml", + "https://github.com/pyvec/naucse.python.cz/blob/master/courses.yml", + "https://naucse.python.cz/", + "naucse:page?lesson=git/branching", + "naucse:page?lesson=git/git-collaboration-2in1", + "naucse:static?filename=naucse_fork.png", + "naucse:static?filename=view-all-branches.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/meta/submitting-a-run/index.md", @@ -2164,7 +4157,47 @@ "content": { "path": "mini-workshop/index.html" }, + "ids": [ + "alarm", + "barvy", + "blikani", + "cyklus", + "cyklus_s_podminkou", + "kalkulacka", + "konec", + "matematika", + "motorek", + "otevreni_komunikacniho_kanalu", + "otevreni_prikazove_radky", + "program", + "semafor", + "svetylko", + "tlacitko", + "vyrazy" + ], "license": "cc-by-sa-40", + "links": [ + "#alarm", + "#barvy", + "#blikani", + "#cyklus", + "#cyklus_s_podminkou", + "#kalkulacka", + "#konec", + "#matematika", + "#motorek", + "#otevreni_komunikacniho_kanalu", + "#otevreni_prikazove_radky", + "#program", + "#semafor", + "#svetylko", + "#tlacitko", + "#vyrazy", + "naucse:page?lesson=micropython/mini-workshop&page=organizers", + "naucse:static?filename=icon_gedit.png", + "naucse:static?filename=icon_terminal.png", + "naucse:static?filename=semafor.gif" + ], "slug": "index", "solutions": [], "source_file": "lessons/micropython/mini-workshop/index.md", @@ -2180,7 +4213,37 @@ "content": { "path": "mini-workshop/organizers.html" }, + "ids": [ + "firmware", + "nakupni_seznam", + "pokyny_pro_organizatory", + "priprava_hardwaru", + "priprava_pocitace" + ], "license": "cc-by-sa-40", + "links": [ + "#firmware", + "#nakupni_seznam", + "#pokyny_pro_organizatory", + "#priprava_hardwaru", + "#priprava_pocitace", + "https://getfedora.org/", + "https://github.com/adafruit/ampy", + "https://github.com/espressif/esptool", + "https://micropython.org/download#esp8266", + "https://www.aliexpress.com/wholesale?SearchText=3+pin+WS2812+connector", + "https://www.aliexpress.com/wholesale?SearchText=dupont+jumper+cable+m-m", + "https://www.aliexpress.com/wholesale?SearchText=impact+switch+module+dupont", + "https://www.aliexpress.com/wholesale?SearchText=mini+breadboard+170", + "https://www.aliexpress.com/wholesale?SearchText=nodemcu+v2+esp8266+ch340", + "https://www.aliexpress.com/wholesale?SearchText=sg92r", + "https://www.aliexpress.com/wholesale?SearchText=ws2812+strip", + "https://www.gme.cz/led-kulate-pouzdro?tech_par[103][]=18997&showFilter=103", + "naucse:page?lesson=beginners/install-editor&page=gedit", + "naucse:static?filename=boot.py", + "naucse:static?filename=module_detail.jpg", + "naucse:static?filename=module_full.jpg" + ], "slug": "organizers", "solutions": [], "source_file": "lessons/micropython/mini-workshop/organizers.md", @@ -2220,7 +4283,38 @@ "content": { "path": "asteroids/index.html" }, + "ids": [ + "asteroidy", + "dokonceni_a_rozsireni", + "hra_typu_asteroids", + "kolize", + "utok", + "vesmirna_lod" + ], "license": "cc-by-sa-40", + "links": [ + "#asteroidy", + "#dokonceni_a_rozsireni", + "#hra_typu_asteroids", + "#kolize", + "#utok", + "#vesmirna_lod", + "http://kenney.nl", + "http://opengameart.org/content/smoke-particle-assets", + "http://opengameart.org/content/space-shooter-redux", + "http://pyglet.readthedocs.org/en/latest/programming_guide/text.html", + "https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset", + "https://docs.python.org/3/tutorial/datastructures.html#sets", + "https://en.wikipedia.org/wiki/Asteroids_%28video_game%29", + "https://en.wikipedia.org/wiki/Wraparound_%28video_games%29", + "https://github.com/pyvec/cheatsheets/blob/master/sets/sets-cs.pdf", + "https://pyglet.readthedocs.io/en/latest/modules/math.html#pyglet.math.Mat4", + "https://pyglet.readthedocs.io/en/latest/programming_guide/migration.html?highlight=matrix#window-projection-and-cameras", + "https://pyglet.readthedocs.io/en/latest/programming_guide/shapes.html", + "https://pythonhosted.org/pyglet/api/pyglet.graphics.Batch-class.html", + "naucse:page?lesson=beginners/inheritance", + "naucse:static?filename=screenshot.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/projects/asteroids/index.md", @@ -2245,7 +4339,31 @@ "content": { "path": "github-api/index.html" }, + "ids": [ + "api_githubu", + "autorizace", + "interakce", + "requests", + "uzivatelsky_ucet", + "webove_api" + ], "license": "cc-by-sa-40", + "links": [ + "#api_githubu", + "#autorizace", + "#interakce", + "#requests", + "#uzivatelsky_ucet", + "#webove_api", + "https://api.github.com/emojis", + "https://developer.github.com/v3/", + "https://docs.github.com/en/rest/reference/activity#star-a-repository-for-the-authenticated-user", + "https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods", + "https://github.com", + "https://github.com/pyvec/naucse.python.cz/stargazers", + "https://github.com/settings/tokens", + "naucse:page?lesson=intro/json" + ], "slug": "index", "solutions": [], "source_file": "lessons/projects/github-api/index.md", @@ -2266,7 +4384,47 @@ "content": { "path": "pong/index.html" }, + "ids": [ + "dynamika_hry", + "konstanty_a_stav_hry", + "odrazeni_micku", + "pohyb_palek", + "pong", + "rozehrani", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "solution-5", + "vstup_od_uzivatele", + "vykresleni_hraci_plochy", + "zaver" + ], "license": "cc-by-sa-40", + "links": [ + "#dynamika_hry", + "#konstanty_a_stav_hry", + "#odrazeni_micku", + "#pohyb_palek", + "#pong", + "#rozehrani", + "#vstup_od_uzivatele", + "#vykresleni_hraci_plochy", + "#zaver", + "https://en.wikipedia.org/wiki/Atari,_Inc.", + "https://en.wikipedia.org/wiki/Pong", + "https://www.youtube.com/watch?v=fiShX2pTz9A", + "naucse:page?lesson=intro/pyglet", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:solution?solution=5", + "naucse:static?filename=pong.png", + "naucse:static?filename=pong.py" + ], "slug": "index", "solutions": [ { @@ -2313,7 +4471,50 @@ "content": { "path": "snake/index.html" }, + "ids": [ + "ctverecky_ven_grafiku_sem", + "housenka", + "hra_typu_had", + "jen_at_ji_hlavne_ze_mu_chutna", + "logika_hry_afaze_projektu", + "nacteni_vsech_obrazku_ze_slozky", + "nenechme_ho_utect", + "optimalizace_uklid", + "ovladani_pomoci_klavesnice", + "rozpohybovani_hada", + "solution-0", + "vyber_spravnych_obrazku", + "vykresleni_hada", + "zprikazove_radky_do_graficke_aplikace" + ], "license": "cc-by-sa-40", + "links": [ + "#ctverecky_ven_grafiku_sem", + "#housenka", + "#hra_typu_had", + "#jen_at_ji_hlavne_ze_mu_chutna", + "#logika_hry_afaze_projektu", + "#nacteni_vsech_obrazku_ze_slozky", + "#nenechme_ho_utect", + "#optimalizace_uklid", + "#ovladani_pomoci_klavesnice", + "#rozpohybovani_hada", + "#vyber_spravnych_obrazku", + "#vykresleni_hada", + "#zprikazove_radky_do_graficke_aplikace", + "https://docs.python.org/3/library/pathlib.html", + "https://en.wikipedia.org/wiki/Snake_(video_game_genre)", + "naucse:page?lesson=beginners/list", + "naucse:page?lesson=intro/pyglet", + "naucse:solution?solution=0", + "naucse:static?filename=apple.png", + "naucse:static?filename=coords.svg", + "naucse:static?filename=green.png", + "naucse:static?filename=screenshot-cat.png", + "naucse:static?filename=screenshot-final.png", + "naucse:static?filename=snake-tiles.png", + "naucse:static?filename=snake-tiles.zip" + ], "slug": "index", "solutions": [ { @@ -2360,7 +4561,50 @@ "content": { "path": "drawing/index.html" }, + "ids": [ + "housenka", + "jak_vybrat_ctverecky", + "krmeni", + "logicke_a_zobrazovaci_souradnice", + "nacitani_kousku_hada", + "nakresli_mi_hada", + "reprezentace_hada", + "sazeni_ctverecku", + "sazeni_hada", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4" + ], "license": "cc-by-sa-40", + "links": [ + "#housenka", + "#jak_vybrat_ctverecky", + "#krmeni", + "#logicke_a_zobrazovaci_souradnice", + "#nacitani_kousku_hada", + "#nakresli_mi_hada", + "#reprezentace_hada", + "#sazeni_ctverecku", + "#sazeni_hada", + "https://docs.python.org/3/library/pathlib.html", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:static?filename=apple.png", + "naucse:static?filename=caterpillar.png", + "naucse:static?filename=coords-blocks.svg", + "naucse:static?filename=coords-px.svg", + "naucse:static?filename=coords.svg", + "naucse:static?filename=green.png", + "naucse:static?filename=red.png", + "naucse:static?filename=screenshot-dir.png", + "naucse:static?filename=snake-tiles.png", + "naucse:static?filename=snake-tiles.zip" + ], "slug": "index", "solutions": [ { @@ -2539,7 +4783,59 @@ "content": { "path": "logic/index.html" }, + "ids": [ + "a_to_je_vse", + "konec", + "krmeni", + "logika_hry", + "nekonecna_magicka_klec", + "nove_jidlo", + "ovladani", + "rozhybejme_hada", + "solution-0", + "solution-1", + "solution-10", + "solution-11", + "solution-2", + "solution-3", + "solution-4", + "solution-5", + "solution-6", + "solution-7", + "solution-8", + "solution-9", + "ven_se_stavem", + "vylepseni_ovladani", + "zatim_dobry_ted_ale_narazime" + ], "license": "cc-by-sa-40", + "links": [ + "#a_to_je_vse", + "#konec", + "#krmeni", + "#logika_hry", + "#nekonecna_magicka_klec", + "#nove_jidlo", + "#ovladani", + "#rozhybejme_hada", + "#ven_se_stavem", + "#vylepseni_ovladani", + "#zatim_dobry_ted_ale_narazime", + "https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations", + "https://en.wikipedia.org/wiki/Torus#Topology", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=10", + "naucse:solution?solution=11", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:solution?solution=5", + "naucse:solution?solution=6", + "naucse:solution?solution=7", + "naucse:solution?solution=8", + "naucse:solution?solution=9" + ], "slug": "index", "solutions": [ { diff --git a/lessons/cython/index.html b/lessons/cython/index.html index 4cb9c7e4..3b1f7797 100644 --- a/lessons/cython/index.html +++ b/lessons/cython/index.html @@ -1,6 +1,6 @@

        Dnes budeme potřebovat do virtuálního prostředí nainstalovat tyto knihovny:

        -
        $ python -m pip install --upgrade pip
        -$ python -m pip install notebook numpy cython pytest pytest-profiling
        +
        $ python -m pip install --upgrade pip
        +$ python -m pip install notebook numpy cython pytest pytest-profiling
         

        Také je potřeba nainstalovat překladač jazyka C a hlavičkové soubory Pythonu:

          @@ -11,7 +11,7 @@

        C API -# +#

        Mluvíme-li o „Pythonu“, máme často na mysli jak jazyk samotný, tak i interpret, program, který programy v tomto jazyce umí spouštět. @@ -33,7 +33,7 @@

        C API

        Někdy to ale je potřeba, a dnešní přednáška bude specifická pro CPython a přímé využití jeho API pro jazyk C.

        Rychlost -# +#

        Častý důvod proč sáhnout k C API je rychlost: CPython je celkem pomalý. Tradiční metoda optimalizace je zjistit, které části jsou kritické, a přepsat @@ -44,16 +44,16 @@

        Rychlost První krok k tomu je vždy zkontrolovat, co zabírá více času, než by mělo. K tomu se dá použít nástroj profile ze standardní knihovny, který vypíše tabulku počtu volání jednotlivých funkcí a času v nich stráveného:

        -
        $ python -m profile -s cumtime program.py
        +
        $ python -m profile -s cumtime program.py
         

        Profilovat běh pytest testů se dá jednoduše pomocí modulu pytest-profiling:

        -
        $ python -m pip install pytest-profiling
        -$ python -m pytest --profile
        +
        $ python -m pip install pytest-profiling
        +$ python -m pytest --profile
         

        Když máme představu o tom, co nás brzdí, můžeme začít přepisovat do C způsoby popsanými níže.

        Jiná možnost, jak program zrychlit, je ho pustit, tak jak je, pod interpretem PyPy, který obsahuje optimalizovaný překladač. To je ale jiná kapitola.

        Externí knihovny -# +#

        Druhý důvod, proč programátoři používají C API, je použití knihoven, které mají rozhraní pro C. @@ -63,14 +63,14 @@

        Externí knihovny ctypes, ale v dnešní době je dobré místo toho použít CFFI, knihovnu která funguje i s PyPy (a teoreticky jinými implementacemi).

        CPython -# +#

        Třetí důvod, proč použít C API, je práce s CPythonem samotným. Když člověk zabředne do složitého problému, může na CPython pustit C debugger jako gdb nebo Valgrind, prozkoumat potíže na nižší úrovni a zjistit, kde přesně se chyba nachází.

        Modul v C -# +#

        Pojďme začít příkladem. Vytvořte si následující soubor, který implementuje rozšíření @@ -78,52 +78,52 @@

        Modul v C

        (Nebudeme chtít, abyste podobný kód uměli napsat, ale měli byste být schopní porozumět tomu, co dělá.)

        demo.c:

        -
        #include <Python.h>
        +
        #include <Python.h>
         
        -PyDoc_STRVAR(
        +PyDoc_STRVAR(
             mod_docstring, 
        -    "Demo extension module with a Python wrapper for the system(3) function");
        -
        -static PyObject *demo_system(PyObject *self, PyObject *args){
        -    const char *command;
        -    int retval;
        -
        -    /* Parse the given arguments: expect one string, convert to char* */
        -    if (!PyArg_ParseTuple(args, "s", &command)) {
        -        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
        -        return NULL;
        -    }
        -
        -    /* Call the C function */
        -    retval = system(command);
        -
        -    /* Return result as Python int (error handling built in) */
        -    return PyLong_FromLong(retval);
        -}
        -
        -/* List of all methods in the module */
        -static PyMethodDef DemoMethods[] = {
        -    {"system",  demo_system, METH_VARARGS,
        -            PyDoc_STR("Execute a shell command.")},
        -    {NULL, NULL, 0, NULL}        /* Sentinel */
        -};
        -
        -/* Module specification */
        -static struct PyModuleDef demo_module = {
        -   PyModuleDef_HEAD_INIT,
        -   "demo",          /* name of module */
        -   mod_docstring,   /* dosctring (may be NULL) */
        -   0,               /* size of per-interpreter state of the module */
        -   DemoMethods,     /* list of methods */
        -};
        -
        -
        -/* Module entrypoint */
        -PyMODINIT_FUNC
        -PyInit_demo(void)
        -{
        -    return PyModuleDef_Init(&demo_module);
        -}
        +    "Demo extension module with a Python wrapper for the system(3) function");
        +
        +static PyObject *demo_system(PyObject *self, PyObject *args){
        +    const char *command;
        +    int retval;
        +
        +    /* Parse the given arguments: expect one string, convert to char* */
        +    if (!PyArg_ParseTuple(args, "s", &command)) {
        +        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
        +        return NULL;
        +    }
        +
        +    /* Call the C function */
        +    retval = system(command);
        +
        +    /* Return result as Python int (error handling built in) */
        +    return PyLong_FromLong(retval);
        +}
        +
        +/* List of all methods in the module */
        +static PyMethodDef DemoMethods[] = {
        +    {"system",  demo_system, METH_VARARGS,
        +            PyDoc_STR("Execute a shell command.")},
        +    {NULL, NULL, 0, NULL}        /* Sentinel */
        +};
        +
        +/* Module specification */
        +static struct PyModuleDef demo_module = {
        +   PyModuleDef_HEAD_INIT,
        +   "demo",          /* name of module */
        +   mod_docstring,   /* dosctring (may be NULL) */
        +   0,               /* size of per-interpreter state of the module */
        +   DemoMethods,     /* list of methods */
        +};
        +
        +
        +/* Module entrypoint */
        +PyMODINIT_FUNC
        +PyInit_demo(void)
        +{
        +    return PyModuleDef_Init(&demo_module);
        +}
         

        Z tohoto souboru by měla být patrná struktura podobných rozšíření: máme funkci (demo_system), která převádí objekty Pythonu na datové typy C, volá samotnou funkci a výsledek převádí zpět na pythonní @@ -142,7 +142,7 @@

        Modul v C Až bude Python tento modul importovat, najde tuto funkci podle jména, spustí ji a podle vrácené struktury typu PyModuleDef vytvoří pythonní objekt s modulem.

        Překlad -# +#

        Abychom mohli takovýto modul naimportovat, musíme ho nejdřív přeložit a sestavit z něj sdílenou knihovnu – soubor .so (nebo .dll) – s názvem modulu: @@ -194,17 +194,17 @@

        Překlad

        Příkaz python setup.py develop bude fungovat jako dřív (používá build_ext --inplace), jen je opět potřeba příkaz po každé změně znovu spustit.

        PyObject -# +#

        Podívejme se teď na základní mechanismy interpretu CPython.

        Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject (dokumentace, definice). Skládá se ze dvou prvků:

        -
        typedef struct _object {
        -    Py_ssize_t ob_refcnt;
        -    struct _typeobject *ob_type;
        -} PyObject;
        +
        typedef struct _object {
        +    Py_ssize_t ob_refcnt;
        +    struct _typeobject *ob_type;
        +} PyObject;
         

        První je počet referencí (reference count), který se dá popsat jako počet míst, ze kterých je možné k tomuto objektu přistoupit. Když objekt uložíme do proměnné nebo do seznamu, zvýší se počet referencí o 1. @@ -218,10 +218,10 @@

        PyObject

        Struktura PyObject slouží jako hlavička, za kterou pak následují data interpretovaná podle typu daného objektu. Například pythonní objekt typu float vypadá následovně:

        -
        typedef struct {
        -    PyObject ob_base;
        -    double ob_fval;
        -} PyFloatObject;
        +
        typedef struct {
        +    PyObject ob_base;
        +    double ob_fval;
        +} PyFloatObject;
         

        ...tedy struktura PyObject, za kterou je v paměti číselná hodnota.

        Seznamy obsahují za hlavičkou např. velikost a (ukazatel na) pole ukazatelů na jednotlivé prvky. @@ -231,7 +231,7 @@

        PyObject

        To základní, co potřebujeme vědět, je, že na úrovni C je každý pythonní objekt reprezentován jako struktura počtu referencí, ukazatele na typ a dat specifických pro daný typ.

        Reference counting -# +#

        Tak jako v C je důležité správně alokovat a dealokovat paměť, při tvorbě rozšíření do CPythonu je třeba správně pracovat s referencemi: ke každému Py_INCREF (přičtení 1 k počtu referencí) @@ -251,7 +251,7 @@

        Reference counting o zavolání Py_DECREF. Vrácením výsledku tuto zodpovědnost ale předáváme na funkci, která volá tu naši.

        Hodnoty a výjimky -# +#

        Další konvence, kterou většina funkcí v C API dodržuje, je způsob vracení výjimek.

        Funkce, které vrací pythonní objekty, na úrovni C vrací PyObject*. @@ -265,7 +265,7 @@

        Hodnoty a výjimky Vzhledem k tomu, že její výsledek rovnou vracíme, není potřeba úspěch kontrolovat – vrátíme buď správnou hodnotu nebo NULL se zaznamenanou výjimkou.

        GIL -# +#

        Poslední omezení, kterého si autor rozšíření musí být vědom, je Global Interpreter Lock. Stručně řečeno, s objekty PyObject* může pracovat pouze jedno vlákno. @@ -278,7 +278,7 @@

        GIL Například čtení ze souboru nebo sítě ostatní vlákna neblokuje. Stejně tak maticové operace v NumPy typicky nedrží GIL zatímco počítají na úrovni C nebo Fortranu.

        Cython -# +#

        Teď, když víme jak to všechno funguje, se můžeme podívat na způsob, jak rozšíření psát jednoduše. @@ -288,9 +288,9 @@

        Cython

        Jeden takový jazyk je Cython (neplést s CPython).

        Cython je jazyk podobný Pythonu, který ale lze přeložit na C a dále optimalizovat.

        Cython si nainstalujte pomocí příkazu:

        -
        $ python -m pip install cython
        +
        $ python -m pip install cython
         

        Kompilace Pythonu -# +#

        Když chceme převést modul z Pythonu do Cythonu, nejjednodušší začátek je přejmenovat soubor .py na .pyx, aby bylo jasné, že jde o jiný jazyk, který nepůjde naimportovat přímo.

        @@ -358,7 +358,7 @@

        Cython Tento problém aktuálně řeší PyPA (správci pip a setuptools).

        Instalace z archivů wheel by měla být bezproblémová.

        Anotace -# +#

        Kód, který takto vznikne, není o moc rychlejší než původní Python. Je to tím, že sekvence příkazů ve funkci je sice převedená do C a přeložená do strojového kódu, @@ -366,7 +366,7 @@

        Anotace číslo z matice zkonstruovat pythonní objekt, vyhledat implementaci sčítání pro dvě celá čísla, a výsledek převést zpět na int64 a uložit do matice.

        Na situaci se můžeme podívat pomocí přepínače --annotate:

        -
        $ cython -3 --annotate matmul.pyx
        +
        $ cython -3 --annotate matmul.pyx
         

        To vygeneruje soubor matmul.html, kde jsou potencionálně pomalé operace vysvíceny žlutě. Ke každému řádku se navíc dá kliknutím ukázat odpovídající kód v C (který bývá docela složitý, protože řeší věci jako zpětnou kompatibilitu a ošetřování chyb, a navíc používá hodně pomocných @@ -376,7 +376,7 @@

        Anotace vyhnout. Nejjednodušší způsob, jak toho docílit, je doplnění statických informací o typech.

        Doplnění typů -# +#

        Začneme u funkce intmul, kde doplníme informaci o tom, že parametry a a b a proměnná result jsou typu int. @@ -400,7 +400,7 @@

        Doplnění typů Bohužel ale toto zrychlení pocítíme, jen když takovou funkci zavoláme z jiné funkce napsané v Cythonu.

        Tři typy funkcí -# +#

        Funkce jdou deklarovat třemi způsoby:

          @@ -409,7 +409,7 @@

          Tři typy funkcí
        • cpdef <type> func(...): je funkce, která se z Cythonu volá rychle, ale jde volat i z Pythonu (ve skutečnosti Cython vytvoří dva druhy této funkce).

        Třídy -# +#

        Cython umožňuje vytvářet tzv. built-in třídy: stejný druh tříd jako je např. str nebo int. @@ -441,7 +441,7 @@

        Třídy return self.foo

        Více o definici tříd najdete v dokumentaci Cythonu.

        Používání NumPy -# +#

        Pro funkci matmul můžeme nadefinovat číselné proměnné (n, m, p, i, j, k, x, y) jako int, ale tím si moc nepomůžeme: většinu času program stráví vybíráním a ukládáním hodnot @@ -475,7 +475,7 @@

        Používání NumPy tohoto řádku. Obě operace probíhají na úrovni Pythonu a proto budou pomalejší a při použití --annotate bude řádek s takovou operací označen žlutě.

        Direktivy -# +#

        Anotací typů matic se naše demo maticového násobení dostalo skoro na úroveň C, ale ne úplně: řádky, které pracují s maticemi, jsou ve výstupu --annotate @@ -509,7 +509,7 @@

        Používání NumPy Opak je with cython.gil:, kterým zámek zase zamkneme – například když potřebujeme vyhodit výjimku.

        Struktury, ukazatele a dynamická alokace -# +#

        Přestože v Cythonu můžete používat pythonní n-tice, slovníky, seznamy a další podobné nehomogenní typy, jejich použití je pomalé, protože vždy pracují @@ -577,7 +577,7 @@

        Struktury, ukazatele a dynamick 'y':0.0, 'z':-0.75}

        Použití knihoven z C -# +#

        Pro použití C knihoven z Pythonu je lepší použít CFFI. Ale když už píšete kód v Cythonu @@ -602,7 +602,7 @@

        Struktury, ukazatele a dynamick srand(time(NULL)) print(rand())

        Zkratky: pyximport a %%cython -# +#

        Pro interaktivní práci v Jupyter Notebook má Cython vlastní „magii“. Na začátku Notebooku můžeme zadat:

        @@ -623,7 +623,7 @@

        Struktury, ukazatele a dynamick import matmul

        Video -# +#

        Před nedávnem měl Miro na Středisku unixových technologií nahrávanou ukázku přepsání úlohy ruksaku z předmětu MI-PAA z Pythonu do Cythonu (včetně nepříjemného záseku a live diff --git a/lessons/decorators/index.html b/lessons/decorators/index.html index 8e2cf599..bb4d533f 100644 --- a/lessons/decorators/index.html +++ b/lessons/decorators/index.html @@ -1,5 +1,5 @@

        Dekorátory -# +#

        V této lekci se nebudeme věnovat žádné externí knihovně. Místo toho se seznámíme s jednou vlastností Pythonu, kterou knihovny často využívají, a která obvykle @@ -8,7 +8,7 @@

        Dekorátory

        Dekorátory se hodí tehdy, když potřebujeme upravit chování nějaké funkce, ale nechceme ji přímo upravovat.

        Teorie do začátku -# +#

        Co je to vlastně dekorátor? Dekorátor je vlastně jenom funkce, která dostane jeden argument a vrátí jednu hodnotu. Je ale trochu speciální v tom, že jak @@ -27,7 +27,7 @@

        Teorie do začátku

        Na řádku za zavináčem může být libovolný výraz, který po vyhodnocení vrátí funkci, která má požadované rozhraní.

        Přiklad 0 – registrace funkcí -# +#

        Jak už při programování bývá zvykem, náš první dekorátor nás pozdraví.

        Začneme s jednoduchým programem, který definuje funkci pro pozdrav a zavolá ji.

        @@ -92,14 +92,14 @@

        Přiklad 0 – registrace funkcí například knihovna flask pro definování webových služeb nebo click pro vytváření příkazů pro terminál.

        Příklad 1 – trasování volání funkcí -# +#

        Podívejme se třeba na tuto na pohled nevinnou funkci. Počítá, jak vypadá n-té číslo ve Fibonacciho posloupnosti. Funguje docela pěkně, pokud jí nezadáme jako argument příliš velké číslo. Na autorově počítači příliš velká čísla začínají kolem 35.

        def fib(x):
        -    """Spočítá x-té číslo ve Fibonacciho posloupnosti."""
        +    """Spočítá x-té číslo ve Fibonacciho posloupnosti."""
             if x <= 1:
                 return x
             return fib(x - 1) + fib(x - 2)
        @@ -112,7 +112,7 @@ 

        Přiklad 0 – registrace funkcí @co_se_deje def fib(x): - """Spočítá x-té číslo ve Fibonacciho posloupnosti.""" + """Spočítá x-té číslo ve Fibonacciho posloupnosti.""" if x <= 1: return x return fib(x - 1) + fib(x - 2) @@ -162,7 +162,7 @@

        Řešení

        třeba dekorátor počítal, kolikrát se funkce spustí, a jak dlouho obvykle trvá, mohl by nám pomoct najít místa pro optimalizaci.

        Nápověda pro funkce -# +#

        Zkuste si v interaktivní konzoli Pythonu spustit následující příklad:

        >>> help(print)
        @@ -186,8 +186,8 @@ 

        Řešení

        nahradni_funkce(x) ->>> -

        Něco je špatně. Protože jsme původní implementaci funkce fib pomocí +>>> +

        Něco je špatně. Protože jsme původní implementaci funkce fib pomocí dekorátoru nahradili naší pomocnou funkcí, komentář se cestou ztratil. Mohli bychom přidat dokumentační komentář k náhradní funkci, ale přece nebudeme stejný kód kopírovat dvakrát.

        @@ -208,9 +208,9 @@

        Řešení

        fib(x) Spočítá x-té číslo ve Fibonacciho posloupnosti. ->>> -

        Předávání všech argumentů. -# +>>> +

        Předávání všech argumentů. +#

        Při psaní dekorátorů je dobré myslet na to, jak moc univerzální by měly být. Například náš co_se_deje momentálně funguje pouze pro funkce, které mají @@ -235,7 +235,7 @@

        Řešení

        Ve výstupu teď používáme pouze poziční argumenty. Přidání těch pojmenovaných je cvičení pro čtenáře.

        Příklad 2 – opakování HTTP požadavků -# +#

        Pokud náš program musí pracovat s nějakou externí službou nebo systémem, může se stát, že komunikace mezi nimi nebude vždy bezproblémová. Pěkný příklad je @@ -249,7 +249,7 @@

        Příklad 2 – opakování HTTP po
        import requests
         
         def stahni():
        -    """Stáhne stránku a něco s ní udělá."""
        +    """Stáhne stránku a něco s ní udělá."""
             print("Stahuju stránku")
             odpoved = requests.get("https://httpbin.org/status/200,400,500")
             print(f"Dostali jsme {odpoved.status_code}")
        @@ -264,7 +264,7 @@ 

        Příklad 2 – opakování HTTP po máme dobrou šanci, že to projde.

        Začneme s jednoduchým dekorátorem, který jenom zavolá funkci.

        def opakuj_pri_neuspechu(func):
        -    """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci
        +    """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci
             zavolat znovu.
             """
             @functools.wraps(func)
        @@ -276,7 +276,7 @@ 

        Příklad 2 – opakování HTTP po @opakuj_pri_neuspechu def stahni(): - """Stáhne stránku a něco s ní udělá.""" + """Stáhne stránku a něco s ní udělá.""" print("Stahuju stránku") odpoved = requests.get("https://httpbin.org/status/200,400,500") print(f"Dostali jsme {odpoved.status_code}") @@ -293,7 +293,7 @@

        Příklad 2 – opakování HTTP po def opakuj_pri_neuspechu(func): - """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci + """Pokud volání funkce vyhodí výjimku, budeme ji ignorovat a zkusíme funkci zavolat znovu. """ @@ -311,7 +311,7 @@

        Příklad 2 – opakování HTTP po @opakuj_pri_neuspechu def stahni(): - """Stáhne stránku a něco s ní udělá.""" + """Stáhne stránku a něco s ní udělá.""" print("Stahuju stránku") odpoved = requests.get("https://httpbin.org/status/200,400,500") print(f"Dostali jsme {odpoved.status_code}") @@ -356,7 +356,7 @@

        Příklad 2 – opakování HTTP po @opakuj_pri_neuspechu(requests.exceptions.HTTPError) def stahni(): - """Stáhne stránku a něco s ní udělá.""" + """Stáhne stránku a něco s ní udělá.""" print("Stahuju stránku") odpoved = requests.get("https://httpbin.org/status/200,400,500") print(f"Dostali jsme {odpoved.status_code}") diff --git a/lessons/def/index.html b/lessons/def/index.html index 270d1ea8..1e6014f4 100644 --- a/lessons/def/index.html +++ b/lessons/def/index.html @@ -1,12 +1,12 @@

        Definice funkcí -# +#

        Dříve jsme volali funkce, které napsal někdo jiný:

        print('Ahoj světe!')
         

        Dnes si ukážeme, jak psát funkce vlastní.

        K čemu jsou funkce? -# +#

        Často se stává, že kód, který dělá nějakou jednoduchou věc, není úplně jednoduchý. @@ -37,12 +37,12 @@

        K čemu jsou funkce?

        Funkce umožňuje pojmenovat nějaký kousek programu, který se pak dá použít pomocí jména bez detailních znalostí toho, jak to vevnitř funguje.

        Definice funkce -# +#

        Protože už znáš if a for, které mají jednořádkovou hlavičku a odsazené tělo příkazu, neměl by ti zápis funkce připadat příliš zvláštní:

        def zamen(slovo, pozice, novy_znak):
        -    """V daném slově zamění znak na dané pozici za daný nový znak."""
        +    """V daném slově zamění znak na dané pozici za daný nový znak."""
             zacatek = slovo[:pozice]
             konec = slovo[pozice + 1:]
             nove_slovo = zacatek + novy_znak + konec
        @@ -79,7 +79,7 @@ 

        Definice funkce

        Tělo funkce může mít více příkazů – včetně podmínek, cyklů a podobně. Následující procedura třeba vypíše skóre daného hráče a k tomu hlášku:

        def napis_hlasku(nazev, skore):
        -    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
        +    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
         
             print(nazev, 'skóre je', skore)
             if skore > 1000:
        @@ -96,7 +96,7 @@ 

        Definice funkce napis_hlasku('Tvoje', 256) napis_hlasku('Protivníkovo', 5)

        Cvičení -# +#

        Zkus napsat funkci, která vrátí obsah obdélníka daných rozměrů. Příslušný vzoreček je S = a×b, @@ -115,7 +115,7 @@

        Řešení

        Vracení ukončuje funkci -# +#

        Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou návratovou hodnotu ven z funkce a zároveň ukončí provádění funkce.

        @@ -144,7 +144,7 @@

        Řešení

        def ano_nebo_ne(otazka):
        -     """Vrátí True nebo False podle odpovědi uživatele"""
        +     """Vrátí True nebo False podle odpovědi uživatele"""
             while True:
                 odpoved = input(otazka)
                 if odpoved == 'ano':
        diff --git a/lessons/deployment/index.html b/lessons/deployment/index.html
        index 9c8310cf..4ebf0225 100644
        --- a/lessons/deployment/index.html
        +++ b/lessons/deployment/index.html
        @@ -1,12 +1,12 @@
         

        Deployment webových aplikací -# +#

        Aplikace napsaná v Pythonu běží na našem počítači, ale jak ji dostat do Internetu? Existují různé možnosti, jednou z nich je nasadit ji do cloudu.

        Nemáte ještě webovou aplikaci? Můžete vyzkoušet framework Flask.

        WSGI -# +#

        Nasazování webových aplikací v Pythnu se opírá o WSGI, což je standardní pythonní rozhraní pro komunikaci diff --git a/lessons/deployment/pythonanywhere.html b/lessons/deployment/pythonanywhere.html index bf2274f5..5644dd1a 100644 --- a/lessons/deployment/pythonanywhere.html +++ b/lessons/deployment/pythonanywhere.html @@ -1,5 +1,5 @@

        Deployment webových aplikací na PythonAnywhere -# +#

        PythonAnywhere je pro limitované použití zdarma.

        K posílání kódu na produkční prostředí budeme používat Git. @@ -14,9 +14,9 @@

        Deployment webových apl tak je ve webové konzoli potřeba použít jiný příkaz na vytvoření virtuální prostředí, než jste z toho kurzu zvyklí. Napište příkazy takto (bez úvodního $):

        -
        $ virtualenv --python=python3.7 __venv__
        -$ . __venv__/bin/activate
        -$ python -m pip install flask
        +
        $ virtualenv --python=python3.7 __venv__
        +$ . __venv__/bin/activate
        +$ python -m pip install flask
         

        Pokud máte na PythonAnywhere starší účet, možná tam Python 3.7 nenajdete. Můžete použít Python 3.6, nemělo by to vadit, protože tento návod je koncipován tak, aby s touto verzí také fungoval. @@ -26,12 +26,12 @@

        Deployment webových apl S veřejným repozitářem je to jednodušší – stačí ho naklonovat „anonymně” (git clone https://github.com/<github-username>/<github-repo>). Pokud ale používáme privátní repozitář, bude potřeba si vygenerovat SSH klíč:

        -
        $ ssh-keygen  # (zeptá se na hesla ke klíči)
        -$ cat ~/.ssh/id_rsa.pub
        +
        $ ssh-keygen  # (zeptá se na hesla ke klíči)
        +$ cat ~/.ssh/id_rsa.pub
         

        Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním nastavení v sekci "SSH and GPG Keys". Pak můžete klonovat přes SSH:

        -
        $ git clone git@github.com:<github-username>/<github-repo>.git
        +
        $ git clone git@github.com:<github-username>/<github-repo>.git
         

        Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

        Přejděte na stránkách PythonAnywhere do Dashboard do záložky Web, a vytvořte novou aplikaci. @@ -59,7 +59,7 @@

        Deployment webových apl a na adrese <uživatelské-jméno>.pythonanywhere.com si ji můžete prohlédnout.

        Deployment soukromých údajů -# +#

        Protože vaše hesla, tajné klíče apod. nejsou v repozitáři, je nutné je předat aplikaci zvlášť. @@ -75,7 +75,7 @@

        Deployment soukromých údajů GitHub povoluje všem vytvořit si jeden účet pro automatické operace, ale takový účet musí mít napsané v popisu, že je robot.

        Aktualizace -# +#

        Když nahrajeme nový kód na GitHub, je vždy potřeba provést na PythonAnywhere v konzoli git pull a pak v záložce Web aplikaci restartovat.

        diff --git a/lessons/dict-with-list-values/index.html b/lessons/dict-with-list-values/index.html index b3d9afc9..4118e383 100644 --- a/lessons/dict-with-list-values/index.html +++ b/lessons/dict-with-list-values/index.html @@ -1,5 +1,5 @@

        Více hodnot v jednom záznamu slovníku -# +#

        Ke každému klíči může patřit jen jedna hodnota. Jak bys zařídil/a, aby hodnot bylo víc?

        diff --git a/lessons/dict/index.html b/lessons/dict/index.html index 0d29c912..748f4a20 100644 --- a/lessons/dict/index.html +++ b/lessons/dict/index.html @@ -1,5 +1,5 @@

        Slovníky -# +#

        Další základní datový typ, který si představíme – po číslech, řetězcích, seznamech a n-ticích – @@ -34,7 +34,7 @@

        Slovníky

        Naopak to nejde – slovník neumožňuje podle hodnoty přímo zjistit klíč. Na překlad z angličtiny do češtiny bys potřeboval/a druhý slovník.

        Měnění slovníků -# +#

        Co se stane, když klíč ve slovníku není?

        >>> slovnik['Pes']
        @@ -72,7 +72,7 @@ 

        Slovníky >>> 'Mouse' in slovnik False

        Iterace -# +#

        Když slovník projdeš cyklem for, dostaneš klíče jednotlivých záznamů:

        >>> for klic in slovnik:
        @@ -105,7 +105,7 @@ 

        Slovníky RuntimeError: dictionary changed size during iteration

        Hodnoty u už existujících klíčů ale měnit můžeš.

        Jak udělat slovník -# +#

        Slovník se dá vytvořit několika způsoby. První, pomocí složených závorek, jsi už viděl/a. @@ -139,7 +139,7 @@

        Jak udělat slovník Například takhle nejde zadat jako klíč řetězec "def" nebo "propan-butan".

        Zaplň prázdný slovník -# +#

        Nejobecnější způsob vytváření slovníků je podobný tomu co znáš u seznamů: vytvoř prázdný slovník a postupně do něj přidávej záznamy, jeden za druhým.

        @@ -160,7 +160,7 @@

        Jak udělat slovník print(barvy_po_tydnu['jablko'])

        Typy klíčů a hodnot -# +#

        Do slovníku můžeš uložit jakoukoli hodnotu: řetězce, seznamy, nebo čísla.

        uzivatel = {'jméno': 'Amálka', 'velikost nohy': 36, 'oblíbená čísla': [5, 27]}
        @@ -185,7 +185,7 @@ 

        Jak udělat slovník File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'

        A to je zatím ke slovníkům vše -# +#

        Chceš-li mít všechny triky, které slovníky umí, pěkně pohromadě, můžeš si stáhnout diff --git a/lessons/distribution/index.html b/lessons/distribution/index.html index 96ed1e22..3ecbfc69 100644 --- a/lessons/distribution/index.html +++ b/lessons/distribution/index.html @@ -1,5 +1,5 @@

        Moduly -# +#

        Zatím jsme tvořili programy v Pythonu tak nějak na divoko, tedy v jednom nebo více souborech bez nějakého zvláštního řádu. V této lekci se podíváme na @@ -22,7 +22,7 @@

        Moduly

        Později se podíváme na elegantnější způsob jak to zařídit; teď se vraťme zpět k balíčkování.

        Slovníček pojmů -# +#

        Než se pustíme do samotného výkladu, zavedeme některé pojmy tak, aby mezi nimi nedošlo v textu záměně. @@ -37,7 +37,7 @@

        Slovníček pojmů
      • projekt (Project) je knihovna, framework, skript, plugin, aplikace apod. (či jejich kombinace), které balíme do balíčků.
      • setup.py -# +#

        Základním stavebním kamenem Python balíčku je soubor setup.py, který obsahuje všechna potřebná metadata ve volání funkce setup() z modulu @@ -60,35 +60,35 @@

        setup.py (tedy stejně jako modul). Je to dobrá konvence, ale není to technicky nutné.

        Balíček můžeme zkusit nainstalovat do virtuálního prostředí:

        -
        $ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
        -$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
        -(__venv__)$ python setup.py install
        +
        $ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
        +$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
        +(__venv__)$ python setup.py install
         ...
         (__venv__)$ python
         >>> import isholiday
         >>> 
        -(__venv__)$ python -m pip freeze
        +(__venv__)$ python -m pip freeze
         isholiday==0.1
         

        Souboru setup.py rozumí i nástroj pip, takže můžete použít ten:

        -
        (__venv__)$ python -m pip install .
        +
        (__venv__)$ python -m pip install .
         

        Mezi výše uvedenými příkazy existují rozdíly, ale pro základní použití se výsledek neliší.

        Alternativně můžete použít příkaz develop (nebo pip install --editable), který balíček nainstaluje tak, že změny v souborech se projeví rovnou (není třeba po každé změněně instalovat znovu).

        Přes setup.py můžeme dělat i jiné věci, než jen instalovat, například vytvořit archiv, zdrojový balíček:

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         ...
         warning: sdist: standard file not found: should have one of README, README.rst, README.txt
         ...
         

        Extra soubory do zdrojového balíčku -# +#

        Jak vidíte, setuptools si stěžuje, že náš projekt nemá README – soubor, do kterého se tradičně píšou základní informace o projektu. Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, tedy tam, kde byste jej nejspíš čekali.

        Czech public holiday checker...

        Poté spustíme setup.py sdist znovu:

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         

        V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam být i soubor README.

        Skvělé, pojďme vytvořit i další speciální soubor, LICENSE, který bude @@ -100,7 +100,7 @@

        setup.py

        V našem případě bude MANIFEST.in vypadat takto:

        include LICENSE

        Při dalším spuštění už setup.py přidá i soubor LICENSE. To můžete zkontrolovat i ve výsledném archivu.

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         ...
         hard linking LICENSE -> isholiday-0.1
         hard linking MANIFEST.in -> isholiday-0.1
        @@ -109,16 +109,16 @@ 

        setup.py

        Hotový balíček pak můžete nainstalovat pomocí nástroje pip. Doporučuji to dělat v jiném virtuálním prostředí – v aktuálním už ho máte nainstalovaný.

        -
        # v jiné konzoli, v jiném adresáři
        -$ python3 -m venv __venv2__
        -$ . __venv2__/bin/activate
        -(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
        +
        # v jiné konzoli, v jiném adresáři
        +$ python3 -m venv __venv2__
        +$ . __venv2__/bin/activate
        +(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
         Processing cesta/k/projektu/dist/isholiday-0.1.tar.gz
         Installing collected packages: isholiday
           Running setup.py install for isholiday ... done
         Successfully installed isholiday-0.1
         

        Více argumentů pro setup() -# +#

        Na chvíli se vrátíme k volání funkce setup() a přidáme co nejvíc dalších položek. @@ -167,7 +167,7 @@

        setup.py což komplikuje práci s datovými soubory (např. templates pro Flask). Je proto lepší zip_safe=False uvést.

        Více souborů s Python kódem -# +#

        Doteď jsme vytvářeli balíček jen s modulem ve formě jednoho zdrojového souboru isholiday.py. Co ale dělat, pokud je náš projekt větší a obsahuje souborů více? @@ -193,19 +193,19 @@

        Více souborů s Python kódem

        Soubor __init__.py jednak značí, že adresář isholiday je importovatelný modul, a také obsahuje kód, který se spustí při importu modulu isholiday.

        Musíme ještě mírně upravit setup.py – místo py_modules použijeme packages:

        -
        diff --git a/setup.py b/setup.py
        -index 3a69792..6b453ab 100644
        ---- a/setup.py
        -+++ b/setup.py
        -@@ -11,7 +11,7 @@ setup(
        -     keywords='holiday,dates',
        -     license='Public Domain',
        -     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
        --    py_modules=['isholiday'],
        -+    packages=['isholiday'],
        -     classifiers=[
        -         'Intended Audience :: Developers',
        -         'License :: Public Domain',
        +
        diff --git a/setup.py b/setup.py
        +index 3a69792..6b453ab 100644
        +--- a/setup.py
        ++++ b/setup.py
        +@@ -11,7 +11,7 @@ setup(
        +     keywords='holiday,dates',
        +     license='Public Domain',
        +     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
        +-    py_modules=['isholiday'],
        ++    packages=['isholiday'],
        +     classifiers=[
        +         'Intended Audience :: Developers',
        +         'License :: Public Domain',
         

        Případně, což je ještě lepší, můžeme použít find_packages():

        from setuptools import setup, find_packages
         
        @@ -240,11 +240,11 @@ 

        Více souborů s Python kódem protože znepřehledňuje kód, to ale neznamená, že to musíme uživatelům naší knihovny znepříjemňovat (např. pro interaktivní režim).

        Spouštění modulu -# +#

        Pokusíme-li se teď program spustit pomocí python -m isholiday, narazíme na problém: na rozdíl od souboru se složka s kódem takto spustit nedá:

        -
        $ python -m isholiday
        +
        $ python -m isholiday
         python: No module named isholiday.__main__; 'isholiday' is a package and cannot be directly executed
         

        Namísto spuštění souboru (typicky s blokem if __name__ == '__main__':) totiž Python v tomto případě hledá soubor pojmenovaný __main__.py a spustí ten.

        @@ -259,7 +259,7 @@

        Více souborů s Python kódem Bude to fungovat i tehdy, když vytvoříte balíček (python setup.py sdist) a nainstalujete ho v jiném virtuálním prostředí.

        Programy pro příkazovou řádku -# +#

        Pokud chcete, aby váš modul umožňoval spouštění přímo z příkazové řádky, bez python -m, měli byste použít entrypoints. @@ -277,16 +277,16 @@

        Programy pro příkazovou řádku funkce může být v modulu definovaná nebo importovaná.

        Skript bude možné použít, je-li aktivní prostředí, kde je nainstalován, jen zadáním jména entrypointu:

        -
        (__venv__)$ python setup.py sdist
        -
        # v jiné konzoli, v jiném virtuálním prostředí
        -(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
        +
        (__venv__)$ python setup.py sdist
        +
        # v jiné konzoli, v jiném virtuálním prostředí
        +(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
         (__venv2__)$ isholiday_demo
         ...
         Mon Mar 28 00:00:00 2016 True
         Tue Mar 28 00:00:00 2017 False
         Fri Apr 14 00:00:00 2017 True
         

        Specifikace závislostí -# +#

        Balíčky na PyPI mohou záviset na dalších balíčkách. V případě isholiday to potřeba není, ale v úlohách z minulých cvičení ano.

        @@ -299,7 +299,7 @@

        Programy pro příkazovou řádku install_requires=['Flask', 'click>=6'], )

        Soubor requirements.txt -# +#

        Kromě závislostí v setup.py se u pythonních projektů často setkáme se souborem requirements.txt, který obsahuje přesné verze všech závislostí, včetně @@ -315,7 +315,7 @@

        Programy pro příkazovou řádku My ho používat nebudeme, vystačíme si s volnější specifikací závislostí v setup.py.

        Nahrání na PyPI -# +#

        Balíček jde zaregistrovat a nahrát na PyPI. Původně k tomu sloužily příkazy setup.py register a upload, ale tyto příkazy používaly HTTP, což není @@ -325,26 +325,26 @@

        Nahrání na PyPI účet na PyPI, účet na testovací PyPI a vytvořit konfigurační soubor ~/.pypirc:

        -
        [distutils]
        -index-servers=
        -    pypi
        -    testpypi
        +
        [distutils]
        +index-servers=
        +    pypi
        +    testpypi
         
        -[pypi]
        -username = <your user name goes here>
        -password = <your password goes here>
        +[pypi]
        +username = <your user name goes here>
        +password = <your password goes here>
         
        -[testpypi]
        -repository = https://test.pypi.org/legacy/
        -username = <your user name goes here>
        -password = <your password goes here>
        +[testpypi]
        +repository = https://test.pypi.org/legacy/
        +username = <your user name goes here>
        +password = <your password goes here>
         

        Hesla můžete vynechat, pokud je budete chtít pokaždé zadávat.

        Používáte-li Windows, je potřeba nastavit proměnnou prostředí HOME na adresář se souborem .pypirc, např:

        > set HOME=C:\cesta\k\nastaveni
         

        Registrace projektu a nahrání na testovací PyPI se provádí pomocí příkazu upload: ten projekt zaregistrueje (pokud to jde) a nahraje samotný balíček:

        -
        (__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
        +
        (__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
         Uploading distributions to https://test.pypi.org/legacy/
         Uploading isholiday-0.1.tar.gz
         [================================] 8379/8379 - 00:00:02
        @@ -358,18 +358,18 @@ 

        Nahrání na PyPI Zabírat jména na opravdové PyPI jen tak není hezké vůči ostatním Pythonistům; registrujte tedy prosím jen balíčky, které budou nějak pro ostatní užitečné.

        Instalace pomocí pip -# +#

        Projekt nahraný na PyPI by mělo jít nainstalovat pomocí pipu. V případě použití ostré verze PyPI stačí k instalaci zadat název balíčku:

        -
        (__venv__)$ python -m pip install <název_balíčku>
        +
        (__venv__)$ python -m pip install <název_balíčku>
         

        Pokud však použijeme testovací PyPI, je nutné pipu říct, aby balíček hledal tam. Postup uvedený v dokumentaci není v tomto případě nejvhodnější, protože z testovací PyPI vezme jak náš balíček, tak i případné závislosti, které mohou být zastaralé, rozbité či jinak škodlivé.

        Lepší by bylo, kdyby pip nainstaloval závislosti z ostré PyPI a na testovací hledal jen náš projekt. Toho se dá docílit přepínačem --extra-index-url.

        -
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
        +
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
         

        V tomto případě pip nejdřív prohledá ostrou PyPI, a pokud nenajde požadovaný balíček, použije testovací PyPI. Zde je potřeba dávat pozor na název projektu, protože případné konflikty mezi ostrou a testovací PyPI se nekontrolují. @@ -377,15 +377,15 @@

        Instalace pomocí pip stejným názvem, nainstaluje se ten z ostré verze.

        V případě, že tento problém nastane, je možné ho částečně obejít specifikací verze instalovaného balíčku:

        -
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
        +
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
         

        Pokud u duplicitního projektu na ostré PyPI neexistuje požadovaná verze, nainstaluje se náš balíček z testovací PyPI.

        Jiná možnost je zadat přímo cestu k archivu s balíčkem místo jeho názvu. Zde pak na umístění balíčku ani verzi nezáleží:

        -
        (__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
        +
        (__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
         

        Odkaz na archiv se dá najít na informační stránce o našem projektu na PyPI.

        Datové soubory -# +#

        Některé moduly kromě samotného kódu potřebují i datové soubory. Například aplikace ve Flasku potřebují templates. @@ -397,7 +397,7 @@

        Datové soubory )

        Další informace jsou odkázané v dokumentaci.

        Wheel: Binární balíčky -# +#

        Zatím jsme se zabývali jen zdrojovými balíčky (sdist). Existují ale i balíčky „zkompilované” – binární (bdist). @@ -405,7 +405,7 @@

        Wheel: Binární balíčky Binární balíček se místo toho jen rozbalí na patřičné místo.

        Z historických důvodů existuje několik různých druhů binárních distribucí, v současné době je ale důležitá pouze možnost bdist_wheel:

        -
        (__venv__)$ python setup.py bdist_wheel
        +
        (__venv__)$ python setup.py bdist_wheel
         

        Výsledek je v souboru dist/*.whl.

        Pokud vám příkaz nefunguje, nainstalujte balík wheel.

        Obsah binárního balíčku typu wheel můžete prozkoumat, je to obyčejný ZIP.

        @@ -423,12 +423,12 @@

        Wheel: Binární balíčky
      • wheel se rychleji instaluje.
      • Proces vydání složitějšího softwaru pak může vypadat takto:

        -
        (__venv__)$ rm dist/*
        -(__venv__)$ python setup.py sdist bdist_wheel
        +
        (__venv__)$ rm dist/*
        +(__venv__)$ python setup.py sdist bdist_wheel
         [... kontrola vytvořených balíčků v „čistém“ virtualenvu ...]
        -(__venv__)$ python -m twine upload dist/*
        +(__venv__)$ python -m twine upload dist/*
         

        Další -# +#

        K balíčkování existuje obsáhlá dokumentace. Budete-li chtít dělat něco, co v tomto kurzu není, podívejte se tam!

        \ No newline at end of file diff --git a/lessons/docs/index.html b/lessons/docs/index.html index d7951b06..c64dc311 100644 --- a/lessons/docs/index.html +++ b/lessons/docs/index.html @@ -1,11 +1,11 @@

        Dokumentace -# +#

        Jednou ze zásadních součástí každého kvalitního Python projektu je dokumentace. Protože chceme, abyste vytvářeli kvalitní projekty, podíváme se tedy i na dokumentaci.

        Sphinx -# +#

        Nejpoužívanějším nástrojem na vytváření dokumentace Python projektů je Sphinx. Když jste se dívali do dokumentace Flasku, requests, clicku, flexmocku, pytestu, @@ -54,13 +54,13 @@

        Sphinx dokumentace sestavit do HTML.

        Sphinx umí generovat dokumentaci ve více formátech (LaTeX, manuálové stránky atd.), pro nás bude podstatné především HTML.

        -
        (__venv__) $ make html
        +
        (__venv__) $ make html
         ...
         The HTML pages are in _build/html.
         

        Ve zmíněné složce byste měli najít index.html, ten si můžete prohlédnout v prohlížeči.

        Textový obsah v dokumentaci -# +#

        Text dokumentace začíná v souboru index.rst a píše se ve značkovacím formátu reStructuredText neboli rst. @@ -104,7 +104,7 @@

        Textový obsah v dokumentaci
        It refers to the section itself, see :ref:`my-reference-label`.
         It could refer to a different section as well :)
         

        Co do dokumentace psát -# +#

        Teď, když víte jak něco napsat, pojďme si povědět co vlastně psát. K čemu dokumentace vlastně je?

        @@ -141,7 +141,7 @@

        Textový obsah v dokumentaci
      • podrobný návod jak přispívat.
      • Nastavení a rozšíření -# +#

        Průvodce sphinx-quickstart generuje soubor s nastavením, conf.py, ve kterém můžete měnit nastavení Sphinxu a jeho rozšíření, včetně detailů @@ -155,7 +155,7 @@

        Nastavení a rozšíření 'sphinx.ext.intersphinx', ]

        doctest -# +#

        doctest je modul ze standardní knihovny, který najde v dokumentaci bloky kódu a otestuje, jestli odpovídají ukázanému výstupu. @@ -178,34 +178,34 @@

        Nastavení a rozšíření
        foo
         

        K tomu všemu složí několik direktiv:

        .. testsetup:: -# +#

        Direktiva pro potřebný kód, který se musí provést, aby příklad fungoval, ale nebude v dokumentaci zobrazen (např. kód pro vytvoření falešného objektu, import...).

        .. testcleanup:: -# +#

        Podobná direktiva jako .. testsetup:: provedená po skončení testů. V dokumentaci nebude kód zobrazen.

        .. doctest:: -# +#

        Test s interaktivní konzolí. V dokumentaci bude zobrazen, pokud nepoužijete flag :hide:.

        .. testcode:: -# +#

        Kód testu bez interaktivní konzole, co chcete kontrolovat, musíte dát na standardní výstup. V dokumentaci bude zobrazen, pokud nepoužijete flag :hide:.

        .. testoutput:: -# +#

        Výstup posledního testcode bloku. V dokumentaci bude kód zobrazen, pokud nepoužijete flag :hide:.

        Kompletní příklad -# +#

        Zde můžete vidět výše zmíněné direktivy použité dohromady. Jedná se o umělý příklad, kdy použitou třídu připravíme v direktivě testsetup. @@ -264,7 +264,7 @@

        Kompletní příklad parrot.die()

        Testy se také dají např. zařazovat do skupin. Více najdete v dokumentaci.

        -
        (__venv__) $ make doctest
        +
        (__venv__) $ make doctest
         ...
         Document: intro
         ---------------
        @@ -287,7 +287,7 @@ 

        Kompletní příklad 0 failures in cleanup code ...

        Import z vlastního kódu -# +#

        Pokud nemáte nainstalovaný vlastní balíček a budete z něj chtít v doctestu importovat, pravděpodobně dostanete ImportError. @@ -305,7 +305,7 @@

        Kompletní příklad import sys sys.path.insert(0, os.path.abspath('..'))

        Travis CI -# +#

        Neexistuje zatím unifikovaný způsob, jak specifikovat závislosti pro sestavení dokumentace. Proto, pokud chcete mít nějaký jednoduchý způsob, jak pouštět @@ -315,15 +315,15 @@

        Kompletní příklad (většinou pouze sphinx), nebo všechny závislosti, aby šel použít soubor samostatně.

        Poté na Travisu můžete udělat něco jako:

        -
        language: python
        -python:
        -- '3.7'
        -install:
        -- python setup.py install
        -- pip install -r docs/requirements.txt
        -script:
        -- python setup.py test --addopts -v
        -- cd docs && make doctest
        +
        language: python
        +python:
        +- '3.7'
        +install:
        +- python setup.py install
        +- pip install -r docs/requirements.txt
        +script:
        +- python setup.py test --addopts -v
        +- cd docs && make doctest
         

        Chcete-li jít s dobou, můžete vyzkoušet strukturovaný způsob závislostí pro vývoj pomocí extras. Aktuálně pro to neexistuje standard, ale vypadá to, že následující způsob je nejlepší kandidát na @@ -336,7 +336,7 @@

        Kompletní příklad jméno extras v hranatých závorkách):

        install:
         - python -m pip install .[dev]

        autodoc -# +#

        Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, které průvodce přidává automaticky.

        @@ -355,13 +355,13 @@

        Kompletní příklad můžete použít i jiné direktivy.

        Pro vygenerování hezké struktury si můžete pomoci příkazem sphinx-apidoc:

        -
        (__venv__) $ sphinx-apidoc -o docs mymodule
        +
        (__venv__) $ sphinx-apidoc -o docs mymodule
         

        V dokumentačních řetězcích samozřejmě můžete použít reStructuredText a je to dokonce žádoucí.

        Zde je ukázka z betamaxu (Copyright 2013 Ian Cordasco):

        class Betamax:
         
        -    """This object contains the main API of the request-vcr library.
        +    """This object contains the main API of the request-vcr library.
         
             This object is entirely a context manager so all you have to do is:
         
        @@ -399,7 +399,7 @@ 

        Kompletní příklad

        Existují různé způsoby, jak dokumentovat argumenty, návratové hodnoty apod. Zvídavým studentům doporučujeme podívat se na rozšíření Napoleon.

        Odkazy na třídy a moduly -# +#

        Máte-li zdokumentovaný modul, funkci, třídu, metodu apod., je možné na ni odkázat pomocí konstrukce :mod:, :func:, :class:, :meth: a dalších @@ -410,13 +410,13 @@

        Odkazy na třídy a moduly

        Všechny zdokumentované objekty se automaticky přidávají do rejstříku. Chcete-li do rejstříku přidat něco navíc, použijte direktivu index.

        README.rst -# +#

        Když už se stejně zabýváme reStructuredTextem, je dobré váš README přepsat nebo převést do stejného formátu. Na PyPI pak bude váš projekt vypadat lépe.

        Při přejmenování na README.rst dejte pozor na patřičné změny v setup.py.

        Read the Docs -# +#

        Pokud svůj repositář na GitHubu změníte na veřejný, můžete využít službu Read the Docs k hostování dokumentace ve Sphinxu. diff --git a/lessons/drawing/index.html b/lessons/drawing/index.html index ceb57f37..0ad12f44 100644 --- a/lessons/drawing/index.html +++ b/lessons/drawing/index.html @@ -1,5 +1,5 @@

        Nakresli mi hada -# +#

        Většina videoher má vlastní svět – spoustu čísel, textů, seznamů a jiných datových objektů, které popisují všechno, co ve hře je – celý stav hry. @@ -17,7 +17,7 @@

        Nakresli mi hada

        Napadne tě, jak polohu hada zapsat pomocí čísel, seznamů a dalších základních datových typů?

        Reprezentace hada -# +#

        Asi nejjednodušší způsob, jak si v počítači „zapamatovat“ herního hada, je pomocí seznamu souřadnic.

        @@ -50,7 +50,7 @@

        Reprezentace hada

        Počítačům (a programátorům?) to takhle stačí. My si to ale zkusme zobrazit barevně, ať hadovi rozumí i hráč naší budoucí hry.

        Logické a zobrazovací souřadnice -# +#

        U vykreslování hada musíme vyřešit jeden základní problém: převod logických souřadnic na souřadnice obrazovky.

        @@ -66,7 +66,7 @@

        Logické a zobrazovací souřadnice

        A ocas s „herními“ (logickými) souřadnicemi (1, 2) se vykreslí na čtvereček se souřadnicemi (10, 20).

        Sázení čtverečku -# +#

        Na to, abychom hada vykreslili, použijeme okýnko z Pygletu. Tady je základní kostra programu Pyglet, které už bys měl/a rozumět.

        @@ -132,7 +132,7 @@

        Řešení

        Sázení hada -# +#

        Zkus teď na začátek programu – těsně pod import a konstantu – přidat definici hada:

        @@ -175,7 +175,7 @@

        Řešení

        Krmení -# +#

        @@ -224,7 +224,7 @@

        Řešení

        pyglet.gl.glEnable(pyglet.gl.GL_BLEND) pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA, pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)

        Načítání kousků hada -# +#

        Teď, když umíš kreslit hada ze čtverců, zkusíme ho udělat hezčího. Stáhni si archiv snake-tiles.zip @@ -303,7 +303,7 @@

        Řešení

        Housenka -# +#

        A teď zkus načtení obrázků začlenit do programu s hadem!

        Všechny importy patří nahoru, konstanty pod ně, a dál pak zbytek kódu. @@ -350,7 +350,7 @@

        Řešení

        Jak vybrat čtverečky? -# +#

        Místo toho, aby byl všude stejný kousek hada, ale budeme chtít vybrat vždycky ten správný.

        diff --git a/lessons/exceptions/index.html b/lessons/exceptions/index.html index 7f42a513..578036e1 100644 --- a/lessons/exceptions/index.html +++ b/lessons/exceptions/index.html @@ -1,11 +1,11 @@

        Výjimky -# +#

        Pojďme si prohloubit znalosti o chybách, neboli odborně o výjimkách (angl. exceptions).

        Podívej se na následující funkci:

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             odpoved = input('Zadej číslo: ')
             return int(odpoved)
         

        Když uživatel nezadá číslice, ale třeba text cokolada, @@ -13,7 +13,7 @@

        Výjimky odpovídající chybovou hlášku:

        Traceback (most recent call last):
           File "ukazka.py", line 4, in nacti_cislo
        -    cislo = int(odpoved)
        +    cislo = int(odpoved)
         ValueError: invalid literal for int() with base 10: 'cokolada'
         

        Program volá funkci int() pro něco, co nedává smysl jako číslo. Co s tím má chudák funkce int dělat? @@ -25,7 +25,7 @@

        Výjimky Kdybys měl/a funkci, která zjistí jestli jsou v řetězci jen číslice, mohlo by to fungovat nějak takhle:

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             while True:
                 odpoved = input('Zadej číslo: ')
                 if obsahuje_jen_cislice(odpoved):
        @@ -54,11 +54,11 @@ 

        Výjimky

        Chceš-li zjistit, jestli funkce int umí daný řetězec převést na číslo, nejlepší je použít přímo funkci int.

        Ošetření chyby -# +#

        Pro zachycení chyby má Python příkaz try/except.

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             while True:
                 odpoved = input('Zadej číslo: ')
                 try:
        @@ -72,7 +72,7 @@ 

        Výjimky v bloku except. Pokud výjimka nenastala, přeskočí se celý blok except.

        Druhy chyb -# +#

        A co je to ValueError? To je typ chyby. Podobných typů je spousta. @@ -101,7 +101,7 @@

        Druhy chyb například except ArithmeticError: zachytí i ZeroDivisionError. A except Exception: zachytí všechny výjimky, které běžně chceš zachytit.

        Nechytej je všechny! -# +#

        Většinu chyb není potřeba ošetřovat.

        Nastane-li nečekaná situace, je téměř vždy @@ -122,7 +122,7 @@

        Nechytej je všechny! Neboli vypsat chybovou hlášku. A to se stane normálně, bez try.

        Další přílohy k try -# +#

        Pro úplnost: kromě except existují dva jiné bloky, které můžeš „přilepit“ k try, a to else a finally. @@ -148,7 +148,7 @@

        Další přílohy k try finally: print('Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`')

        Vyvolání chyby -# +#

        Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

        Často se to stává, když píšeš nějakou obecnou funkci. @@ -174,7 +174,7 @@

        Další přílohy k try Chybu můžeš vyvolat pomocí příkazu raise. Za příkaz dáš druh výjimky a pak do závorek nějaký popis toho, co je špatně.

        def obsah_ctverce(strana):
        -    """Vrátí obsah čtverce s danou délkou strany"""
        +    """Vrátí obsah čtverce s danou délkou strany"""
             if strana > 0:
                 return strana ** 2
             else:
        diff --git a/lessons/expressions/index.html b/lessons/expressions/index.html
        index d6deb629..ebe5dfcc 100644
        --- a/lessons/expressions/index.html
        +++ b/lessons/expressions/index.html
        @@ -1,5 +1,5 @@
         

        Vyhodnocování výrazů -# +#

        Už víš, že Python se dá použít jako kalkulačka: dokáže spočítat hodnotu výrazu (angl. expression) jako 3 * (5 + 2). diff --git a/lessons/files/index.html b/lessons/files/index.html index ebb326ba..4857abe5 100644 --- a/lessons/files/index.html +++ b/lessons/files/index.html @@ -1,5 +1,5 @@

        Soubory -# +#

        Dnes se podíváme na to, jak v Pythonu číst z (a pak i zapisovat do) souborů.

        @@ -36,7 +36,7 @@

        Soubory najednou přečte celý obsah souboru a vrátí ho jako řetězec. Nakonec metoda close() otevřený soubor zase zavře.

        Automatické zavírání souborů -# +#

        Soubory se dají přirovnat k ledničce: abys něco mohl/a z ledničky vzít, nebo dát dovnitř, musíš @@ -66,7 +66,7 @@

        Automatické zavírání souborů Když se Python dostane na konec odsazeného bloku, soubor automaticky zavře.

        V naprosté většině případů je pro otevírání souborů nejlepší použít with.

        Iterace nad soubory -# +#

        Otevřené soubory se, jako např. řetězce či range, dají použít s příkazem for. @@ -115,7 +115,7 @@

        Řešení

        print() print('Jak se ti líbí?')

        Psaní souborů -# +#

        Pozor!

        Pro Python není problém smazat obsah jakéhokoli souboru. diff --git a/lessons/first-steps/index.html b/lessons/first-steps/index.html index f1ef9e68..55fdb14c 100644 --- a/lessons/first-steps/index.html +++ b/lessons/first-steps/index.html @@ -1,5 +1,5 @@

        Interaktivní režim Pythonu -# +#

        Chceš-li si začít hrát s Pythonem, otevři příkazový řádek a aktivuj virtuální prostředí. Zkontroluj si, že ti na začátku příkazové řádky svítí (venv).

        @@ -26,7 +26,7 @@

        Interaktivní režim Pythonu V průběhu kurzu jich uvidíš ještě spoustu, takže si ji dobře prohlédni, ať ji příště poznáš.

        První příkaz -# +#

        Třemi „zobáčky“ >>> Python prosí o instrukce. Pojď mu nějakou dát!

        @@ -66,7 +66,7 @@

        První příkaz v těchto materiálech. Kód je pak čitelnější.

        Ukončení -# +#

        Pokud ses dostal/a až sem, gratuluji! Python máš nejen nainstalovaný, ale taky ti funguje. diff --git a/lessons/flask/index.html b/lessons/flask/index.html index 1eb018e4..75905d00 100644 --- a/lessons/flask/index.html +++ b/lessons/flask/index.html @@ -1,5 +1,5 @@

        Webové aplikace: Flask -# +#

        Python je víceúčelový jazyk. Na minulém cvičení jsme tvořili aplikace pro příkazovou řádku, @@ -9,13 +9,13 @@

        Webové aplikace: Flask

        Pro naše účely použijeme Flask, protože je nejrychlejší na pochopení a nevyžaduje striktně použití MVC paradigmatu.

        Flask -# +#

        Flask opět můžete nainstalovat do virtualenvu, nejlépe použít projekt z minulého cvičení:

        -
        $ cd project
        -$ . __venv__/bin/activate 
        -(__venv__) $ python -m pip install Flask
        +
        $ cd project
        +$ . __venv__/bin/activate 
        +(__venv__) $ python -m pip install Flask
         

        Základní použití Flasku je poměrně primitivní. Do souboru hello.py napište:

        from flask import Flask
        @@ -26,9 +26,9 @@ 

        Flask return 'MI-PYT je nejlepší předmět na FITu!'

        Pak aplikaci spusťte pomocí následujících příkazů. (Na Windows použijte místo export příkaz set.)

        -
        (__venv__) $ export FLASK_APP=hello.py
        -(__venv__) $ export FLASK_DEBUG=1
        -(__venv__) $ flask run
        +
        (__venv__) $ export FLASK_APP=hello.py
        +(__venv__) $ export FLASK_DEBUG=1
        +(__venv__) $ flask run
          * Serving Flask app "hello"
          * Forcing debug mode on
          * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
        @@ -58,7 +58,7 @@ 

        Flask return 'Hello, World'

        Na adrese http://127.0.0.1:5000/hello/ pak uvidíte druhou stránku.

        Ladící režim -# +#

        Proměnná FLASK_DEBUG říká, že se aplikace má spustit v ladícím režimu: je zapnutý příjemnější výpis chyb a aplikace se automaticky restartuje @@ -73,7 +73,7 @@

        Ladící režim Navíc aplikaci zpomaluje. Používejte ho proto pouze na svém počítači.

        Dynamické routy -# +#

        Když vytváříte dynamický web, ne vždy můžete všechna URL znát dopředu. Budete například chtít zobrazit informace o uživatelích na adresách @@ -102,7 +102,7 @@

        Dynamické routy def hello(name='world'): return 'Hello, {}!'.format(name)

        Získání URL -# +#

        Opačným způsobem jak k routám přistupovat je, když potřebujete získat URL nějaké stránky, například protože potřebujete zobrazit odkaz. @@ -129,7 +129,7 @@

        Dynamické routy Generování URL vám také může zjednodušit nasazení statické verze stránek.

        Pro URL v rámci vašich stránek proto doporučujeme url_for používat důsledně.

        Šablony -# +#

        Zatím jsou naše webové stránky poměrně nudné: obsahují jen prostý text, nepoužívají HTML.

        @@ -182,7 +182,7 @@

        Šablony (Jiné funkce známé z Pythonu ale použít nejdou – ač jsou podobné, je Jinja2 jiný jazyk než Python.)

        Filtry -# +#

        Není úplně elegantní vzít nějaká data (např. tweety z Twitter API) a ještě před předáním šabloně do nich cpát svoje úpravy (např. převod na HTML). @@ -194,7 +194,7 @@

        Filtry @app.template_filter('time') def convert_time(text): - """Convert the time format to a different one""" + """Convert the time format to a different one""" dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y') return dt.strftime('%c') @@ -208,7 +208,7 @@

        Filtry
        {{ created_at|time }}
         

        Pokud potřebujete velmi obecný filtr, je vhodné se podívat do seznamu těch vestavěných.

        Escaping -# +#

        V textu, který se vkládá do šablon, jsou automaticky nahrazeny znaky, které mají v HTML speciální význam. @@ -233,7 +233,7 @@

        Escaping @app.template_filter('time') def convert_time(text): - """Convert the time format to a different one""" + """Convert the time format to a different one""" dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y') result = dt.strftime('<strong>%c</strong>') return jinja2.Markup(result) @@ -241,7 +241,7 @@

        Escaping (ani nikdo mnohem chytřejší než vy) nemohl na vaší stránce provést něco nekalého.

        Statické soubory -# +#

        Pokud budete potřebovat nějaké statické soubory (např. styly CSS nebo obrázky), dejte je do adresáře static vedle souboru s kódem @@ -250,7 +250,7 @@

        Statické soubory

        V šabloně pak například:

        <link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
         

        Logování -# +#

        Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného @@ -280,7 +280,7 @@

        Statické soubory (navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody setLevel, viz dokumentace modulu logging.

        Větší Flask aplikace -# +#

        Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet @@ -292,7 +292,7 @@

        Větší Flask aplikace

        Následující sekce popisují některé zajímavé techniky, které se mohou u větších a složitějších aplikací hodit.

        create_app factory -# +#

        Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí funkce, tzv. application_factory, @@ -310,7 +310,7 @@

        create_app factory return app

        Blueprint moduly -# +#

        Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky @@ -347,7 +347,7 @@

        create_app factory

        V případě použití url_for je třeba cesty z blueprintu namespacovat, např.:

        url_for('auth.login')
         

        Vlastní podtřída Flask -# +#

        Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které @@ -385,7 +385,7 @@

        create_app factory def greetings_number(): return str(current_app.greetings)

        A další -# +#

        Flask umí i další věci – například zpracování formulářů, chybové stránky nebo přesměrování. Také existuje i řada rozšíření, diff --git a/lessons/fstring/index.html b/lessons/fstring/index.html index 7885da6b..80def15a 100644 --- a/lessons/fstring/index.html +++ b/lessons/fstring/index.html @@ -1,5 +1,5 @@

        Šablony (formátovací řetězce) -# +#

        Řekněme, že chceš uživateli vypsat určitou hodnotu s nějakou „omáčkou“ okolo. Dá se na to použít print(), kterému můžeš předat „mix“ řetězců a čísel:

        @@ -44,15 +44,15 @@

        Šablony (formátovací řetězce) Váš výsledek je {soucet}. S pozdravem, -{podpis} +{podpis} """)

        A nakonec – v šabloně můžeš použít nejen jména proměnných, ale jakékoli výrazy.

        -
        >>> hlaska = f'Součet je {3 + 4}'
        +
        >>> hlaska = f'Součet je {3 + 4}'
         

        Ale nepřežeň to! Většinou je program přehlednější, když si každou vypisovanou hodnotu zvlášť pojmenuješ – tedy uložíš do vhodně pojmenované proměnné.

        Metoda format -# +#

        Někdy se stane, že jednu šablonu potřebuješ použít vícekrát. Pak formátovací řetězec použít nemůžeš, protože se do něj proměnné doplňují diff --git a/lessons/functions/index.html b/lessons/functions/index.html index 3c02f37c..0d8b8c3e 100644 --- a/lessons/functions/index.html +++ b/lessons/functions/index.html @@ -1,5 +1,5 @@

        Funkce -# +#

        Známe spoustu matematických operací, které se zapisují pomocí symbolů – třeba plus a minus. @@ -63,7 +63,7 @@

        Funkce .

        Všechno ostatní vyjádříme slovně.

        Délka řetězce -# +#

        Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce. Místo symbolu má název. @@ -89,7 +89,7 @@

        Délka řetězce i když se stejně jmenují a podobně zapisují. Pythonní funkce může např. mít pro stejný argument různé hodnoty.

        Volání funkce jako výraz -# +#

        Vzpomínáš si, jak Python vyhodnocuje výrazy?

        vysledek = 3 * (5 + 2)
        @@ -134,7 +134,7 @@ 

        Délka řetězce print( 9 )

        … a podobně.

        Procedury -# +#

        Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") je taky volání funkce. @@ -164,7 +164,7 @@

        Procedury Kdybys o něm diskutoval/a s nějakým zkušeným programátorem, odkaž ho prosím na tyto materiály.

        Argumenty -# +#

        Argument je to, co funkci dáš k dispozici. Hodnota, se kterou funkce pracuje. Chceš-li délku řetězce Ahoj!, použiješ funkci len která umí vypočítat @@ -191,7 +191,7 @@

        Řešení

        Funkce print zavolaná bez argumentů napíše prázdný řádek.

        Pojmenované argumenty -# +#

        Některé funkce umí pracovat i s pojmenovanými argumenty. Píšou se podobně jako přiřazení do proměnné, @@ -209,7 +209,7 @@

        Řešení

        print(1 + 2, end='!') print()

        Funkce je potřeba volat -# +#

        Pozor na to, že když nenapíšeš závorky, funkce se nezavolá! Výraz len(s) je volání funkce, ale len bez závorek označuje @@ -224,7 +224,7 @@

        Řešení

        print(len) # Vypsání samotné funkce print(len + 1) # Sečtení funkce a čísla

        Přehled funkcí -# +#

        A jaké funkce můžeš, kromě len a print, použít? Přehled těch základních najdeš v následující lekci.

        \ No newline at end of file diff --git a/lessons/generators/index.html b/lessons/generators/index.html index fa4c2e64..13adebe9 100644 --- a/lessons/generators/index.html +++ b/lessons/generators/index.html @@ -1,11 +1,11 @@

        Generátory -# +#

        Dnes si popíšeme, jak v Pythonu fungují generátory, tedy funkce s příkazem yield. Někteří z vás možná už nějaký jednoduchý generátor napsali, ale pojďme si je vysvětlit od úplného začátku: od toho, jak se v Pythonu iteruje.

        Iterace -# +#

        Když je v Pythonu potřeba iterovat (např. příkazem for) přes nějakou kolekci (seznam, řetězec, soubor, …), použije se iterační protokol, @@ -26,11 +26,11 @@

        Iterace 3 >>> next(it) Traceback (most recent call last): - ... + ... StopIteration >>> next(it) Traceback (most recent call last): - ... + ... StopIteration

        Cyklus for x in collection: ... tedy dělá něco jako:

        iterator = iter(collection)
        @@ -53,14 +53,14 @@ 

        Iterace

        Iterátory ale můžou být i „větší“: třeba otevřený soubor je iterátor, z něhož next() načítá jednotlivé řádky.

        Generátory -# +#

        Asi nejzajímavější druh iterátoru je tzv. generátor: funkce, která umí postupně dávat k dispozici hodnoty. Definuje se pomocí klíčového slova yield: každá funkce, která obsahuje yield, je generátorová funkce (angl. generator function).

        def generate2():
        -    """generates 2 numbers"""
        +    """generates 2 numbers"""
             print('A')
             yield 0
             print('B')
        @@ -83,10 +83,10 @@ 

        Generátory >>> next(it) C Traceback (most recent call last): - ... + ... StopIteration

        Další použití generátorů -# +#

        Vlastnost přerušit provádění funkce je velice užitečná nejen pro vytváření sekvencí, ale má celou řadu dalších užití. @@ -108,14 +108,14 @@

        Generátory Můžeme si představit, že místo yield se „doplní“ obsah bloku with. Funkce se tam na chvíli zastaví a může se tedy provádět něco jiného.

        Vracení hodnot z generátorů -# +#

        V rámci generátorové funkce můžeme použít i return, který funkci ukončí. Vrácená hodnota se však při normální iteraci (např. ve for) nepoužije. Objeví se pouze jako hodnota výjimky StopIteration, která signalizuje konec iterace:

        def generator(a, b):
        -    """Yield two numbers and return their sum"""
        +    """Yield two numbers and return their sum"""
             yield a
             yield b
             return a + b
        @@ -129,7 +129,7 @@ 

        Vracení hodnot z generátorů File "<stdin>", line 1, in <module> StopIteration: 5

        Obousměrná komunikace -# +#

        Oproti normálním iterátorům, které hodnoty jen poskytují, mají generátory metodu send(), kterou je možné posílat hodnoty do běžícího generátoru. @@ -182,7 +182,7 @@

        Vracení hodnot z generátorů RuntimeError: generator ignored GeneratorExit 0

        Delegace na podgenerátor – yield from -# +#

        Máme následující generátor:

        def dance():
        diff --git a/lessons/git-collaboration-2in1/index.html b/lessons/git-collaboration-2in1/index.html
        index d827e609..6830dfc9 100644
        --- a/lessons/git-collaboration-2in1/index.html
        +++ b/lessons/git-collaboration-2in1/index.html
        @@ -1,5 +1,5 @@
         

        Spolupráce a Git -# +#

        „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat @@ -15,7 +15,7 @@

        Spolupráce a Git Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

        Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

        Git a GitHub -# +#

        Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. Takové složce s kódem říkáme repozitář. @@ -42,7 +42,7 @@

        Git a GitHub A třetí kopii repozitáře máte u sebe na počítači.

        Git workflow

        Práce s lokálním repozitářem -# +#

        Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, @@ -56,13 +56,13 @@

        Práce s lokálním repozitářem

        Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

        Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

        -
        $ git clone https://github.com/asgeirrr/prezencka
        +
        $ git clone https://github.com/asgeirrr/prezencka
         

        V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

        Stav repozitáře (git status) -# +#

        Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         nothing to commit, working tree clean
        @@ -73,7 +73,7 @@ 

        Stav repozitáře (git status<
      • Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
      • První revize (git commit) -# +#

        Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. @@ -81,7 +81,7 @@

        První revize (git commit)

        Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt a do něj napište svoje současné povolání nebo cokoliv jiného. Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Untracked files:
        @@ -91,9 +91,9 @@ 

        První revize (git commit) nothing added to commit but untracked files present (use "git add" to track)

        U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

        -
        $ git add magdalena_rettigova.txt
        +
        $ git add magdalena_rettigova.txt
         

        a znovu zkontrolujte stav repozitáře:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Changes to be committed:
        @@ -101,13 +101,13 @@ 

        První revize (git commit) new file: magdalena_rettigova.txt

        To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

        -
        $ git commit
        +
        $ git commit
         

        Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). Pak soubor uložíme a zavřeme editor.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is ahead of 'origin/master' by 1 commit.
           (use "git push" to publish your local commits)
        @@ -115,12 +115,12 @@ 

        První revize (git commit)

        Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

        Git workflow

        Log (git log) -# +#

        Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, na které navazujeme.

        -
        $ git log
        +
        $ git log
         commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
         Author: Magdalena Dobromila <magdalena@rettigova.cz>
         Date:   Tue Mar 28 19:27:08 2017 +0200
        @@ -138,7 +138,7 @@ 

        Log (git log)

        V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

        Open-source a Free software -# +#

        Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. @@ -188,11 +188,11 @@

        Open-source a Free software Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

        Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

        Spolupráce na projektu -# +#

        Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

        Posílání změn (git push) -# +#

        Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. @@ -205,26 +205,26 @@

        Posílání změn (git push

        A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         

        Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

        Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje nebo svým uživatelským jménem na GitHubu, aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

        -
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
        +
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
         

        Zkontrolujme, že se nám to povedlo:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
         

        Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

        -
        $ git push tvojejmeno master
        +
        $ git push tvojejmeno master
         

        což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

        Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

        Žádost o začlenění (pull request) -# +#

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

        @@ -237,10 +237,10 @@

        Žádost o začlenění (pull request)

        Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

        Aktualizace (git pull) -# +#

        Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

        -
        $ git pull origin master
        +
        $ git pull origin master
         

        stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

        Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. diff --git a/lessons/github-api/index.html b/lessons/github-api/index.html index fb899589..f6e8976b 100644 --- a/lessons/github-api/index.html +++ b/lessons/github-api/index.html @@ -1,5 +1,5 @@

        Webové API -# +#

        Jak už bylo řečeno v lekci o JSON, hlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc. @@ -14,7 +14,7 @@

        Webové API

        Z minulých lekcí bys měl/a mít založený účet na github.com. Podívejme se na to, jak se zeptat Githubu, co o tobě ví.

        Autorizace -# +#

        První, a mnohdy nejsložitější, krok k použití API je přihlášení. Počítače se totiž přihlašují jinak @@ -34,11 +34,11 @@

        Autorizace

        Obsah tokenu se ti zobrazí pouze jednou, hned po vytvoření. Když ho zapomeneš, deaktivuj ho a vytvoř si nový.

        Requests -# +#

        K práci s internetovými stránkami použijeme knihovnu Requests. V aktivovaném virtuálním prostředí si ji nainstaluj příkazem:

        -
        (venv)$ python -m pip install requests
        +
        (venv)$ python -m pip install requests
         

        A potom v Pythonu zkus stáhnout nějakou stránku:

        import requests
         
        @@ -58,7 +58,7 @@ 

        Requests

        Ale my nechceme obsah pro lidi. Podívejme se, co Github zpřístupňuje počítačům.

        Uživatelský účet -# +#

        Zkus, co dělá tento kód:

        import requests
        @@ -91,7 +91,7 @@ 

        Uživatelský účet Třeba adresu svého profilového obrázku můžeš vypsat pomocí:

        print(data['avatar_url'])
         

        API Githubu -# +#

        API Githubu toho umí mnohem víc. Třeba na adrese https://api.github.com/emojis na tebe čeká @@ -100,7 +100,7 @@

        Uživatelský účet Celé API je zdokumentováno na adrese developer.github.com.

        Interakce -# +#

        Pomocí webových API se dají informace nejen číst, ale i měnit.

        Na stránce diff --git a/lessons/hello-world/index.html b/lessons/hello-world/index.html index 8fca0803..cee6ee22 100644 --- a/lessons/hello-world/index.html +++ b/lessons/hello-world/index.html @@ -1,5 +1,5 @@

        První program -# +#

        >>> 3 + 4
         7
        @@ -23,7 +23,7 @@ 

        První program

        Pokud máš v ukládacím okýnku možnost zvolit kódování, zvol UTF-8. Můžeš–li zvolit typ souboru, zvol .py nebo „všechny soubory“.

        Spuštění -# +#

        Otevři si příkazovou řádku. Pomocí cd donaviguj do adresáře, kde máš soubory ke kurzům Pythonu.

        @@ -34,7 +34,7 @@

        Spuštění

        Příkaz k tomu jsme si ukázali na konci návodu na tvorbu virtuálního prostředí; končí activate.

        Pak a zadej tento příkaz:

        -
        (venv)$ python ahoj.py
        +
        (venv)$ python ahoj.py
         

        Pokud se vypíše hláška Ahoj světe!, gratuluji! Napsal/a jsi svůj první program v Pythonu!

        Jestli to nefunguje, zkontroluj, že:

        diff --git a/lessons/http/index.html b/lessons/http/index.html index e19ef51e..98df17b0 100644 --- a/lessons/http/index.html +++ b/lessons/http/index.html @@ -1,5 +1,5 @@

        HTTP – Jak funguje Internet -# +#

        Než začneme pracovat s internetem – ať už tvorbou vlastních stránek, nebo komunikací s existujícími službami, pojďme si přiblížit, co vlastně ten @@ -29,7 +29,7 @@

        HTTP – Jak funguje Internet Každou webovou stránku spravuje takový server.

        Webové adresy -# +#

        Jak taková komunikace vypadá si ukážeme na příkladu – co se stane, když do prohlížeče zadám tuhle adresu:

        @@ -58,7 +58,7 @@

        Webové adresy

        U jednodušších stránek to může být přímo jméno souboru, který má server uložený na disku – proto spousta adres na Webu končí příponou .html.

        Požadavek a odpověď -# +#

        K získání požadované stránky prohlížeč vytvoří požadavek (angl. request) – zprávu „Pošli mi prosím stránku /lessons/fast-track/http/“ – a pošle ho @@ -113,7 +113,7 @@

        Požadavek a odpověď

        Hlavičky jsou ukončené volným řádkem, po kterém následuje samotný obsah odpovědi ve zmíněném jazyce HTML.

        HTTP Metody -# +#

        Komunikace ukázaná výše používala metodu GET, která slouží ke čtení informací. diff --git a/lessons/ignoring/index.html b/lessons/ignoring/index.html index e546d629..0e7d669e 100644 --- a/lessons/ignoring/index.html +++ b/lessons/ignoring/index.html @@ -1,5 +1,5 @@

        Ignorování souborů -# +#

        Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:

        @@ -34,7 +34,7 @@

        Ignorování souborů

        My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby git status neukazoval červeně, že ještě nejsou v repozitáři.

        Příprava -# +#

        Pojďme si to ukázat na příkladu. Založ si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:

        @@ -80,7 +80,7 @@

        Příprava nothing added to commit but untracked files present (use "git add" to track)

        Spousta souborů, ale jen jeden z nich chceš v repozitáři. Co s těmi ostatními?

        Výstupy programu a pomocné soubory společných nástrojů -# +#

        Nejjednodušší je vyrovnat se se souborem obrazek.ps. V repozitáři ho nechceš (je to repozitář zdrojového kódu; výsledky bývá @@ -126,7 +126,7 @@

        Výstupy program .gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

        Jak ignorovat zbylé dva soubory?

        Osobní poznámky -# +#

        Soubor poznamky.txt se taky dá zařadit do .gitignore, ale moc se tam nehodí. Existuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří @@ -153,7 +153,7 @@

        Osobní poznámky Untracked files: (use "git add <file>..." to include in what will be committed) Autofile.tmp

        Další haraburdí -# +#

        Některé programy automaticky vytvářejí pomocné soubory. Často to dělají správci souborů (často .Thumbnails na Linuxu, @@ -182,7 +182,7 @@

        Osobní poznámky (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: obrazek.py

        Formát ignorovacího souboru -# +#

        Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: každý na zvláštní řádek. @@ -197,13 +197,13 @@

        Osobní poznámky

        Další detaily je možné najít v dokumentaci.

        Automatické přidávání -# +#

        Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo

        -
        $ git add soubor1 soubor2
        -$ git commit
        +
        $ git add soubor1 soubor2
        +$ git commit
         

        můžeš napsat jen git commit s tečkou na konci:

        -
        $ git commit .
        +
        $ git commit .
         

        To automaticky přidá všechny neignorované soubory, které git status ukazuje červeně. Tečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá @@ -213,5 +213,5 @@

        Automatické přidávání

        Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize, ukazovala poznámka s tím, co vlastně v nové revizi bude. Uvidíš tak něco jako git status vždy, když začneš psát popisek k revizi:

        -
        $ git config --global commit.verbose 1
        +
        $ git config --global commit.verbose 1
         
        \ No newline at end of file diff --git a/lessons/inheritance/index.html b/lessons/inheritance/index.html index 6b0d2653..6f0d2aad 100644 --- a/lessons/inheritance/index.html +++ b/lessons/inheritance/index.html @@ -1,5 +1,5 @@

        Dědičnost -# +#

        Minule jsme probrali třídy. Jako příklad jsme si ukázali třídu pro koťátka:

        @@ -77,7 +77,7 @@

        Dědičnost Takže všechno, co je definované pro Zviratko, platí i pro koťátka – dokud to výslovně nezměníš.

        Přepisování metod a super() -# +#

        Když se ti nebude líbit chování některé metody v nadtřídě, stačí dát metodu stejného jména do @@ -125,7 +125,7 @@

        Přepisování metod a super()< kombinovat se speciálními metodami jako __init__. Dokonce se to dělá poměrně často!

        Polymorfismus -# +#

        Programátoři nezavedli dědičnost jen proto, že jsou líní a nechtějí psát dvakrát stejný kód. @@ -166,7 +166,7 @@

        Polymorfismus Liskovové substituční princip, jde o právě tento problém.)

        Generalizace -# +#

        Když se teď podíváš na funkce zamnoukej a zastekej, možná tě napadne, že by se diff --git a/lessons/install-editor/atom.html b/lessons/install-editor/atom.html index b8da122f..39dbf04b 100644 --- a/lessons/install-editor/atom.html +++ b/lessons/install-editor/atom.html @@ -1,11 +1,11 @@

        Instalace Atomu -# +#

        Editor Atom si stáhni z jeho domovské stránky a nainstaluj.

        Nastavení -# +#

        V Atomu se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

        Odsazování a obarvování bude fungovat správně jen v souborech s koncovkou .py @@ -14,7 +14,7 @@

        Nastavení

        Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Kontrola stylu zdrojového kódu -# +#

        Jedna věc nám v Atomu přeci jen chybí: plugin pro kontrolu správného stylu zdrojového kódu.

        @@ -28,7 +28,7 @@

        Kontrola stylu zdrojového kódu který tě na jejich porušení upozorní.

        Nejprve je potřeba si nainstalovat speciální knihovnu, která se o kontrolu dokáže postarat. Do příkazové řádky zadej následující:

        -
        $ python -m pip install flake8
        +
        $ python -m pip install flake8
         

        A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber „Soubor > Nastavení/File > Settings“ a v nabídce uprostřed okna vyber poslední položku @@ -37,7 +37,7 @@

        Kontrola stylu zdrojového kódu na tlačítko „Instalovat/Install“. Bude ještě potřeba schválit instalaci všech závislostí, na které se Atom postupně zeptá.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install-editor/gedit.html b/lessons/install-editor/gedit.html index 10b019e4..edc59195 100644 --- a/lessons/install-editor/gedit.html +++ b/lessons/install-editor/gedit.html @@ -1,14 +1,14 @@

        Instalace Geditu -# +#

        Na Linuxu se Gedit instaluje jako ostatní programy:

        -
        Fedora
        $ sudo dnf install gedit
        -
        Ubuntu
        $ sudo apt-get install gedit
        +
        Fedora
        $ sudo dnf install gedit
        +
        Ubuntu
        $ sudo apt-get install gedit
         

        Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

        Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

        Nastavení -# +#

        Gedit se nastavuje v Předvolbách (Preferences).

        @@ -28,7 +28,7 @@

        Nastavení

        Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install-editor/index.html b/lessons/install-editor/index.html index 149d1c70..6eeebbff 100644 --- a/lessons/install-editor/index.html +++ b/lessons/install-editor/index.html @@ -1,5 +1,5 @@

        Instalace editoru -# +#

        Editor, program na úpravu textu, je základní pomůcka každého programátora, @@ -12,7 +12,7 @@

        Instalace editoru nebude ti stačit. Stejně tak nejsou vhodné programy jako Word či Writer.

        Co programátorský editor umí -# +#

        Editor pro programátory nám umožňuje upravovat prostý text – písmenka. Na rozdíl od programů jako Word, Writer či Pages neumožňuje text formátovat, @@ -51,7 +51,7 @@

        Co programátorský editor umí 9 except TemplateNotFound: 10 abort(404)

        Volba a nastavení editoru -# +#

        Vybereš-li editor, klikni na jeho jméno a dostaneš se na instrukce ke stažení a nastavení. @@ -86,7 +86,7 @@

        Co programátorský editor umí si že je správně nastaven.

        IDE -# +#

        Existují i složitější a mocnější editory, takzvané IDE (angl. Integrated Development Environment, integrované vývojové prostředí), diff --git a/lessons/install-editor/kate.html b/lessons/install-editor/kate.html index 1edddb3b..d2b4d4f3 100644 --- a/lessons/install-editor/kate.html +++ b/lessons/install-editor/kate.html @@ -1,14 +1,14 @@

        Instalace Kate -# +#

        Na Linuxu se Kate instaluje jako ostatní programy:

        -
        Fedora
        $ sudo dnf install kate
        -
        Ubuntu
        $ sudo apt-get install kate
        +
        Fedora
        $ sudo dnf install kate
        +
        Ubuntu
        $ sudo apt-get install kate
         

        Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

        Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

        Nastavení -# +#

        Číslování řádků

        V menu Pohled/View vyber @@ -30,7 +30,7 @@

        Nastavení

        Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install-editor/notepad-plus-plus.html b/lessons/install-editor/notepad-plus-plus.html index 8ec767cb..9a3b24da 100644 --- a/lessons/install-editor/notepad-plus-plus.html +++ b/lessons/install-editor/notepad-plus-plus.html @@ -1,11 +1,11 @@

        Instalace Notepadu++ -# +#

        Notepad++ je k dispozici pouze pro Windows.

        Stáhni jej z jeho domovské stránky a nainstaluj.

        Nastavení -# +#

        Odsazování

        V menu Nastavení zvol Předvolby a pak nastav @@ -17,7 +17,7 @@

        Nastavení

        Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install-editor/others.html b/lessons/install-editor/others.html index 3f1ecc53..90afd615 100644 --- a/lessons/install-editor/others.html +++ b/lessons/install-editor/others.html @@ -1,19 +1,19 @@

        Instalace editoru -# +#

        Používáš-li editor, pro který nemáme instrukce, budeš ho muset nastavit sám/sama. Tady je pár tipů, na co si dát pozor.

        Nastavení -# +#

        Číslování řádků -# +#

        Ujisti se, že ti editor čísluje řádky. Pokud ne, podívej se do nastavení a zjisti, jak se to zapíná.

        Obarvování -# +#

        Ulož soubor s koncovkou .py – například zkouska.py – a zkopíruj do něj následující program:

        @@ -23,7 +23,7 @@

        Obarvování je tvůj editor nastavený správně. Jinak se podívej do nastavení a zjisti, jak se to zapíná.

        Odsazování -# +#

        Stisknutím klávesy Tab na začatku řádku se vloží 4 mezery. Pro psaní a sdílení kódu v Pythonu je důležité, @@ -34,7 +34,7 @@

        Odsazování Tab vloží jiný počet než 4, podívej se do nastavení po možnostech jako „velikost odsazení“ nebo „nahrazovat tabulátory za mezery”.

        Kontrola stylu zdrojového kódu -# +#

        Editory často podporují instalaci pluginů, které mohou psaní kódu usnadnit a pomoci s jeho kontrolou. @@ -47,7 +47,7 @@

        Kontrola stylu zdrojového kódu v dokumentu PEP8.

        Zkus takový plugin pro svůj editor najít a nainstalovat.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install-editor/vscode.html b/lessons/install-editor/vscode.html index f3b65548..a2f062f8 100644 --- a/lessons/install-editor/vscode.html +++ b/lessons/install-editor/vscode.html @@ -1,18 +1,18 @@

        Instalace Visual Studio Code -# +#

        Stažení a instalace -# +#

        Editor si můžeš stáhnout z jeho domovské stránky. Vyber na ní zelené tlačítko Download a vyber instalátor pro svůj systém. Dále se řiď instrukcemi instalátoru jako u každého jiného programu.

        Nastavení -# +#

        Ve Visual Studio Code se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

        Odesílání telemetrických dat -# +#

        Tento textový editor ale odesílá data o tvém používání (nejspíš včetně např. obsahu otevřených souborů). @@ -23,7 +23,7 @@

        Odesílání telemetrických dat

        Viz též původni postup v angličtině.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/lessons/install/index.1.html b/lessons/install/index.1.html index e669b301..47ce4fe1 100644 --- a/lessons/install/index.1.html +++ b/lessons/install/index.1.html @@ -23,33 +23,33 @@ v příslušné lekci pro začátečníky. Modul venv je součást standardní knihovny.

        Unix (Linux, macOS) -# +#

        Zkontroluj, že máš modul ensurepip:

        -
        $ python3.7 -m ensurepip --version
        +
        $ python3.7 -m ensurepip --version
         pip 18.0 (nebo i jiná verze)
         

        Jestli ne, postupuj podle lekce pro začátečníky – jsou tam podrobnější instrukce. Jinak použij:

        -
        $ mkdir project
        -$ cd project
        -$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
        -$ . __venv__/bin/activate  # aktivace
        -(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
        -(__venv__)$ ...  # práce "uvnitř"
        -(__venv__)$ deactivate  # vypnutí virtualenvu
        +
        $ mkdir project
        +$ cd project
        +$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
        +$ . __venv__/bin/activate  # aktivace
        +(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
        +(__venv__)$ ...  # práce "uvnitř"
        +(__venv__)$ deactivate  # vypnutí virtualenvu
         

        Windows -# +#

        -
        > mkdir project
        -> cd project
        -> py -3 -m venv __venv__
        +
        > mkdir project
        +> cd project
        +> py -3 -m venv __venv__
         > __venv__\Scripts\activate
         (__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
         (__venv__)> ...  # práce "uvnitř"
         (__venv__)> deactivate  # vypnutí virtualenvu
         

        Poznámky -# +#

        Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu pracovat.

        diff --git a/lessons/install/index.2.html b/lessons/install/index.2.html index 2570359d..c00835e2 100644 --- a/lessons/install/index.2.html +++ b/lessons/install/index.2.html @@ -1,5 +1,5 @@

        Git -# +#

        Další program, který budeme později potřebovat, nám později umožní (mimojiné) spolupracovat @@ -8,22 +8,22 @@

        Git Pojďme si ho nainstalovat a nastavit.

        Instalace je různá pro různé operační systémy, vyber ten svůj.

        Linux -# +#

        Instalaci na Linux zvládneme jedním příkazem:

        Fedora, RHEL:

        -
        $ sudo dnf install git gitk git-gui nano
        +
        $ sudo dnf install git gitk git-gui nano
         

        Ubuntu, Debian:

        -
        $ sudo apt-get install git gitk git-gui nano
        +
        $ sudo apt-get install git gitk git-gui nano
         

        U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, gitk, git gui a nano.

        Jestli máš nainstalováno, ještě nastav Gitu editor. Pokud nemáš rád/a Vim (nebo nevíš co to je), zadej tento příkaz:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením níže.

        Windows -# +#

        Jdi na stránku git-scm.org, stáhni si Git a nainstaluj si ho.

        @@ -42,21 +42,21 @@

        Windows > git config --global gui.encoding utf-8

        A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

        macOS -# +#

        Spusť v příkazové řádce git. Je-li už nainstalovaný, dozvíš se, jak ho používat (výpis začíná usage). Jinak ho nainstaluj pomocí Homebrew:

        -
        $ brew install git git-gui
        +
        $ brew install git git-gui
         

        Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, i když sis v rámci instalace editoru nainstaloval/a např. Atom). Dělá se to tímto příkazem:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením:

        Nastavení -# +#

        Na projektu, který bude uložen v Gitu, může spolupracovat více lidí. @@ -64,8 +64,8 @@

        Nastavení potřeba říct jméno a e-mail. Do příkazové řádky zadej následující příkazy, změň v nich ale jméno a adresu:

        -
        $ git config --global user.name "Adéla Novotná"
        -$ git config --global user.email adela.novotna@example.cz
        +
        $ git config --global user.name "Adéla Novotná"
        +$ git config --global user.email adela.novotna@example.cz
         

        Můžeš samozřejmě použít i přezdívku, nebo dokonce falešný e-mail, ale v takovém případě bude složitější se zapojit do týmových projektů. @@ -80,11 +80,11 @@

        Nastavení

        Dále si můžeš nastavit barevné výpisy – pokud si tedy (jako někteří autoři Gitu) nemyslíš, že příkazová řádka má být černobílá:

        -
        $ git config --global color.ui true
        +
        $ git config --global color.ui true
         

        Spuštění git config nevypíše žádnou hlášku, že se operace povedla. To je normální; stejně se chová spousta dalších příkazů, např. cd.

        Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

        -
        $ git config --global --list
        +
        $ git config --global --list
         user.name=Adéla Novotná
         user.email=adela.novotna@example.cz
         

        A to je vše! Git máš nainstalovaný. Gratuluji!

        \ No newline at end of file diff --git a/lessons/install/index.html b/lessons/install/index.html index ff966cda..c238b86c 100644 --- a/lessons/install/index.html +++ b/lessons/install/index.html @@ -1,5 +1,5 @@

        Instalace Pythonu -# +#

        V této sekci nainstalujeme Python.

        To se na každém druhu operačního systému dělá trošku jinak. diff --git a/lessons/install/linux.html b/lessons/install/linux.html index 8714817f..46ec84cf 100644 --- a/lessons/install/linux.html +++ b/lessons/install/linux.html @@ -1,16 +1,16 @@

        Instalace Pythonu na Linux -# +#

        Nainstalovat Pyhon na Linux je většinou jednoduché. Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, tak jsou tyhle instrukce trochu delší. Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

        Instalace Pythonu 3 -# +#

        Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť v příkazové řádce příkaz:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Přejdi na další sekci, kontrolu tkinter.

        @@ -20,42 +20,42 @@

        Instalace Pythonu 3 doinstaluj Python. Konkrétní příkaz záleží na distribuci:

          -
        • Fedora:
          $ sudo dnf install python3
          +
        • Fedora:
          $ sudo dnf install python3
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3
          +
        • Ubuntu:
          $ sudo apt-get install python3
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        Kontrola Tkinter -# +#

        Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti Pythonu. Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) často musíme nainstalovat zvlášť. Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

        -
        $ python3 -m tkinter
        +
        $ python3 -m tkinter
         

        Objeví-li se okýnko, je všechno v pořádku. Zavři ho a přejdi na doinstalování virtualenv.

        Jestli ne, modul tkinter ještě nainstaluj:

          -
        • Fedora:
          $ sudo dnf install python3-tkinter
          +
        • Fedora:
          $ sudo dnf install python3-tkinter
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3-tk
          +
        • Ubuntu:
          $ sudo apt-get install python3-tk
           

        Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

        Doinstalování Virtualenv -# +#

        Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu vyřadily). Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

        Spusť v příkazové řádce příkaz:

        -
        $ python3 -m ensurepip --version
        +
        $ python3 -m ensurepip --version
         

        Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. Zbytek této sekce můžeš přeskočit!

        Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat @@ -63,7 +63,7 @@

        Doinstalování Virtualenv
          -
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
          +
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        diff --git a/lessons/install/macos.html b/lessons/install/macos.html index 0e3c99dc..428a02ef 100644 --- a/lessons/install/macos.html +++ b/lessons/install/macos.html @@ -1,15 +1,15 @@

        Instalace Pythonu pro macOS -# +#

        Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje instalaci aplikací a knihoven, které budeme potřebovat pro programování. Jak na to?

        Spusť v příkazové řádce příkaz:

        -
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        +
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         

        Pak zadej následující příkaz a Python bude nainstalovaný:

        -
        $ brew install python3
        +
        $ brew install python3
         

        Zkontroluj si, že máš verzi 3.6 nebo vyšší:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Jinak je něco špatně; diff --git a/lessons/install/windows.html b/lessons/install/windows.html index c75117a7..99135c9e 100644 --- a/lessons/install/windows.html +++ b/lessons/install/windows.html @@ -1,8 +1,8 @@

        Instalace Pythonu pro Windows -# +#

        Zjisti, jestli už máš Python nainstalovaný -# +#

        Otevři si příkazovou řádku (pokud nevíš o co jde, přečti si o ní tady).

        Napiš python a zmáčkni na klávesnici Enter. @@ -25,7 +25,7 @@

        Zjisti, jestli už máš Pyth

        Stažení -# +#

        • Běž na stahovací stránku
        • @@ -37,7 +37,7 @@

          Stažení Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

          Screenshot zjišťování verze systému

        Instalace -# +#

        Stažený instalátor spusť.

        Na začátku instalace zaškrtni:

        diff --git a/lessons/interfaces/index.html b/lessons/interfaces/index.html index cc28ccbf..a681ff19 100644 --- a/lessons/interfaces/index.html +++ b/lessons/interfaces/index.html @@ -1,5 +1,5 @@

        Rozhraní -# +#

        Už víš že funkce ti umožňují kousek kódu:

          @@ -24,12 +24,12 @@

          Rozhraní Tyhle parametry tvoří rozhraní, které umožňuje připojit jakýkoli spotřebič k jakékoli elektrárně.

          Rozhraní funkce -# +#

          Podívej se na tuhle hlavičku funkce. Je z ní poznat, co ta funkce dělá a jak ji použít?

          def ano_nebo_ne(otazka):
          -    """Zeptá se uživatele na otázku a vrátí True nebo False dle odpovědi"""
          +    """Zeptá se uživatele na otázku a vrátí True nebo False dle odpovědi"""
               ...
           

          Podobnou funkci už jsi napsal/a. Když zavoláš ano_nebo_ne('Chutná ti čokoláda?'), otázka se objeví @@ -37,7 +37,7 @@

          Rozhraní funkce Když uživatel odpoví, funkce vrátí True nebo False.

          Co kdybys ale měl/a následující funkci?

          def ano_nebo_ne(otazka):
          -    """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
          +    """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
               nebo False dle stisknutého tlačítka."""
               ...
           

          Screenshot s tlačítky Ano a Ne

          @@ -47,7 +47,7 @@

          Rozhraní funkce

          Z hlediska programu se nic nemění: jediné co se změní je definice funkce; volání a práce s návratovou hodnotou je pak stejné jako dřív.

          Vyzkoušej si to! -# +#

          Najdi nějaký svůj program, který používá ano_nebo_ne, případně jen print a input.

          diff --git a/lessons/json/index.html b/lessons/json/index.html index 5f68099f..cf9d0b91 100644 --- a/lessons/json/index.html +++ b/lessons/json/index.html @@ -1,5 +1,5 @@

          Kódování dat -# +#

          V Pythonu informace spravuješ v seznamech, slovnících a jiných datových strukturách. @@ -25,7 +25,7 @@

          Kódování dat Vystačíš si proto s převáděním na řetězce, se kterými – na rozdíl od bytů – už umíš pracovat.

        Kódování -# +#

        Existuje spousta způsobů jak zakódovat data do textu. Každý způsob se snaží najít vhodnou rovnováhu mezi @@ -39,13 +39,13 @@

        Kódování dat 'věk': 26, }

        Jiný způsob kódování dat je YAML:

        -
        jméno: Anna
        -město: Brno
        -jazyky:
        -  - čeština
        -  - angličtina
        -  - Python
        -věk: 26
        +
        jméno: Anna
        +město: Brno
        +jazyky:
        +  - čeština
        +  - angličtina
        +  - Python
        +věk: 26
         

        Nebo třeba Bencode:

        d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

        Existují i netextové formáty jako Pickle 3. @@ -55,12 +55,12 @@

        Kódování dat K▒u.

        A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:

        -
        {
        -  "jméno": "Anna",
        -  "město": "Brno",
        -  "jazyky": ["čeština", "angličtina", "Python"],
        -  "věk": 26
        -}
        +
        {
        +  "jméno": "Anna",
        +  "město": "Brno",
        +  "jazyky": ["čeština", "angličtina", "Python"],
        +  "věk": 26
        +}
         

        Pozor na to, že ačkoli JSON vypadá podobně jako zápis v Pythonu, je to jiný formát s vlastními pravidly. Nezaměňuj je!

        @@ -68,7 +68,7 @@

        Kódování dat nech na počítači, aby dal na správné místo správné čárky a uvozovky.

        JSON -# +#

        Pojďme se zaměřit na populární JSON; práce s ostatními formáty funguje podobně.

        K zakódování dat do textu použij funkci dumps z modulu json @@ -94,7 +94,7 @@

        Kódování dat >>> print(data['věk'] + 1) 27

        Hezký výstup -# +#

        To, co vrací json.dumps, je vhodné pro počítačové zpracování:

        >>> kod = json.dumps(data)
        @@ -122,7 +122,7 @@ 

        Kódování dat včetně funkcí na zápis/čtení přímo do/ze souborů – je v příslušné dokumentaci.

        Typy -# +#

        JSON neumožňuje věrně zakódovat jakýkoli Pythonní objekt. Zaměřuje se na výměnu informací mezi různými programy a programovacími jazyky.

        @@ -152,7 +152,7 @@

        Kódování dat >>> json.loads(kod) {'dvojice': [1, 2], 'seznam': [3, 4], '2': 'dva', '11': 'jedenáct'}

        Jiná kódování -# +#

        Jak už bylo řečeno, JSON je jen jeden ze způsobů, kterými lze data zakódovat. Jiná kódování mají svá pro a proti, ale v podstatě fungují stejně: @@ -161,13 +161,13 @@

        Kódování dat

        V případech, kdy má soubor s informacemi psát člověk, se často používají formáty TOML nebo YAML.

        TOML -# +#

        Knihovnu pro TOML potřeba si nainstalovat. Dělá se to příkazem, který znáš z instalace knihovny Pytest. Pozor ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného (a možná nebezpečného!):

        -
        (venv)$ python -m pip install toml
        +
        (venv)$ python -m pip install toml
         

        Data pak lze kódovat pomocí toml.dumps a dekódovat pomocí toml.loads:

        >>> import toml
         >>> print(toml.dumps(data))
        @@ -176,20 +176,20 @@ 

        TOML jazyky = ["čeština", "angličtina", "Python"] "město" = "Brno"

        YAML -# +#

        Knihovnu pro YAML je také potřeba doinstalovat. Opět – ve jméně pyyaml neudělej překlep!

        -
        (venv)$ python -m pip install pyyaml
        +
        (venv)$ python -m pip install pyyaml
         

        Data pak lze kódovat pomocí yaml.safe_dump (nebo „hezky“ pomocí yaml.safe_dump(data, indent=4, allow_unicode=True)) a zapisovat pomocí yaml.safe_load(kod). Výsledný soubor vypadá takto:

        -
        jazyky:
        -- čeština
        -- angličtina
        -- Python
        -jméno: Anna
        -město: Brno
        -věk: 26
        +
        jazyky:
        +- čeština
        +- angličtina
        +- Python
        +jméno: Anna
        +město: Brno
        +věk: 26
         
        \ No newline at end of file diff --git a/lessons/list/index.html b/lessons/list/index.html index 37d929d5..135b7b38 100644 --- a/lessons/list/index.html +++ b/lessons/list/index.html @@ -2,7 +2,7 @@ Tahák na seznamy, který si můžeš vytisknout.

        Seznamy -# +#

        Dnes si ukážeme, jak pracovat se seznamy (angl. lists).

        Začneme prakticky. @@ -32,7 +32,7 @@

        Seznamy
        seznam = [1, 'abc', True, None, range(10), len]
         print(seznam)
         

        Neměnitelné hodnoty -# +#

        Důležitá vlastnost seznamů je, že se dají měnit.

        Než vysvětlíme, o co jde, připomeňme si, jak fungují hodnoty, které se měnit @@ -57,7 +57,7 @@

        Seznamy kamaradka = 'Alexandra' print(kamaradka)

        Měnění seznamů -# +#

        A jak jsou na tom seznamy? Ty se měnit dají.

        @@ -89,7 +89,7 @@

        Seznamy a.append(4) print(b)

        Další způsoby, jak měnit seznamy -# +#

        Kromě metody append, která přidává jediný prvek na konec, existuje spousta dalších metod, které seznamy mění. @@ -114,7 +114,7 @@

        Seznamy zviratka.reverse() # ['pes', 'králík', 'kočka'] zviratka.clear() # []

        Vybírání ze seznamů -# +#

        Často budeš ze seznamu chtít vybrat prvek na určité pozici. To funguje jako u řetězců: do hranatých závorek dáš číslo prvku. @@ -130,7 +130,7 @@

        Seznamy

        „Sekáním“ vzniká nový seznam – když pak původní seznam změníš, v novém menším seznamu se to neprojeví.

        Měnění prvků -# +#

        Na rozdíl od řetězců (které se měnit nedají) můžeš u existujících seznamů nastavovat konkrétní prvky – a to tak, že do prvku přiřadíš jako by to byla @@ -146,7 +146,7 @@

        Měnění prvků zviratka[1:-2] = ['koťátko', 'králíček'] print(zviratka)

        Mazání prvků -# +#

        Přiřazením do podseznamu můžeš i změnit délku seznamu nebo některé prvky úplně odstranit:

        @@ -195,7 +195,7 @@

        Měnění prvků balicek.clear() print(balicek)

        Řazení -# +#

        Metoda sort seřadí prvky seznamu.

        seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
        @@ -213,7 +213,7 @@ 

        Měnění prvků seznam.sort(reverse=True) print(seznam)

        Známé operace se seznamy -# +#

        Spousta toho, co můžeš dělat s řetězci, má stejný účinek i u seznamů. Třeba sečítání a násobení číslem:

        @@ -236,7 +236,7 @@

        Měnění prvků print(melodie.count('DE')) print(melodie.index('DE'))

        Seznam jako podmínka -# +#

        Seznam můžeš použít v příkazu if (nebo while) jako podmínku, která platí, když v tom seznamu něco je. @@ -248,7 +248,7 @@

        Měnění prvků

        Podobně můžeš v podmínce použít i řetězce. A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.

        Tvoření seznamů -# +#

        Tak jako funkce int převádí na celá čísla a str na řetězce, @@ -333,7 +333,7 @@

        Tvoření seznamů ['J', 'Q', 'K', 'A']?

        Řešení najdeš v textu o kousek níže.

        Seznamy a řetězce -# +#

        Seznamy a řetězce jsou druhy sekvencí. Můžeš různě převádět z jednoho typu na druhý.

        @@ -357,7 +357,7 @@

        Tvoření seznamů
        veta = ' '.join(slova)
         print(veta)
         

        Seznamy a náhoda -# +#

        Modul random obsahuje funkce, které mají něco společného s náhodou: třeba nám už známou random.randrange. diff --git a/lessons/local-run/index.html b/lessons/local-run/index.html index f29118d2..138a0dcb 100644 --- a/lessons/local-run/index.html +++ b/lessons/local-run/index.html @@ -1,8 +1,8 @@

        Vytvoření lokálního kurzu -# +#

        Příprava -# +#

        První věc, kterou budeš potřebovat, je Python, a to alespoň ve verzi 3.8. Pokud zrovna danou verzi Pythonu nainstalovanou nemáš, můžeš postupovat podle návodu na instalaci Pythonu.

        @@ -15,7 +15,7 @@

        Příprava
      • Poetry můžeš nainstalovat do systému podle návodu na stránkách Poetry
      • -
      • Můžeš si aktivovat virtuální prostředí a Poetry nainstalovat pomocí:
        $ python -m pip install --user poetry
        +
      • Můžeš si aktivovat virtuální prostředí a Poetry nainstalovat pomocí:
        $ python -m pip install --user poetry
         
      • Poslední věc, kterou potřebuješ, už není žádný program, ale pár schopností. @@ -25,7 +25,7 @@

        Příprava návodu na používání Gitu a v úvodu k YAMLu.

        Naklonování základu -# +#

        Kurz můžeš vytvořit úplně od začátku, ale pro začátek lepší varianta je vyjít z nějakého už existujícího. @@ -35,46 +35,46 @@

        Naklonování základu Historické kurzy ale můžou být už zaarchivované a nejnovější verze v repozitáři nemusí odpovídat tomu co je na webu.)

        Kontrola nastavení projektu -# +#

        Zkontroluj si, že naklonovaný kurz obsahuje soubor pyproject.toml s verzí naucse = 0.5.0 nebo vyšší a naucse-render = 1.8 nebo vyšší. Třeba takto:

        -
        $ git grep ^naucse pyproject.toml
        +
        $ git grep ^naucse pyproject.toml
         pyproject.toml:11:naucse = "^0.5.1"
         pyproject.toml:12:naucse-render = "^1.8"
         

        Jestli soubor pyproject.toml vůbec nemáš, zkopíruj si ho z repozitáre naucse-python. Jestli máš starší verzi naucse, aktualizuj příkazem poetry add naucse@latest.

        Lokální spuštění -# +#

        Po naklonování si zkontroluj, že kurz u tebe „jede“.

        Nainstaluj protřebné závislosti:

        -
        $ poetry install
        +
        $ poetry install
         

        A spusť vývojový server:

        -
        $ poetry run python -m naucse serve
        +
        $ poetry run python -m naucse serve
         

        Program vypíše adresu (např. http://127.0.0.1:8003/); tu navštiv v prohlížeči. Tam se „doklikej“ na kurz, ze kterého budeš vycházet.

        Struktura repozitáře -# +#

        V repozitáři s kurzem najdeš následující soubory a adresáře:

        lessons/: Texty lekcí -# +#

        Jednotlivé lekce jsou rozděleny do „kategorií“, aby se dalo lépe „smíchat“ několik kurzů dohromady. Každá lekce má vlastní adresář se dvěma soubory:

        • info.yml obsahuje metadata, například:

          -
            title: Vytvoření lokálního kurzu
          -  style: md
          -  attribution:
          -  - Napsal Mikuláš Poul, 2018
          -  - Napsal Petr Viktorin, 2022
          -  license: cc-by-sa-40
          -  license_code: cc0
          +
            title: Vytvoření lokálního kurzu
          +  style: md
          +  attribution:
          +  - Napsal Mikuláš Poul, 2018
          +  - Napsal Petr Viktorin, 2022
          +  license: cc-by-sa-40
          +  license_code: cc0
           
          • title je titulek stránky, který se objeví v obsahu.
          • style je typ obsahu: md pro Markdown nebo ipynb pro @@ -99,7 +99,7 @@

            lessons/: Texty lekcí

          course.yml, courses, runs: Definice kurzu -# +#

          Definice kurzu je uložena v souboru YAML. Jsou dvé možnosti, kde tenhle soubor může být:

          @@ -123,7 +123,7 @@

          cou

          Když zakládáš nový kurz, můžeš zkopírovat existující definici na nové místo, nebo ji nechat kde je a změnit ji.

          .github/workflows/main.yml: Instrukce pro GitHub Actions -# +#

          Tenhle soubor obsahuje instrukce pro GitHub Actions pomocí kterých se kurz publikuje. Obsahuje kromě instalace a cache tři hlavní kroky:

          @@ -136,23 +136,23 @@

          .gith Až budeš kurz přidávat na naucse.python.cz, měly by se zkontrolovat, ale do té doby se s tímto souborem netrap.

          licenses/ -# +#

          Tenhle adresář obsahuje licence, pod kterými obsah může být. Neměň ho.

          pyproject.toml, poetry.lock, .github: Definice projektu a závislostí -# +#

          Tyhle soubory definují jaké nástroje se použijí pro publikování kurzu.

          Definice kurzu -# +#

          Soubor course.yml nebo courses/*.yml obsahuje všechny informace o kurzu – název, popisek, kde a kdy se koná a pak samozřejmě plán jednotlivých lekcí.

          Celá definice kurzu je jeden velký slovník, který si postupně popíšeme a vyplníme. Pro potřeby kurzu je připravena šablona, kterou můžeš použít.

          Povinné informace -# +#

          Nejdřív prvních pár základních povinných údajů:

            @@ -162,7 +162,7 @@

            Povinné informace

          A teď už jen nepovinné údaje.

          Místo a čas -# +#

          Přidáváš-li kurz s instruktorem, kdy se na každou lekci budete scházet, přidej informace o místu a času. @@ -179,14 +179,14 @@

          Místo a čas

          Kromě toho je potřeba zadat časovou zónu, kde se lekce odehrávají. Pro ČR a Slovensko použij Europe/Prague (největší město v oblasti).

          Takže třeba takhle:

          -
          default_time:
          -  start: '18:00'
          -  end: '20:00'
          -timezone: Europe/Prague
          +
          default_time:
          +  start: '18:00'
          +  end: '20:00'
          +timezone: Europe/Prague
           

          Tohle výchozí čas. U každé lekce se dá zvlášť nastavit jiný začátek a konec.

          Proměnné -# +#

          Poslední nepovinná hodnota, než se dostaneme k obsahu kurzu, jsou proměné, které se definují klíčem vars a musí být také slovníkem. Proměné mohou upravovat obsah lekcí a stránek kurzu, a pokud budeš vytvářet nebo upravovat materiály, můžeš si i definovat vlastní.

          @@ -205,14 +205,14 @@

          Proměnné

        Plán lekcí -# +#

        A teď už zbývá poslední věc, a to je sestavení programu kurzu. Kurz se skládá z jednotlivých lekcí (sessions) a každá lekce obsahuje seznam materiálů. Lekce nadefinuješ klíčem sessions v definici kurzu. Ten musí být seznam dalších slovníků. Každý z nich představuje jednu lekci.

        Definice lekce -# +#

        Datum lekce nastavíš klíčem date, ve formátu YYYY-MM-DD. Čas nastavovat nemusíš, použije se čas z default_time, ale můžeš ho přenastavit @@ -222,10 +222,10 @@

        Definice lekce Použije se v adrese (URL) lekce.

        Dalším povinným údajem je title – název lekce.

        Základní definice lekce tedy vypadá následovně:

        -
        sessions:
        -- slug: first-lesson
        -  title: Název první lekce
        -  date: 2018-03-07
        +
        sessions:
        +- slug: first-lesson
        +  title: Název první lekce
        +  date: 2018-03-07
         

        Většina lekcí bude mít navíc obsah – seznam materiálů. Ty se nastavují pomocí klíče materials.

        Existují tři druhy materiálů:

        @@ -235,43 +235,43 @@

        Definice lekce tedy jméno podsložky ve složce lessons. Identifikátor materiálu je <název kategorie>/<název materiálu z kategorie>. Takže například materiál `beginners/install by se zadal takto:

        -
          sessions:
        -  - slug: first-lesson
        -    title: Název první lekce
        -    date: 2018-03-07
        -    materials:
        -    - lesson: beginners/install
        +
          sessions:
        +  - slug: first-lesson
        +    title: Název první lekce
        +    date: 2018-03-07
        +    materials:
        +    - lesson: beginners/install
         

        • Externí odkazy se definují pomocí klíčů url a title. Do url patří kompletní odkaz na materiál, do title patří název odkazu. Příklad použítí:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - title: Úvodní prezentace
          -      url: https://example.com/uvod.pdf
          -    - title: Tahák na příkazovou řádku
          -      url: https://example.com/tahak.pdf
          -      type: cheatsheet
          -    - title: Domácí projekty (PDF)
          -      url: https://example.com/ukol.pdf
          -      type: homework
          +
            sessions:
          +  - slug: first-lesson
          +    title: Název první lekce
          +    date: 2018-03-07
          +    materials:
          +    - title: Úvodní prezentace
          +      url: https://example.com/uvod.pdf
          +    - title: Tahák na příkazovou řádku
          +      url: https://example.com/tahak.pdf
          +      type: cheatsheet
          +    - title: Domácí projekty (PDF)
          +      url: https://example.com/ukol.pdf
          +      type: homework
           
        • Materiály bez odkazu se definují stejně jako externí odkazy, jen se do klíče url dá hodnota null. Například:

          -
            sessions:
          -  - slug: last-lesson
          -    title: Název lekce
          -    date: 2019-03-07
          -    materials:
          -    - title: Přehlídka závěrečných projektů
          -      url: null
          -    - title: Předání diplomů
          -      url: null
          +
            sessions:
          +  - slug: last-lesson
          +    title: Název lekce
          +    date: 2019-03-07
          +    materials:
          +    - title: Přehlídka závěrečných projektů
          +      url: null
          +    - title: Předání diplomů
          +      url: null
           

        U všech druhú materiálú lze nastavit typ, který určuje ikonku která se použije v seznamu materiálů vedle názvu.

        @@ -286,20 +286,20 @@

        Definice lekce

        Poslední věc, která jde definovat u materiálů, jsou proměné, pomocí klíče vars. Definují se stejně jako u celého kurzu, ale mají účinek jen pro specifický materiál. Například takhle:

        -
        sessions:
        -- slug: first-lesson
        -  title: Název první lekce
        -  date: 2018-03-07
        -  materials:
        -  - lesson: beginners/install
        -    vars:
        -      bonus: true
        +
        sessions:
        +- slug: first-lesson
        +  title: Název první lekce
        +  date: 2018-03-07
        +  materials:
        +  - lesson: beginners/install
        +    vars:
        +      bonus: true
         

        Otestování kurzu -# +#

        Po vytvoření definice kurzu s povinnými položkami se můžeš podívat na to, jak tvůj kurz bude vypadat. Spusť si vývojový server:

        -
        $ poetry run python -m naucse serve
        +
        $ poetry run python -m naucse serve
         

        Otevři si adresu, kterou ti příkaz napíše. Měl by na ní být seznam nadefinovaných kurzů.

        Pokud se stránka s kurzy nevykreslí, tak uvidíš Python vyjímku, která ti může pomoct, ale také může být pěkne matoucí. Nejprve si zkontroluj, jeslti jsi vážně vyplnil/a všechny povinné údaje. @@ -311,9 +311,9 @@

        Definice lekce

        Pokud máš lekce naplánované na určité dny, rozklikni si na stránce kurzu Kalendář a zkontroluj že odpovídá tvé představě.

        Jako další test může posloužit druhý režim spuštění, freeze místo serve, který projde všechny stránky a zkontroluje jestli fungují:

        -
        $ poetry run python -m naucse freeze
        +
        $ poetry run python -m naucse freeze
         

        Upravování a vytváření materiálů -# +#

        Na závěr této části ještě trochu k materiálům. Jak bylo zmíněno výše, obsah materiálů je definován ve složce lessons. diff --git a/lessons/local-variables/index.html b/lessons/local-variables/index.html index d1c2bcaf..c0d96e1a 100644 --- a/lessons/local-variables/index.html +++ b/lessons/local-variables/index.html @@ -1,5 +1,5 @@

        Lokální proměnné -# +#

        Už umíš definovat vlastní funkce. Zbývá ale ještě dovysvětlit, jak v nich fungují proměnné.

        @@ -30,11 +30,11 @@

        Lokální proměnné pro ni. Když funkce nastav_x skončí, proměnná x přestane existovat.

        Skrývání detailů -# +#

        Podobně skončí s chybou i složitější program:

        def zamen(slovo, pozice, novy_znak):
        -    """V daném slově zamění znak na dané pozici za daný nový znak"""
        +    """V daném slově zamění znak na dané pozici za daný nový znak"""
             zacatek = slovo[:pozice]
             konec = slovo[pozice + 1:]
             nove_slovo = zacatek + novy_znak + konec
        @@ -54,7 +54,7 @@ 

        Skrývání detailů Jak divné by bylo, kdyby po každém zavolání print byla najednou nastavená proměnná i, kterou print náhodou používá při procházení svých parametrů!

        Přiřazení -# +#

        To, co dělá lokální proměnnou, je přiřazení. Porovnej nastav_x s příkladem na obsah_kruhu výše: rozdíl mezi pi a x @@ -75,7 +75,7 @@

        Přiřazení
      • Přiřazují i speciální přiřazovací operátory jako +=, *=, :=.
      • Zakrývání jména -# +#

        Jak to funguje, když ve funkci přiřadíš do proměnné, která existuje i globálně? Pak tu máme problém.

        @@ -95,7 +95,7 @@

        Přiřazení Jedna je globální. Jedna je lokální pro funkci nastav_x. Jmenují se stejně, ale jsou to dvě různé proměnné.

        Lokální nebo globální? -# +#

        Pojďme si to ukázat. Než spustíš tenhle program, zkus předpovědět co bude dělat. @@ -151,7 +151,7 @@

        Řešení

        Rada na závěr -# +#

        Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších věcí v Pythonu. diff --git a/lessons/logic/index.html b/lessons/logic/index.html index 3a48339e..3b6b58ee 100644 --- a/lessons/logic/index.html +++ b/lessons/logic/index.html @@ -1,5 +1,5 @@

        Logika hry -# +#

        Už umíš vykreslit „fotku“ hada. Hadí videohra ale nebude jen statický obrázek. @@ -11,7 +11,7 @@

        Logika hry -->

        Rozhýbejme hada -# +#

        Tak, ale teď už k samotné hře!

        Tvůj program teď, doufám, vypadá nějak takhle:

        @@ -60,7 +60,7 @@

        Rozhýbejme hada Víš co tenhle příkaz dělá? Jestli ne, koukni znovu na poznámky k seznamům!

        A had se hýbe… Jen ho ještě nejde ovládat.

        Ven se stavem -# +#

        Než uděláme interaktivního hada, zkusíme trošku uklidit. Program se nám rozrůstá, a za chvíli bude složité se v něm vyznat. @@ -174,7 +174,7 @@

        Řešení

        Ovládání -# +#

        Nyní k onomu slíbenému ovládání. Respektive nejdřív k změnám směru.

        Had ze hry se plazí stále stejným směrem, dokud hráč nezmáckne klávesu. @@ -267,7 +267,7 @@

        Řešení

        Pojďme je vyřešit, jednu po druhé.

        Zatím dobrý, teď ale narazíme -# +#

        „Hadí“ hry jako ta naše mají dvě varianty: buď je kolem hřiště „zeď“ a hráč při nárazu do okraje prohraje, nebo je hřiště „nekonečné“ – had okrajem @@ -348,7 +348,7 @@

        Řešení

        state.width = window.width // TILE_SIZE
         state.height = window.height // TILE_SIZE
         

        Nekonečná magická klec -# +#

        Teď místo konce hry při naražení necháme hada „projít“ a objevit se na druhé straně.

        @@ -414,7 +414,7 @@

        Řešení

        definuje vhodně pro tento účel; a % b má vždy stejné znaménko jako b.

        Krmení -# +#

        Tak. Had je v pasti, už nemůže vylézt. Co dál?

        @@ -486,7 +486,7 @@

        Řešení

        Nové jídlo -# +#

        Když už had umí jíst, je potřeba mu zajistit pravidelný přísun jídla. Nejlépe tak, že se každé snězené jídlo nahradí novým.

        @@ -570,7 +570,7 @@

        Řešení

        Pak budou na začátku hry na hada čekat dvě náhodné jídla.

        Konec -# +#

        Had teď může narůst do obrovských rozměrů – a hru stále nelze prohrát. Zařídíme tedy, aby hra skončila, když had narazí sám do sebe.

        @@ -626,7 +626,7 @@

        Řešení

        Vylepšení ovládání -# +#

        Poslední úprava kódu!

        Možná si všimneš – zvlášť jestli jsi už nějakou verzi hada hrál/a, @@ -684,7 +684,7 @@

        Řešení

        if (old_x, old_y) != (-new_x, -new_y): self.snake_direction = new_direction

        A to je vše? -# +#

        Gratuluji, máš funkční a hratelnou hru! Doufám že jsi na sebe hrdý/á!

        diff --git a/lessons/magic/index.html b/lessons/magic/index.html index 83325eec..34222ed6 100644 --- a/lessons/magic/index.html +++ b/lessons/magic/index.html @@ -1,5 +1,5 @@

        Magie -# +#

        Co z Pythonu dělá tak užitečný jazyk? Z velké části je to zaměření na čitelnost kódu. Pythonu se někdy říká „spustitelný pseudokód“: syntaxe je inspirovaná zápisem abstraktních algoritmů v matematice, používá se málo speciálních znaků jako $, <<, &&, ?. @@ -13,7 +13,7 @@

        Magie

        Na jiný důvod, proč použít méně pochopitelné techniky, narazíme při psaní knihoven a frameworků. To je kód, který používá hodně programátorů – a často jsou to programátoři s méně zkušenostmi, než mají autoři knihovny. Tady proto bývá dobré občas použít nějakou tu magii – znepřehlednit kód knihovny, aby kód který knihovnu používá, mohl být přehlednější.

        Typický příklad jsou dekorátory ve Flasku. Napsat dekorátor není úplně triviální, ale velice to zjednodušuje práci všem, co ve Flasku píšou web. Konstrukce @app.route je pro většinu lidí magická – nevíme přesně, co to dělá, ale to nám nebrání ji použít.

        Velká moc a velká zodpovědnost -# +#

        Druhý možný význam slova magie je něco, co neodpovídá „normálnímu“ chování podobných věcí.

        Jazyk Python standardizuje syntaxi relativně malého počtu operací (operátory, volání funkcí, atributy, ...), způsobů řízení toku programu (cykly, with, ...) a strukturování kódu (moduly, def, class). @@ -26,7 +26,7 @@

        Velká moc a velká zodpovědnost

        Následující principy (kromě jiných) je proto dobré při psaní knihoven používat jen po pečlivém zvážení, jestli by to nešlo i bez magie.

        * Taková třída dokonce existuje ve standardní knihovně.

        Speciální metody -# +#

        Základní způsob, jak přizpůsobit chování objektů, jsou speciální metody. Asi už víte, že všechny atributy, které začínají a končí dvojitým podtržítkem, jsou rezervované pro samotný Python, který je používá podle svých pravidel – například danou metodu volá, když je potřeba sečíst dvě čísla.

        @@ -62,7 +62,7 @@

        Speciální metody

        Předefinování hierarchie dědičnosti: __instancecheck__, __subclasscheck__.

        Dekorátory -# +#

        Další věc, na kterou se podíváme, jsou dekorátory – způsob, jak si přizpůsobovat funkce.

        @@ -129,7 +129,7 @@

        Dekorátory @to_floats def add(a, b): - """Adds two numbers""" + """Adds two numbers""" return a + b print(add(1, '2')) @@ -215,7 +215,7 @@

        Dekorátory Dekorátor dostane třídu jako první argument a třída se nahradí tím, co dekorátor vrátí.

        Deskriptory -# +#

        Jeden z nejmagičtějších operátorů v Pythonu je ., tečka. Je magický v obou významech – většina lidí ho používá, ačkoli nemá tušení, co přesně dělá, a dá se předefinovat tolika různými způsoby, že to vydá na celou přednášku.

        @@ -274,14 +274,14 @@

        Deskriptory
        # (Omluvte prosím češtinu v kódu)
         
         class Descriptor2D:
        -    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
        +    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
         
             def __init__(self, name1, name2):
                 self.name1 = name1
                 self.name2 = name2
         
             def __get__(self, instance, cls=None):
        -        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
        +        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
                 """
         
                 if instance is not None:
        @@ -395,7 +395,7 @@ 

        Deskriptory print(vect.length)

        Kompletní implementace je např. ve frameworku Pyramid jako pyramid.decorator.reify.

        Konstruktor -# +#

        Třídy v Pythonu můžou mít konstruktor – funkci, která se zavolá, aby vytvořila objekt daného typu. @@ -428,7 +428,7 @@

        Konstruktor print(Point(3, 4))

        Metatřídy -# +#

        Poslední věc, na kterou se podíváme, jsou metatřídy.

        Začneme zlehka: pokud při definici třídy zadáme nějakou funkci jako pojmenovaný @@ -557,7 +557,7 @@

        Konstruktor nebo SQLAlchemy), kdy chceme, aby pořadí sloupců tabulky odpovídalo tomu, jak jsou sloupce/atributy nadefinovány ve třídě.

        A další -# +#

        Další (bohužel?) oblíbený trik je vnuknutí magických schopností modulu.

        Naimportované moduly Python ukládá do slovníku sys.modules, aby při dalším @@ -588,7 +588,7 @@

        A další print(ANSWER)

        Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

        Úkol -# +#

        Úkol není!

        Budete-li chtít některé techniky z této lekce ve svém kódu (včetně semestrálky) použít, zamyslete se, jestli se problém nedá vyřešit jednodušeji, čitelněji, přehledněji, udržovatelněji. diff --git a/lessons/main-module/index.html b/lessons/main-module/index.html index 9c8f3d26..044180ca 100644 --- a/lessons/main-module/index.html +++ b/lessons/main-module/index.html @@ -1,5 +1,5 @@

        Spouštěcí moduly -# +#

        Automatické testy musí projít „bez dozoru“. V praxi se často automaticky spouští, případné chyby se automaticky @@ -99,7 +99,7 @@

        Spouštěcí moduly Protože ale hlavní část programu (vyhodnot) jde pokrýt automatickými testy, ruční testování nemusí být tak důkladné.

        Negativní testy -# +#

        Test test_vyhry, ukázaný výše, není úplný. Splnila by ho i funkce jako:

        @@ -118,7 +118,7 @@

        Negativní testy teď stačí říct, že with pytest.raises ověří, že odsazený blok kódu pod ním vyvolá danou výjimku:

        def test_spatneho_tahu():
        -    """🤘 vs. 🖖 není správný vstup"""
        +    """🤘 vs. 🖖 není správný vstup"""
             with pytest.raises(ValueError):
                 vyhodnot('metal', 'spock')
         
        \ No newline at end of file diff --git a/lessons/micropython/index.1.html b/lessons/micropython/index.1.html index 8c8b4620..431daba9 100644 --- a/lessons/micropython/index.1.html +++ b/lessons/micropython/index.1.html @@ -1,5 +1,5 @@

        MicroPython (na ESP8266/NodeMCU) -# +#

        (Tato lekce bohužel, na rozdíl od předchozích, nejde jen tak vyzkoušet z domu – je potřeba speciální hardware.)

        Dnes si ukážeme, jak lze Python použít na malých/vestavěných zařízeních.

        @@ -14,14 +14,14 @@

        MicroPython (na ESP8266/NodeMCU)

        Přichystejte si MicroUSB kabel. Pokud nemáte vlastní, několik jich můžeme zapůjčit.

        Obsah lekce vychází z tutoriálů pro PyLadies (a, b), na které se můžete podívat, pokud tu bude něco vysvětleno příliš rychle.

        Popis desky -# +#

        V posledních letech se dá za relativně málo peněz pořídit počítač dost „velký” na to, aby se na něm dal spustit MicroPython – speciální implementace Pythonu pro prostředí s omezenou pamětí. NodeMCU, které budeme používat my, obsahuje čip ESP8266, čip navržený jako ovladač WiFi k vestavěným systémům (např. k Arduinu). Kromě samotného čipu a flash paměti, které se skrývají v oplechované krabičce, je na desce převodník napětí z 5 V (USB) na 3,3 V a datový převodník z USB na sériový protokol a jednotlivé piny procesoru jsou vyvedeny na „nožičky” desky.

        V paměti je už nahraný firmware MicroPython; pojďme se k němu připojit.

        Drivery a připojení -# +#

        Postup připojení je jiný pro každý systém:

          @@ -38,7 +38,7 @@

          Drivery a připojení

          Kdyby byly pro Windows či Mac potřeba ovladače, dají se najít na stránkách výrobce.

          Po připojení stiskněte tlačítko RST na desce. Měla by se objevit hlavička a nakonec známý pythonní prompt >>>.

          MicroPython -# +#

          Implementace MicroPython se chová téměř stejně jako CPython. Vyzkoušejte si ale některé rozdíly (porovnejte výstup MicroPythonu a Pythonu 3 na počítači):

          >>> print
          @@ -53,7 +53,7 @@ 

          MicroPython >>> urandom(1)[0] 61

          Vstup a výstup -# +#

          Co má MicroPython navíc je přístup k hardwaru. Zkusme zjistit hodnotu pinu 0, který je na NodeMCU normálně HIGH (3,3 V) a je spojen se zemí přes tlačítko FLASH.

          @@ -72,7 +72,7 @@

          MicroPython Odpovídající si označení lze zjistit z taháku.

          Zkuste zajistit, aby dioda svítila, právě pokud je stisknuté tlačítko FLASH.

          Ovládání konzole -# +#

          Pravděpodobně jste si všimli, že konzole MicroPythonu automaticky odsazuje. To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit.

          @@ -80,16 +80,16 @@

          Ovládání konzole Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D.

          Existuje ale i nástroj jménem ampy, který umožňuje pustit předpřipravený skript. Instaluje se jako adafruit-ampy:

          -
          $ python -m pip install adafruit-ampy
          +
          $ python -m pip install adafruit-ampy
           

          Po nainstalování vypněte existující připojení k desce (picocom/screen/PuTTY), napište skript a spusťte ho pomocí příkazu run:

          -
          $ ampy -p PORT run script.py
          +
          $ ampy -p PORT run script.py
           

          Kde PORT je stejný port jako výše – např. /dev/ttyUSB0 na Linuxu, COM3 na Windows. Pro více informací můžete nepřekvapivě použít příkaz ampy --help.

          Od teď doporučuji psát kód vedle do editoru a spouštět jej pomocí ampy run.

          Zkuste pomocí funkce time.sleep (která v MicroPythonu k dispozici je) diodou blikat v pravidelných intervalech.

          Blikání -# +#

          Na pravidelné blikání, technicky řečeno pulzně-šířkovou modulaci (angl. Pulse Width Modulation) má MicroPython třídu PWM, které se dá nastavit frekvence (freq) v Hz a střída (duty) od 0 do 1024:

          @@ -102,7 +102,7 @@

          Blikání LED (střída určuje intenzitu světla), bzučáků (frekvence určuje výšku tónu), servomotorků (délka signálu určuje úhel otočení), atd.

          LED pásek WS2812 -# +#

          Na destičku se dá připojit spousta různých komponent. Jen je vždy potřeba ověřit v dokumentaci, že existuje knihovna pro daný protokol na MicroPython pro ESP8266. Časté protokoly jsou I2C, OneWire, či SPI.

          @@ -126,20 +126,20 @@

          LED pásek WS2812 np.write()

          Co znamenají čísla 0 a 255 na posledním řádku, jistě zjistíte experimentálně.

          Flashování -# +#

          Na našich destičkách je MicroPython už nahraný, ale kdybyste si koupili vlastní NodeMCU nebo chtěli firmware aktualizovat, budete ho potřebovat umět nahrát.

          K tomu je potřeba nástroj esptool, který se dá nainstalovat pomocí:

          -
          $ python -m pip install esptool
          +
          $ python -m pip install esptool
           

          Po instalaci esptool si stáhněte nejnovější stabilní firmware pro ESP8266 z micropython.org/download a zadejte:

          -
          $ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
          +
          $ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
           

          Hodnotu pro --port opět doplňte podle svého systému – např. /dev/tty.wchusbserial1420 na Macu, COM3 na Windows.

          Destiček s čipem ESP8266 se vyrábí celá řada různých typů a některé mohou potřebovat odlišné nastavení při flashování. Popis všech možností nastavení je k nalezení v dokumentaci k esptool.

          Je-li na desce nahraný MicroPython, tento příkaz by měl fungovat. U jiného firmware, (případně u poškozeného MicroPythonu), je potřeba při zapojování destičky do USB držet tlačítko FLASH.

          Souborový systém -# +#

          MicroPython pro ESP8266 obsahuje souborový systém nad flash pamětí, se kterým pracují standardní pythonní funkce jako open a os.listdir. @@ -148,9 +148,9 @@

          Souborový systém zařízení. Není ho pak potřeba připojovat k počítači – stačí powerbanka nebo 3,3V zdroj.

          Pro nahrání souborů do zařízení můžete použít příkaz ampy put:

          -
          $ ampy -p PORT put main.py
          +
          $ ampy -p PORT put main.py
           

          WebREPL -# +#

          ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. Dokonce se přes WiFi dá i ovládat.

          @@ -188,7 +188,7 @@

          Souborový systém Měli byste dostat konzoli, jako přes USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat soubory.

          Komunikace -# +#

          Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu socket, nebo protokol pro „internet of things“ (jako MQTT), ale diff --git a/lessons/micropython/index.html b/lessons/micropython/index.html index cc5f3094..cca782df 100644 --- a/lessons/micropython/index.html +++ b/lessons/micropython/index.html @@ -1,5 +1,5 @@

          MicroPython na malém zařízení -# +#

          Tahle sekce bohužel nejde jednoduše projít z domu.

          Využíváme speciální vybavení, které je potřeba nejdřív @@ -63,13 +63,13 @@

          MicroPython na malém zařízení kouče) narovnej nebo si vezmi jinou destičku.


          Instalace -# +#

          Bohužel se dnes neobejdeme bez instalace. Musíš naučit svůj počítač, aby si s destičkou povídal.

          Nejdřív si do virtuálního prostředí nainstaluj program Ampy od Adafruitu. Ten budeme později používat na nahrávání kódu:

          -
          (env)$ python -m pip install adafruit-ampy
          +
          (env)$ python -m pip install adafruit-ampy
           

          Pak propoj modul s počítačem přes USB kabel, jako kdybys připojoval/a třeba mobil.

          Je potřeba použít kvalitní datový kabel. @@ -80,10 +80,10 @@

          Instalace Původní (anglický) návod k této části je na stránkách MicroPythonu.

          Linux -# +#

          Na správně nastaveném počítači stačí zadat:

          -
          $ picocom -b 115200 --flow n /dev/ttyUSB0
          +
          $ picocom -b 115200 --flow n /dev/ttyUSB0
           

          Pokud příkaz neskončí s chybou, stiskni tlačítko RST na modulu. Měly by se nakonec objevit tři zobáčky, >>>.

          Většina počítačů ale na komunikaci s malými zařízeními nastavená není. @@ -100,7 +100,7 @@

          Linux je potřeba k zařízení přistupovat přes jiný soubor. Použij příkaz dmesg | tail, který vypíše něco jako:

        -
          $ dmesg | tail
        +
          $ dmesg | tail
           [703169.886296] ch341 1-1.1:1.0: device disconnected
           [703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
           [703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
        @@ -114,9 +114,9 @@ 

        Linux
      • Pokud picocom skončil s chybou Permission denied, potřebuješ získat přístup k souboru zařízení. To znamená přidat se do příslušné skupiny:

        -
        $ sudo usermod -a -G dialout $(whoami)
        +
        $ sudo usermod -a -G dialout $(whoami)
         

        Poté je potřeba se znovu přihlásit, třeba příkazem:

        -
        $ su - $(whoami)
        +
        $ su - $(whoami)
         

        Pro ověření spusť příkaz groups; v jeho výstupu by mělo být dialout. Například:

        $ groups
        @@ -128,7 +128,7 @@ 

        Linux

      • Windows -# +#

        MicroPython se přihlásí jako COM port. Otevři správce zařízení a zjisti, který COM port to je (kouč s tím pomůže).

        @@ -150,17 +150,17 @@

        Windows okýnko podobné konzoli, kde se, když zmáčkneš na modulu RST, objeví nakonec tři zobáčky: >>>.

        macOS -# +#

        V příkazové řádce zadej:

        -
        $ screen /dev/tty.usbmodem* 115200
        +
        $ screen /dev/tty.usbmodem* 115200
         

        a stiskni Enter. Pak na modulu zmáčkni RST. Měly by se nakonec objevit tři zobáčky, >>>.

        Nejde-li to, je možná potřeba nainstalovat driver. Ten se dá stáhnout z tohoto blogu.

        MicroPython – taky Python -# +#

        Tak jako máš na počítači nainstalovaný operační systém, na vývojové desce je takzvaný firmware, @@ -200,7 +200,7 @@

        MicroPython – taky Python >>> urandom(1)[0] 61

        Vstup -# +#

        MicroPython na malé destičce obsahuje některé moduly, které jinde nenajdeš. Ten hlavní se jmenuje @@ -227,7 +227,7 @@

        MicroPython – taky Python máš na taháku – můžeš si zkontrolovat, že Pin(0) u sebe má poznámku FLASH.

        Obvod -# +#

        Teď na chvíli necháme programování a postavíme si elektrický obvod. Vezmi si modrou svítivou diodu (LED, „světýlko”) a @@ -285,7 +285,7 @@

        Obvod 0 voltů a ostatní napětí počítáme vzhledem k ní. Na nožičce 3V je tedy napětí 3,3 V vzhledem k zemi.

        Výstup -# +#

        Proč jsme diodu na to, aby se rozsvítila, připojili k modulu a ne jen k baterce? @@ -326,7 +326,7 @@

        Řešení

        Pouštění kódu ze souboru -# +#

        Jak začneš psát trochu složitější programy, mohlo by se stát, že tě konzole MicroPythonu začne trochu štvát. @@ -353,12 +353,12 @@

        Řešení

      • macOS: port používáš v příkazu screen, např. /dev/tty.usbmodem*
      • ampy spusť následujícím příkazem, jen za PORT doplň svůj port:

        -
        (venv)$ ampy -p PORT run led_podle_tlacitka.py
        +
        (venv)$ ampy -p PORT run led_podle_tlacitka.py
         

        Program by měl blikat diodou. Využívá k tomu funkci time.sleep(), která počká daný počet vteřin – tedy time.sleep(1/2) zastaví program na půl sekundy.

        Velice rychle blikat -# +#

        Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. @@ -420,7 +420,7 @@

        Velice rychle blikat Jako s otvíráním souborů, je dobré po sobě uklidit – i když zatím můžeš jednoduše restartovat celé zařízení.

        Tóny a melodie -# +#

        Vezmi si další součástku – piezobudič, neboli „bzučítko”.

        Tahle malá věc obsahuje speciální materiál, který se, @@ -479,7 +479,7 @@

        Tóny a melodie

        Naprogramuj písničku! Potřebuješ-li víc not, pusť si program, který vypočítá další frekvence.

        Další ovládání -# +#

        Teď si vezmi dvě tlačítka a připoj je k modulu: GND vždycky na G, VCC vždycky na 3V a @@ -493,7 +493,7 @@

        Další ovládání a přitom se jedním tlačítkem bude dát zvyšovat tón a druhým snižovat?

        Program si (na svém počítači) ulož, ať se k němu můžeš vrátit.

        Rotace -# +#

        Čas na další součástku! Tentokrát to bude servomotor.

        Servomotor je součástka, která má v sobě zabudovaný @@ -536,7 +536,7 @@

        Rotace nebude fungovat. Za chvíli si řekneme proč; zatím (jsi-li na kurzu) se přidej do dvojice k někomu, komu to funguje.

        Poznámka o napájení a napětí -# +#

        K tomu, aby se otočil motor, je potřeba mnohem víc energie, než k rozsvícení světýlka. @@ -571,7 +571,7 @@

        Poznámka o napájení a napětí

        Pozor, 5V nepřipojuj jinam než na VIN!

        Napětí -# +#

        Další důvod, proč ti servomotor někdy nefunguje dobře, je to, že je stavěný na 5 voltů, ne na 3,3 které @@ -603,7 +603,7 @@

        Napětí workshopu ti určitě rádi poradí nebo ti aspoň řeknou koho se zeptat!

        Barevná světýlka -# +#

        Tak, dost teorie; vezmi si novou hračku! Tentokrát to bude LED pásek.

        diff --git a/lessons/mini-workshop/index.html b/lessons/mini-workshop/index.html index ac01ec4c..984e8f81 100644 --- a/lessons/mini-workshop/index.html +++ b/lessons/mini-workshop/index.html @@ -15,7 +15,7 @@ (Pro úplnost: je to deska NodeMCU s mikroprocesorem ESP8266.)

        Dost povídání, pojďme na to!

        Otevření příkazové řádky -# +#

        Klikni na Activities; potom vyber z levého panelu Terminal (ikonka @@ -23,11 +23,11 @@

        Otevření příkazové řádky

        Objeví se příkazová řádka – černé okýnko s bílým textem, kam můžeš zadávat příkazy.

        Otevření komunikačního kanálu -# +#

        V příkazové řádce by měl být řádek končící dolarem. Za ten dolar napiš:

        -
        picocom -b 115200 /dev/ttyUSB0
        +
        picocom -b 115200 /dev/ttyUSB0
         

        Opisuj opatrně, každé písmenko má smysl! Pak zmáčkni Enter. Měl by se objevit následující výpis:

        @@ -52,7 +52,7 @@

        Otevření komunikačního kanálu Terminal ready

        Pak stiskni Enter. Měly by se objevit tři zobáčky, kterými MicroPython prosí o instrukce:

        >>>

        Kalkulačka -# +#

        Za tři zobáčky můžeš zadat nějaký matematický příklad. MicroPython ho spočítá. Zkus třeba tyhle (zobáčky nepiš, ty vypíše sám MicroPython:

        @@ -71,7 +71,7 @@

        Otevření komunikačního kanálu

        Věděl/a jsi, že v Americe používají desetinnou tečku místo čárky? Většina programovacích jazyků ji používá taky.

        Světýlko -# +#

        MicroPython na našich destičkách má připravený objekt led, jehož metodou value jde ovládat svítící dioda. @@ -79,14 +79,14 @@

        Světýlko
        >>> led.value(1)
         >>> led.value(0)
         

        Tlačítko -# +#

        K destičce je připojeno i tlačítko. Metodou btn.value() se zeptáš, jestli je právě zmáčknuté, nebo ne.

        >>> btn.value()
         

        Zkus tenhle příkaz zadat, zatímco tlačítko držíš.

        Výrazy -# +#

        Informace o tom, jestli je tlačítko zmáčknuté – btn.value() – je číslo: buď 0, nebo 1. @@ -94,7 +94,7 @@

        Výrazy 0, nebo 1 – třeba pro rozsvícení nebo zhasnutí diody:

        >>> led.value(btn.value())
         

        Cyklus -# +#

        Existuje způsob, jak nechat MicroPython něco opakovat stále dokola: takzvaný nekonečný cyklus. @@ -111,7 +111,7 @@

        Výrazy Je ale způsob jak ho přerušit, až tě omrzí: zmáčkni Ctrl+C.

        Motorek -# +#

        Další objekt, který můžeš použít, je servo. Ten ovládá servomotor, který můžeš nastavit na konkrétní úhel. Třeba:

        @@ -121,7 +121,7 @@

        Výrazy

        Nepoužívej prosím čísla menší než 40 nebo větší než 120, motorek se tím může ničit.

        Matematika -# +#

        Před chvílí jsme si ukázali tento kód:

        >>> led.value(btn.value())
        @@ -141,7 +141,7 @@ 

        Matematika

        Dokážeš výsledek dát do cyklu, aby program na zmáčknutí či puštění tlačítka reagoval automaticky?

        Barvy -# +#

        Poslední věc připojená k destičce je LED pásek s několika světýlky. Každé z nich se dá nastavit na nějakou barvu. @@ -155,7 +155,7 @@

        Barvy Až budeš experimentovat, nezapomeň na strip.write() – bez toho se barvy neukážou.

        Program -# +#

        Teď si přestaneme jen tak hrát a začneme psát program.

        @@ -171,7 +171,7 @@

        Barvy stiskni Ctrl+A a pak Ctrl+Q. Měl by se objevit řádek končící dolarem.

        Za dolar napiš:

        -
        ampy -p /dev/ttyUSB0 run main.py
        +
        ampy -p /dev/ttyUSB0 run main.py
         

        ... a stiskni Enter. Tento příkaz soubor s programem do zařízení nahraje a rovnou spustí.

        Zkus v editoru nastavit jiné barvy a program znovu uložit @@ -180,7 +180,7 @@

        Barvy Tím se vrátíš k předchozímu příkazu (ampy) a můžeš znovu stisknout Enter a program spustit.

        Blikání -# +#

        Tady je program, který rozbliká LED pásek. Ukazuje větší cyklus, a navíc funkci sleep, která MicroPython na chvíli @@ -202,13 +202,13 @@

        Blikání strip.write() sleep(1/4)

        Semafor -# +#

        Dokážeš naprogramovat semafor?

        Se závorou?

        Cyklus s podmínkou -# +#

        Cykly nemusí být jen nekonečné. Tady je cyklus, který čeká dokud není stisknuté tlačítko.

        @@ -221,14 +221,14 @@

        Cyklus s podmínkou led.value(1)

        Alarm -# +#

        Polož na tlačítko nějaký těžší předmět (třeba myš) tak, aby bylo zmáčknuté. Když někdo předmět vezme, tlačítko přestane být zmáčknuté.

        Napiš program, který na to bude čekat a jakmile někdo myš ukradne, LED pásek začne zuřivě blikat.

        Konec? -# +#

        Tím dnešní krátká exkurze do světa MicroPythonu končí. Jestli tě programování zaujalo a chceš v něm pokračovat, dej nám vědět!

        diff --git a/lessons/mini-workshop/organizers.html b/lessons/mini-workshop/organizers.html index 873cc5cb..9f74204a 100644 --- a/lessons/mini-workshop/organizers.html +++ b/lessons/mini-workshop/organizers.html @@ -1,10 +1,10 @@

        Pokyny pro organizátory -# +#

        Tento motivační wokshop s MicroPythonem potřebuje speciální hardware. Tady je popsáno, jak jsme všechno připravili.

        Nákupní seznam -# +#

        NodeMCU Devkit v2

        Dá se koupit z Číny, např. @@ -32,7 +32,7 @@

        Nákupní seznam

        Počítač

        Je potřeba i „velký“ počítač – hlavně kvůli obrazovce a klávesnici. Viz nastavení níže.

        Příprava hardwaru -# +#

        NodeMCU zasuň do nepájivého pole, aby na každé delší straně zbyla řada dírek. Do nich zapoj komponenty:

        @@ -94,19 +94,19 @@

        Nákupní seznam

        Fotografie modulu s veškerým příslušenstvím

        Detailní záběr na osazené nepájivé pole

        Příprava počítače -# +#

        Na workshop doporučujeme použít počítače s Fedorou Workstation 25. Pár věcí je potřeba nastavit:

        • Uživatel musí být členem skupiny dialout:

          -
          $ sudo usermod -a -G dialout $(whoami)
          -$ su - $(whoami)
          +
          $ sudo usermod -a -G dialout $(whoami)
          +$ su - $(whoami)
           

          (Po tomto nastavení je potřeba se přihlásit a znovu odhlásit, případně v každém terminálu zadat su - $(whoami).)

        • Musí být nainstalované balíčky picocom a ampy:

          -
          $ sudo dnf install picocom ampy
          +
          $ sudo dnf install picocom ampy
           

          (Na jiných systémech nemusí být ampy v systémových repozitářích. V takovém případě se dá nainstalovat pomocí python3 -m pip install --user adafruit-ampy.)

          @@ -126,26 +126,26 @@

          Příprava počítače

        Firmware -# +#

        K flashování je potřeba stáhnout binární obraz MicroPythonu pro ESP8266 a náš předpřipravený začátečnický soubor boot.py.

        Potřebné nástroje, esptool a ampy, můžeme na Fedoře nainstalovat z balíčků:

        -
        $ sudo dnf install esptool ampy
        +
        $ sudo dnf install esptool ampy
         

        Na systémech, kde tyto nástroje v systémových balíčcích nejsou, se dají nainstalovat do virtuálního prostředí:

        -
        $ python3 -m venv venv
        -$ . venv/bin/activate
        -(venv)$ python -m pip install esptool adafruit-ampy
        +
        $ python3 -m venv venv
        +$ . venv/bin/activate
        +(venv)$ python -m pip install esptool adafruit-ampy
         

        Připojíme NodeMCU přes USB a pomocí esptool ho naflashujeme:

        -
        (venv)$ esptool.py --port /dev/ttyUSB0 erase_flash
        -(venv)$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
        +
        (venv)$ esptool.py --port /dev/ttyUSB0 erase_flash
        +(venv)$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
         

        (Kdyby neexistovalo zařízení /dev/ttyUSB0, ve výstupu dmesg | tail se dá dohledat, kam se NodeMCU připojilo. V takovém případě ale bude potřeba změnit instrukce k workshopu.)

        Nakonec na NodeMCU stiskneme tlačítko RST, pustíme a pak nahrajeme boot.py:

        -
        (venv)$ ampy -p /dev/ttyUSB0 put boot.py
        +
        (venv)$ ampy -p /dev/ttyUSB0 put boot.py
         

        Soubor boot.py obsahuje testovací režim pro kontrolu, že je vše nahráno správně. Podržíme-li tlačítko na modulu stisknuté, po resetu (tlačítkem RST nebo diff --git a/lessons/modules/index.html b/lessons/modules/index.html index 8dd813ba..2d31055c 100644 --- a/lessons/modules/index.html +++ b/lessons/modules/index.html @@ -1,5 +1,5 @@

        Moduly -# +#

        Modul je v Pythonu něco, z čeho můžeš importovat. Třeba z modulu math můžeš importovat funkci sqrt:

        @@ -29,7 +29,7 @@

        Moduly Až začneš psát větší programy, zjednoduší ti to práci.

        Vlastní moduly -# +#

        A teď to hlavní! Můžeš vytvořit vlastní importovatelný modul @@ -48,13 +48,13 @@

        Moduly print(louka.popis_stav())

        A pak spusť vypis.py:

        -
        $ python vypis.py
        +
        $ python vypis.py
         

        Příkaz import hledá soubory (mimo jiné) v adresáři, ve kterém je „hlavní modul” programu – tedy soubor který spouštíš (tady vypis.py). Oba soubory by proto měly být ve stejném adresáři.

        Vedlejší efekty -# +#

        Co přesně dělá příkaz import louka?

        Python najde příslušný soubor (louka.py) a provede v něm všechny příkazy, @@ -91,7 +91,7 @@

        Vedlejší efekty Importem si programátor připravuje nástroje; teprve zavoláním funkce je používá.

        Příkaz print proto radši z modulu zase smaž.

        Adresář pro každý projekt -# +#

        Od teď budeš občas psát větší projekty, které budou obsahovat více souvisejících souborů. diff --git a/lessons/mypy/index.html b/lessons/mypy/index.html index aaeb512c..0304ee9d 100644 --- a/lessons/mypy/index.html +++ b/lessons/mypy/index.html @@ -1,18 +1,18 @@

        Mypy -# +#

        Dnes se společně podíváme na knihovnu mypy, která nám do Pythonu přidá možnost kontroly typů, jenž je jinak dostupná jen v jiných programovacích jazycích.

        Statická a dynamická typová kontrola -# +#

        Statická typová kontrola v programovacím jazyce počítá s tím, že pro každou proměnnou či parametr je uveden datový typ. Proměnná definovaná s konkrétním typem pak nemůže obsahovat hodnotu jiného datového typu a pokus o to vyvolá výjimku. Jako např. tento kód v Javě:

        -
        String name = "John";
        -name = 5;
        +
        String name = "John";
        +name = 5;
         

        První řádek definuje proměnnou name jako řetězec. Na druhém řádku se pokoušíme do této proměnné přiřadit celé číslo, což není povoleno a kompilace takového kódu skončí chybou.

        @@ -34,12 +34,12 @@

        Statická a dynamická typová kon může odhalit chyby ještě před spuštěním aplikace či jejich testů.

        Pokud výhody statické typové kontroly znějí slibně, je tady pro vás mypy.

        Instalace a spuštění -# +#

        mypy se instaluje standardním způsobem:

        -
        $ python -m pip install mypy
        +
        $ python -m pip install mypy
         

        A spouští se pak stejnojmenným příkazem:

        -
        $ mypy program.py 
        +
        $ mypy program.py 
         Success: no issues found in 1 source file
         

        První spuštění nejspíše nezahlásí žádný problém, protože program neobsahuje informace o typech proměnných a tak nemá mypy co kontrolovat.

        @@ -49,14 +49,14 @@

        Instalace a spuštění print(hello("World"))

        Pokud budeme chtít do budoucna zařídit, aby mypy nepřeskakovala funkce bez definovaných typů, dá se to zařídit přepínačem --disallow-untyped-defs.

        -
        $ mypy --disallow-untyped-defs program.py 
        +
        $ mypy --disallow-untyped-defs program.py 
         program.py:1: error: Function is missing a type annotation
         Found 1 error in 1 file (checked 1 source file)
         

        Jakmile aplikace používá definice typů, je dobré je kontrolovat v rámci testů. Např. pro pytest existuje doplněk pytest-mypy, který se o to postará.

        Definice typů a jejich kontrola -# +#

        Python sám o sobě sice statickou typovou kontrolu neobsahuje, ale od verze 3 je pro ni v jazyce připravena podpora. Náš moderní program @@ -69,10 +69,10 @@

        Instalace a spuštění řetězec a vrací taktéž řetězec.

        Tato úprava nemá na běh programu vůbec žádný vliv, protože Python samotný definice typů ignoruje.

        -
        $ python program.py                      
        +
        $ python program.py                      
         Hello World!
         

        mypy nám ovšem potvrdí, že je vše v pořádku.

        -
        $ mypy --disallow-untyped-defs program.py
        +
        $ mypy --disallow-untyped-defs program.py
         Success: no issues found in 1 source file
         

        Co když se teď naši vylepšenou funkci pokusíme zavolat znovu s nesprávným typem argumentu?

        @@ -81,19 +81,19 @@

        Instalace a spuštění print(hello("World")) print(hello(5)) -

        $ python program.py                      
        +
        $ python program.py                      
         Hello World!
         Hello 5!
         

        Funguje to, protože řetězcová metoda .format() si poradí i s argumenty jiných typů. Ovšem, co na to mypy a typová kontrola?

        -
        $ mypy --disallow-untyped-defs program.py
        +
        $ mypy --disallow-untyped-defs program.py
         program.py:5: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
         Found 1 error in 1 file (checked 1 source file)
         

        Té se to právem nelíbí, protože v definici jsme si stanovili, že funkce má brát jako argument řetězec a místo toho jí na posledním řádku voláme s celočíselným argumentem.

        Vlastní datové typy -# +#

        V Pythonu často používáme vlastní třídy a jejich instance si všemi možnými způsoby předáváme do/z funkcí. I s tím si umí mypy poradit.

        @@ -117,15 +117,15 @@

        Vlastní datové typy hello(rooster) hello(guest)

        Když se program pokusíme spustit, bude bez problémů fungovat:

        -
        $ python program.py
        +
        $ python program.py
         Hi, I am Kokrhac, your pet.
         Hi, I am Tichoslapek, your pet.
         

        mypy nás ovšem upozorní, že funkci hello v druhém případě nepoužíváme správně:

        -
        $ mypy program.py
        +
        $ mypy program.py
         program.py:19: error: Argument 1 to "hello" has incompatible type "Person"; expected "Animal"
         Found 1 error in 1 file (checked 1 source file)
         

        Alternativní způsoby definice -# +#

        Jak už bylo zmíněno, Python samotný definice typů ignoruje. I přes to ale bylo potřeba na ně jazyk připravit, aby dvojtečka za parametrem a šipka za @@ -137,7 +137,7 @@

        Vlastní datové typy print hello("World") print hello(5)

        A říci mypy, že kontroluje kód pro starší verzi Pythonu:

        -
        $ mypy --py2 program.py                  
        +
        $ mypy --py2 program.py                  
         program.py:5: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
         Found 1 error in 1 file (checked 1 source file)
         

        Poslední možností definice typů je využití tzv. „stub“ souborů. Takový soubor @@ -151,7 +151,7 @@

        Vlastní datové typy

        Definice sama o sobě je validní Python kód a funguje ve stejné formě pro Python 2 i 3.

        Složitější definice a modul typing -# +#

        Změníme naši jednoduchou funkci tak, aby uměla přímo pozdravit a to hned několikrát.

        @@ -160,7 +160,7 @@

        Složitější definice a mo print("Hello {}!".format(name)) say_hello(["PyLadies", "Ostrava"]) -

        $ python say_hello.py 
        +
        $ python say_hello.py 
         Hello PyLadies!
         Hello Ostrava!
         

        Program funguje dobře. Přidejme tedy definice typů — seznam pro jména @@ -176,11 +176,11 @@

        Složitější definice a mo print("Hello {}!".format(name)) say_hello(["PyLadies", "Ostrava"]) -

        $ python say_hello.py
        +
        $ python say_hello.py
         Hello PyLadies!
         Hello Ostrava!
         
        -$ mypy say_hello.py  
        +$ mypy say_hello.py  
         Success: no issues found in 1 source file
         

        Na fungování programu nemá změna žádný vliv a mypy je zdá se také spokojená. Máme hotovo? Svým způsobem ano, ale naše funkce je přeci jen univerzálnější @@ -262,15 +262,15 @@

        Složitější definice a mo result = pow(5, 3) print(hello(result)) -

        $ mypy program.py
        +
        $ mypy program.py
         program.py:11: error: Argument 1 to "hello" has incompatible type "int"; expected "str"
         Found 1 error in 1 file (checked 1 source file)
         

        Globální proměnné -# +#

        Ne vždy si mypy dokáže odvodit datové typy např. pro globální proměnné.

        global_dict = {}
        -
        $ mypy global.py
        +
        $ mypy global.py
         global.py:1: error: Need type annotation for 'global_dict' (hint: "global_dict: Dict[<type>, <type>] = ...")
         Found 1 error in 1 file (checked 1 source file)
         

        V takovém případě se dá datový typ definovat velmi podobně jako u funkcí:

        @@ -278,7 +278,7 @@

        Složitější definice a mo global_dict: Dict[str, float] = {}

        A mnohem více -# +#

        Tohle by na úvod mohlo stačit. O mypy se toho dá samozřejmě nejvíce dočíst v dokumentaci diff --git a/lessons/nested-list/index.html b/lessons/nested-list/index.html index 99c289bc..d2eae3bb 100644 --- a/lessons/nested-list/index.html +++ b/lessons/nested-list/index.html @@ -1,5 +1,5 @@

        Vnořené seznamy -# +#

        Seznam může obsahovat jakýkoli typ hodnot: čísla, řetězce a tak dále:

        prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
        @@ -26,14 +26,14 @@ 

        Vnořené seznamy Stejně jako vnořené cykly for ti umožnily vypsat tabulku, vnořené seznamy ti umožní si tabulku „zapamatovat”.

        def vytvor_radek_tabulky(cislo_radku, velikost):
        -    """Vrátí seznam – daný řádek tabulky s násobilkou"""
        +    """Vrátí seznam – daný řádek tabulky s násobilkou"""
             radek = []
             for cislo_sloupce in range(velikost):
                 radek.append(cislo_radku * cislo_sloupce)
             return radek
         
         def vytvor_tabulku(velikost):
        -    """Vrátí seznam seznamů – tabulku s násobilkou"""
        +    """Vrátí seznam seznamů – tabulku s násobilkou"""
             seznam_radku = []
             for cislo_radku in range(velikost):
                 radek = vytvor_radek_tabulky(cislo_radku, velikost)
        diff --git a/lessons/nested-traceback/index.html b/lessons/nested-traceback/index.html
        index e0595241..de75e00d 100644
        --- a/lessons/nested-traceback/index.html
        +++ b/lessons/nested-traceback/index.html
        @@ -1,5 +1,5 @@
         

        Výpisy chyb ze zanořených funkcí -# +#

        Teď si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která nastane v zanořené funkci.

        @@ -8,17 +8,17 @@

        Výpisy chyb ze zanořených funkcí

        def podel(delenec, delitel):
        -    """Podělí čísla mezi sebou a vrátí výsledek."""
        +    """Podělí čísla mezi sebou a vrátí výsledek."""
             return delenec / delitel        # řádek 3
         
         
         def podel_nulou(cislo):
        -    """Vydělí dané číslo nulou a vrátí výsledek."""
        +    """Vydělí dané číslo nulou a vrátí výsledek."""
             return podel(cislo, 0)          # řádek 8
         
         
         def ukaz_priklad():
        -    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
        +    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
             vysledek = podel_nulou(3)       # řádek 13
             print(vysledek)
         
        @@ -26,13 +26,13 @@ 

        Výpisy chyb ze zanořených funkcí

        Co se stane, když tohle pustíš?

        Traceback (most recent call last):
           File "ukazka.py", line 16, in <module>
        -    ukaz_priklad()
        +    ukaz_priklad()
           File "ukazka.py", line 13, in ukaz_priklad
        -    vysledek = podel_nulou(3)
        +    vysledek = podel_nulou(3)
           File "ukazka.py", line 8, in podel_nulou
        -    return podel(cislo, 0)
        +    return podel(cislo, 0)
           File "ukazka.py", line 3, in podel
        -    return delenec / delitel
        +    return delenec / delitel
         ZeroDivisionError: division by zero
         

        Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu. Skutečná chyba (tedy místo, které musíš opravit) je asi někde poblíž těchto diff --git a/lessons/notebook/index.html b/lessons/notebook/index.html index 268f9e59..7a0b01d4 100644 --- a/lessons/notebook/index.html +++ b/lessons/notebook/index.html @@ -2,7 +2,7 @@

        Jupyter Notebook -# +#

        Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

        Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -10,14 +10,14 @@

        Jupyter Notebook

        Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

        Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

        -
        $ python -m pip install --upgrade pip wheel
        -$ python -m pip install notebook
        +
        $ python -m pip install --upgrade pip wheel
        +$ python -m pip install notebook
         

        Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

        Nainstalovaný Notebook pusťte pomocí:

        -
        $ python -m notebook
        +
        $ python -m notebook
         

        V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

        Jak na Notebook -# +#

        Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

        Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

        @@ -116,5 +116,5 @@

        Jak na Notebook

        - + diff --git a/lessons/numpy/index.html b/lessons/numpy/index.html index 17fdf0c6..46cd5a2b 100644 --- a/lessons/numpy/index.html +++ b/lessons/numpy/index.html @@ -2,8 +2,8 @@

        Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky:

        -
        $ python -m pip install --upgrade pip
        -$ python -m pip install notebook numpy scipy imageio matplotlib pillow
        +
        $ python -m pip install --upgrade pip
        +$ python -m pip install notebook numpy scipy imageio matplotlib pillow
         
        @@ -32,7 +32,7 @@

        NumPy -# +#

        @@ -44,7 +44,7 @@

        NumPy

        Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

        Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

        Nejednoznačnost a zkratky -# +#

        Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. Na obojí se používají podobné nástroje. @@ -232,7 +232,7 @@

        Nejednoznačnost a zkratky

        Základní operace -# +#

        @@ -591,7 +591,7 @@

        Základní operace

        Indexování -# +#

        @@ -1251,7 +1251,7 @@

        Indexování

        Broadcasting a změny -# +#

        @@ -1719,7 +1719,7 @@

        Broadcasting a změny
        try:
             array /= 2
         except Exception as e:
        -    print("Chyba!!", type(e), e)
        +    print("Chyba!!", type(e), e)
         

        @@ -1749,7 +1749,7 @@

        Broadcasting a změny

        Tvoření matic, část 2 -# +#

        @@ -1953,7 +1953,7 @@

        Tvoření matic, část 2
        In [48]:
        -
        int_zeros = numpy.zeros((4, 4), dtype='int8')
        +
        int_zeros = numpy.zeros((4, 4), dtype='int8')
         print(int_zeros.dtype)
         int_zeros
         
        @@ -2123,7 +2123,7 @@

        Tvoření matic, část 2

        Reshape -# +#

        @@ -2421,7 +2421,7 @@

        Reshape

        Datové typy -# +#

        @@ -2544,7 +2544,7 @@

        Datové typy
        In [62]:
        -
        numpy.array([0, 1.3, "foobar"], dtype=object)
        +
        numpy.array([0, 1.3, "foobar"], dtype=object)
         
        @@ -2584,7 +2584,7 @@

        Datové typy
        In [63]:
        -
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
        +
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
         
        @@ -2624,7 +2624,7 @@

        Datové typy
        In [64]:
        -
        numpy.zeros(4, dtype='<I')
        +
        numpy.zeros(4, dtype='<I')
         
        @@ -2664,7 +2664,7 @@

        Datové typy
        In [65]:
        -
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
        +
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
         
        @@ -2697,7 +2697,7 @@

        Datové typy
        In [66]:
        -
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
        +
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
         
        @@ -2737,8 +2737,8 @@

        Datové typy
        In [67]:
        -
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
        -numpy.array([(1, 2, 'abc')] * 4, record_type)
        +
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
        +numpy.array([(1, 2, 'abc')] * 4, record_type)
         
        @@ -2771,7 +2771,7 @@

        Datové typy

        Maticové násobení -# +#

        @@ -2857,7 +2857,7 @@

        Maticové násobení

        Booleovské hodnoty polí -# +#

        @@ -2878,7 +2878,7 @@

        Booleovské hodnoty polí if numpy.eye(3): pass except ValueError as e: - print("Chyba!", type(e), e) + print("Chyba!", type(e), e)

        @@ -2917,11 +2917,11 @@

        Booleovské hodnoty polí
        if numpy.eye(3).any():
        -    print('Alespoň jeden prvek je nenulový')
        +    print('Alespoň jeden prvek je nenulový')
         if numpy.eye(3).all():
        -    print('Všechny prvky jsou nenulové')
        +    print('Všechny prvky jsou nenulové')
         if numpy.eye(3).size:
        -    print('Pole obsahuje nějaké prvky')
        +    print('Pole obsahuje nějaké prvky')
         
        @@ -2961,9 +2961,9 @@

        Booleovské hodnoty polí
        if numpy.ones((1, 1, 1, 1)):
        -    print('Ano')
        +    print('Ano')
         if numpy.zeros((1, 1, 1, 1)):
        -    print('Ne')
        +    print('Ne')
         
        @@ -2995,7 +2995,7 @@

        Booleovské hodnoty polí
        if numpy.ones((0, 0)):
        -    print('Ano')
        +    print('Ano')
         
        @@ -3025,7 +3025,7 @@

        Booleovské hodnoty polí

        Další operace -# +#

        @@ -3118,7 +3118,7 @@

        Další operace

        Příklady použití -# +#

        @@ -3134,7 +3134,7 @@

        Příklady použití

        Matematika a grafy -# +#

        @@ -3155,7 +3155,7 @@

        Matematika a grafy
        from matplotlib import pyplot
         
        -# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
        +# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
         %matplotlib inline
         
        @@ -3293,9 +3293,9 @@

        Matematika a grafy from mpl_toolkits.mplot3d import Axes3D fig = pyplot.figure() -axes = fig.gca(projection='3d') +axes = fig.gca(projection='3d') -surf = axes.plot_surface(x, y, z, cmap='viridis') +surf = axes.plot_surface(x, y, z, cmap='viridis')

        @@ -3329,7 +3329,7 @@

        Matematika a grafy

        Obrázky -# +#

        @@ -3351,7 +3351,7 @@

        Obrázky
        import imageio
        -img = imageio.imread('static/python.jpg')
        +img = imageio.imread('static/python.jpg')
         img
         
        @@ -3545,7 +3545,7 @@

        Obrázky
        blue_channel = img[..., -1]
        -pyplot.imshow(blue_channel, cmap='gray')
        +pyplot.imshow(blue_channel, cmap='gray')
         
        @@ -3601,7 +3601,7 @@

        Obrázky
        In [83]:
        -
        secret = imageio.imread('static/secret.png', pilmode='L')
        +
        secret = imageio.imread('static/secret.png', pilmode='L')
         
         img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
         
        @@ -3678,7 +3678,7 @@

        Obrázky
        In [85]:
        -
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
        +
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
         
        @@ -3733,7 +3733,7 @@

        Obrázky
        In [86]:
        -
        imageio.imsave('python.png', img)
        +
        imageio.imsave('python.png', img)
         
        @@ -3745,7 +3745,7 @@

        Obrázky

        Zvuk -# +#

        @@ -3763,7 +3763,7 @@

        Zvuk
        import scipy.io.wavfile
        -sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
        +sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
         print(sample_rate)
         sound
         
        @@ -3880,7 +3880,7 @@

        Zvuk
        from IPython.display import Audio
         Audio(data=channel, rate=sample_rate)
        -print('(Zkuste si to sami; tento print vymažte)')
        +print('(Zkuste si to sami; tento print vymažte)')
         
        @@ -4013,7 +4013,7 @@

        Zvuk
        spectrum = numpy.fft.fft(segment)
         freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
        -pyplot.xlabel('Frekvence (Hz)')
        +pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs, numpy.abs(spectrum))
         
        @@ -4069,7 +4069,7 @@

        Zvuk
        In [93]:
        -
        pyplot.xlabel('Frekvence (Hz)')
        +
        pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
         
        @@ -4201,5 +4201,5 @@

        Zvuk

        - + diff --git a/lessons/pandas/index.html b/lessons/pandas/index.html index e80a8135..960dd862 100644 --- a/lessons/pandas/index.html +++ b/lessons/pandas/index.html @@ -3,8 +3,8 @@

        Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky. Můžete použít prostředí z lekce o NumPy.

        -
        $ python -m pip install --upgrade pip
        -$ python -m pip install notebook pandas matplotlib
        +
        $ python -m pip install --upgrade pip
        +$ python -m pip install notebook pandas matplotlib
         

        Pro případ, že by vaše verze pip-u neuměla wheels nebo na PyPI nebyly příslušné wheel balíčky, je dobré mít na systému nainstalovaný překladač C a Fortranu (např. gcc, gcc-gfortran) a hlavičkové soubory Pythonu (např. python3-devel). Jestli je ale nemáte, zkuste instalaci přímo – wheels pro většinu operačních systémů existují – a až kdyby to nefungovalo, instalujte překladače a hlavičky.

        Mezitím co se instaluje, stáhněte si do adresáře static potřebné soubory: actors.csv a @@ -18,14 +18,14 @@

        Analýza dat v Pythonu -# +#

        Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

        Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

        Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

        Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

        Proces analýzy dat -# +#

        Práce datového analytika se většinou drží následujícího postupu:

          @@ -46,7 +46,7 @@

          Proces analýzy dat

        Pandas -# +#

        Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

        @@ -76,7 +76,7 @@

        Pandas

        Tabulky -# +#

        @@ -101,7 +101,7 @@

        Tabulky
        In [2]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -202,8 +202,8 @@

        Tabulky
        items = pandas.DataFrame([
        -    ["Book", 123],
        -    ["Computer", 2185],
        +    ["Book", 123],
        +    ["Computer", 2185],
         ])
         items
         
        @@ -278,8 +278,8 @@

        Tabulky
        items = pandas.DataFrame([
        -    {"name": "Book", "price": 123},
        -    {"name": "Computer", "price": 2185},
        +    {"name": "Book", "price": 123},
        +    {"name": "Computer", "price": 2185},
         ])
         items
         
        @@ -452,7 +452,7 @@

        Tabulky

        Sloupce -# +#

        @@ -469,7 +469,7 @@

        Sloupce
        In [7]:
        -
        birth_years = actors['birth']
        +
        birth_years = actors['birth']
         birth_years
         
        @@ -821,7 +821,7 @@

        Sloupce
        In [16]:
        -
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
        +
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
         
        @@ -867,7 +867,7 @@

        Sloupce
        In [17]:
        -
        actors['name'].str.upper()
        +
        actors['name'].str.upper()
         
        @@ -1083,11 +1083,11 @@

        Sloupce
        In [22]:
        -
        print('Součet: ', birth_years.sum())
        -print('Průměr: ', birth_years.mean())
        -print('Medián: ', birth_years.median())
        -print('Počet unikátních hodnot: ', birth_years.nunique())
        -print('Koeficient špičatosti: ', birth_years.kurtosis())
        +
        print('Součet: ', birth_years.sum())
        +print('Průměr: ', birth_years.mean())
        +print('Medián: ', birth_years.median())
        +print('Počet unikátních hodnot: ', birth_years.nunique())
        +print('Koeficient špičatosti: ', birth_years.kurtosis())
         
        @@ -1129,7 +1129,7 @@

        Sloupce
        In [23]:
        -
        actors['name'].apply(lambda x: ''.join(reversed(x)))
        +
        actors['name'].apply(lambda x: ''.join(reversed(x)))
         
        @@ -1168,7 +1168,7 @@

        Sloupce
        In [24]:
        -
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
        +
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
         
        @@ -1206,7 +1206,7 @@

        Sloupce

        Tabulky a vybírání prvků -# +#

        @@ -1223,7 +1223,7 @@

        Tabulky a vybírání prvků
        In [25]:
        -
        actors['name']  # Jméno sloupce
        +
        actors['name']  # Jméno sloupce
         
        @@ -1342,7 +1342,7 @@

        Tabulky a vybírání prvků
        In [27]:
        -
        actors[['name', 'alive']]  # Seznam sloupců
        +
        actors[['name', 'alive']]  # Seznam sloupců
         
        @@ -1435,7 +1435,7 @@

        Tabulky a vybírání prvků

        Indexer loc -# +#

        @@ -1594,7 +1594,7 @@

        Indexer loc
        In [30]:
        -
        actors.loc[2, 'birth']
        +
        actors.loc[2, 'birth']
         
        @@ -1634,7 +1634,7 @@

        Indexer loc
        In [31]:
        -
        actors.loc[2:4, 'birth':'alive']
        +
        actors.loc[2:4, 'birth':'alive']
         
        @@ -1711,7 +1711,7 @@

        Indexer loc
        In [32]:
        -
        actors.loc[2:4, 'name']
        +
        actors.loc[2:4, 'name']
         
        @@ -1747,7 +1747,7 @@

        Indexer loc
        In [33]:
        -
        actors.loc[2:4, 'name':'name']
        +
        actors.loc[2:4, 'name':'name']
         
        @@ -1820,7 +1820,7 @@

        Indexer loc
        In [34]:
        -
        actors.loc[:, 'alive']
        +
        actors.loc[:, 'alive']
         
        @@ -1866,7 +1866,7 @@

        Indexer loc
        In [35]:
        -
        actors.loc[:, ['name', 'alive']]
        +
        actors.loc[:, ['name', 'alive']]
         
        @@ -2030,7 +2030,7 @@

        Indexer loc

        Indexer iloc -# +#

        @@ -2378,7 +2378,7 @@

        Indexer iloc
        In [42]:
        -
        actors.iloc[-1].loc['name']
        +
        actors.iloc[-1].loc['name']
         
        @@ -2410,7 +2410,7 @@

        Indexer iloc

        Indexy -# +#

        @@ -2428,7 +2428,7 @@

        Indexy
        In [43]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -2601,7 +2601,7 @@

        Indexy
        In [46]:
        -
        actors.index = actors['name']
        +
        actors.index = actors['name']
         actors
         
        @@ -2839,7 +2839,7 @@

        Indexy
        In [49]:
        -
        actors.loc[['Eric', 'Graham']]
        +
        actors.loc[['Eric', 'Graham']]
         
        @@ -2920,7 +2920,7 @@

        Indexy
        In [50]:
        -
        actors.loc['Terry']
        +
        actors.loc['Terry']
         
        @@ -3002,7 +3002,7 @@

        Indexy
        In [51]:
        -
        indexed_actors = actors.set_index(['name', 'birth'])
        +
        indexed_actors = actors.set_index(['name', 'birth'])
         indexed_actors
         
        @@ -3141,7 +3141,7 @@

        Indexy
        In [53]:
        -
        indexed_actors.loc['Terry']
        +
        indexed_actors.loc['Terry']
         
        @@ -3207,7 +3207,7 @@

        Indexy
        In [54]:
        -
        indexed_actors.loc['Terry'].loc[1940]
        +
        indexed_actors.loc['Terry'].loc[1940]
         
        @@ -3241,7 +3241,7 @@

        Indexy
        In [55]:
        -
        indexed_actors.loc[('Terry', 1942)]
        +
        indexed_actors.loc[('Terry', 1942)]
         
        @@ -3371,8 +3371,8 @@

        Indexy
        In [57]:
        -
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
        -                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
        +
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
        +                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
         last_names
         
        @@ -3409,7 +3409,7 @@

        Indexy
        In [58]:
        -
        indexed_actors['last_name'] = last_names
        +
        indexed_actors['last_name'] = last_names
         indexed_actors
         
        @@ -3506,7 +3506,7 @@

        Indexy

        NaN neboli NULL či N/A -# +#

        @@ -3523,7 +3523,7 @@

        NaN neboli NULL či N/A
        In [59]:
        -
        '(' + indexed_actors['last_name'] + ')'
        +
        '(' + indexed_actors['last_name'] + ')'
         
        @@ -3570,7 +3570,7 @@

        NaN neboli NULL či N/A
        In [60]:
        -
        indexed_actors['last_name'].isnull()
        +
        indexed_actors['last_name'].isnull()
         
        @@ -3617,7 +3617,7 @@

        NaN neboli NULL či N/A
        In [61]:
        -
        indexed_actors.fillna('')
        +
        indexed_actors.fillna('')
         
        @@ -3800,7 +3800,7 @@

        NaN neboli NULL či N/A

        Merge -# +#

        Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

        @@ -3811,7 +3811,7 @@

        Merge
        In [63]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -3904,7 +3904,7 @@

        Merge
        In [64]:
        -
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
        +
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
         spouses
         
        @@ -4168,7 +4168,7 @@

        Merge

        Přesýpání dat -# +#

        @@ -4190,9 +4190,9 @@

        Přesýpání dat import random random.seed(0) -months = pandas.date_range('2015-01', '2016-12', freq='M') -categories = ['Electronics', 'Power Tools', 'Clothing'] -data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)} +months = pandas.date_range('2015-01', '2016-12', freq='M') +categories = ['Electronics', 'Power Tools', 'Clothing'] +data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)} for a, b in itertools.product(months, categories) if random.randrange(20) > 0])

        @@ -4335,7 +4335,7 @@

        Přesýpání dat
        In [69]:
        -
        data['sales'].describe()
        +
        data['sales'].describe()
         
        @@ -4383,7 +4383,7 @@

        Přesýpání dat
        In [70]:
        -
        indexed = data.set_index(['category', 'month'])
        +
        indexed = data.set_index(['category', 'month'])
         indexed.head()
         
        @@ -4477,7 +4477,7 @@

        Přesýpání dat
        In [71]:
        -
        unstacked = indexed.unstack('month')
        +
        unstacked = indexed.unstack('month')
         unstacked
         
        @@ -4839,7 +4839,7 @@

        Přesýpání dat
        In [73]:
        -
        unstacked.loc['Electronics'].sum()
        +
        unstacked.loc['Electronics'].sum()
         
        @@ -4879,7 +4879,7 @@

        Přesýpání dat
        In [74]:
        -
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
        +
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
         
        @@ -4960,7 +4960,7 @@

        Přesýpání dat
        In [75]:
        -
        unstacked.loc['Clothing']
        +
        unstacked.loc['Clothing']
         
        @@ -5023,7 +5023,7 @@

        Přesýpání dat

        Grafy -# +#

        @@ -5064,7 +5064,7 @@

        Grafy
        In [77]:
        -
        unstacked.loc['Clothing'].dropna().plot()
        +
        unstacked.loc['Clothing'].dropna().plot()
         
        @@ -5888,7 +5888,7 @@

        Grafy
        # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
        -unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
        +unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
         
        @@ -6048,7 +6048,7 @@

        Grafy

        Groupby -# +#

        Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

        @@ -6152,7 +6152,7 @@

        Groupby
        In [81]:
        -
        data.groupby('category')
        +
        data.groupby('category')
         
        @@ -6192,7 +6192,7 @@

        Groupby
        In [82]:
        -
        data.groupby('category').sum()
        +
        data.groupby('category').sum()
         
        @@ -6269,7 +6269,7 @@

        Groupby
        In [83]:
        -
        data.groupby('category').count()
        +
        data.groupby('category').count()
         
        @@ -6351,7 +6351,7 @@

        Groupby
        In [84]:
        -
        data.groupby(['category', 'month']).sum().head()
        +
        data.groupby(['category', 'month']).sum().head()
         
        @@ -6439,7 +6439,7 @@

        Groupby
        In [85]:
        -
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
        +
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
         
        @@ -6535,7 +6535,7 @@

        Groupby
        In [86]:
        -
        g = data.groupby('month')
        +
        g = data.groupby('month')
         g.describe()
         
        @@ -6873,8 +6873,8 @@

        Groupby
        bin_size = 10000
        -by_month = data.groupby('month').sum()
        -by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
        +by_month = data.groupby('month').sum()
        +by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
         by_thousands
         
        @@ -6954,7 +6954,7 @@

        Groupby
        In [88]:
        -
        by_thousands[('sales', 'sum')].plot()
        +
        by_thousands[('sales', 'sum')].plot()
         
        @@ -7238,5 +7238,5 @@

        Groupby

        - + diff --git a/lessons/pong/index.html b/lessons/pong/index.html index f3be3c6c..38c56cc8 100644 --- a/lessons/pong/index.html +++ b/lessons/pong/index.html @@ -1,5 +1,5 @@

        Pong -# +#

        @@ -13,7 +13,7 @@

        Pong

        Na Youtube se můžeš podívat na video, které ukazuje jak se Pong hraje.

        Konstanty a stav hry -# +#

        Hra Pong má jednoduchá pravidla. Musíme je ale umět vyjádřit v Pythonu a to není úplně jednoduché. @@ -78,7 +78,7 @@

        Konstanty a stav hry stisknute_klavesy = set() # sada stisknutych klaves skore = [0, 0] # skore dvou hracu

        Vykreslení hrací plochy -# +#

        Nejprve si v Pygletu otevřeme okno velikosti hrací plochy.

        import pyglet
        @@ -99,7 +99,7 @@ 

        Konstanty a stav hry
        from pyglet import gl
         ...
         def nakresli_obdelnik(x, y, sirka, vyska):
        -    """Nakresli obdelnik na danych souradnicich
        +    """Nakresli obdelnik na danych souradnicich
         
             Nazorny diagram::
         
        @@ -127,7 +127,7 @@ 

        Konstanty a stav hry grafických prvků.

        ...
         def vykresli():
        -    """Vykresli stav hry"""
        +    """Vykresli stav hry"""
             window.clear()  # smaz obsah okna (vybarvi na cerno)
         
         window = pyglet.window.Window(width=SIRKA, height=VYSKA)
        @@ -220,7 +220,7 @@ 

        Řešení

        volali funkci, a uložíme si ho do proměnné: napis = Label().

        def nakresli_text(text, x, y, pozice_x):
        -    """Nakresli dany text na danou pozici
        +    """Nakresli dany text na danou pozici
         
             Argument ``pozice_x`` muze byt "left" nebo "right", udava na kterou stranu
             bude text zarovnany
        @@ -260,12 +260,12 @@ 

        Řešení

        Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

        Dynamika hry -# +#

        Teď to začne být zajímavé. Nejdřív rozhýbeme pálky, protože je to jednodušší, pak míček.

        Vstup od uživatele -# +#

        Potřebujeme pohybovat s pálkami podle vstupu od uživatele. Dokud bude uživatel držet např. klávesu S, levá pálka @@ -349,7 +349,7 @@

        Řešení

        ) pyglet.app.run()

        Pohyb pálek -# +#

        Když už jsme dokázali zpracovat vstup od uživatele, můžeme podle něj pohnout s pálkami. @@ -393,7 +393,7 @@

        Řešení

        pyglet.app.run()

        a podívej se na výsledek.

        Rozehrání -# +#

        Než začneme míček odrážet od stěn, musíme ho nejprve uvést do pohybu. Vystřelíme ho ze středu hrací plochy @@ -452,7 +452,7 @@

        Řešení

        Zkus, co se teď stane při spuštění hry. Míček by měl vyletět pokaždé do jiného směru.

        Odrážení míčku -# +#

        Míček nám teď nekontrolovaně vyletí z hřiště. Musíme tedy zařídit, aby se odrážel od stěn. @@ -504,7 +504,7 @@

        Odrážení míčku skore[0] += 1 reset()

        Závěr -# +#

        Hurá, prokousali jsme se k zdárnému konci Pongu! Máš teď plně funkční interaktivní grafickou diff --git a/lessons/prefer-return/index.html b/lessons/prefer-return/index.html index 0fbe7935..57d037da 100644 --- a/lessons/prefer-return/index.html +++ b/lessons/prefer-return/index.html @@ -1,5 +1,5 @@

        Vrátit nebo vypsat? -# +#

        Podívejme se teď na následující program, který vypíše obsah elipsy:

        from math import pi
        @@ -41,7 +41,7 @@ 

        Vrátit nebo vypsat?
        from math import pi
         
         def obsah_elipsy(a, b):
        -    """Vrátí obsah elipsy s poloosami daných délek"""
        +    """Vrátí obsah elipsy s poloosami daných délek"""
             # Jen samotný výpočet:
             return pi * a * b
         
        @@ -55,14 +55,14 @@ 

        Vrátit nebo vypsat? Když ale funkce něco počítá, nebo když si nejsi jistý/á, je dobré ve funkci print ani input nemít.

        None -# +#

        Když funkce neskončí příkazem return, automaticky se vrátí hodnota None.

        Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, a znamená „nic“.

        def nic():
        -     """Tahle funkce nic nedělá """
        +     """Tahle funkce nic nedělá """
         
         print(nic())
         

        Procedury v Pythonu vracejí právě toto „nic“.

        \ No newline at end of file diff --git a/lessons/print/index.html b/lessons/print/index.html index 602304e1..06b74940 100644 --- a/lessons/print/index.html +++ b/lessons/print/index.html @@ -1,5 +1,5 @@

        Print a chybové hlášky -# +#

        Vytvoř v editoru nový soubor, ulož ho do adresáře pro dnešní lekci pod jménem printing.py a napiš do něj teď už známý příkaz:

        @@ -13,7 +13,7 @@

        Print a chybové hlášky

        Funguje? Doufám, že ano; za chvíli ho vylepšíme.

        Další příkazy -# +#

        Zkus do programu postupně, po jednom, přidávat další řádky. Po přidání každého dalšího print program znovu spusť a vyzkoušej, jestli @@ -42,7 +42,7 @@

        Další příkazy Více se dozvíš později, zatím si zapamatuj, že se takovýto text označuje označuje v programovací hantýrce jako řetězec.

        Jak číst chyby -# +#

        Často zjistíš, že program, který napíšeš, nebude fungovat hned napoprvé. Počítač je hloupý stroj; pokud instrukce nenapíšeš přesně podle pravidel jazyka @@ -79,7 +79,7 @@

        Další příkazy Jestli funguje, gratuluji! Jinak chybu opět oprav a opakuj, dokud to nebude fungovat :)

        Jak funguje program -# +#

        Teď, když program běží, se můžeme podívat, co se při jeho spuštění vlastně děje. @@ -93,7 +93,7 @@

        Jak funguje program ale základní myšlenka je stále stejná: počítač „čte“ odshora dolů a provádí příkazy jeden po druhém.

        A z jakých že instrukcí se náš „recept“ skládá?

        Ten print, který tu celou dobu používáš, je funkce. diff --git a/lessons/pyglet/index.html b/lessons/pyglet/index.html index d1e69421..eb6828b4 100644 --- a/lessons/pyglet/index.html +++ b/lessons/pyglet/index.html @@ -1,5 +1,5 @@

        Grafika -# +#

        Dnes si ukážeme, jak s Pythonem napsat grafickou aplikaci.

        Použijeme knihovnu, která není zabudovaná přímo @@ -8,7 +8,7 @@

        Grafika v zapnutém virtualenvu modul pip – konkrétně příkaz python -m pip install pyglet. U mě vypadá instalace nějak takto:

        -
        (venv)$ python -m pip install pyglet
        +
        (venv)$ python -m pip install pyglet
         Collecting pyglet
           Downloading pyglet-1.2.4-py3-none-any.whl (964kB)
         Installing collected packages: pyglet
        @@ -28,7 +28,7 @@ 

        Grafika uklidíme.

        Hotovo? Pojďme si vysvětlit, co se tu vlastně děje.

        Interaktivní programy -# +#

        Podívejme se ještě jednou, jak zhruba vypadá hlavní program pro Piškvorky, který jsme napsali @@ -93,7 +93,7 @@

        Interaktivní programy knihovna (angl. library) a ostatní to pak můžou používat.

        Pyglet 🐷 -# +#

        Jedna z takových knihoven je Pyglet. Obsahuje kromě smyčky událostí taky funkce na @@ -117,7 +117,7 @@

        Pyglet 🐷 (funkce pyglet.app.run()) a program může pokračovat.

        Text -# +#

        Klávesa Esc není příliš zajímavá. Zkusme reagovat i na jiné klávesy.

        @@ -171,7 +171,7 @@

        Text Proto Pygletu dáme samotnou funkci, kterou bude sám volat, kdykoli uživatel stiskne klávesu.

        Čas ⏲ -# +#

        Ještě jednu událost zpracujme, než se přesuneme ke grafice.

        Bude to takzvaný tik hodin @@ -209,7 +209,7 @@

        Čas ⏲ Většina filmů používá jen 24 obrázků za vteřinu; realistické 3D hry až 60.

        Vykreslování 🖌 -# +#

        Program, který vypisuje na terminál spoustu čísel, @@ -287,7 +287,7 @@

        Čas ⏲ kterou Pyglet volá z on_draw. Jinde funkce jako clear a draw nebudou fungovat správně.

        Animace -# +#

        Pojď si teď se Spritem trochu pohrát.

        Do funkce zpracuj_text dej místo printu tento příkaz:

        @@ -311,7 +311,7 @@

        Animace

        Co se stane, když začneš měnit ta čísla?

        Co se stane, když zkusíš podobně nastavovat atribut rotation?

        Zavolej později -# +#

        Pyglet umí kromě opakovaného „tikání“ zavolat funkci @@ -340,7 +340,7 @@

        Zavolej později had.image = obrazek pyglet.clock.schedule_once(zmen, 0.2)

        Klik 🐭 -# +#

        Poslední věc, na kterou se tady naučíme reagovat, je klikání. Těsně před window.push_handlers napiš funkci:

        @@ -358,7 +358,7 @@

        Zavolej později
      • Jak se projeví Shift+klik?
      • Pokračování příště -# +#

        Koukám že kódu už je dnes tak akorát na ukončení lekce:

        import math
        diff --git a/lessons/pyqt/index.html b/lessons/pyqt/index.html
        index 7b0d76d7..1238638c 100644
        --- a/lessons/pyqt/index.html
        +++ b/lessons/pyqt/index.html
        @@ -1,46 +1,46 @@
         

        GUI v Pythonu: PyQt5 -# +#

        Způsobů, jak dělat v Pythonu aplikace s GUI, je mnoho. Dá se použít zabudovaný, ale ošklivý Tkinter, nebo nějaký externí framework.

        V tomto cvičení budeme používat framework Qt, protože je multiplatformní, používá se i v jiných oblastech, než je Python, je dostatečně robustní a dá se na většinu systémů nainstalovat bez větších problémů.

        Pomocí aplikace Qt Designer se dá navíc základní kostra GUI poměrně jednoduše naklikat, takže není nutné psát layout aplikace v kódu.

        Instalace -# +#

        Na tomto cvičení budete potřebovat balíček PyQt5 a aplikaci Qt5 Designer. Pokud budete používat svůj počítač, prosíme vás o instalaci již předem, na cvičení toho bude opravdu hodně a nemůžeme si dovolit plýtvat časem.

        PyQt5 -# +#

        Pokud máte Python alespoň 3.5 a jednu z platforem, pro které je připraven wheel na PyPI, stačí udělat:

        -
        (__venv__) $ python -m pip install --upgrade pip
        -(__venv__) $ python -m pip install PyQt5
        +
        (__venv__) $ python -m pip install --upgrade pip
        +(__venv__) $ python -m pip install PyQt5
         

        Pro starší verzi Pythonu nebo 32bitový Linux to ale nebude fungovat. V takovém případě můžete PyQt5 zkusit najít v balíčkovacím systému vaší distribuce (např. balíček python3-qt5 ve Fedoře nebo python3-pyqt5 v Debianu). Virtualenv pak může vytvořit s přepínačem --system-site-packages, který zajistí, že i z virtualenvu uvidíte PyQt5 nainstalované z distribučního balíčku.

        -
        $ python3 -m venv --system-site-packages __venv__
        +
        $ python3 -m venv --system-site-packages __venv__
         

        Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů (návod).

        První aplikace níže by vám měla fungovat.

        Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

        Qt5 Designer -# +#

        Na Linuxu najdete Qt5 Designer v balíčkách, třeba qt5-designer na Fedoře nebo qttools5-dev-tools na Debianu.

        Na Windows (i na Macu) si můžete stáhnout instalátor Qt 5, který (doufáme) nainstaluje i Designer.

        Pokud používáte na Macu homebrew, můžete to udělat i takto:

        -
        $ brew install qt5
        -$ brew linkapps qt5
        +
        $ brew install qt5
        +$ brew linkapps qt5
         

        Existují i Python wheely pyqt5-tools pro Windows obsahující Qt5 Designer. Ten je pak potřeba pro spuštění dohledat v nainstalované lokaci.

        NumPy -# +#

        Do virtuálního prostředí s PyQt5 si nainstalujte i NumPy:

        -
        $ python -m pip install numpy
        +
        $ python -m pip install numpy
         

        První aplikace -# +#

        Napište si první aplikaci, ať vidíte, jak kód v PyQt vypadá. Detaily toho, jak to funguje, si ukážeme později.

        @@ -56,7 +56,7 @@

        NumPy app.exec()

        O Qt, PyQt a PySide -# +#

        Qt je aplikační framework napsaný v C++, který zjednodušuje psaní multiplatformních aplikací (od počítačů s Linuxem, Mac OS či Windows po různá vestavěná zařízení).

        PyQt je knihovna, která umožňuje použít Qt z Pythonu. @@ -64,7 +64,7 @@

        NumPy Tedy: kdokoliv, kdo dostane kopii programu, musí mít možnost dostat odpovídající zdrojový kód a má možnost tento kód dál šířit pod stejnou licencí.

        Pokud by se vám tato licence nelíbila, je možnost použít PySide, které má permisivnější licenci a téměř stejné API jako PyQt, ale není tak stabilní.

        Moduly Qt -# +#

        Qt je rozděleno na několik tzv. modulů. Pro grafická uživatelská rozhraní (GUI), kterými se budeme zabývat, použijeme hlavně QtGui a QtWidgets.

        @@ -73,12 +73,12 @@

        Moduly Qt

        Další moduly jsou nadstavby od vykreslování SVG nebo práci s multimédii (které se můžou hodit) po třeba práci s SQL a XML nebo síťovou komunikaci, kde je pro Python pohodlnější použít jiné knihovny.

        Specifika PyQt -# +#

        Ačkoli se Qt dá použít z Pythonu, bohužel zjistíte, že ne všechno funguje a vypadá tak, jako kdyby to byla knihovna od základů napsaná pro Python. Tady jsou některé zvláštnosti, na které se můžete připravit.

        Jména a dokumentace -# +#

        Qt pojmenovává funkce, metody a atributy konvencí camelCase, místo pythonistického snake_case. PyQt tuto konvenci nemění: je užitečnější používat identická jména, a kromě toho knihovna PyQt vznikla ještě před PEP 8.

        @@ -90,13 +90,13 @@

        Jména a dokumentace

        Rozdíly mezi C a pythonní verzí jsou většinou intuitivní (např. None místo NULL), ale jsou popsány v dokumentaci PyQt.

        Atributy -# +#

        Qt zásadně používá pro přístup k atributům objektů funkce. Funkce pro čtení se typicky jmenuje podle atributu, funkce pro nastavení má předponu set. Namísto pythonního c = obj.color a obj.color = ... tedy použijeme c = obj.color() a obj.setColor(...).

        Správa paměti -# +#

        Python a C++/Qt mají, bohužel, rozdílný přístup ke správě paměti. Python používá reference counting a garbage collection. @@ -113,7 +113,7 @@

        Správa paměti a CPython C API (z minula) vám v tom pomůžou. Doporučujeme dělat malé commity a psát jednoduchý kód.

        Smyčka událostí, signály a sloty -# +#

        Qt funguje na principu smyčky událostí (event loop). Metoda QApplication.exec obsahuje v podstatě nekonečnou smyčku, která čeká na externí události (klik myši, @@ -153,7 +153,7 @@

        Smyčka událostí, signály a sloty app.exec()

        Skládání GUI -# +#

        Základní způsob, jak v Qt vytvářet grafické rozhraní, je skládání funkčních prvků (widgets) do hierarchie oken, skupin a panelů.

        @@ -197,7 +197,7 @@

        Smyčka událostí, signály a sloty programy stačí „poskládat“ z nich a napojit je na logiku. Pro složitější programy jsou pak možnosti, jak si widgety přizpůsobit.

        Qt Designer -# +#

        Na tomto cvičení si připravíme aplikaci pro editaci dlaždicových map (tile maps) – obrázků složených z omezené nabídky čtverečků („dlaždic“), @@ -251,7 +251,7 @@

        Qt Designer main()

        Vlastní widget - Grid -# +#

        Qt neobsahuje předpřipravený widget na dlaždicové mapy. Musíme si tedy vyrobit vlastní.

        Mapu budeme reprezentovat jako NumPy matici (viz lekce o NumPy). @@ -351,7 +351,7 @@

        Qt Designer painter.fillRect(rect, QtGui.QBrush(color))

        Nyní by již mapa měla být v okně vidět barevně.

        Obrázky -# +#

        Protože barvičky jsou příliš nudné, přidáme do mapového widgetu obrázky.

        Veškerou, ke cvičení i k úkolu potřebnou, grafiku najdete na GitHubu. @@ -382,7 +382,7 @@

        Obrázky if self.array[row, column] < 0: SVG_WALL.render(painter, rect)

        Model/View -# +#

        Nyní trochu odbočíme a povíme si krátce o dalším podsystému Qt: o modelech.

        Qt obsahuje framework, který mapuje informace do podoby tabulek, seznamů nebo obecných stromů. @@ -399,7 +399,7 @@

        Obrázky Tyto modely je složitější napojit na existující aplikační logiku, ale pro většinu účelů postačí.

        O obecných modelech si můžete přečíst v dokumentaci.

        QListWidget - Paleta -# +#

        Jeden z widgetů se zabudovaným modelem je QListWidget, který umí spravovat a zobrazovat nějaký seznam. @@ -429,7 +429,7 @@

        QListWidget - Paleta ... def item_activated(): - """Tato funkce se zavolá, když uživatel zvolí položku""" + """Tato funkce se zavolá, když uživatel zvolí položku""" # Položek může obecně být vybráno víc, ale v našem seznamu je to # zakázáno (v Designeru selectionMode=SingleSelection). @@ -463,7 +463,7 @@

        QListWidget - Paleta for item in palette.selectedItems(): grid.selected = item.data(VALUE_ROLE)

        Klikání do gridu -# +#

        Nyní nezbývá nic jiného, než pomocí klikání nanášet zvolené dílky do mapy. K tomu opět použijeme událost, tentokrát událost kliknutí, tedy mousePressEvent.

        @@ -488,7 +488,7 @@

        QListWidget - Paleta
        # Za přidáním položek do palety a napojení signálu
         palette.setCurrentRow(1)
         

        Více tlačítek myši -# +#

        Můžete si vyzkoušet, že se mapa mění při použití jakéhokoliv tlačítka myši. Je to proto, že mousePressEvent se stane, kdykoli na widgetu stiskneme libovolné tlačítko. @@ -502,7 +502,7 @@

        QListWidget - Paleta
                    elif event.button() == QtCore.Qt.RightButton:
                         self.array[row, column] = 0
         

        Tažení myši -# +#

        Pro splnění úkolu bude stačit objekty mazat a klást pomocí klikání na jednotlivá políčka. Pokud však chcete poskytnout uživateli větší komfort, prozkoumejte další události @@ -513,7 +513,7 @@

        QListWidget - Paleta jen jednu poslední. Jednotlivé body můžete spojit čárou pomocí knihovny bresenham.)

        Naše aplikace bude umět vytvořit novou, prázdnou mapu. Ukážeme si, jak vytvořit modální dialog pro volby (šířka a výška nové mapy). @@ -597,7 +597,7 @@

        Třída pro GUI aplikace -# +#

        Funkce main se nám pomalu rozrůstá a další funkce, které volá, musí být buď definované v ní (jako item_activated) nebo musí brát relativně hodně argumentů (jako new_dialog). diff --git a/lessons/range/index.html b/lessons/range/index.html index e0f5e8e4..24d32fc4 100644 --- a/lessons/range/index.html +++ b/lessons/range/index.html @@ -1,5 +1,5 @@

        Range – sekvence čísel -# +#

        Funkce range(10) vrátí speciální hodnotu, která v sobě obsahuje čísla od 0 do 9:

        diff --git a/lessons/reassignment/index.html b/lessons/reassignment/index.html index 74cf378c..6548d02f 100644 --- a/lessons/reassignment/index.html +++ b/lessons/reassignment/index.html @@ -1,5 +1,5 @@

        Přepisování proměnných -# +#

        Už víš, že hodnota proměnné se může v čase měnit: když přiřadíš do už existující proměnné, stará hodnota se zahodí @@ -31,7 +31,7 @@

        Přepisování proměnných # ▲ | # ╰──────────────────╯

        Přepisování v cyklu -# +#

        Ještě „zajímavější“ je použít podobné přepisování v cyklu.

        Zopakuj si, že for cyklus jako:

        diff --git a/lessons/recursion/index.html b/lessons/recursion/index.html index ad4cdffd..a67066ca 100644 --- a/lessons/recursion/index.html +++ b/lessons/recursion/index.html @@ -1,5 +1,5 @@

        Rekurze -# +#

        Rekurze (angl. recursion) je programátorská technika, kdy funkce volá sebe sama.

        @@ -54,7 +54,7 @@

        Rekurze RecursionError: maximum recursion depth exceeded

        Hláška je zkrácená – dva řádky by se správně měly opakovat 999×, ale novější verze Pythonu je vypíšou jen třikrát.

        Kontrolované zanoření -# +#

        Jak rekurzi využít v praxi? Jeden způsob je si počítat, kolikrát se ještě „zanořit“.

        @@ -119,7 +119,7 @@

        Kontrolované zanoření

        Lokální proměnné -# +#

        Na předchozím příkladu je vidět zajímavé chování lokálních proměnných. Když je potápěč „na dně“, jakou hodnotu má proměnná hloubka?

        @@ -132,7 +132,7 @@

        Lokální proměnné přestane existovat. A „volající“ funkce vidí svoji proměnnou, ve které je stále původní hodnota.

        Pro matematiky -# +#

        Nemáš-li rád/a matematiku, tuhle sekci přeskoč!

        Rekurzivní algoritmy mají původ v matematice. Faktoriál x, neboli diff --git a/lessons/requests/index.html b/lessons/requests/index.html index e2ad18b4..5c8180a9 100644 --- a/lessons/requests/index.html +++ b/lessons/requests/index.html @@ -1,5 +1,5 @@

        Requests -# +#

        Knihoven pro HTTP klienty (tedy “programy, které stahují webové stránky“) je celá řada. @@ -16,7 +16,7 @@

        Requests client interface. Zaměříme se tedy na Requests hned od začátku.

        Knihovna Requests se instaluje standardním způsobem:

        -
        $ python -m pip install requests
        +
        $ python -m pip install requests
         

        Budeme předpokládat, že znáte alespoň základy HTTP protokolu, a vrhneme se rovnou na příklad.

        Pokud základy neznáte, můžete se podívat na @@ -44,7 +44,7 @@

        Requests Pokud na GitHub používáte dvoufaktorovou autentizaci, příklad nebude fungovat.

        Příklady použití pro další HTTP metody najdete v dokumentaci.

        Použití session -# +#

        Hlavně v budoucnu se nám bude hodit použití tzv. session.

        @@ -66,7 +66,7 @@

        Použití session >>> r.json() {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Cookie': 'mipyt=best', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.19.1', 'X-Test': 'true', 'X-Test2': 'true'}}

        GitHub API -# +#

        Podíváme se teď, podobně jako v úvodním příkladu, na GitHub API, které má poměrně jednoduchou autentizaci (od GitHubu přímo @@ -131,13 +131,13 @@

        Použití session My ale věříme, že ji odebrat nechcete :)

        Dokumentace ke GitHub API.

        Chraňte své tokeny -# +#

        Když ukládáte skript do gitu, mějte na paměti, že tokeny a klíče do něj nikdy nepatří. Můžete je uložit do konfiguračního souboru, který bude gitem ignorován, například takhle:

        -
        [github]
        -token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
        +
        [github]
        +token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
         

        A následně konfiguraci načtete pomocí modulu configparser:

        >>> import configparser
        diff --git a/lessons/snake/index.html b/lessons/snake/index.html
        index 8e34a321..dbe4578c 100644
        --- a/lessons/snake/index.html
        +++ b/lessons/snake/index.html
        @@ -1,5 +1,5 @@
         

        Hra typu Had -# +#

        Dnes to všechno — třídy, grafiku, seznamy a tak dále – spojíme dohromady do závěrečného projektu. @@ -20,7 +20,7 @@

        Hra typu Had Kdyby se to stalo, prosím, ozvi se nám! Rádi ti s projektem pomůžeme.

        Logika hry a fáze projektu -# +#

        Základní princip hry máš v malíčku, pokud jsi dokončil/a domácí projekt po lekci o seznamech. Pokud jej nemáš, doporučuji @@ -52,7 +52,7 @@

        Hra typu Had na druhé straně.

        Z příkazové řádky do grafické aplikace -# +#

        V příkazové řádce měl had souřadnice označující řádek a sloupec. V grafické aplikaci to bude podobné, ale protože pixelů na obrazovce je mnohem více, budeme @@ -66,7 +66,7 @@

        Z příkazové řádky do grafic čtverců vejde na šířku a na výšku a tím i zjistit, kolik pomyslných sloupců a řádků bude naše hrací plocha mít.

        Vykreslení hada -# +#

        Abychom mohli hada vykreslit, potřebujeme si pro začátek uložit jeho souřadnice. K tomu můžeš použít seznam dvojic – stejně jako v domácím projektu. Podobných @@ -86,7 +86,7 @@

        Vykreslení hada Pro jednoduchost stačí Sprite vytvořit, vykreslit a „zapomenout“. Není to ale optimální přístup a tak tohle může být jedním z adeptů pro pozdější vylepšení.

        Rozpohybování hada -# +#

        Aby se mohl had hýbat, potřebuje znát směr pohybu. V příkazové řádce jsme vždy počkali, až nám směr zadá uživatel, ale v opravdové hře se bude had @@ -104,7 +104,7 @@

        Rozpohybování hada automaticky v pravidelných intervalech. pyglet.clock.schedule_interval je zde jasná volba.

        Ovládání pomocí klávesnice -# +#

        Reagovat na stisknuté klávesy jsme se už taky učili. Teď to tedy využijeme, abychom dokázali změnit nastavený směr pohybu z předchozího bodu. Bude pro to @@ -120,7 +120,7 @@

        Ovládání pomocí klávesnice

        Vida, máme hotový základ!

        Nenechme ho utéct -# +#

        Had už se nám hýbe podle našich představ, ale stačí ho nechat chvíli bez dozoru a uteče nám z hrací plochy. Tomu není těžké zabránit, když víme, že žádná @@ -133,7 +133,7 @@

        Nenechme ho utéct

        Stejným způsobem a na stejném místě v programu bude třeba vyřešit i situaci, kdy had narazí sám do sebe.

        Jen ať jí, hlavně že mu chutná -# +#

        Jezdit s hadem po hrací ploše může být chvíli zábava, ale protože had neroste, není to žádná výzva. A aby mohl růst, potřebuje jíst.

        @@ -147,7 +147,7 @@

        Jen ať jí, hlavně že mu chutná obrázek použijeme třeba jablko.

        První závan grafiky :-)

        Čtverečky ven, grafiku sem -# +#

        Čtverečky jsou fajn, ale hra by měla lahodit oku a had by měl vypadat jako had. K tomu máme připravenou sadu obrázků - ke stažení zde. @@ -155,7 +155,7 @@

        Čtverečky ven, grafiku sem úrovni jako soubor s programem.

        Kousky hada

        Načtení všech obrázků ze složky -# +#

        Nejdříve si načteme všechny obrázky do hry, abychom je pak mohli bez potíží použít. Protože se nechceme opakovat (DRY), bude potřeba to udělat nějak @@ -204,7 +204,7 @@

        Řešení

        Housenka -# +#

        Než se začneme zabývat různými obrázky, uděláme pokus k ověření, že nám vše stále funguje. Jako mezistupeň od hranatého hada k jeho věrné grafické podobě vytvoř housenku. @@ -214,7 +214,7 @@

        Řešení

        Začne to být náročnější.

        Housenka

        Výběr správných obrázků -# +#

        Jistě sis všiml/a, že některé obrázky v naší sadě jsou téměř identické a liší se jen v otočení. V tuhle chvíli máme totiž dvě možnosti, jak vykreslit @@ -238,7 +238,7 @@

        Výběr správných obrázků

        Finální had

        Odměnou za vyřešení ti bude kompletní grafická hra Had. Gratuluji!

        Optimalizace, úklid -# +#

        Než se po dokončení základní hry vrhneš na její rozšiřování, měl by se celý kód uklidit a zpřehlednit, aby se v něm další úpravy dělaly snáze a s menším diff --git a/lessons/str-index-slice/index.html b/lessons/str-index-slice/index.html index ffc7e48b..5ee59f0a 100644 --- a/lessons/str-index-slice/index.html +++ b/lessons/str-index-slice/index.html @@ -1,5 +1,5 @@

        Výběr z řetězců -# +#

        Už umíš spojovat dohromady kratší řetězce:

        spojeny_retezec = 'a' + 'b'
        @@ -8,7 +8,7 @@ 

        Výběr z řetězců řetězce dostat kratší součásti. Začneme jednotlivými znaky.

        Výběr znaku -# +#

        Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku (angl. subscripting), @@ -61,7 +61,7 @@

        Řešení

        ╰───┴───┴───┴───┴───┴───┴───┴───╯

        Sekání řetězců -# +#

        Kromě jednotlivých znaků můžeme vybírat i delší části – odborně podřetězce (angl. substrings).

        @@ -128,7 +128,7 @@

        Řešení

        ╰───────────╯ 'čokoláda'[-3:] == 'áda'

        Cvičení -# +#

        Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za jiné. Například:

        diff --git a/lessons/str-methods/index.html b/lessons/str-methods/index.html index 2e50c757..13105d5a 100644 --- a/lessons/str-methods/index.html +++ b/lessons/str-methods/index.html @@ -1,5 +1,5 @@

        Řetězcové funkce a metody -# +#

        Řetězce umí všelijaké triky. Funkcí len() můžeš zjistit, jak je řetězec dlouhý; @@ -33,7 +33,7 @@

        Řetězcové funkce a metody

        A jak se převádí na malá písmena? K tomu budeme potřebovat další novou vlastnost Pythonu: metody.

        Metody -# +#

        Metoda (angl. method) je jako funkce – něco, co se dá zavolat. Na rozdíl od funkce je svázaná s nějakým objektem (hodnotou). @@ -53,7 +53,7 @@

        Metody nedá změnit, dá se jen vytvořit nějaký odvozený. S touto vlastností už ses mohl/a setkat při psaní funkce zamen.

        Iniciály -# +#

        Pro procvičení metod a vybírání znaků si zkus napsat program, který se zeptá na jméno, pak na příjmení @@ -81,7 +81,7 @@

        Řešení

        Je sice delší, ale mnohem přehlednější.

        A další -# +#

        Řetězcových metod je celá řada. Nejužitečnější z nich najdeš v taháku, který si můžeš stáhnout či vytisknout. diff --git a/lessons/str/index.html b/lessons/str/index.html index dd7f72e0..c28017fe 100644 --- a/lessons/str/index.html +++ b/lessons/str/index.html @@ -1,5 +1,5 @@

        Zápis řetězců -# +#

        Teď se podíváme na zoubek řetězcům. Už s nimi trochu umíš, tak začneme rekapitulací.

        @@ -17,7 +17,7 @@

        Zápis řetězců a tak je uvozovky potřeba používat důsledně.

        (Ilustrační komiks. Člověk říká robotovi: "Řekni Pavlovi, ať mi zavolá!". Robot odpoví: "PAVLOVI AŤ MI ZAVOLÁ!")

        Znaky -# +#

        Texty sestávají z jednotlivých písmenek. Řetězce víceméně taky, ale aby bylo jasné, co přesně tím písmenkem @@ -43,7 +43,7 @@

        Znaky >>> len("") 0

        Uvozovky -# +#

        K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. Není mezi nimi rozdíl. @@ -63,7 +63,7 @@

        Znaky Funkce print() vypisuje hodnoty „hezky“, „pro uživatele“ – v případě řetězců tedy bez uvozovek.

        Uvozovky v uvozovkách -# +#

        Proč si při zadávání textu můžeš vybrat mezi dvěma druhy uvozovek?

        Občas se stane, že v rámci textu potřebuješ použít samotnou uvozovku (nebo @@ -76,14 +76,14 @@

        Znaky
        >>> len("Zpívala si: "Tralala"")
         Traceback (most recent call last)
           File "<>", line 1
        -    len("Zpívala si: "Tralala"")
        -                      ^
        +    len("Zpívala si: "Tralala"")
        +                      ^
         SyntaxError: invalid syntax
         

        Pokud používáš chytrý editor, doporučuju si zvyknout na to, jakou barvou máš řetězce zvýrazněné. Často to pomáhá odhalit chybky.

        Sekvence se zpětným lomítkem -# +#

        Co dělat, když v řetězci potřebuješ oba druhy uvozovek, jako ve větě Vtom vnuk křik': "Hleď!"?

        @@ -146,7 +146,7 @@

        Řešení

        >>> print('-\U0001F0BD-') -🂽-

        Zpětné lomítko -# +#

        Zpětné lomítko tedy začíná speciální sekvenci (známou pod anglickým termínem escape sequence), kterou zadáš jediný znak.

        @@ -158,7 +158,7 @@

        Řešení

        Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ je zápis pro jedno zpětné lomítko.

        Nový řádek -# +#

        Někdy potřebuješ řetězce, které obsahují více řádků. Pythonní řetězce ale můžeš normálně napsat jen na jeden řádek. @@ -177,7 +177,7 @@

        Nový řádek >>> len('-\n-') 3

        Trojité uvozovky -# +#

        Kromě \n je i druhý způsob, jak zadat řetězec se znakem nového řádku: ohraničit ho třemi uvozovkami (jednoduchými nebo dvojitými) @@ -199,7 +199,7 @@

        Nový řádek Číslo je kladné. """)

        Cvičení -# +#

        Jaká je délka těchto řetězců?

        Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

        diff --git a/lessons/submitting-a-run/index.html b/lessons/submitting-a-run/index.html index 2c15f4d4..e0bd6bde 100644 --- a/lessons/submitting-a-run/index.html +++ b/lessons/submitting-a-run/index.html @@ -1,10 +1,10 @@

        Přidání kurzu na Nauč se Python -# +#

        Když už máme nadefinováný vlastní kurz, zbývá nám jen ho dostat na naucse.python.cz. Budeme k tomu potřebovat pár příkazů v Gitu a trochu trpělivosti.

        Definice GitHub Actions -# +#

        Způsob, jakým se obsah kurz dostane na naucse.python.cz je následující:

          @@ -18,7 +18,7 @@

          Definice GitHub Actions Jestli tenhle soubor nemáš, zkopíruj si ho z repozitáře pyvec/naucse-python.

          Nahrání do vlastního forku -# +#

          První věc, kterou budeš potřebovat, je vlastní účet na GitHubu.

          Přihlaš se na GitHub a vytvoř „fork” kurzu ze kterého vycházíš, @@ -42,21 +42,21 @@

          Nahrání do vlastního forku

          Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno pod kterým fork je, a nazevrepa za název repozitáře):

          -
          $ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/nazevrepa
          +
          $ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/nazevrepa
           

          Dále potřebuješ vytvořit commit se svým kurzem a případně se změnami v materiálech. Je dobré změny dělat v zvláštní větvi, ne v main/master. Vymysli si název větve (např. pridani-kurzu) a pusť příkazy

          -
          $ git branch nazevvetve
          -$ git checkout nazevvetve
          +
          $ git branch nazevvetve
          +$ git checkout nazevvetve
           

          Jak vytvořit commit, se dozvíš například v návodu na používání Gitu. Více o větvích se můžeš dozvědět v návodu na větvení v Gitu.

          Pull request -# +#

          Svůj commit teď potřebuješ dostat do svého forku na GitHubu. To uděláš příkazem (uzivatelskejmeno nahraď za uživatelské jméno, pod kterým fork je, nazevvetve za název větve):

          -
          $ git push uzivatelskejmeno nazevvetve
          +
          $ git push uzivatelskejmeno nazevvetve
           

          Mezi informacemi které tento příkaz vypíše by měla být adresa na vytvoření pull requestu. Tu navštiv, vyber na ní compare across forks a pod base repository vyber repozitář se svým kurzem. @@ -68,16 +68,16 @@

          Pull request Tím se spustí další GitHub Action, který vytvoří větev compiled s obsahem pro naucse.python.cz.

          Informace o tvém repozitáři -# +#

          Teď potřebuješ ještě přidat kurz na naucse.python.cz. To se dělá změnou souboru courses.yml, nejlépe přímo na GitHubu pomocí tlačítka s ikonkou tužky.

          Na konec souboru přidej záznam:

          -
          rok/identifikator:
          -  url: https://github.com/uzivatelskejmeno/nazevrepa
          -  path: idkurzu
          -  branch: compiled
          +
          rok/identifikator:
          +  url: https://github.com/uzivatelskejmeno/nazevrepa
          +  path: idkurzu
          +  branch: compiled
           

          kde doplň:

          • rok kdy se kurz koná. U kurzu který zasahuje do více kalendářních roků @@ -94,7 +94,7 @@

            Informace o tvém repozitáři někdo schválit a v rámci toho může všechno zkontrolovat a upravit.

            Po tom, co správci PR schválí a začlení tvoje změny do základního repozitáře, stačí počkat pár minut a tvůj kurz se objeví na naucse.python.cz.

            Upravování kurzu -# +#

            Pokud budeš chtít na svém kurzu něco změnit, musíš s každou změnou udělat commit a odeslat commit na GitHub.

            Nastavené GitHub Actions pro každou změnu sestaví a publikují novou diff --git a/lessons/testing/index.1.html b/lessons/testing/index.1.html index 68605d62..e60305ce 100644 --- a/lessons/testing/index.1.html +++ b/lessons/testing/index.1.html @@ -1,5 +1,5 @@

            Testování -# +#

            V tomto cvičení se budeme zabývat automatickým testováním kódu. Modul unittest ze standardní knihovny už byste měli znát, @@ -11,7 +11,7 @@

            Testování

          Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový zápisek Michala Hořejška.

          pytest -# +#

          Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday @@ -19,13 +19,13 @@

          pytest
          import isholiday
           
           def test_xmas_2016():
          -    """Test whether there is Christmas in 2016"""
          +    """Test whether there is Christmas in 2016"""
               holidays = isholiday.getholidays(2016)
               assert (24, 12) in holidays
           

          Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a nainstalujeme a spustíme pytest:

          -
          (__venv__) $ python -m pip install pytest
          -(__venv__) $ python -m pytest tests/test_holidays.py
          +
          (__venv__) $ python -m pip install pytest
          +(__venv__) $ python -m pytest tests/test_holidays.py
           
          ============================= test session starts ==============================
           platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
           rootdir: /tmp/tmp.etepchwQWh, inifile:
          @@ -58,7 +58,7 @@ 

          pytest

          Pytest upravuje chování assertu, což oceníte především, pokud test selže:

              ...
               assert (23, 12) in holidays
          -
          (__venv__) $ python -m pytest tests/test_holidays.py
          +
          (__venv__) $ python -m pytest tests/test_holidays.py
           
          ============================= test session starts ==============================
           platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
           rootdir: /tmp/tmp.etepchwQWh, inifile:
          @@ -89,7 +89,7 @@ 

          pytest f()

          Více o základním použití pytestu najdete v dokumentaci.

          Parametrické testy -# +#

          Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen @@ -103,7 +103,7 @@

          Parametrické testy @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048)) def test_xmas(year): - """Test whether there is Christmas""" + """Test whether there is Christmas""" holidays = isholiday.getholidays(year) assert (24, 12) in holidays

          Zápis je určitým způsobem podobný knihovně click: funkce @@ -112,7 +112,7 @@

          Parametrické testy jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité n-tice např. seznam, množinu, range, vlastní generátor...

          Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

          -
          (__venv__) $ python -m pytest -v
          +
          (__venv__) $ python -m pytest -v
           
          ============================= test session starts ==============================
           platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
           cachedir: .pytest_cache
          @@ -145,7 +145,7 @@ 

          Parametrické testy (2048, 7, 6)], ) def test_some_holidays(year, month, day): - """Test a few sample holidays""" + """Test a few sample holidays""" holidays = isholiday.getholidays(year) assert (day, month) in holidays

          Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, @@ -193,7 +193,7 @@

          Parametrické testy tests/test_holidays.py:8: AssertionError ====================== 2 failed, 3 passed in 0.03 seconds ======================

          Fixtures -# +#

          Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, abyste získali to, co teprve chcete testovat. Příkladem může být například @@ -264,7 +264,7 @@

          Parametrické testy Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference PyCon PL.

          „Podvádění“ -# +#

          Při psaní testů se občas hodí trochu podvádět. Například když nechceme, aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na @@ -273,7 +273,7 @@

          „Podvádění“

          * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít pro funkcionalitu knihoven, které mají v názvu mock :)

          Falešné objekty (fakes) -# +#

          Při testování často potřebujeme nějaký objekt, který má určité atributy a metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

          @@ -288,7 +288,7 @@

          Falešné objekty (fakes) model='MIG-21', fly=lambda: None)

          Částečně upravené objekty, třídy, moduly (stubs) -# +#

          Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část atributů nebo metod:

          @@ -314,14 +314,14 @@

          Falešné objekty (fakes) ... ['fake content']

          Očekávání (mocks, spies) -# +#

          Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), nebo jen sledujete, jestli se zavolala (spies). (Příklady na odkazu.)

          Integrace s pytestem -# +#

          Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double @@ -330,7 +330,7 @@

          Integrace s pytestem můžete využít zabudovanou pytest fixturu monkeypatch.

          Varování -# +#

          Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud @@ -348,7 +348,7 @@

          Varování z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění při psaní testů.

          Testování HTTP komunikace: betamax -# +#

          Vaše programy často používají webová API. Při testování funkcionality API klientů se vynoří řada problémů:

          @@ -405,7 +405,7 @@

          Varování def client(betamax_session): return Client(session=betamax_session)

        Citlivé údaje -# +#

        Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

        Vyvstávají dvě otázky:

        @@ -440,7 +440,7 @@

        Varování

        V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

        Komprimované citlivé údaje -# +#

        Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní @@ -452,7 +452,7 @@

        Komprimované citlivé údaje nijak transformována, více viz Wikipedia a specifikace HTTP)

        Které HTTP požadavky jsou stejné? -# +#

        Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. @@ -465,7 +465,7 @@

        Komprimované citlivé údaje z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak testovat webové API klienty v Pythonu.

        Testování aplikací ve Flasku -# +#

        Pro testování aplikací ve Flasku se používá app.test_client():

        @@ -484,7 +484,7 @@

        Komprimované citlivé údaje Proto nelze použít přímo response.text; text dostaneme pomocí response.get_data(as_text=True).

        Testování aplikací v clicku -# +#

        Podobně funguje testování aplikací v clicku. Click obsahuje třídu CliRunner, která pomáhá s testováním:

        @@ -496,7 +496,7 @@

        Testování aplikací v clicku assert result.exit_code == 0 assert 'forced update' in result.output

        Kam dát testy? -# +#

        Dokumentace pytestu uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

        @@ -526,7 +526,7 @@

        Testování aplikací v clicku

        Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve složce s testy.

        Spouštění testů pomocí setup.py test -# +#

        Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale python setup.py test, což funguje i s jinými nástroji než je pytest. @@ -549,7 +549,7 @@

        Spouštění testů pomocí Na to uživatel spustí pytest samotný.

        Další informace jsou v dokumentaci pytestu.

        Travis CI -# +#

        Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky na službě Travis CI při každém pushnutí na GitHub.

        @@ -560,38 +560,38 @@

        Travis CI Pak opět vpravo nahoře zvolte Accounts a povolte Travis pro váš repozitář.

        Do repozitáře přidejte soubor .travis.yml:

        -
        language: python
        -python:
        -- '3.6'
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.6'
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Uvedený příklad je pro Python 3.6. Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

        -
        language: python
        -python:
        -- '3.7'
        -dist: xenial
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.7'
        +dist: xenial
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Verze Pythonu lze kombinovat:

        -
        language: python
        -python:
        -- '3.6'
        -- '3.7'
        -dist: xenial
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.6'
        +- '3.7'
        +dist: xenial
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Po pushnutí by se na Travisu měl automaticky spustit test. Více informací o použití pro Python najdete v dokumentaci.

        Kvíz -# +#

        Co je špatně na této testovací sadě k funkci is_even()?

        def is_even(n):
        diff --git a/lessons/testing/index.html b/lessons/testing/index.html
        index f0c3baf6..5a99557a 100644
        --- a/lessons/testing/index.html
        +++ b/lessons/testing/index.html
        @@ -1,5 +1,5 @@
         

        Testování -# +#

        Programátorská práce nespočívá jen v tom, program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. @@ -18,7 +18,7 @@

        Testování Když v otestovaném kódu v budoucnu uděláš nějakou změnu, testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

        Instalace knihovny pytest -# +#

        Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. @@ -48,7 +48,7 @@

        Instalace knihovny pytest Dej si proto pozor a ve jménu pytest neudělej překlep!

        Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

        -

        (venv)$ python -m pip install pytest
        +
        (venv)$ python -m pip install pytest
         

        Co ten příkaz znamená?

        python -m pip zavolá Python s tím, že má pustit modul pip. Tento modul umí instalovat nebo @@ -67,7 +67,7 @@

        Instalace knihovny pytest Program se ale bez příkazu python může spustit v jiném Pythonu, než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

        Psaní testů -# +#

        Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst @@ -78,11 +78,11 @@

        Instalace knihovny pytest že jména jak souborů s testy tak samotných testovacích funkcí začínají na test_.

        def secti(a, b):
        -    """Vrátí součet dvou čísel"""
        +    """Vrátí součet dvou čísel"""
             return a + b
         
         def test_secti():
        -    """Otestuje funkci secti"""
        +    """Otestuje funkci secti"""
             assert secti(1, 2) == 3
         

        Co se v té testovací funkci děje?

        Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, @@ -94,14 +94,14 @@

        Instalace knihovny pytest V „normálním” kódu se assert může chovat trochu jinak než výše, ale do toho teď nebudeme zabředávat.

        Spouštění testů -# +#

        Testy se spouští zadáním příkazu python -m pytest -v následovaným názvem souboru s testy. Tedy v překladu: Pythone, pusť modul pytest, v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

        -
        $ python -m pytest -v test_secteni.py
        +
        $ python -m pytest -v test_secteni.py
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
         cachedir: .pytest_cache
        @@ -124,7 +124,7 @@ 

        Instalace knihovny pytest

        Zkus si změnit funkci secti (nebo její test) a podívat se, jak to vypadá když test „neprojde“.

        Testovací moduly -# +#

        Testy se většinou nepíšou přímo ke kódu, ale do souboru vedle. diff --git a/lessons/tuple/index.html b/lessons/tuple/index.html index 2322a66f..9eb9c80e 100644 --- a/lessons/tuple/index.html +++ b/lessons/tuple/index.html @@ -1,5 +1,5 @@

        N-tice -# +#

        Když už známe seznam, podívejme se na jeho sestřičku: takzvanou n-tici (angl. tuple).

        @@ -62,7 +62,7 @@

        N-tice
        ix, ocko = 'xo'
         jedna, dva, tri = [1, 2, 3]
         

        Malé n-tice -# +#

        Jak vytvořit n-tici s žádným nebo jedním prvkem? Takhle:

        prazdna_ntice = ()
        @@ -73,7 +73,7 @@ 

        N-tice Když budeš opravdu potřebovat jednoprvkovou n-tici, radši ji pro přehlednost ozávorkuj.

        Kdy použít seznam a kdy n-tici? -# +#

        Seznamy se používají, když předem nevíš, kolik v nich přesně bude hodnot, diff --git a/lessons/turtle/index.html b/lessons/turtle/index.html index b5a9f942..fc90c873 100644 --- a/lessons/turtle/index.html +++ b/lessons/turtle/index.html @@ -1,12 +1,12 @@

        🐍 🐢 -# +#

        V této lekci si vyzkoušíš želví kreslení.

        Pusť Python v interaktivním módu (bez souboru .py).

        $ python
         
        ->>>
        -

        (Znaky > a $ píše počítač, ne ty. +>>> +

        (Znaky > a $ píše počítač, ne ty. Na Windows bude místo $ znak > a před $ nebo > může být ještě něco dalšího.)

        @@ -18,7 +18,7 @@

        🐍 🐢 Dej ho tak, abys viděla i příkazovou řádku i nové okýnko.

        A kde je ta želva? -# +#

        Želva je zrovna převlečená za šipku. Ale funkce shape ji umí odmaskovat:

        @@ -28,7 +28,7 @@

        A kde je ta želva?

        Modul turtle obsahuje spoustu dalších funkcí, kterými můžeš želvu ovládat. Pojďme se na ně kouknout zblízka.

        Otáčení -# +#

        Želva se umí otáčet (doleva – left a doprava – right) a lézt po papíře (dopředu – forward). @@ -44,7 +44,7 @@

        Otáčení Když se ti výsledek nelíbí, můžeš zavřít kreslící okno a zkusit to znovu. (Nebo místo zavření okna můžeš naimportovat a použít funkci clear().)

        Želví program -# +#

        Interaktivní mód je skvělý na hraní, ale teď přejdeme zase na soubory.

        @@ -61,7 +61,7 @@

        Želví program

        Otázka

        Co dělá funkce exitonclick, kterou voláš na konci programu?

        Přerušovaná čára -# +#

        Funkce penup řekne želvě, aby zvedla ocásek se štětcem: bude se tak hýbat aniž by za sebou nechávala stopu. @@ -78,7 +78,7 @@

        Želví program exitonclick()

        Až to budeš mít hotové, zkus začít kreslit trochu složitější obrázky:

        Čtverec -# +#

        Nakresli čtverec.

        Želví čtverec

        @@ -105,7 +105,7 @@

        Řešení

        Obdélník -# +#

        Nakresli obdélník.

        Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

        @@ -131,7 +131,7 @@

        Řešení

        Tři čtverce -# +#

        Nakresli tři čtverce, každý otočený třeba o 20°.

        Tři želví čtverce

        @@ -181,7 +181,7 @@

        Řešení

        Jde. Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

        Jak opakovat – a neopakovat se -# +#

        Udělej v editoru nový soubor a ulož ho jako cykly.py. Budeš v něm zkoušet cykly.

        @@ -203,7 +203,7 @@

        Jak opakovat – a neopakovat seif se provede jen někdy; tělo příkazu for se opakuje několikrát dokola.

        Výčet -# +#

        Zkus napsat ještě jeden vzorový program, který v češtině zní:

          @@ -238,7 +238,7 @@

          Výčet pozdrav = 'SYN' print(pozdrav + '!')

          Range -# +#

          Vraťme se k for i in range(100). Už víš, že to znamená „Pro každé i ze sekvence range(100)“. @@ -313,7 +313,7 @@

          Řešení

          for _ in range(100):
              print('Nikdy nebudu odsazovat o tři mezery!')
           

          Dlouhá přerušovaná čára -# +#

          Už víš, že pomocí penup a pendown lze nakreslit přerušenou čáru:

          from turtle import forward, penup, pendown, exitonclick
          @@ -370,7 +370,7 @@ 

          Řešení

          Čtverec II -# +#

          A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

          Čtverec se kreslí následovně:

          @@ -398,7 +398,7 @@

          Řešení

          Tři čtverce -# +#

          Nakonec nakresli 3 čtverce, každý otočený o 20°. Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu @@ -434,7 +434,7 @@

          Řešení

          Úkol navíc -# +#

          Máš-li hotovo, zkus nakreslit schody:

          Želví schody

          diff --git a/lessons/variables/index.html b/lessons/variables/index.html index 23db02b3..67bf65fc 100644 --- a/lessons/variables/index.html +++ b/lessons/variables/index.html @@ -1,5 +1,5 @@

          Čtverec -# +#

          Teď se vrátíme do základní školy a zkusíme si napsat program, který vypočítá obsah a obvod čtverce, u kterého známe délku strany.

          @@ -46,7 +46,7 @@

          Řešení

          Menší čtverec -# +#

          Jestli všechno funguje, zkus změnit program tak, aby počítal obsah a obvod čtverce o straně 123 cm.

          @@ -61,7 +61,7 @@

          Řešení

          Proměnné -# +#

          Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? Baví tě přepisování čísel? @@ -94,7 +94,7 @@

          Řešení

          4 * 183 není moc jasné, co ta čísla znamenají. Výraz 4 * strana je na tom mnohem líp.

          Kruhy -# +#

          Tohle je příklad navíc! Klidně ho přeskoč.

          Změna zadání! @@ -107,7 +107,7 @@

          Řešení

          Všechna čísla, která matematici označují jen jedním písmenkem (klidně řeckým), vhodně pojmenuj.

          Komentáře -# +#

          Program si teď zpřehledníme komentářem. V Pythonu komentář začíná dvojkřížkem (#), @@ -131,7 +131,7 @@

          Řešení

          mezery (nebo i víc). Za # pak patří právě jedna.

          Načítání vstupu -# +#

          Nakonec se podíváme, jak zařídit, aby číslo nemuselo být zapsáno v programu, ale aby ho mohl uživatel zadat sám.

          diff --git a/lessons/venv-setup/index.html b/lessons/venv-setup/index.html index 718d9497..d6e6a975 100644 --- a/lessons/venv-setup/index.html +++ b/lessons/venv-setup/index.html @@ -1,5 +1,5 @@

          Nastavení prostředí -# +#

          V této sekci si:

            @@ -8,7 +8,7 @@

            Nastavení prostředí
          • aktivuješ virtuální prostředí.

          Příprava adresáře -# +#

          Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů počítače jim záleží na tom, kde jsou ty soubory uložené.

          @@ -29,7 +29,7 @@

          Příprava adresáře Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

          Adresář pro každou lekci -# +#

          Nový adresář je zatím prázdný. To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější @@ -42,12 +42,12 @@

          Adresář pro každou lekci

          Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

          Přepnutí -# +#

          Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

          -
          $ cd naucse-python
          +
          $ cd naucse-python
           

          Pak zkontroluj, že jsi na správném místě:

          • Pomocí příkazu pwd (na Windows cd) zkontroluj, @@ -70,7 +70,7 @@

            Windows

            > <
              Directory of C:\Users\Helena\naucse-python
             05/08/2014 07:28 PM <DIR>  00
             

          Virtuální prostředí -# +#

          Teď si vytvoříš virtuální prostředí pro Python.

          Virtuální prostředí je něco, co zajistí že se všechny počítače budou @@ -90,12 +90,12 @@

          Windows

          > <
            příkazů.
            Bude je rychlejší vyzkoušet než popsat kdy je který správný,
            takže nejdřív zkus:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           

          A jestli dostaneš chybu No module named venv, zkus místo toho:

          -
           $ virtualenv -p python3 venv
          +
           $ virtualenv -p python3 venv
           
        • macOS:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           
        • Windows:

          Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících @@ -122,11 +122,11 @@

          Windows

          > <
           
        • V grafickém prohlížeči souborů to vypadá např. takto:

          (adresáře '00' a 'venv' vedle sebe)

          Aktivace virtuálního prostředí -# +#

          Nakonec virtuální prostředí aktivuj:

          -

          Unix

          $ source venv/bin/activate
          +                

          Unix

          $ source venv/bin/activate
           

          Windows

          > venv\Scripts\activate
           

          Jestli používáš příkazovou řádku ve Visual Studio Code, diff --git a/lessons/while/index.html b/lessons/while/index.html index 6377807f..37dce985 100644 --- a/lessons/while/index.html +++ b/lessons/while/index.html @@ -1,5 +1,5 @@

          While -# +#

          Kromě cyklu for máme ještě druhý typ cyklu: while (angl. dokud). Na rozdíl od for, kde předem známe počet opakování, @@ -58,7 +58,7 @@

          While

          Ale zpátky k while! Dokážeš napsat tenhle program?

          Oko bere -# +#

          • Začínáš s 0 body.
          • diff --git a/lessons/with/index.html b/lessons/with/index.html index 44341acf..4cefabed 100644 --- a/lessons/with/index.html +++ b/lessons/with/index.html @@ -1,5 +1,5 @@

            Kontext: with a finally -# +#

            Čteš-li tyto materiály poprvé, tuto sekci můžeš s klidným svědomím přeskočit. Pokročilejším ale doporučuju vsadit věci do širšího kontextu.

            @@ -32,7 +32,7 @@

            Kontext: with a # Pro vyzkoušení napiš do souboru 'cislo.txt' nějaké číslo. print(nacti_cele_cislo('cislo.txt') * 11)

            Kontrola výjimek -# +#

            Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. diff --git a/lessons/yaml/index.html b/lessons/yaml/index.html index c1ababa2..2a4e57ef 100644 --- a/lessons/yaml/index.html +++ b/lessons/yaml/index.html @@ -1,30 +1,30 @@

            O formátu YAML -# +#

            Formát se skládá z několika stavebních bloků, které se dají poté skládat dohromady. Prvním je seznam hodnot (podobně jako v Pythonu). Seznam se ve formátu YAML zapisuje následovně:

            -
            - První položka
            -- Druhá položka
            -- 3
            -- Položka může být i něco jiného než text!
            +
            - První položka
            +- Druhá položka
            +- 3
            +- Položka může být i něco jiného než text!
             

            Druhým stavebním blokem je slovník (zase podobně jako v Pythonu), který se skládá z klíčů a hodnot, nezáleží v ní tedy na pořadí, protože se k informaci vždy člověk dostance pomocí klíče. Slovník se ve formátu YAML zapisuje následovně:

            -
            klic1: Hodnota klíče klic1.
            -klic2: 2
            -klic3: I hodnoty ve slovníku mohou být něco jiného než text.
            -klic4: |
            -    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
            +
            klic1: Hodnota klíče klic1.
            +klic2: 2
            +klic3: I hodnoty ve slovníku mohou být něco jiného než text.
            +klic4: |
            +    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
             
            -    Tento text budou dva separátní odstavce v rámci jednoho klíče.
            -klic5:
            -klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
            +    Tento text budou dva separátní odstavce v rámci jednoho klíče.
            +klic5:
            +klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
             

            Seznamy a slovníky jde samozřejmě i skládat dohromady:

            -
            klic1: Hodnota klíče
            -klic2:
            -- Tohle je seznam, které patří pod klíč klic2
            -- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
            -- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
            -klic3:
            -  vnorenyklic: Slovník může obsahovat další slovník i takto.
            +
            klic1: Hodnota klíče
            +klic2:
            +- Tohle je seznam, které patří pod klíč klic2
            +- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
            +- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
            +klic3:
            +  vnorenyklic: Slovník může obsahovat další slovník i takto.
             
            \ No newline at end of file diff --git a/lessons/zip-enumerate/index.html b/lessons/zip-enumerate/index.html index 382ec9eb..e102c6ce 100644 --- a/lessons/zip-enumerate/index.html +++ b/lessons/zip-enumerate/index.html @@ -1,5 +1,5 @@

            Iterátory n-tic -# +#

            Některé hodnoty v Pythonu jsou iterovatelné (angl. iterable): obsahují sekvenci jiných hodnot a lze je „projít“ (iterovat) cyklem for nebo @@ -16,7 +16,7 @@

            Iterátory n-tic

            Podívejme se na dva další iterovatelné objekty: enumerate a zip. Oba jsou sekvence vytvořené z jiných, jednodušších sekvencí.

            Enumerate: očíslování sekvence -# +#

            Funkce enumerate vezme nějakou existující sekvenci a očísluje ji: ve vrácené sekvenci budou dvojice (index, původní hodnota).

            @@ -50,7 +50,7 @@

            Enumerate: očíslování sekvence

            Když budeš od sekvence enumerate chtít něco víc než iterování, převeď ji na seznam.

            Rozbalování v cyklu for -# +#

            Cyklus for umíš rozepsat: opakuje se v něm nastavení proměnné (které dělá for za tebe), pak tělo cyklu, a znovu nastavení proměnné, tělo cyklu atd. @@ -116,7 +116,7 @@

            Řešení

            Zip: Víc iterací najednou -# +#

            Další iterátor n-tic je funkce zip, která umí projít dvě sekvence naráz.

            @@ -150,7 +150,7 @@

            Řešení

            for vec, barva, misto, cislo in zip(veci, barvy, mista, cisla): print(f"{cislo}. {barva} {vec} je {misto}")

            Zip Longest: Pro ty co chtějí všechno -# +#

            Jak se zip chová, když dostane seznamy různých délek?

            veci = ['tráva', 'slunce', 'mrkev', 'list', 'myšlenka', 'spravedlnost']
            diff --git a/meta/branching/index.html b/meta/branching/index.html
            index 8be73081..15403799 100644
            --- a/meta/branching/index.html
            +++ b/meta/branching/index.html
            @@ -1,5 +1,5 @@
             

            Větvení v Gitu -# +#

            Takže, Git už znáš! Teď to začne být trošičku složitější :)

            @@ -82,7 +82,7 @@

            Větvení v Gitu

            A až je některá větev hotová, může se začlenit zpátky do master. Podívejme se jak na to.

            Sloučení -# +#

            Nedávalo by smysl historii projektu rozdvojovat, kdyby pak jednotlivé větve nešly zase sloučit dohromady. diff --git a/meta/cmdline/index.html b/meta/cmdline/index.html index 57530a9c..2d2fcbcb 100644 --- a/meta/cmdline/index.html +++ b/meta/cmdline/index.html @@ -1,5 +1,5 @@

            Příkazová řádka -# +#

            V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, které programátoři používají na zadávání textových příkazů.

            @@ -51,7 +51,7 @@

            Windows

            >
             Ctrl++ a
             Ctrl+- (příp. se Shift).

            První příkaz -# +#

            Začněme ale příkazem, který je všude stejný. Napiš whoami (z angl. who am I? – kdo jsem?) @@ -69,7 +69,7 @@

            Windows

            > <
             takže ho nepiš sám/sama! Zadej jen whoami a Enter.

            Stejně tak počítač sám vypíše přihlašovací jméno.

            Aktuální adresář -# +#

            Příkazová řádka pracuje vždy v nějakém adresáři neboli složce (angl. directory, folder). @@ -94,7 +94,7 @@

            Windows

            > <
             části uvedeno který adresář zrovna ukazují.
             Příkazová řádka umí soubory ukazovat taky – ale musíš si o to říct.

            Co v tom adresáři je? -# +#

            Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) ti vypíše co aktuální adresář obsahuje: všechny soubory, @@ -115,7 +115,7 @@

            Windows

            > <
             05/08/2014 07:28 PM <DIR>  Music
             
             

            Změna aktuálního adresáře -# +#

            Aktuální adresář se dá změnit pomocí příkazu cd (z angl. change directory – změnit adresář). @@ -127,11 +127,11 @@

            Windows

            > <
             

            Používáš-li Windows, cd už jsi používal/a – tento příkaz se chová různě podle toho, jestli něco napíšeš za něj nebo ne.

            -

            Unix

            $ cd Desktop
            +                

            Unix

            $ cd Desktop
             $ pwd
             /home/helena/Desktop
             
            -

            Windows

            > cd Desktop
            +                

            Windows

            > cd Desktop
             > cd
             C:\Users\helena\Desktop
             

            Poznámka pro Windows

            @@ -139,26 +139,26 @@

            Windows

            > <
             například D: místo C:, je potřeba kromě cd
             zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

            Vytvoření adresáře -# +#

            Co takhle si zkusit vytvořit adresář? To se dělá příkazem mkdir (z angl. make directory – vytvořit adresář). Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě zkouska:

            -

            Unix

            $ mkdir zkouska
            +                

            Unix

            $ mkdir zkouska
             

            Windows

            > mkdir zkouska
             

            Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

            -

            Unix

            $ cd zkouska
            +                

            Unix

            $ cd zkouska
             

            Windows

            > cd zkouska
             

            Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

            V grafickém hledátku -# +#

            Často nebudeš pracovat jenom s příkazovou řádkou. Vyplatí se umět aktuální adresář z příkazové řádky otevřít i v jiných @@ -195,7 +195,7 @@

            Unix

            $ 
                             

            Windows

            > cd
             C:\Users\helena\Desktop\zkouska
             

            Kopírování z příkazové řádky -# +#

            Na Linuxu vyber text myší a pak buď:

              @@ -207,7 +207,7 @@

              Windows

              > <
               

              Na Windows v menu příkazové řádky (ikonce vlevo nahoře) vyber EditMark, text vyber myší a zkopíruj pomocí Enter.

              Otevření v prohlížeči souborů -# +#

              Na Linuxu záleží na programu, který používáš. Buď:

                @@ -226,7 +226,7 @@

                Otevření v prohlížeči souborů

                Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na prohlížení adresářů: zjistíš, že se adresář opravdu vytvořil.

                Vkládání do příkazové řádky -# +#

                Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. @@ -240,10 +240,10 @@

                Vkládání do příkazové řádky

                Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš ", např:

                -
                $ cd "můj super adresář"
                +
                $ cd "můj super adresář"
                 

                Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

                Pozorování změn -# +#

                Vyzkoušej si, že se v řádce projeví i změny, které na počítači uděláš jiným způsobem.

                @@ -255,7 +255,7 @@

                Vkládání do příkazové řádky

                Na počítači máš jen jednu sadu souborů, se kterou umí manipulovat jak grafické programy tak příkazová řádka.

                O úroveň nahoru -# +#

                A poslední věc: jsi-li teď v adresáři Desktop/zkouska (nebo Plocha/zkouska, Desktop\zkouska atp.), jak se dostat zpátky do Desktop?

                @@ -267,17 +267,17 @@

                O úroveň nahoru

                Nadřazený adresář má speciální jméno .., dvě tečky. Přejdi do něj zadáním cd .. a pak se ujisti, že jsi opravdu v Desktop:

                -

                Unix

                $ cd ..
                +                

                Unix

                $ cd ..
                 $ pwd
                 /home/helena/Desktop
                 
                -

                Windows

                > cd ..
                +                

                Windows

                > cd ..
                 > cd
                 C:\Users\helena\Desktop
                 

                Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

                Konec -# +#

                Příkazů existuje samozřejmě daleko víc.

                Když se je naučíš, můžeš z příkazové řádky plnohodnotně ovládat @@ -298,7 +298,7 @@

                Konec
                $ exit
                 

                A tím je úvod do příkazové řádky hotový.

                Přehled -# +#

                Tady je tabulka základních příkazů, se kterými si do začátku vystačíš:

        diff --git a/meta/course.json b/meta/course.json index d06cc402..e63d89ad 100644 --- a/meta/course.json +++ b/meta/course.json @@ -1,7 +1,7 @@ { "api_version": [ 0, - 3 + 4 ], "course": { "description": "Návod na přidání kurzu na Nauč se Python", @@ -30,7 +30,43 @@ "content": { "path": "cmdline/index.html" }, + "ids": [ + "aktualni_adresar", + "co_v_tom_adresari_je", + "konec", + "kopirovani_z_prikazove_radky", + "o_uroven_nahoru", + "otevreni_vprohlizeci_souboru", + "pozorovani_zmen", + "prehled", + "prikazova_radka", + "prvni_prikaz", + "vgrafickem_hledatku", + "vkladani_do_prikazove_radky", + "vytvoreni_adresare", + "zmena_aktualniho_adresare" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualni_adresar", + "#co_v_tom_adresari_je", + "#konec", + "#kopirovani_z_prikazove_radky", + "#o_uroven_nahoru", + "#otevreni_vprohlizeci_souboru", + "#pozorovani_zmen", + "#prehled", + "#prikazova_radka", + "#prvni_prikaz", + "#vgrafickem_hledatku", + "#vkladani_do_prikazove_radky", + "#vytvoreni_adresare", + "#zmena_aktualniho_adresare", + "naucse:static?filename=linux-file-browser.png", + "naucse:static?filename=macos-file-browser.png", + "naucse:static?filename=windows-cmd-properties.png", + "naucse:static?filename=windows-file-browser.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/cmdline/index.md", @@ -64,7 +100,16 @@ "content": { "path": "install/index.html" }, + "ids": [ + "instalace_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu", + "naucse:page?lesson=beginners/install&page=linux", + "naucse:page?lesson=beginners/install&page=macos", + "naucse:page?lesson=beginners/install&page=windows" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install/index.md", @@ -78,7 +123,24 @@ "content": { "path": "install/linux.html" }, + "ids": [ + "check-tkinter", + "doinstalovani_virtualenv", + "instalace_pythonu_3", + "instalace_pythonu_na_linux", + "install-virtualenv", + "kontrola_tkinter" + ], "license": "cc-by-sa-40", + "links": [ + "#check-tkinter", + "#doinstalovani_virtualenv", + "#instalace_pythonu_3", + "#instalace_pythonu_na_linux", + "#install-virtualenv", + "#kontrola_tkinter", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "linux", "solutions": [], "source_file": "lessons/beginners/install/linux.md", @@ -93,7 +155,15 @@ "content": { "path": "install/macos.html" }, + "ids": [ + "instalace_pythonu_pro_macos" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu_pro_macos", + "http://brew.sh", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "macos", "solutions": [], "source_file": "lessons/beginners/install/macos.md", @@ -108,7 +178,26 @@ "content": { "path": "install/windows.html" }, + "ids": [ + "download", + "instalace", + "instalace_pythonu_pro_windows", + "stazeni", + "zjisti_jestli_uz_mas_python_nainstalovany" + ], "license": "cc-by-sa-40", + "links": [ + "#download", + "#instalace", + "#instalace_pythonu_pro_windows", + "#stazeni", + "#zjisti_jestli_uz_mas_python_nainstalovany", + "https://www.python.org/downloads/windows/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/venv-setup", + "naucse:static?filename=windows_32v64-bit.png", + "naucse:static?filename=windows_add_python_to_path.png" + ], "slug": "windows", "solutions": [], "source_file": "lessons/beginners/install/windows.md", @@ -137,7 +226,24 @@ "content": { "path": "venv-setup/index.html" }, + "ids": [ + "adresar_pro_kazdou_lekci", + "aktivace_virtualniho_prostredi", + "nastaveni_prostredi", + "prepnuti", + "priprava_adresare", + "virtualni_prostredi" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdou_lekci", + "#aktivace_virtualniho_prostredi", + "#nastaveni_prostredi", + "#prepnuti", + "#priprava_adresare", + "#virtualni_prostredi", + "naucse:static?filename=dirs-00.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/venv-setup/index.md", @@ -162,8 +268,14 @@ "content": { "path": "yaml/index.html" }, + "ids": [ + "o_formatu_yaml" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#o_formatu_yaml" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/yaml/index.md", @@ -184,7 +296,18 @@ "content": { "path": "branching/index.html" }, + "ids": [ + "slouceni", + "vetveni_v_gitu" + ], "license": "cc-by-sa-40", + "links": [ + "#slouceni", + "#vetveni_v_gitu", + "naucse:static?filename=branch1.png", + "naucse:static?filename=branches.png", + "naucse:static?filename=merge.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/branching/index.md", @@ -215,7 +338,45 @@ "content": { "path": "git-collaboration-2in1/index.html" }, + "ids": [ + "aktualizace_codegit_pullcode", + "git_a_github", + "log_codegit_logcode", + "open-source_a_free_software", + "posilani_zmen_codegit_pushcode", + "prace_s_lokalnim_repozitarem", + "prvni_revize_codegit_commitcode", + "spoluprace_a_git", + "spoluprace_na_projektu", + "stav_repozitare_codegit_statuscode", + "zadost_o_zacleneni_pull_request" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace_codegit_pullcode", + "#git_a_github", + "#log_codegit_logcode", + "#open-source_a_free_software", + "#posilani_zmen_codegit_pushcode", + "#prace_s_lokalnim_repozitarem", + "#prvni_revize_codegit_commitcode", + "#spoluprace_a_git", + "#spoluprace_na_projektu", + "#stav_repozitare_codegit_statuscode", + "#zadost_o_zacleneni_pull_request", + "https://choosealicense.com", + "https://creativecommons.org", + "https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software", + "https://en.wikipedia.org/wiki/Richard_Stallman", + "https://github.com", + "https://github.com/asgeirrr/prezencka", + "https://github.com/asgeirrr/prezencka/", + "https://opensource.org", + "https://www.root.cz/knihy/katedrala-a-trziste/", + "naucse:page?lesson=beginners/cmdline", + "naucse:static?filename=diagram.png", + "naucse:static?filename=gh-workflow-diagram.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/git-collaboration-2in1/index.md", @@ -243,7 +404,24 @@ "content": { "path": "install/index.1.html" }, + "ids": [ + "config", + "git", + "linux", + "macos", + "nastaveni", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#config", + "#git", + "#linux", + "#macos", + "#nastaveni", + "#windows", + "https://git-scm.org" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/install/index.md", @@ -264,8 +442,17 @@ "content": { "path": "notebook/index.html" }, + "ids": [ + "jak_na_notebook", + "jupyter_notebook" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#jak_na_notebook", + "#jupyter_notebook", + "https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages" + ], "modules": { "katex": "0.7.1" }, @@ -290,8 +477,63 @@ "content": { "path": "local-run/index.html" }, + "ids": [ + "codecourseymlcode_codecoursescode_coderunscode_definice_kurzu", + "codegithubworkflowsmainymlcode_instrukce_pro_github_actions", + "codelessonscode_texty_lekci", + "codelicensescode", + "codepyprojecttomlcode_codepoetrylockcode_codegithubcode_definice_projektu_a_zavislosti", + "definice_kurzu", + "definice_lekce", + "kontrola_nastaveni_projektu", + "lokalni_spusteni", + "misto_a_cas", + "naklonovani_zakladu", + "otestovani_kurzu", + "plan_lekci", + "povinne_informace", + "priprava", + "promenne", + "struktura_repozitare", + "upravovani_a_vytvareni_materialu", + "vytvoreni_lokalniho_kurzu" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#codecourseymlcode_codecoursescode_coderunscode_definice_kurzu", + "#codegithubworkflowsmainymlcode_instrukce_pro_github_actions", + "#codelessonscode_texty_lekci", + "#codelicensescode", + "#codepyprojecttomlcode_codepoetrylockcode_codegithubcode_definice_projektu_a_zavislosti", + "#definice_kurzu", + "#definice_lekce", + "#kontrola_nastaveni_projektu", + "#lokalni_spusteni", + "#misto_a_cas", + "#naklonovani_zakladu", + "#otestovani_kurzu", + "#plan_lekci", + "#povinne_informace", + "#priprava", + "#promenne", + "#struktura_repozitare", + "#upravovani_a_vytvareni_materialu", + "#vytvoreni_lokalniho_kurzu", + "https://cs.wikipedia.org/wiki/Markdown", + "https://github.com/pyvec/naucse-python", + "https://github.com/pyvec/naucse-python/blob/main/pyproject.toml", + "https://github.com/pyvec/naucse.python.cz/issues", + "https://python-poetry.org/docs/#installation", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install", + "naucse:page?lesson=beginners/venv-setup", + "naucse:page?lesson=fast-track/yaml", + "naucse:page?lesson=git/git-collaboration-2in1", + "naucse:page?lesson=git/install", + "naucse:page?lesson=intro/notebook", + "naucse:static?filename=info.yml" + ], "slug": "index", "solutions": [], "source_file": "lessons/meta/local-run/index.md", @@ -316,8 +558,33 @@ "content": { "path": "submitting-a-run/index.html" }, + "ids": [ + "definice_github_actions", + "informace_o_tvem_repozitari", + "nahrani_do_vlastniho_forku", + "pridani_kurzu_na_nauc_se_python", + "pull_request", + "upravovani_kurzu" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#definice_github_actions", + "#informace_o_tvem_repozitari", + "#nahrani_do_vlastniho_forku", + "#pridani_kurzu_na_nauc_se_python", + "#pull_request", + "#upravovani_kurzu", + "https://github.com/", + "https://github.com/pyvec/naucse-python", + "https://github.com/pyvec/naucse-python/blob/main/.github/workflows/main.yml", + "https://github.com/pyvec/naucse.python.cz/blob/master/courses.yml", + "https://naucse.python.cz/", + "naucse:page?lesson=git/branching", + "naucse:page?lesson=git/git-collaboration-2in1", + "naucse:static?filename=naucse_fork.png", + "naucse:static?filename=view-all-branches.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/meta/submitting-a-run/index.md", diff --git a/meta/git-collaboration-2in1/index.html b/meta/git-collaboration-2in1/index.html index d827e609..6830dfc9 100644 --- a/meta/git-collaboration-2in1/index.html +++ b/meta/git-collaboration-2in1/index.html @@ -1,5 +1,5 @@

        Spolupráce a Git -# +#

        „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat @@ -15,7 +15,7 @@

        Spolupráce a Git Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

        Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

        Git a GitHub -# +#

        Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. Takové složce s kódem říkáme repozitář. @@ -42,7 +42,7 @@

        Git a GitHub A třetí kopii repozitáře máte u sebe na počítači.

        Git workflow

        Práce s lokálním repozitářem -# +#

        Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, @@ -56,13 +56,13 @@

        Práce s lokálním repozitářem

        Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

        Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

        -
        $ git clone https://github.com/asgeirrr/prezencka
        +
        $ git clone https://github.com/asgeirrr/prezencka
         

        V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

        Stav repozitáře (git status) -# +#

        Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         nothing to commit, working tree clean
        @@ -73,7 +73,7 @@ 

        Stav repozitáře (git status<
      • Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
      • První revize (git commit) -# +#

        Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. @@ -81,7 +81,7 @@

        První revize (git commit)

        Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt a do něj napište svoje současné povolání nebo cokoliv jiného. Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Untracked files:
        @@ -91,9 +91,9 @@ 

        První revize (git commit) nothing added to commit but untracked files present (use "git add" to track)

        U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

        -
        $ git add magdalena_rettigova.txt
        +
        $ git add magdalena_rettigova.txt
         

        a znovu zkontrolujte stav repozitáře:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Changes to be committed:
        @@ -101,13 +101,13 @@ 

        První revize (git commit) new file: magdalena_rettigova.txt

        To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

        -
        $ git commit
        +
        $ git commit
         

        Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). Pak soubor uložíme a zavřeme editor.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is ahead of 'origin/master' by 1 commit.
           (use "git push" to publish your local commits)
        @@ -115,12 +115,12 @@ 

        První revize (git commit)

        Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

        Git workflow

        Log (git log) -# +#

        Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, na které navazujeme.

        -
        $ git log
        +
        $ git log
         commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
         Author: Magdalena Dobromila <magdalena@rettigova.cz>
         Date:   Tue Mar 28 19:27:08 2017 +0200
        @@ -138,7 +138,7 @@ 

        Log (git log)

        V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

        Open-source a Free software -# +#

        Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. @@ -188,11 +188,11 @@

        Open-source a Free software Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

        Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

        Spolupráce na projektu -# +#

        Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

        Posílání změn (git push) -# +#

        Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. @@ -205,26 +205,26 @@

        Posílání změn (git push

        A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         

        Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

        Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje nebo svým uživatelským jménem na GitHubu, aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

        -
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
        +
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
         

        Zkontrolujme, že se nám to povedlo:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
         

        Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

        -
        $ git push tvojejmeno master
        +
        $ git push tvojejmeno master
         

        což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

        Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

        Žádost o začlenění (pull request) -# +#

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

        @@ -237,10 +237,10 @@

        Žádost o začlenění (pull request)

        Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

        Aktualizace (git pull) -# +#

        Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

        -
        $ git pull origin master
        +
        $ git pull origin master
         

        stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

        Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. diff --git a/meta/install/index.1.html b/meta/install/index.1.html index 2570359d..c00835e2 100644 --- a/meta/install/index.1.html +++ b/meta/install/index.1.html @@ -1,5 +1,5 @@

        Git -# +#

        Další program, který budeme později potřebovat, nám později umožní (mimojiné) spolupracovat @@ -8,22 +8,22 @@

        Git Pojďme si ho nainstalovat a nastavit.

        Instalace je různá pro různé operační systémy, vyber ten svůj.

        Linux -# +#

        Instalaci na Linux zvládneme jedním příkazem:

        Fedora, RHEL:

        -
        $ sudo dnf install git gitk git-gui nano
        +
        $ sudo dnf install git gitk git-gui nano
         

        Ubuntu, Debian:

        -
        $ sudo apt-get install git gitk git-gui nano
        +
        $ sudo apt-get install git gitk git-gui nano
         

        U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, gitk, git gui a nano.

        Jestli máš nainstalováno, ještě nastav Gitu editor. Pokud nemáš rád/a Vim (nebo nevíš co to je), zadej tento příkaz:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením níže.

        Windows -# +#

        Jdi na stránku git-scm.org, stáhni si Git a nainstaluj si ho.

        @@ -42,21 +42,21 @@

        Windows > git config --global gui.encoding utf-8

        A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

        macOS -# +#

        Spusť v příkazové řádce git. Je-li už nainstalovaný, dozvíš se, jak ho používat (výpis začíná usage). Jinak ho nainstaluj pomocí Homebrew:

        -
        $ brew install git git-gui
        +
        $ brew install git git-gui
         

        Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, i když sis v rámci instalace editoru nainstaloval/a např. Atom). Dělá se to tímto příkazem:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením:

        Nastavení -# +#

        Na projektu, který bude uložen v Gitu, může spolupracovat více lidí. @@ -64,8 +64,8 @@

        Nastavení potřeba říct jméno a e-mail. Do příkazové řádky zadej následující příkazy, změň v nich ale jméno a adresu:

        -
        $ git config --global user.name "Adéla Novotná"
        -$ git config --global user.email adela.novotna@example.cz
        +
        $ git config --global user.name "Adéla Novotná"
        +$ git config --global user.email adela.novotna@example.cz
         

        Můžeš samozřejmě použít i přezdívku, nebo dokonce falešný e-mail, ale v takovém případě bude složitější se zapojit do týmových projektů. @@ -80,11 +80,11 @@

        Nastavení

        Dále si můžeš nastavit barevné výpisy – pokud si tedy (jako někteří autoři Gitu) nemyslíš, že příkazová řádka má být černobílá:

        -
        $ git config --global color.ui true
        +
        $ git config --global color.ui true
         

        Spuštění git config nevypíše žádnou hlášku, že se operace povedla. To je normální; stejně se chová spousta dalších příkazů, např. cd.

        Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

        -
        $ git config --global --list
        +
        $ git config --global --list
         user.name=Adéla Novotná
         user.email=adela.novotna@example.cz
         

        A to je vše! Git máš nainstalovaný. Gratuluji!

        \ No newline at end of file diff --git a/meta/install/index.html b/meta/install/index.html index ff966cda..c238b86c 100644 --- a/meta/install/index.html +++ b/meta/install/index.html @@ -1,5 +1,5 @@

        Instalace Pythonu -# +#

        V této sekci nainstalujeme Python.

        To se na každém druhu operačního systému dělá trošku jinak. diff --git a/meta/install/linux.html b/meta/install/linux.html index 8714817f..46ec84cf 100644 --- a/meta/install/linux.html +++ b/meta/install/linux.html @@ -1,16 +1,16 @@

        Instalace Pythonu na Linux -# +#

        Nainstalovat Pyhon na Linux je většinou jednoduché. Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, tak jsou tyhle instrukce trochu delší. Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

        Instalace Pythonu 3 -# +#

        Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť v příkazové řádce příkaz:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Přejdi na další sekci, kontrolu tkinter.

        @@ -20,42 +20,42 @@

        Instalace Pythonu 3 doinstaluj Python. Konkrétní příkaz záleží na distribuci:

          -
        • Fedora:
          $ sudo dnf install python3
          +
        • Fedora:
          $ sudo dnf install python3
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3
          +
        • Ubuntu:
          $ sudo apt-get install python3
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        Kontrola Tkinter -# +#

        Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti Pythonu. Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) často musíme nainstalovat zvlášť. Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

        -
        $ python3 -m tkinter
        +
        $ python3 -m tkinter
         

        Objeví-li se okýnko, je všechno v pořádku. Zavři ho a přejdi na doinstalování virtualenv.

        Jestli ne, modul tkinter ještě nainstaluj:

          -
        • Fedora:
          $ sudo dnf install python3-tkinter
          +
        • Fedora:
          $ sudo dnf install python3-tkinter
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3-tk
          +
        • Ubuntu:
          $ sudo apt-get install python3-tk
           

        Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

        Doinstalování Virtualenv -# +#

        Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu vyřadily). Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

        Spusť v příkazové řádce příkaz:

        -
        $ python3 -m ensurepip --version
        +
        $ python3 -m ensurepip --version
         

        Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. Zbytek této sekce můžeš přeskočit!

        Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat @@ -63,7 +63,7 @@

        Doinstalování Virtualenv
          -
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
          +
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        diff --git a/meta/install/macos.html b/meta/install/macos.html index 0e3c99dc..428a02ef 100644 --- a/meta/install/macos.html +++ b/meta/install/macos.html @@ -1,15 +1,15 @@

        Instalace Pythonu pro macOS -# +#

        Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje instalaci aplikací a knihoven, které budeme potřebovat pro programování. Jak na to?

        Spusť v příkazové řádce příkaz:

        -
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        +
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         

        Pak zadej následující příkaz a Python bude nainstalovaný:

        -
        $ brew install python3
        +
        $ brew install python3
         

        Zkontroluj si, že máš verzi 3.6 nebo vyšší:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Jinak je něco špatně; diff --git a/meta/install/windows.html b/meta/install/windows.html index c75117a7..99135c9e 100644 --- a/meta/install/windows.html +++ b/meta/install/windows.html @@ -1,8 +1,8 @@

        Instalace Pythonu pro Windows -# +#

        Zjisti, jestli už máš Python nainstalovaný -# +#

        Otevři si příkazovou řádku (pokud nevíš o co jde, přečti si o ní tady).

        Napiš python a zmáčkni na klávesnici Enter. @@ -25,7 +25,7 @@

        Zjisti, jestli už máš Pyth

        Stažení -# +#

        • Běž na stahovací stránku
        • @@ -37,7 +37,7 @@

          Stažení Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

          Screenshot zjišťování verze systému

        Instalace -# +#

        Stažený instalátor spusť.

        Na začátku instalace zaškrtni:

        diff --git a/meta/local-run/index.html b/meta/local-run/index.html index f29118d2..138a0dcb 100644 --- a/meta/local-run/index.html +++ b/meta/local-run/index.html @@ -1,8 +1,8 @@

        Vytvoření lokálního kurzu -# +#

        Příprava -# +#

        První věc, kterou budeš potřebovat, je Python, a to alespoň ve verzi 3.8. Pokud zrovna danou verzi Pythonu nainstalovanou nemáš, můžeš postupovat podle návodu na instalaci Pythonu.

        @@ -15,7 +15,7 @@

        Příprava
      • Poetry můžeš nainstalovat do systému podle návodu na stránkách Poetry
      • -
      • Můžeš si aktivovat virtuální prostředí a Poetry nainstalovat pomocí:
        $ python -m pip install --user poetry
        +
      • Můžeš si aktivovat virtuální prostředí a Poetry nainstalovat pomocí:
        $ python -m pip install --user poetry
         
      • Poslední věc, kterou potřebuješ, už není žádný program, ale pár schopností. @@ -25,7 +25,7 @@

        Příprava návodu na používání Gitu a v úvodu k YAMLu.

        Naklonování základu -# +#

        Kurz můžeš vytvořit úplně od začátku, ale pro začátek lepší varianta je vyjít z nějakého už existujícího. @@ -35,46 +35,46 @@

        Naklonování základu Historické kurzy ale můžou být už zaarchivované a nejnovější verze v repozitáři nemusí odpovídat tomu co je na webu.)

        Kontrola nastavení projektu -# +#

        Zkontroluj si, že naklonovaný kurz obsahuje soubor pyproject.toml s verzí naucse = 0.5.0 nebo vyšší a naucse-render = 1.8 nebo vyšší. Třeba takto:

        -
        $ git grep ^naucse pyproject.toml
        +
        $ git grep ^naucse pyproject.toml
         pyproject.toml:11:naucse = "^0.5.1"
         pyproject.toml:12:naucse-render = "^1.8"
         

        Jestli soubor pyproject.toml vůbec nemáš, zkopíruj si ho z repozitáre naucse-python. Jestli máš starší verzi naucse, aktualizuj příkazem poetry add naucse@latest.

        Lokální spuštění -# +#

        Po naklonování si zkontroluj, že kurz u tebe „jede“.

        Nainstaluj protřebné závislosti:

        -
        $ poetry install
        +
        $ poetry install
         

        A spusť vývojový server:

        -
        $ poetry run python -m naucse serve
        +
        $ poetry run python -m naucse serve
         

        Program vypíše adresu (např. http://127.0.0.1:8003/); tu navštiv v prohlížeči. Tam se „doklikej“ na kurz, ze kterého budeš vycházet.

        Struktura repozitáře -# +#

        V repozitáři s kurzem najdeš následující soubory a adresáře:

        lessons/: Texty lekcí -# +#

        Jednotlivé lekce jsou rozděleny do „kategorií“, aby se dalo lépe „smíchat“ několik kurzů dohromady. Každá lekce má vlastní adresář se dvěma soubory:

        • info.yml obsahuje metadata, například:

          -
            title: Vytvoření lokálního kurzu
          -  style: md
          -  attribution:
          -  - Napsal Mikuláš Poul, 2018
          -  - Napsal Petr Viktorin, 2022
          -  license: cc-by-sa-40
          -  license_code: cc0
          +
            title: Vytvoření lokálního kurzu
          +  style: md
          +  attribution:
          +  - Napsal Mikuláš Poul, 2018
          +  - Napsal Petr Viktorin, 2022
          +  license: cc-by-sa-40
          +  license_code: cc0
           
          • title je titulek stránky, který se objeví v obsahu.
          • style je typ obsahu: md pro Markdown nebo ipynb pro @@ -99,7 +99,7 @@

            lessons/: Texty lekcí

          course.yml, courses, runs: Definice kurzu -# +#

          Definice kurzu je uložena v souboru YAML. Jsou dvé možnosti, kde tenhle soubor může být:

          @@ -123,7 +123,7 @@

          cou

          Když zakládáš nový kurz, můžeš zkopírovat existující definici na nové místo, nebo ji nechat kde je a změnit ji.

          .github/workflows/main.yml: Instrukce pro GitHub Actions -# +#

          Tenhle soubor obsahuje instrukce pro GitHub Actions pomocí kterých se kurz publikuje. Obsahuje kromě instalace a cache tři hlavní kroky:

          @@ -136,23 +136,23 @@

          .gith Až budeš kurz přidávat na naucse.python.cz, měly by se zkontrolovat, ale do té doby se s tímto souborem netrap.

          licenses/ -# +#

          Tenhle adresář obsahuje licence, pod kterými obsah může být. Neměň ho.

          pyproject.toml, poetry.lock, .github: Definice projektu a závislostí -# +#

          Tyhle soubory definují jaké nástroje se použijí pro publikování kurzu.

          Definice kurzu -# +#

          Soubor course.yml nebo courses/*.yml obsahuje všechny informace o kurzu – název, popisek, kde a kdy se koná a pak samozřejmě plán jednotlivých lekcí.

          Celá definice kurzu je jeden velký slovník, který si postupně popíšeme a vyplníme. Pro potřeby kurzu je připravena šablona, kterou můžeš použít.

          Povinné informace -# +#

          Nejdřív prvních pár základních povinných údajů:

            @@ -162,7 +162,7 @@

            Povinné informace

          A teď už jen nepovinné údaje.

          Místo a čas -# +#

          Přidáváš-li kurz s instruktorem, kdy se na každou lekci budete scházet, přidej informace o místu a času. @@ -179,14 +179,14 @@

          Místo a čas

          Kromě toho je potřeba zadat časovou zónu, kde se lekce odehrávají. Pro ČR a Slovensko použij Europe/Prague (největší město v oblasti).

          Takže třeba takhle:

          -
          default_time:
          -  start: '18:00'
          -  end: '20:00'
          -timezone: Europe/Prague
          +
          default_time:
          +  start: '18:00'
          +  end: '20:00'
          +timezone: Europe/Prague
           

          Tohle výchozí čas. U každé lekce se dá zvlášť nastavit jiný začátek a konec.

          Proměnné -# +#

          Poslední nepovinná hodnota, než se dostaneme k obsahu kurzu, jsou proměné, které se definují klíčem vars a musí být také slovníkem. Proměné mohou upravovat obsah lekcí a stránek kurzu, a pokud budeš vytvářet nebo upravovat materiály, můžeš si i definovat vlastní.

          @@ -205,14 +205,14 @@

          Proměnné

        Plán lekcí -# +#

        A teď už zbývá poslední věc, a to je sestavení programu kurzu. Kurz se skládá z jednotlivých lekcí (sessions) a každá lekce obsahuje seznam materiálů. Lekce nadefinuješ klíčem sessions v definici kurzu. Ten musí být seznam dalších slovníků. Každý z nich představuje jednu lekci.

        Definice lekce -# +#

        Datum lekce nastavíš klíčem date, ve formátu YYYY-MM-DD. Čas nastavovat nemusíš, použije se čas z default_time, ale můžeš ho přenastavit @@ -222,10 +222,10 @@

        Definice lekce Použije se v adrese (URL) lekce.

        Dalším povinným údajem je title – název lekce.

        Základní definice lekce tedy vypadá následovně:

        -
        sessions:
        -- slug: first-lesson
        -  title: Název první lekce
        -  date: 2018-03-07
        +
        sessions:
        +- slug: first-lesson
        +  title: Název první lekce
        +  date: 2018-03-07
         

        Většina lekcí bude mít navíc obsah – seznam materiálů. Ty se nastavují pomocí klíče materials.

        Existují tři druhy materiálů:

        @@ -235,43 +235,43 @@

        Definice lekce tedy jméno podsložky ve složce lessons. Identifikátor materiálu je <název kategorie>/<název materiálu z kategorie>. Takže například materiál `beginners/install by se zadal takto:

        -
          sessions:
        -  - slug: first-lesson
        -    title: Název první lekce
        -    date: 2018-03-07
        -    materials:
        -    - lesson: beginners/install
        +
          sessions:
        +  - slug: first-lesson
        +    title: Název první lekce
        +    date: 2018-03-07
        +    materials:
        +    - lesson: beginners/install
         

        • Externí odkazy se definují pomocí klíčů url a title. Do url patří kompletní odkaz na materiál, do title patří název odkazu. Příklad použítí:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - title: Úvodní prezentace
          -      url: https://example.com/uvod.pdf
          -    - title: Tahák na příkazovou řádku
          -      url: https://example.com/tahak.pdf
          -      type: cheatsheet
          -    - title: Domácí projekty (PDF)
          -      url: https://example.com/ukol.pdf
          -      type: homework
          +
            sessions:
          +  - slug: first-lesson
          +    title: Název první lekce
          +    date: 2018-03-07
          +    materials:
          +    - title: Úvodní prezentace
          +      url: https://example.com/uvod.pdf
          +    - title: Tahák na příkazovou řádku
          +      url: https://example.com/tahak.pdf
          +      type: cheatsheet
          +    - title: Domácí projekty (PDF)
          +      url: https://example.com/ukol.pdf
          +      type: homework
           
        • Materiály bez odkazu se definují stejně jako externí odkazy, jen se do klíče url dá hodnota null. Například:

          -
            sessions:
          -  - slug: last-lesson
          -    title: Název lekce
          -    date: 2019-03-07
          -    materials:
          -    - title: Přehlídka závěrečných projektů
          -      url: null
          -    - title: Předání diplomů
          -      url: null
          +
            sessions:
          +  - slug: last-lesson
          +    title: Název lekce
          +    date: 2019-03-07
          +    materials:
          +    - title: Přehlídka závěrečných projektů
          +      url: null
          +    - title: Předání diplomů
          +      url: null
           

        U všech druhú materiálú lze nastavit typ, který určuje ikonku která se použije v seznamu materiálů vedle názvu.

        @@ -286,20 +286,20 @@

        Definice lekce

        Poslední věc, která jde definovat u materiálů, jsou proměné, pomocí klíče vars. Definují se stejně jako u celého kurzu, ale mají účinek jen pro specifický materiál. Například takhle:

        -
        sessions:
        -- slug: first-lesson
        -  title: Název první lekce
        -  date: 2018-03-07
        -  materials:
        -  - lesson: beginners/install
        -    vars:
        -      bonus: true
        +
        sessions:
        +- slug: first-lesson
        +  title: Název první lekce
        +  date: 2018-03-07
        +  materials:
        +  - lesson: beginners/install
        +    vars:
        +      bonus: true
         

        Otestování kurzu -# +#

        Po vytvoření definice kurzu s povinnými položkami se můžeš podívat na to, jak tvůj kurz bude vypadat. Spusť si vývojový server:

        -
        $ poetry run python -m naucse serve
        +
        $ poetry run python -m naucse serve
         

        Otevři si adresu, kterou ti příkaz napíše. Měl by na ní být seznam nadefinovaných kurzů.

        Pokud se stránka s kurzy nevykreslí, tak uvidíš Python vyjímku, která ti může pomoct, ale také může být pěkne matoucí. Nejprve si zkontroluj, jeslti jsi vážně vyplnil/a všechny povinné údaje. @@ -311,9 +311,9 @@

        Definice lekce

        Pokud máš lekce naplánované na určité dny, rozklikni si na stránce kurzu Kalendář a zkontroluj že odpovídá tvé představě.

        Jako další test může posloužit druhý režim spuštění, freeze místo serve, který projde všechny stránky a zkontroluje jestli fungují:

        -
        $ poetry run python -m naucse freeze
        +
        $ poetry run python -m naucse freeze
         

        Upravování a vytváření materiálů -# +#

        Na závěr této části ještě trochu k materiálům. Jak bylo zmíněno výše, obsah materiálů je definován ve složce lessons. diff --git a/meta/notebook/index.html b/meta/notebook/index.html index 268f9e59..7a0b01d4 100644 --- a/meta/notebook/index.html +++ b/meta/notebook/index.html @@ -2,7 +2,7 @@

        Jupyter Notebook -# +#

        Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

        Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -10,14 +10,14 @@

        Jupyter Notebook

        Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

        Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

        -
        $ python -m pip install --upgrade pip wheel
        -$ python -m pip install notebook
        +
        $ python -m pip install --upgrade pip wheel
        +$ python -m pip install notebook
         

        Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

        Nainstalovaný Notebook pusťte pomocí:

        -
        $ python -m notebook
        +
        $ python -m notebook
         

        V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

        Jak na Notebook -# +#

        Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

        Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

        @@ -116,5 +116,5 @@

        Jak na Notebook

        - + diff --git a/meta/submitting-a-run/index.html b/meta/submitting-a-run/index.html index 2c15f4d4..e0bd6bde 100644 --- a/meta/submitting-a-run/index.html +++ b/meta/submitting-a-run/index.html @@ -1,10 +1,10 @@

        Přidání kurzu na Nauč se Python -# +#

        Když už máme nadefinováný vlastní kurz, zbývá nám jen ho dostat na naucse.python.cz. Budeme k tomu potřebovat pár příkazů v Gitu a trochu trpělivosti.

        Definice GitHub Actions -# +#

        Způsob, jakým se obsah kurz dostane na naucse.python.cz je následující:

          @@ -18,7 +18,7 @@

          Definice GitHub Actions Jestli tenhle soubor nemáš, zkopíruj si ho z repozitáře pyvec/naucse-python.

          Nahrání do vlastního forku -# +#

          První věc, kterou budeš potřebovat, je vlastní účet na GitHubu.

          Přihlaš se na GitHub a vytvoř „fork” kurzu ze kterého vycházíš, @@ -42,21 +42,21 @@

          Nahrání do vlastního forku

          Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno pod kterým fork je, a nazevrepa za název repozitáře):

          -
          $ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/nazevrepa
          +
          $ git remote add uzivatelskejmeno https://github.com/uzivatelskejmeno/nazevrepa
           

          Dále potřebuješ vytvořit commit se svým kurzem a případně se změnami v materiálech. Je dobré změny dělat v zvláštní větvi, ne v main/master. Vymysli si název větve (např. pridani-kurzu) a pusť příkazy

          -
          $ git branch nazevvetve
          -$ git checkout nazevvetve
          +
          $ git branch nazevvetve
          +$ git checkout nazevvetve
           

          Jak vytvořit commit, se dozvíš například v návodu na používání Gitu. Více o větvích se můžeš dozvědět v návodu na větvení v Gitu.

          Pull request -# +#

          Svůj commit teď potřebuješ dostat do svého forku na GitHubu. To uděláš příkazem (uzivatelskejmeno nahraď za uživatelské jméno, pod kterým fork je, nazevvetve za název větve):

          -
          $ git push uzivatelskejmeno nazevvetve
          +
          $ git push uzivatelskejmeno nazevvetve
           

          Mezi informacemi které tento příkaz vypíše by měla být adresa na vytvoření pull requestu. Tu navštiv, vyber na ní compare across forks a pod base repository vyber repozitář se svým kurzem. @@ -68,16 +68,16 @@

          Pull request Tím se spustí další GitHub Action, který vytvoří větev compiled s obsahem pro naucse.python.cz.

          Informace o tvém repozitáři -# +#

          Teď potřebuješ ještě přidat kurz na naucse.python.cz. To se dělá změnou souboru courses.yml, nejlépe přímo na GitHubu pomocí tlačítka s ikonkou tužky.

          Na konec souboru přidej záznam:

          -
          rok/identifikator:
          -  url: https://github.com/uzivatelskejmeno/nazevrepa
          -  path: idkurzu
          -  branch: compiled
          +
          rok/identifikator:
          +  url: https://github.com/uzivatelskejmeno/nazevrepa
          +  path: idkurzu
          +  branch: compiled
           

          kde doplň:

          • rok kdy se kurz koná. U kurzu který zasahuje do více kalendářních roků @@ -94,7 +94,7 @@

            Informace o tvém repozitáři někdo schválit a v rámci toho může všechno zkontrolovat a upravit.

            Po tom, co správci PR schválí a začlení tvoje změny do základního repozitáře, stačí počkat pár minut a tvůj kurz se objeví na naucse.python.cz.

            Upravování kurzu -# +#

            Pokud budeš chtít na svém kurzu něco změnit, musíš s každou změnou udělat commit a odeslat commit na GitHub.

            Nastavené GitHub Actions pro každou změnu sestaví a publikují novou diff --git a/meta/venv-setup/index.html b/meta/venv-setup/index.html index 718d9497..d6e6a975 100644 --- a/meta/venv-setup/index.html +++ b/meta/venv-setup/index.html @@ -1,5 +1,5 @@

            Nastavení prostředí -# +#

            V této sekci si:

              @@ -8,7 +8,7 @@

              Nastavení prostředí
            • aktivuješ virtuální prostředí.

            Příprava adresáře -# +#

            Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů počítače jim záleží na tom, kde jsou ty soubory uložené.

            @@ -29,7 +29,7 @@

            Příprava adresáře Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

            Adresář pro každou lekci -# +#

            Nový adresář je zatím prázdný. To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější @@ -42,12 +42,12 @@

            Adresář pro každou lekci

            Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

            Přepnutí -# +#

            Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

            -
            $ cd naucse-python
            +
            $ cd naucse-python
             

            Pak zkontroluj, že jsi na správném místě:

            • Pomocí příkazu pwd (na Windows cd) zkontroluj, @@ -70,7 +70,7 @@

              Windows

              > <
                Directory of C:\Users\Helena\naucse-python
               05/08/2014 07:28 PM <DIR>  00
               

          Virtuální prostředí -# +#

          Teď si vytvoříš virtuální prostředí pro Python.

          Virtuální prostředí je něco, co zajistí že se všechny počítače budou @@ -90,12 +90,12 @@

          Windows

          > <
            příkazů.
            Bude je rychlejší vyzkoušet než popsat kdy je který správný,
            takže nejdřív zkus:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           

          A jestli dostaneš chybu No module named venv, zkus místo toho:

          -
           $ virtualenv -p python3 venv
          +
           $ virtualenv -p python3 venv
           
        • macOS:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           
        • Windows:

          Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících @@ -122,11 +122,11 @@

          Windows

          > <
           
        • V grafickém prohlížeči souborů to vypadá např. takto:

          (adresáře '00' a 'venv' vedle sebe)

          Aktivace virtuálního prostředí -# +#

          Nakonec virtuální prostředí aktivuj:

          -

          Unix

          $ source venv/bin/activate
          +                

          Unix

          $ source venv/bin/activate
           

          Windows

          > venv\Scripts\activate
           

          Jestli používáš příkazovou řádku ve Visual Studio Code, diff --git a/meta/yaml/index.html b/meta/yaml/index.html index c1ababa2..2a4e57ef 100644 --- a/meta/yaml/index.html +++ b/meta/yaml/index.html @@ -1,30 +1,30 @@

          O formátu YAML -# +#

          Formát se skládá z několika stavebních bloků, které se dají poté skládat dohromady. Prvním je seznam hodnot (podobně jako v Pythonu). Seznam se ve formátu YAML zapisuje následovně:

          -
          - První položka
          -- Druhá položka
          -- 3
          -- Položka může být i něco jiného než text!
          +
          - První položka
          +- Druhá položka
          +- 3
          +- Položka může být i něco jiného než text!
           

          Druhým stavebním blokem je slovník (zase podobně jako v Pythonu), který se skládá z klíčů a hodnot, nezáleží v ní tedy na pořadí, protože se k informaci vždy člověk dostance pomocí klíče. Slovník se ve formátu YAML zapisuje následovně:

          -
          klic1: Hodnota klíče klic1.
          -klic2: 2
          -klic3: I hodnoty ve slovníku mohou být něco jiného než text.
          -klic4: |
          -    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
          +
          klic1: Hodnota klíče klic1.
          +klic2: 2
          +klic3: I hodnoty ve slovníku mohou být něco jiného než text.
          +klic4: |
          +    Pokud potřebuješ zapsat nějaký delší text, uděláš to takhle.
           
          -    Tento text budou dva separátní odstavce v rámci jednoho klíče.
          -klic5:
          -klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
          +    Tento text budou dva separátní odstavce v rámci jednoho klíče.
          +klic5:
          +klic6: Jak vidíš v klíči klic5, hodnota může být i prázdá.
           

          Seznamy a slovníky jde samozřejmě i skládat dohromady:

          -
          klic1: Hodnota klíče
          -klic2:
          -- Tohle je seznam, které patří pod klíč klic2
          -- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
          -- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
          -klic3:
          -  vnorenyklic: Slovník může obsahovat další slovník i takto.
          +
          klic1: Hodnota klíče
          +klic2:
          +- Tohle je seznam, které patří pod klíč klic2
          +- vnorenyklic: Můžeme skládat jednotlivé typy skoro do nekonečna.
          +- vnorenyklic: Klíče musí být unikátní jen v rámci jednoho slovníku, takže to může být takto.
          +klic3:
          +  vnorenyklic: Slovník může obsahovat další slovník i takto.
           
          \ No newline at end of file diff --git a/mi-pyt/async/index.html b/mi-pyt/async/index.html index 07ded4f9..ce80a4f3 100644 --- a/mi-pyt/async/index.html +++ b/mi-pyt/async/index.html @@ -2,16 +2,16 @@ Máte-li ještě virtualenv s nainstalovaným PyQt, použijte ho, případně ho podle lekce o PyQt nainstalujte znovu.

          K PyQt si přiinstalujte knihovnu asyncqt:

          -
          $ python -m pip install asyncqt
          +
          $ python -m pip install asyncqt
           

          Nejde-li to, nevadí – nezbytné dnes PyQt nebude.

          Navíc si nainstalujte knihovnu aiohttp:

          -
          $ python -m pip install aiohttp
          +
          $ python -m pip install aiohttp
           

          V minulosti byly na této stránce popsány i generátory. Neovládáte-li je ještě, přečtěte si o nich.


          AsyncIO -# +#

          Pojďme si povídat o souběžnosti – možnostech, jak nechat počítač dělat víc úloh věcí najednou.

          @@ -46,7 +46,7 @@

          AsyncIO Tuto techniku tak nemůže používat operační systém, pod kterým můžou běžet i špatně napsané programy. V rámci jednoho procesu se to ale dá s úspěchem využít.

          Souběžnost v Pythonu -# +#

          V Pythonu existovala a existuje řada knihoven, které nám umožňují „dělat více věcí zároveň“. @@ -72,7 +72,7 @@

          Souběžnost v Pythonu využívající Twisted nemohla využít knihovnu pro Tornado.

          Jak to vyřešit?

          Jeden standard -# +#

          xkcd 927

          Komiks xkcd, © Randall Munroe, CC-BY-NC

          @@ -98,7 +98,7 @@

          Jeden standard
          import asyncio
           
           async def count(name, interval):
          -    """Prints numbers from 0 in regular intervals"""
          +    """Prints numbers from 0 in regular intervals"""
               i = 0
               while True:
                   print(name, 'counts', i)
          @@ -149,7 +149,7 @@ 

          Jeden standard objeví i v dokumentaci. Od Pythonu 3.8 je ale deprecated.

          Event Loop -# +#

          Knihovna asyncio nám dává k dispozici smyčku událostí, která se, podobně jako app.exec v Qt, stará o plánování jednotlivých úloh. @@ -173,7 +173,7 @@

          Jeden standard místo ensure_future funkci create_task, která vás lépe ochrání před těžko nalezitelnými chybami.

          Async funkce a Task -# +#

          Smyčka událostí provádí úlohy a asynchronní funkce.

          Asynchronní funkce se definují pomocí async def a umožňují použít příkaz @@ -258,7 +258,7 @@

          Async funkce a Task result = loop.run_until_complete(demo_task()) loop.close()

          Fan-Out a Fan-In -# +#

          S pomocí asynchronních funkcí můžeme nad našimi programy přemýšlet tak, jako by to byly „normální“ procedurálně zapsané algoritmy: máme jedno @@ -289,7 +289,7 @@

          Async funkce a Task

          Toto varování nikdy neignorujte. Kdyby váš program nedělal co má, spolu s varováním byste ignorovali výjimky v této coroutine.

          Asynchronní cykly a kontexty -# +#

          Až budete používat některé „asynchronní“ knihovny, setkáte se pravděpodobně se dvěma novými konstrukcemi: async for a async with.

          @@ -303,7 +303,7 @@

          Asynchronní cykly a kontexty async for row in (await database.execute('SELECT ...')): handle(row)

          A další -# +#

          Nakonec několik tipů, o kterých je dobré vědět.

          V asyncio najdeme synchronizační mechanismy známé z vláknového programování, např. @@ -319,7 +319,7 @@

          Asynchronní cykly a kontexty kde aktuální Task vznikl, apod. Více informací je zase v dokumentaci.

          Alternativní smyčky událostí -# +#

          Jak bylo zmíněno na začátku, hlavní cíl asyncio je definovat společné rozhraní pro různé asynchronní knihovny, aby bylo možné např. kombinovat knihovny pro @@ -361,7 +361,7 @@

          Alternativní smyčky událostí loop.run_forever()

          Komunikace -# +#

          Ono io v asyncio naznačuje, že je tato knihovna dělaná především na vstup a výstup – konkrétně na komunikaci přes síť (případně s jinými procesy).

          diff --git a/mi-pyt/click/index.html b/mi-pyt/click/index.html index aba92a95..2106c538 100644 --- a/mi-pyt/click/index.html +++ b/mi-pyt/click/index.html @@ -1,5 +1,5 @@

          click -# +#

          Nechme internety na chvíli být a pojďme se podívat na úplně jinou knihovnu, click.

          @@ -9,9 +9,9 @@

          click

          Click je dobré používat s knihovnou colorama, která se stará o obarvování textu na příkazové řádce ve Windows (a na Unixu nedělá nic). Nainstalujte si tedy obě:

          -
          $ python -m pip install click colorama
          +
          $ python -m pip install click colorama
           

          Argumenty příkazové řádky -# +#

          Nástroje na zpracování argumentů z CLI jsou i přímo ve standardní knihovně, a dokonce jich není málo: sys.argv, argparse, optparse, getopt. @@ -30,19 +30,19 @@

          click @click.option('--name', prompt='Your name', metavar='NAME', help='The person to greet.') def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" + """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo(f'Hello {name}!') if __name__ == '__main__': hello()

          Vyzkoušejte si ji! Máte-li ji uloženou jako hello.py, zkuste:

          -
          $ python hello.py
          -$ python hello.py --help
          -$ python hello.py --name Pythonista
          -$ python hello.py --count 5
          +
          $ python hello.py
          +$ python hello.py --help
          +$ python hello.py --name Pythonista
          +$ python hello.py --count 5
           

          Příkazy a přepínače -# +#

          Funkce s dekorátorem @click.command je příkaz – když ji zavoláte, click zpracuje argumenty příkazové řádky a zavolá původní funkci @@ -82,16 +82,16 @@

          click if __name__ == '__main__': hello() -

          $ python hello.py
          +
          $ python hello.py
           Hello world!
          -$ python hello.py --name Guido
          +$ python hello.py --name Guido
           Hello Guido!
          -$ python hello.py --name Jane -v
          +$ python hello.py --name Jane -v
           Hello Jane!
           Nice to meet you.
          -$ python hello.py -n 'Mr. Git'
          +$ python hello.py -n 'Mr. Git'
           Hello Mr. Git!
          -$ python hello.py --help
          +$ python hello.py --help
           Usage: hello.py [OPTIONS]
           
           Options:
          @@ -100,7 +100,7 @@ 

          click --help Show this message and exit.

          Přepínač --help přidává click sám.

          Argumenty -# +#

          Kromě přepínačů podporuje click i argumenty. Přepínače musí uživatel na řádce pojmenovat; argumenty se zadávají beze jména, @@ -114,7 +114,7 @@

          Argumenty
          @click.command()
           @click.argument('directory')
           def cd(directory):
          -    """Change the current directory"""
          +    """Change the current directory"""
               click.echo(f'Changing to directory {directory}')
           

          Proměnný počet argumentů se zadává pomocí nargs=-1 (0 nebo víc argumentů) nebo nargs=-1, required=True (1 nebo víc).

          @@ -124,11 +124,11 @@

          Argumenty @click.argument('source', nargs=-1, required=True) @click.argument('destination') def mv(source, destination): - """Move any number of files to one destination""" + """Move any number of files to one destination""" for filename in source: click.echo(f'Moving {filename} to {destination}')

          Soubory -# +#

          Má-li uživatel zadat jméno souboru, nepoužívejte řetězce, ale speciální typ click.File(). @@ -141,14 +141,14 @@

          Argumenty
          @click.command()
           @click.argument('files', nargs=-1, type=click.File('r'))
           def cat(files):
          -    """Print out the contents of the given files"""
          +    """Print out the contents of the given files"""
               for file in files:
                   print(file.read(), end='')
           

          Existuje i varianta click.Path(), která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto poskytuje i jiné další typy.

          Validace vstupů -# +#

          Vstupy získané z přepínačů i argumentů lze ověřit pomocí vlastních podmínek a podle toho naprogramovat chování včetně @@ -175,7 +175,7 @@

          Validace vstupů if __name__ == '__main__': email()

          Podpříkazy -# +#

          Click má dobrou podporu pro podpříkazy známé z verzovacích systémů jako git: příkaz git sám o sobě nedělá nic, jen sdružuje podpříkazy jako git add @@ -197,7 +197,7 @@

          Validace vstupů for file in files: click.echo(f'Adding {file}')

          A další -# +#

          Tahle lekce není popis všeho, co click umí – je to jen ochutnávka, abyste věděli, co od téhle knihovny očekávat.

          diff --git a/mi-pyt/cmdline/index.html b/mi-pyt/cmdline/index.html index 57530a9c..2d2fcbcb 100644 --- a/mi-pyt/cmdline/index.html +++ b/mi-pyt/cmdline/index.html @@ -1,5 +1,5 @@

          Příkazová řádka -# +#

          V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, které programátoři používají na zadávání textových příkazů.

          @@ -51,7 +51,7 @@

          Windows

          >
           Ctrl++ a
           Ctrl+- (příp. se Shift).

          První příkaz -# +#

          Začněme ale příkazem, který je všude stejný. Napiš whoami (z angl. who am I? – kdo jsem?) @@ -69,7 +69,7 @@

          Windows

          > <
           takže ho nepiš sám/sama! Zadej jen whoami a Enter.

          Stejně tak počítač sám vypíše přihlašovací jméno.

          Aktuální adresář -# +#

          Příkazová řádka pracuje vždy v nějakém adresáři neboli složce (angl. directory, folder). @@ -94,7 +94,7 @@

          Windows

          > <
           části uvedeno který adresář zrovna ukazují.
           Příkazová řádka umí soubory ukazovat taky – ale musíš si o to říct.

          Co v tom adresáři je? -# +#

          Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) ti vypíše co aktuální adresář obsahuje: všechny soubory, @@ -115,7 +115,7 @@

          Windows

          > <
           05/08/2014 07:28 PM <DIR>  Music
           
           

          Změna aktuálního adresáře -# +#

          Aktuální adresář se dá změnit pomocí příkazu cd (z angl. change directory – změnit adresář). @@ -127,11 +127,11 @@

          Windows

          > <
           

          Používáš-li Windows, cd už jsi používal/a – tento příkaz se chová různě podle toho, jestli něco napíšeš za něj nebo ne.

          -

          Unix

          $ cd Desktop
          +                

          Unix

          $ cd Desktop
           $ pwd
           /home/helena/Desktop
           
          -

          Windows

          > cd Desktop
          +                

          Windows

          > cd Desktop
           > cd
           C:\Users\helena\Desktop
           

          Poznámka pro Windows

          @@ -139,26 +139,26 @@

          Windows

          > <
           například D: místo C:, je potřeba kromě cd
           zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

          Vytvoření adresáře -# +#

          Co takhle si zkusit vytvořit adresář? To se dělá příkazem mkdir (z angl. make directory – vytvořit adresář). Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě zkouska:

          -

          Unix

          $ mkdir zkouska
          +                

          Unix

          $ mkdir zkouska
           

          Windows

          > mkdir zkouska
           

          Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

          -

          Unix

          $ cd zkouska
          +                

          Unix

          $ cd zkouska
           

          Windows

          > cd zkouska
           

          Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

          V grafickém hledátku -# +#

          Často nebudeš pracovat jenom s příkazovou řádkou. Vyplatí se umět aktuální adresář z příkazové řádky otevřít i v jiných @@ -195,7 +195,7 @@

          Unix

          $ 
                           

          Windows

          > cd
           C:\Users\helena\Desktop\zkouska
           

          Kopírování z příkazové řádky -# +#

          Na Linuxu vyber text myší a pak buď:

            @@ -207,7 +207,7 @@

            Windows

            > <
             

            Na Windows v menu příkazové řádky (ikonce vlevo nahoře) vyber EditMark, text vyber myší a zkopíruj pomocí Enter.

            Otevření v prohlížeči souborů -# +#

            Na Linuxu záleží na programu, který používáš. Buď:

              @@ -226,7 +226,7 @@

              Otevření v prohlížeči souborů

              Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na prohlížení adresářů: zjistíš, že se adresář opravdu vytvořil.

              Vkládání do příkazové řádky -# +#

              Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. @@ -240,10 +240,10 @@

              Vkládání do příkazové řádky

              Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš ", např:

              -
              $ cd "můj super adresář"
              +
              $ cd "můj super adresář"
               

              Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

              Pozorování změn -# +#

              Vyzkoušej si, že se v řádce projeví i změny, které na počítači uděláš jiným způsobem.

              @@ -255,7 +255,7 @@

              Vkládání do příkazové řádky

              Na počítači máš jen jednu sadu souborů, se kterou umí manipulovat jak grafické programy tak příkazová řádka.

              O úroveň nahoru -# +#

              A poslední věc: jsi-li teď v adresáři Desktop/zkouska (nebo Plocha/zkouska, Desktop\zkouska atp.), jak se dostat zpátky do Desktop?

              @@ -267,17 +267,17 @@

              O úroveň nahoru

              Nadřazený adresář má speciální jméno .., dvě tečky. Přejdi do něj zadáním cd .. a pak se ujisti, že jsi opravdu v Desktop:

              -

              Unix

              $ cd ..
              +                

              Unix

              $ cd ..
               $ pwd
               /home/helena/Desktop
               
              -

              Windows

              > cd ..
              +                

              Windows

              > cd ..
               > cd
               C:\Users\helena\Desktop
               

              Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

              Konec -# +#

              Příkazů existuje samozřejmě daleko víc.

              Když se je naučíš, můžeš z příkazové řádky plnohodnotně ovládat @@ -298,7 +298,7 @@

              Konec
              $ exit
               

              A tím je úvod do příkazové řádky hotový.

              Přehled -# +#

              Tady je tabulka základních příkazů, se kterými si do začátku vystačíš:

        diff --git a/mi-pyt/course.json b/mi-pyt/course.json index 5f42bed7..23baa627 100644 --- a/mi-pyt/course.json +++ b/mi-pyt/course.json @@ -1,7 +1,7 @@ { "api_version": [ 0, - 3 + 4 ], "course": { "description": "Základy již znáte a chcete se dozvědět o dalších možnostech využití Pythonu.", @@ -27,7 +27,23 @@ "content": { "path": "generators/index.html" }, + "ids": [ + "dalsi_pouziti_generatoru", + "delegace_na_podgenerator_codeyield_fromcode", + "generatory", + "iterace", + "obousmerna_komunikace", + "vraceni_hodnot_z_generatoru" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_pouziti_generatoru", + "#delegace_na_podgenerator_codeyield_fromcode", + "#generatory", + "#iterace", + "#obousmerna_komunikace", + "#vraceni_hodnot_z_generatoru" + ], "slug": "index", "solutions": [], "source_file": "lessons/advanced/generators/index.md", @@ -52,7 +68,43 @@ "content": { "path": "cmdline/index.html" }, + "ids": [ + "aktualni_adresar", + "co_v_tom_adresari_je", + "konec", + "kopirovani_z_prikazove_radky", + "o_uroven_nahoru", + "otevreni_vprohlizeci_souboru", + "pozorovani_zmen", + "prehled", + "prikazova_radka", + "prvni_prikaz", + "vgrafickem_hledatku", + "vkladani_do_prikazove_radky", + "vytvoreni_adresare", + "zmena_aktualniho_adresare" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualni_adresar", + "#co_v_tom_adresari_je", + "#konec", + "#kopirovani_z_prikazove_radky", + "#o_uroven_nahoru", + "#otevreni_vprohlizeci_souboru", + "#pozorovani_zmen", + "#prehled", + "#prikazova_radka", + "#prvni_prikaz", + "#vgrafickem_hledatku", + "#vkladani_do_prikazove_radky", + "#vytvoreni_adresare", + "#zmena_aktualniho_adresare", + "naucse:static?filename=linux-file-browser.png", + "naucse:static?filename=macos-file-browser.png", + "naucse:static?filename=windows-cmd-properties.png", + "naucse:static?filename=windows-file-browser.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/cmdline/index.md", @@ -89,7 +141,16 @@ "content": { "path": "install/index.html" }, + "ids": [ + "instalace_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu", + "naucse:page?lesson=beginners/install&page=linux", + "naucse:page?lesson=beginners/install&page=macos", + "naucse:page?lesson=beginners/install&page=windows" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install/index.md", @@ -106,7 +167,24 @@ "content": { "path": "install/linux.html" }, + "ids": [ + "check-tkinter", + "doinstalovani_virtualenv", + "instalace_pythonu_3", + "instalace_pythonu_na_linux", + "install-virtualenv", + "kontrola_tkinter" + ], "license": "cc-by-sa-40", + "links": [ + "#check-tkinter", + "#doinstalovani_virtualenv", + "#instalace_pythonu_3", + "#instalace_pythonu_na_linux", + "#install-virtualenv", + "#kontrola_tkinter", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "linux", "solutions": [], "source_file": "lessons/beginners/install/linux.md", @@ -124,7 +202,15 @@ "content": { "path": "install/macos.html" }, + "ids": [ + "instalace_pythonu_pro_macos" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu_pro_macos", + "http://brew.sh", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "macos", "solutions": [], "source_file": "lessons/beginners/install/macos.md", @@ -142,7 +228,26 @@ "content": { "path": "install/windows.html" }, + "ids": [ + "download", + "instalace", + "instalace_pythonu_pro_windows", + "stazeni", + "zjisti_jestli_uz_mas_python_nainstalovany" + ], "license": "cc-by-sa-40", + "links": [ + "#download", + "#instalace", + "#instalace_pythonu_pro_windows", + "#stazeni", + "#zjisti_jestli_uz_mas_python_nainstalovany", + "https://www.python.org/downloads/windows/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/venv-setup", + "naucse:static?filename=windows_32v64-bit.png", + "naucse:static?filename=windows_add_python_to_path.png" + ], "slug": "windows", "solutions": [], "source_file": "lessons/beginners/install/windows.md", @@ -174,7 +279,22 @@ "content": { "path": "testing/index.html" }, + "ids": [ + "instalace_knihovny_pytest", + "psani_testu", + "spousteni_testu", + "testovaci_moduly", + "testovani" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_knihovny_pytest", + "#psani_testu", + "#spousteni_testu", + "#testovaci_moduly", + "#testovani", + "naucse:page?lesson=beginners/install" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/testing/index.md", @@ -198,7 +318,24 @@ "content": { "path": "venv-setup/index.html" }, + "ids": [ + "adresar_pro_kazdou_lekci", + "aktivace_virtualniho_prostredi", + "nastaveni_prostredi", + "prepnuti", + "priprava_adresare", + "virtualni_prostredi" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdou_lekci", + "#aktivace_virtualniho_prostredi", + "#nastaveni_prostredi", + "#prepnuti", + "#priprava_adresare", + "#virtualni_prostredi", + "naucse:static?filename=dirs-00.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/venv-setup/index.md", @@ -227,7 +364,23 @@ "content": { "path": "http/index.html" }, + "ids": [ + "http_jak_funguje_internet", + "http_metody", + "pozadavek_a_odpoved", + "url-anatomy", + "webove_adresy" + ], "license": "cc-by-sa-40", + "links": [ + "#http_jak_funguje_internet", + "#http_metody", + "#pozadavek_a_odpoved", + "#webove_adresy", + "https://en.wikipedia.org/wiki/List_of_HTTP_status_codes", + "https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html", + "naucse:static?filename=url-anatomy.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/http/index.md", @@ -255,7 +408,23 @@ "content": { "path": "install/index.1.html" }, + "ids": [ + "poznamky", + "unix_linux_macos", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#poznamky", + "#unix_linux_macos", + "#windows", + "https://docs.python.org/3/library/venv.html", + "https://packaging.python.org/tutorials/managing-dependencies/", + "https://pipenv.readthedocs.io/en/latest/", + "https://virtualenvwrapper.readthedocs.io/en/latest/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install" + ], "slug": "index", "solutions": [], "source_file": "lessons/fast-track/install/index.md", @@ -279,7 +448,45 @@ "content": { "path": "git-collaboration-2in1/index.html" }, + "ids": [ + "aktualizace_codegit_pullcode", + "git_a_github", + "log_codegit_logcode", + "open-source_a_free_software", + "posilani_zmen_codegit_pushcode", + "prace_s_lokalnim_repozitarem", + "prvni_revize_codegit_commitcode", + "spoluprace_a_git", + "spoluprace_na_projektu", + "stav_repozitare_codegit_statuscode", + "zadost_o_zacleneni_pull_request" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace_codegit_pullcode", + "#git_a_github", + "#log_codegit_logcode", + "#open-source_a_free_software", + "#posilani_zmen_codegit_pushcode", + "#prace_s_lokalnim_repozitarem", + "#prvni_revize_codegit_commitcode", + "#spoluprace_a_git", + "#spoluprace_na_projektu", + "#stav_repozitare_codegit_statuscode", + "#zadost_o_zacleneni_pull_request", + "https://choosealicense.com", + "https://creativecommons.org", + "https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software", + "https://en.wikipedia.org/wiki/Richard_Stallman", + "https://github.com", + "https://github.com/asgeirrr/prezencka", + "https://github.com/asgeirrr/prezencka/", + "https://opensource.org", + "https://www.root.cz/knihy/katedrala-a-trziste/", + "naucse:page?lesson=beginners/cmdline", + "naucse:static?filename=diagram.png", + "naucse:static?filename=gh-workflow-diagram.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/git-collaboration-2in1/index.md", @@ -310,7 +517,51 @@ "content": { "path": "async/index.html" }, + "ids": [ + "a_dalsi", + "alternativni_smycky_udalosti", + "async_funkce_a_task", + "asynchronni_cykly_a_kontexty", + "asyncio", + "event_loop", + "fan-out_a_fan-in", + "jeden_standard", + "komunikace", + "soubeznost_v_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#alternativni_smycky_udalosti", + "#async_funkce_a_task", + "#asynchronni_cykly_a_kontexty", + "#asyncio", + "#event_loop", + "#fan-out_a_fan-in", + "#jeden_standard", + "#komunikace", + "#soubeznost_v_pythonu", + "http://www.tornadoweb.org/en/stable/", + "https://creativecommons.org/licenses/by-nc/2.5/", + "https://docs.python.org/3/library/asyncio-dev.html#asyncio-dev", + "https://docs.python.org/3/library/asyncio-eventloop.html#executor", + "https://docs.python.org/3/library/asyncio-protocol.html#tcp-echo-server-protocol", + "https://docs.python.org/3/library/asyncio-sync.html", + "https://docs.python.org/3/library/asyncio-task.html#asyncio.gather", + "https://greenlet.readthedocs.io/en/latest/", + "https://imgs.xkcd.com/comics/standards.png", + "https://pypi.org/project/asyncqt/", + "https://pypi.org/project/uvloop/", + "https://trio.readthedocs.io/en/stable/tutorial.html", + "https://twistedmatrix.com/trac/", + "https://www.python.org/dev/peps/pep-0249/", + "https://www.python.org/dev/peps/pep-3156/", + "https://www.python.org/dev/peps/pep-3333/", + "https://xkcd.com/927/", + "naucse:page?lesson=advanced/generators", + "naucse:page?lesson=intro/cython", + "naucse:page?lesson=intro/pyqt" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/async/index.md", @@ -334,7 +585,41 @@ "content": { "path": "click/index.html" }, + "ids": [ + "a_dalsi", + "argumenty", + "argumenty_prikazove_radky", + "click", + "podprikazy", + "prikazy_a_prepinace", + "soubory", + "validace_vstupu" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#argumenty", + "#argumenty_prikazove_radky", + "#click", + "#podprikazy", + "#prikazy_a_prepinace", + "#soubory", + "#validace_vstupu", + "https://click.palletsprojects.com/en/7.x/", + "https://click.palletsprojects.com/en/7.x/api/#click.BadParameter", + "https://click.palletsprojects.com/en/7.x/api/#click.File", + "https://click.palletsprojects.com/en/7.x/api/#click.Path", + "https://click.palletsprojects.com/en/7.x/api/#click.UsageError", + "https://click.palletsprojects.com/en/7.x/api/#types", + "https://click.palletsprojects.com/en/7.x/arguments/", + "https://click.palletsprojects.com/en/7.x/options/", + "https://click.palletsprojects.com/en/7.x/options/#callbacks-for-validation", + "https://docs.python.org/3/library/argparse.html", + "https://docs.python.org/3/library/functions.html#open", + "https://docs.python.org/3/library/getopt.html", + "https://docs.python.org/3/library/optparse.html", + "https://docs.python.org/3/library/sys.html#sys.argv" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/click/index.md", @@ -358,7 +643,81 @@ "content": { "path": "cython/index.html" }, + "ids": [ + "anotace", + "c_api", + "cpython", + "cython", + "direktivy", + "doplneni_typu", + "externi_knihovny", + "gil", + "hodnoty_a_vyjimky", + "kompilace_pythonu", + "modul_v_c", + "pouziti_knihoven_z_c", + "pouzivani_numpy", + "preklad", + "pyobject", + "reference_counting", + "rychlost", + "struktury_ukazatele_a_dynamicka_alokace", + "tri_typy_funkci", + "tridy", + "video", + "zkratky_codepyximportcode_a_codecythoncode" + ], "license": "cc-by-sa-40", + "links": [ + "#anotace", + "#c_api", + "#cpython", + "#cython", + "#direktivy", + "#doplneni_typu", + "#externi_knihovny", + "#gil", + "#hodnoty_a_vyjimky", + "#kompilace_pythonu", + "#modul_v_c", + "#pouziti_knihoven_z_c", + "#pouzivani_numpy", + "#preklad", + "#pyobject", + "#reference_counting", + "#rychlost", + "#struktury_ukazatele_a_dynamicka_alokace", + "#tri_typy_funkci", + "#tridy", + "#video", + "#zkratky_codepyximportcode_a_codecythoncode", + "http://cffi.readthedocs.io/en/latest/", + "http://cython.readthedocs.io/en/latest/src/tutorial/cdef_classes.html", + "http://valgrind.org/", + "https://cython.readthedocs.io/src/userguide/source_files_and_compilation.html#compiler-directives", + "https://cython.readthedocs.io/src/userguide/source_files_and_compilation.html#how-to-set-directives", + "https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong", + "https://docs.python.org/3/c-api/module.html#c.PyModuleDef_Slot", + "https://docs.python.org/3/c-api/refcounting.html#c.Py_DECREF", + "https://docs.python.org/3/c-api/refcounting.html#c.Py_INCREF", + "https://docs.python.org/3/c-api/structures.html#c.PyObject", + "https://docs.python.org/3/distutils/apiref.html#distutils.core.Extension", + "https://docs.python.org/3/library/ctypes.html", + "https://en.wikipedia.org/wiki/GNU_Debugger", + "https://github.com/hroncok/", + "https://github.com/joerick/cibuildwheel#cibuildwheel", + "https://github.com/pypa/manylinux", + "https://github.com/python/cpython/blob/3.5/Include/floatobject.h#L15", + "https://github.com/python/cpython/blob/3.5/Include/listobject.h#L23", + "https://github.com/python/cpython/blob/3.5/Include/longintrepr.h#L89", + "https://github.com/python/cpython/blob/3.5/Include/object.h#L106", + "https://pypi.python.org/pypi/pytest-profiling", + "https://travis-ci.org/", + "https://wiki.python.org/moin/WindowsCompilers", + "https://www.appveyor.com/", + "https://www.youtube.com/watch?v=Ksv4RA6yhkY", + "naucse:static?filename=test_matmul.py" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/cython/index.md", @@ -386,7 +745,20 @@ "content": { "path": "deployment/index.html" }, + "ids": [ + "deployment_webovych_aplikaci", + "wsgi" + ], "license": "cc-by-sa-40", + "links": [ + "#deployment_webovych_aplikaci", + "#wsgi", + "http://gunicorn.org/", + "https://www.python.org/dev/peps/pep-0333/", + "https://www.pythonanywhere.com/", + "naucse:page?lesson=intro/deployment&page=pythonanywhere", + "naucse:page?lesson=intro/flask" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/deployment/index.md", @@ -403,7 +775,20 @@ "content": { "path": "deployment/pythonanywhere.html" }, + "ids": [ + "aktualizace", + "deployment_soukromych_udaju", + "deployment_webovych_aplikaci_na_pythonanywhere" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace", + "#deployment_soukromych_udaju", + "#deployment_webovych_aplikaci_na_pythonanywhere", + "https://help.pythonanywhere.com/pages/environment-variables-for-web-apps/", + "https://www.pythonanywhere.com/", + "https://www.pythonanywhere.com/forums/topic/12878/#id_post_52160" + ], "slug": "pythonanywhere", "solutions": [], "source_file": "lessons/intro/deployment/pythonanywhere.md", @@ -428,8 +813,55 @@ "content": { "path": "distribution/index.html" }, + "ids": [ + "dalsi", + "datove_soubory", + "extra_soubory_do_zdrojoveho_balicku", + "instalace_pomoci_pip", + "moduly", + "nahrani_na_pypi", + "programy_pro_prikazovou_radku", + "setuppy", + "slovnicek_pojmu", + "soubor_requirementstxt", + "specifikace_zavislosti", + "spousteni_modulu", + "vice_argumentu_pro_setup", + "vice_souboru_s_python_kodem", + "wheel_binarni_balicky" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#dalsi", + "#datove_soubory", + "#extra_soubory_do_zdrojoveho_balicku", + "#instalace_pomoci_pip", + "#moduly", + "#nahrani_na_pypi", + "#programy_pro_prikazovou_radku", + "#setuppy", + "#slovnicek_pojmu", + "#soubor_requirementstxt", + "#specifikace_zavislosti", + "#spousteni_modulu", + "#vice_argumentu_pro_setup", + "#vice_souboru_s_python_kodem", + "#wheel_binarni_balicky", + "https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt", + "https://docs.python.org/3/distutils/sourcedist.html#specifying-the-files-to-distribute", + "https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e", + "https://packaging.python.org/", + "https://packaging.python.org/distributing/#package-data", + "https://packaging.python.org/distributing/#setup-args", + "https://packaging.python.org/glossary", + "https://pypi.org", + "https://pypi.org/account/register/", + "https://pypi.org/pypi?%3Aaction=list_classifiers", + "https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins", + "https://test.pypi.org/account/register/", + "https://wiki.python.org/moin/TestPyPI" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/distribution/index.md", @@ -453,7 +885,61 @@ "content": { "path": "docs/index.html" }, + "ids": [ + "_doctest", + "_testcleanup", + "_testcode", + "_testoutput", + "_testsetup", + "autodoc", + "co_do_dokumentace_psat", + "doctest", + "dokumentace", + "import_z_vlastniho_kodu", + "kompletni_priklad", + "nastaveni_a_rozsireni", + "odkazy_na_tridy_a_moduly", + "read_the_docs", + "readmerst", + "sphinx", + "textovy_obsah_v_dokumentaci", + "travis_ci" + ], "license": "cc-by-sa-40", + "links": [ + "#_doctest", + "#_testcleanup", + "#_testcode", + "#_testoutput", + "#_testsetup", + "#autodoc", + "#co_do_dokumentace_psat", + "#doctest", + "#dokumentace", + "#import_z_vlastniho_kodu", + "#kompletni_priklad", + "#nastaveni_a_rozsireni", + "#odkazy_na_tridy_a_moduly", + "#read_the_docs", + "#readmerst", + "#sphinx", + "#textovy_obsah_v_dokumentaci", + "#travis_ci", + "http://www.sphinx-doc.org/", + "http://www.sphinx-doc.org/en/master/domains.html#cross-referencing-python-objects", + "http://www.sphinx-doc.org/en/master/ext/autodoc.html#directive-automodule", + "http://www.sphinx-doc.org/en/master/ext/doctest.html", + "http://www.sphinx-doc.org/en/master/ext/napoleon.html", + "http://www.sphinx-doc.org/en/master/markup/inline.html#role-ref", + "http://www.sphinx-doc.org/en/master/markup/misc.html#index-generating-markup", + "http://www.sphinx-doc.org/en/stable/rest.html", + "http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/", + "https://github.com/ralsina/rst-cheatsheet", + "https://readthedocs.org/", + "https://recommonmark.readthedocs.io/en/latest/auto_structify.html#embed-restructuredtext", + "https://www.sphinx-doc.org/en/master/usage/markdown.html", + "naucse:page?lesson=intro/testing" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/docs/index.md", @@ -477,7 +963,69 @@ "content": { "path": "flask/index.html" }, + "ids": [ + "a_dalsi", + "blueprint_moduly", + "create_app_factory", + "dynamicke_routy", + "escaping", + "filtry", + "flask", + "ladici_rezim", + "logovani", + "sablony", + "staticke_soubory", + "vetsi_flask_aplikace", + "vlastni_podtrida_flask", + "webove_aplikace_flask", + "ziskani_url" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#blueprint_moduly", + "#create_app_factory", + "#dynamicke_routy", + "#escaping", + "#filtry", + "#flask", + "#ladici_rezim", + "#logovani", + "#sablony", + "#staticke_soubory", + "#vetsi_flask_aplikace", + "#vlastni_podtrida_flask", + "#webove_aplikace_flask", + "#ziskani_url", + "http://127.0.0.1:5000/hello/", + "http://www.pylonsproject.org/", + "https://cs.wikipedia.org/wiki/Diazotypie", + "https://cs.wikipedia.org/wiki/Model-view-controller", + "https://developer.mozilla.org/en-US/docs/Web", + "https://developer.mozilla.org/en-US/docs/Web/CSS", + "https://developer.mozilla.org/en-US/docs/Web/HTML", + "https://docs.python.org/3/library/logging.html#module-logging", + "https://flask-pymongo.readthedocs.io/en/latest/", + "https://flask-sqlalchemy.palletsprojects.com/en/2.x/", + "https://flask.palletsprojects.com", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Blueprint", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.register_blueprint", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.route", + "https://flask.palletsprojects.com/en/1.1.x/api/#flask.url_for", + "https://flask.palletsprojects.com/en/1.1.x/blueprints/", + "https://flask.palletsprojects.com/en/1.1.x/cli/", + "https://flask.palletsprojects.com/en/1.1.x/extensions/?highlight=extensions", + "https://flask.palletsprojects.com/en/1.1.x/logging/", + "https://flask.palletsprojects.com/en/1.1.x/patterns/appfactories/", + "https://flask.palletsprojects.com/en/1.1.x/quickstart/", + "https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules", + "https://jinja.palletsprojects.com/en/2.10.x/api/#jinja2.Markup", + "https://jinja.palletsprojects.com/en/2.10.x/templates/", + "https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters", + "https://jinja.palletsprojects.com/en/2.10.x/templates/#for", + "https://www.djangoproject.com/", + "naucse:page?lesson=fast-track/http#url-anatomy" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/flask/index.md", @@ -501,7 +1049,34 @@ "content": { "path": "magic/index.html" }, + "ids": [ + "a_dalsi", + "dekoratory", + "deskriptory", + "konstruktor", + "magie", + "metatridy", + "specialni_metody", + "ukol", + "velka_moc_a_velka_zodpovednost" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#dekoratory", + "#deskriptory", + "#konstruktor", + "#magie", + "#metatridy", + "#specialni_metody", + "#ukol", + "#velka_moc_a_velka_zodpovednost", + "http://docs.pylonsproject.org/projects/pyramid/en/latest/_modules/pyramid/decorator.html", + "https://docs.python.org/3/library/pathlib.html", + "https://docs.python.org/3/reference/datamodel.html#special-method-names", + "https://www.python.org/download/releases/2.3/mro/", + "https://www.youtube.com/watch?v=NiSqG6s8skA" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/magic/index.md", @@ -525,7 +1100,48 @@ "content": { "path": "micropython/index.html" }, + "ids": [ + "blikani", + "drivery_a_pripojeni", + "flashovani", + "komunikace", + "led_pasek_ws2812", + "micropython", + "micropython_na_esp8266nodemcu", + "ovladani_konzole", + "popis_desky", + "souborovy_system", + "vstup_a_vystup", + "webrepl" + ], "license": "cc-by-sa-40", + "links": [ + "#blikani", + "#drivery_a_pripojeni", + "#flashovani", + "#komunikace", + "#led_pasek_ws2812", + "#micropython", + "#micropython_na_esp8266nodemcu", + "#ovladani_konzole", + "#popis_desky", + "#souborovy_system", + "#vstup_a_vystup", + "#webrepl", + "http://api.thingspeak.com/channels/1417/field/2/last.txt", + "http://docs.micropython.org/en/latest/esp8266/", + "http://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#onewire-driver", + "http://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#software-spi-bus", + "http://docs.micropython.org/en/latest/esp8266/library/machine.I2C.html#machine-i2c", + "http://micropython.org/download#esp8266", + "http://micropython.org/webrepl/", + "http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html", + "https://github.com/espressif/esptool#usage", + "https://github.com/stlk/micropython/tree/master/workshop", + "https://naucse.python.cz/2019/brno-podzim-pondeli/sessions/micropython/", + "https://pyvec.github.io/cheatsheets/micropython/nodemcu-cs.pdf", + "https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/micropython/index.md", @@ -549,8 +1165,17 @@ "content": { "path": "notebook/index.html" }, + "ids": [ + "jak_na_notebook", + "jupyter_notebook" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#jak_na_notebook", + "#jupyter_notebook", + "https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages" + ], "modules": { "katex": "0.7.1" }, @@ -577,7 +1202,67 @@ "content": { "path": "numpy/index.html" }, + "ids": [ + "booleovske_hodnoty_poli", + "broadcasting_a_zmeny", + "dalsi_operace", + "datove_typy", + "indexovani", + "matematika_a_grafy", + "maticove_nasobeni", + "nejednoznacnost_a_zkratky", + "numpy", + "obrazky", + "priklady_pouziti", + "reshape", + "tvoreni_matic_cast_2", + "zakladni_operace", + "zvuk" + ], "license": "cc-by-sa-40", + "links": [ + "#booleovske_hodnoty_poli", + "#broadcasting_a_zmeny", + "#dalsi_operace", + "#datove_typy", + "#indexovani", + "#matematika_a_grafy", + "#maticove_nasobeni", + "#nejednoznacnost_a_zkratky", + "#numpy", + "#obrazky", + "#priklady_pouziti", + "#reshape", + "#tvoreni_matic_cast_2", + "#zakladni_operace", + "#zvuk", + "data:audio/wav;base64,UklGRjQnAABXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YRAnAACMLOwvpDFyNDAuPDSVNjwvdCf6KOIvSi2GJSYpMSvuJ6ApxizwLZAx+Do7N4o05znqPLI9jDg0M+04UDsAPAk6dzukRLVD+EELQJ89fzfNN9E1nTIDLAMnThhZEKAW9hfWDNn/bf2I/PT51e7k5BrlV+bC32zcD9B3zT/J68bkxVi9ib1zufqzsbUTwkK+fLeMuWy6EsCAwZO/rbw3wbHGyMR5wOzBksn10uzZO9eM2KTbdN0w367iBOa25SLm8eXM637r5u1H7jb0B/0O/FT2i/MH+CD/NQVQAR/9KAR5BZQG8gipCJEKnAc6Ba4I3wPgBeEHzAVlCscKeAgM/1//Uf8gA7D+JfMs9Pbx1+2W6XDmQuce6NridN0N1jbVKtbn0hXNWsjAyIvDtsFlwBu+mbx6uMq1rrIHsmSrX6a3pv6lJ6U9n3WZ2pXNmQGd6pRRjqGNU41+i12I94RghI2G+IZZhbmG7oaWhNyD+Ianig2Lj4yqjWuSo5jFnV6d6p57p5GtxbDlsRy0oLs6wrDEosaezSrWadst3rzgfOW16KfqD+1a8W7zoPec9/T5Dv6B/RD9j/1zAX8C6AE8/Wn6nPnS+ab5cvas9vX0pvLo86vyZe6h7Tbt2+te6tDpF+mo5eXmpugm62Pq/uiM6ezq0O4e7zbtP+0e717xJfOT9Lb2YPrF/cX9JwAHBkMD2gPeBi0JCQwADFoNjg7QFA0WWRWxFcgYaR7oIO8kzyM+IAEhqiLEIXkiHSt7LVsslSp1K7gs2SrZL+E3PEDjQmo/RDyvOvY7ZjxSQQJHi0nGRBpAfT0HQudMjFdEYCpm9mRyXXVZl1mdWwVgHWU9a2FqnmS+XoZmhXWcff9/n37/dUZp2mHlah1sFGcJZcdjFVjAUWxWWVgpWhFaP2DbWQ9PtkU1RrlIckx0S6c5Gi8HKlssRTLbKV0yHTeHLEQfmyLxL14tnSHxHqQgORtxGtEW1Bl+HdMcTRZUEFcRVRIQIQcjLiOKIxQaGB2cHdAnfzDYLcwpoCkvIDsruy3vMGs8X0fYUc9C6DZHOF1KeFVpVXxOAk71SghQVVh5V9ZS5kqqUl5MSk/hSHE5ni8xMDEyNy0EFlkJyRBWFOoTFALf7u3nTuYV8XbqtN9o0mbJM8M8wT7Aqb7iutG0r7uXvdyzJabQrXa6qsI6uyWyFLMbsla+z7xctlq3ur8nxDXHzsbmyyDWzdWz2Lzbd9kp1EbZG+IO62foPeCI37ji4PewAj76ffMg+h0AOAGi+7D5ywFYBxMM9wjlB0gFdwY/DAwS6BSxEPELuQWQCCEP8A7oBvwD/AMYBa4DBPyB+DD34vZn73ro2OWl5ALlx99n11vWAtQQzR7L/cdsxOG/F7n/tXu1FbC0qtmrNKiWqPukWZ24l76Zop11mZCVuZKQk+qUYZLAkeCNuopphyeIoIvYirqImolwiM6K25LMkjGPrJEamAmZFJZ8k/CWlJ2Qn/Wil6V3qbWsxbBmtn25YMCHxSjGVchUy3jPHNFi1WnbAOHy4rjiJecj71/zrfNG8U31Cvnn/ab+M/jF+Cf+xv+g/JP7IPpz+un8YvmN97P14/NF9Ev2h/UU9M7vzuh45zboWOhw5njiNuHY5arm8ONi4wLlGej56P/qsueE6OPsTO5U72DujfKK9n73Mfns/QwBTAEOAOMGkQ8tEGUPPRIPFXcXTBkwFksXbRynHHAf+B3RHV8jpCUzJX0lxCZ5KeYmuCLuJ84tfCquJ+0lkil7LdsuhjFdN2g7gj8TOv06ZEIlSXBIyUXhSmBQmk5dSjdRUVodYHxkXGOGZv9pPGl5alJjMWdjcHNmC2LsXypm9mvrYnpbSWAHX+VZmFsoVllYllclThZJQ0a2TO5LJUTvPGdDqEIvOIQymS9TPClHgj+PQBs9KjNvOrk6XDrGPUo5uTz9LhU0f0NxOZo9hjuxQE1GzzvGPXs+70FhQVI60jDIMBwzKDRVO346XzZbMzgqzCIDMVk5dTW1NyAxtzEtLRcnyS0MMcI6QUd2PvoyjjKeNPc9dUOdRUFHvkYRQu46iT5nPks0szMrNf80LCaOH8QaKRLeEqEMFgb/+5H1nfRP78LpleII2DLS+dA0ykzK2MYFvSK27q+Wr8mupK2oqyWydbhMuRCwWalrtsC8ELwvvlC8DLzPwWHCnMJ2y0XSotdh2mXdXeHb5A/ouOnB7mDum+ue7PDvTPoh/Oj64fl+94b9bQbjCB4EkAa0DFkJmQbDBwsJfw7LD3QPIxCCDyYK8wqoDcAQuBSHDyIMMgujCykLmQYlA1QEEwBL+GL0/vIX8HnwIelT4YLift+824zY29PQ0UzPcMnGw8m/PsCEvS63yrU6tn6vOKueqU2qha6jqzWlF6OHofWioJ5Pnamc65v4l7aRr5JplbyTXpGWkCaSOZVVk/qRdJLdkcWRFJQ8kXCNhZG5krCP1JOQlS6aWJtCmsah/6mprdSr7a3+sbC4vr0IwNPBc8PZyOfNutCJ11HdFuLU5QTrAO248HPz1PNk+NH83fs5+jb5MfkW+j/+fP0c/AD+X/0o+0j3zvZI9+n17PGk7iTsp+oQ6pDnuORd4bfgsOEy4+3i4eMP4aDfvuFz4sLkY+UT5lzkDuYh69/pfelT6Cjvm/WD9yD6ePoa/V0CmwVTB14L1w7xC20L3RBqFuYVgRJuFD8Y0homHR0dNyGIJDcjviQDJ18qWydFJggs3S1nK54ozypdK1Uv3TTIPOdAOD3VOBM61DtZQAVI9E/hT4VMnVFHVdBQhFRgXGVjyGUUbOVlOWHAX1JjFGykdL17nXPmZ39gtF54YSBmMWe7ZNhih1zbWflZoVTBTsBRXFcdVDNOqUQCQjREyke+SDJFyEEVOwk6Ojq2QPw91DZwMI4yrDlBO3k/YTyDOvM6VzVENXc0/zJMOFE9dztdMtQv1zDhKzouEjPkOMEx0ygQLT8pACs6MMcnOCqhK+okcijkJ1YnBTBeLfUmxydrMA48LUAgPT88EDmROME9l0EkR5JNn1BHSatPbE+zUA1Vc1BJVE5ZYlZ6SO04fjUIOD0xpCy3HvoVyBPJEJYPFQTx/SnxpOfd6k/o2eBm1ZXKEMH6v8K7JbLEs064ybrnujqx1qpArHGugrSntQa6o7ygtiizTrg8vPy+ucdTyZnNHNOz0YzRw9WK3tfhAOHz3+/mJ+117VPt7umN6+7wafMh96b5OfyQ/9X/TAGw/uYCIwKgBSkN9Q7kCu4FVQbBCA0PgxGFENwOfhFbD3UMHQyyDSUNfgrvB+ECGgRhBZr6JfPd8ffuPewF6Ozg4t593arYDNRZzQzK5cfDwpy96buEuE6xuKjxpLSlwaZzoWSfNZ6rmxuauJcdlDuUU5T2k1iP444QkaSQRI36iniOT5GYj2qQcpGykwGWnZYwl76ZopuEmw6eB5/aoY2lqaHUn6Glaat+r9iuXbFJtqy6lrsuvHa/n8PTxu7H1coGzc3Q0dMC1HHXit5X5C7lIuau6d/uS/G08BT0zvZE9zP4wfhR+t/6vfz0+Ub4EPvu/JX64/iq93/5x/cb87bxDvKK8YHsk+io58/lBuWt4G/fCd/q4XrhI9zJ3OXfoeFS30Xcyd4P44Xle+Pr4z7p1utM7srx+vbO+5D/VgMCBo4JkgwuDUwNixKpG0QfIxxcHVsgMSTGJaIm5SQEKd0tWSiEJFYlnSZCLJgtqi4lLIQr0itwKQEt7i4BLW4s/jCeNM45HTxzOG86P0Z1TRZJIUabRphPClRUVo5bLl+xZCxlumJCa8lz4WznaYlzpn3QfmZ2CnMQdfJ59Xo8dWds9mTDXkFYrVp0VyBVW1XrVoFTUk0nSEU+XjnEN3k6pDGJK3sh2iDHLlcu5SleKLYtkDGMLEEoPC2pLJcpFywHKsQtXTDpLEsqTDE1LgkuDDYHL0s05jdnN2A4HC4qONE62S99LLUrxyeBL+QsMiiALfIxdTUkNEc46zdYPMQ3mDJoO0Q8azXYLRY2aEf2R0NG2U5xT7BUUVXpV/dVEEw9Tn5LcUXjQhI4MzZ6Nzcvuy2dLawhFReyEiEPpQp0/Nzthudk4M3a8taUxk7C5sS0uy+5XrXtrSuvuK3mrhay9alKp3mohqvDrH6qaasYsWm3wbn3vr27E70VzavVHNif1jDTiNor353jauSu4kjp0fAk+Aj6d/gR+Ir7xALsBpsFX/15/OECRQl+CqoFRga2C7QM/g7EDh4J5wvSDlYPpA9uCC8IMQ5BEK4P8g0fCyAIcwi8BqYCWP60/J79A/qw9CHwY+oj6jfqD+hh3+HXE9OY0rfP68bswUe+8bzSuEm2j7B7p2alHaVeopSdvZdtk2STLJQRleyTjo++jRmP8I8AjzCNm4vijLuM0YtEjeGPC5EilBqYXJlcmXqZUZxynSKg/6Kqo7em0apfq5esXbHvsXu1dbZ1uDG4aLpJvb+/fMNCw0fFJscbyorNhNCz0evQh9G81LrXvNud3lrge+NV55HpSOlF6MXqnO1R7vntSu8t7/vxvPOT9HH0gvV79jv07vDq8gnyIfAg7hzrGOtc62Hr8Oge6GDkA+If4MffbeAa4FvddtzH3RPh4+Db3xjhguLn5ajnr+aL5y7nGOu/77nyqvdW+nD+fP2uA/gKZQ/wDqQNLBO7FzoYuhXhFesa0CCnIU4k3iW/Jv8oDSdvJ18vBzYJNYsvEiyKLUsvIzLjNuM9YEQPQ7M/sz8nQ/lIl00PT0lNu0xJTTFIOE6zV2xb3l9/W9Vcnl/1XSVcjlt0Y6dizF6aWkhcCWUjZ4lnGGDBWoJV+VnmYFVfA1xGU+lLpEkISWtI8ErAR25JZkbePaE1zzTEOVY9iUPYQGQ2aym2KG4x6jWYPig+jzkWNlI6XkBcOhc68TtiPsE9kjXCM900rDLHOh4+5ESjQAo8cz0nPBZCgECzP8QyVjHANAI2KjP5MMwzjDNROG44bjgZN4c9dzsTOnM4KTYqPa07YD8hP49F40KLOxhBikyDTVZJ4E0XSzZKhkdZRV5Aqj+4P8s4YjKVJe4bTRYoEFQQ1goSAxL6EvBd7XHohtvL1o/S3Mujw3nAcLj0rDStYaqnqYeotqmHrZuojqd4rbWsGazSrCOzSbgVuhu5qLx1xNHAr8e5zmLVBtmW3QzgwODh6PTt6++x7yT4Lv/l/vn+Bf7Z/ZMCGAeHCE4M0gxjED8RzhCgEVcRSBF0Dx8SfRQNFogRsg3QD5wT2g/hDrAOpA2dEO0N9gY2AuYCHgK8/6X8JPj380jwAeo+5MLfjdpZ133W29Pm0KfGqsLXveS72rlZtV6uRKqkqOShXp2BmKmVqZUqlTKW4ZSfkNyPdo+AkSqQoY0wjXiOT5E3kWiMq4g6jWuSTpSVlfCW1pmSnuagKqGMoZOicKUIqDCqKatGq5Kq6qrZsIW1nLb2t3a6fsBJxDzGOMNWxRHKwsxMz6XOZM9e0knVq9Uc2HHcvOB15v7mGOu87I3rx+sF7Q3wd/Hk8KzvSPDT79nx/fDE77jwTvJu87rtTu2063Trrun05o/lG+KJ4UvgtdyI2tHYathI2NXWltj61zfZYNiT11DZddpq3YXett5c3z7klec4513ol+2N8s709vjJ+x3+lQEfBkUJuQziEIUV6BRgFjQb8Rz6Gj4bIh+fIGMjciNPJlUqHy9rMM0w6zLIMC8xYzQPN9cyuTBjL1ovezQDPcM8EDsmP6BGg0s7So5KMkqNTTFU5lYwUnxMg00XV0pdT13dXShi1F+aYWVtnHGQa1xqzm75cbpsyWlcY0pbAlh+XvNenVanURJQP1JdTzhOrEouR3VDMEFMPQ0zby4mJ6klFipOMCwwBTDAKPEqLTTQMS8xEjP4NYguzCk0JzUk4yW6K+gxrS/FL3QzqjUVO6Y8ojlGQC89mDmDOu04IjUQNGw3nDcrOkQ8zDOlLik74EYuQuA6MTeyNvs7kkEHQqVBJDvnOXpBg0ZwSM5KfVDPUyhW0VdrUqZN+1NgV8lbb1wlUJ9J6EkEUl5YZUtAQ8I/FzrNK4wieRv1Gs4VpA1DBWH3/ugh6W3steO13JvM/cKZwbu6qbmutHGu7a05rdqon6YLpCCmaq0trk+uSarUpLitZrvivHe8C7qdumvCIskf1FjVv9dO3PLinOb144LpSPBG9lr4VPva+uX3MvvgAGcHvwmfCKIJJgr0DA0P9gvODjMSERLAED8Mhg1tEt4SNA+QErAOHQz7EsYUoBFdDgkKdAp0BdwC3wOhAiIAlfqA9rvxS+zS6MHnJuRx3ojaANWZzYDGJ8TDwty92rnOs/arGad4ph2lxZ3pl8KXWZZMkGyPOI5qixiIHYj1hcCHE4ibhteIkIeriPSIFIoRiSSMXpH1kW2TOZXWl8uaZ5tOoMyj66cbqxqpRKyYroay77bqtr+4B7wDwBDBiMKfxfTE5cfByjLNv9Cp0fTQm9Hq1aLXJNni2dTZ5twD4pfhBeGz4mPlNuhg6U/qBuq76k7tROsh6wXtJ+1k7HXtkO4k7BHs/esH7JTqRObl5jTp5eYT4T3g5d/k3TndR9vS3CnZ6NZe2bjYRdco14HZtNrn2fLdYN3p3WzcGt4G44ToBOsi7enw5vQp+Jn9VgONBTQIlgpvD/oQXhVGF+cXbRxpHuYhECGAIYYlFiqCLCQqXTAlMYsv0jAYMOUw1zDwMhA0IDETMMUvGjRUORE9wEAeQ5JGq0MCQmRC0Em7THdMLUygUslREEzBTqlVgmE3ZOplBmlYZ3plql61YG1pgmgaZH9giF5DYylkaV+2Xbpg0GhXY21Yz07yUMZV60VWPUI9KUKyPXA8/z5BQDg9OjWxLdUxEzwHO8YxwyngNf80OilCIEclGDz/Pj02XTBzOAs55y80M+s3DkFrPG00WzEkNMczNjLVMUc4N0ARPcw1cCsGNIY22zVUKFMkCzRhNSYzUysKK8A09Tm4MwwvfjWqP4VAgTbcN8A7CTowOklDGUp3THhJpUYrTWtUl1QSUJhPZVC+VERNMUNSPzs+mD7tMQgn/iZiJmsdfxPEDvkHaf9y+L7re+pj6snentRdy+nHAcHGuQ25OLdouoe0paqcpXmvSbECq3KruK97s0WzkLKHrSK2VMFKv9q+3MT1y/3Os9Hh1Vrb4+K44qLeAOaV7Abv5u2g8Ar5IPrk+sX4pPo4BjkI1QPq/mgERgvJCZoIlAY9CIIPQQuZBqQIqA1VDeMITQqYCccKpAhGBsUGYgmIBYj8rvrJ+xb6qvcu827uUOyK6triZ9xn3GTbzdUx0CXKksmrxA+/L7mStm+0666ypuyfVZ+inXiazJLLkAqUeZKjjO6Leo9ij+KMuopgi72Lm4v1imWL8o5IkBeQqIzzkieZYZ67nemc2qG8pvWnkaN1pSCtFbAZromstK8ItI+18beiutO/rcMOwoXBQ8W5ycvKscZQyPHNcdIzz8zMwtPu2ADca9qD2mTizuik50jkeuYO61XsBOsa6tDutvEH8aTu5PCT9GnzSPAc8Ezze/Q88QDti+z77GHrqOcY5oHlfuQ/4XjdPdtI3Tnd7Nke16PZHtz72zDag9gw2tLc+9v32yLhYOKW5J7l3Og/7WvyUfU2+VH/8wWOB0QHZQpbDwgUwRRDFlMYZBmeHA4dtx6AIdAngylZKJYnYCxyLw0saiyxLeQsLyeMJ+8rNTDZLxgwazDmLdwwxjgXP887ykCqRgxCiz2RP8RKCFDKTB1Nc1CPTF1Kx1AIXOpld2vuaN1kil0UYLBngWRGZO1mxWm6YrVUoFKzV5Vh5mAlXElUv0/eSc1DYUFgRG1FFz9VNls49DyiOV8vxS9DOi05rDRyLzw0LDdXNfIxyS3eLwA3eT/zPxA7GjsLOQM4uzSkOFBHCkgiQQZAj0AoPso7jToZPiE/VD6VNt8z1DZpNhY2BzEVOd05KDTcMP4rQDIKMucoyCltL7wxcTfROpc1Hy8KMNg07DS/N2w+c0l/SL9DX0ejRytGPkuLTspTV1IdQVo7QUAtRRI/WziHM/UtXC6tI9QX2g/SDsgMBwFp+MHzpetD6dXpyOFa1FvKJMP6wX3KxMSyvg+4oK/6tUW4e7PesHC4E8lzw3S0d7CNthm/mMa4zEzKvczy0STPpdPU27naTuF65lrn++Uh5PDj+uqZ9r/5CvRc8tr1TfxT/jX8Av0U+Yr7ZAHM/OP/IQUVBK4DgwCx+43+mgH+AtwHmgj5Asf8N/veAZ8Dmv+y/8r9JfqD97LzDOxA7//vvu166PTh/d+G21DZ49S3zy3Nr8ekxfPA9rxsus6zpa+frQCsFanFpFuh755/m1+TIZCnkUSScZYPlLqPPpAokXuRnY/ukMCTjpb+lKeR4JJwlM2UTZcdmYufd5//nVeeMaBHpqmoq6dKp+OrPq9xrvyt5qx5r0+zA7SJs4W1Grxwvdy9VsCewTbE6MMoxsHKbc0BzQrLKc9G1CXWD9fP2brc2eDf5LXjO+P55vPpUuvA6trprex17frqLO0y74Lu5u2u7vrvwe4Q6iXpyegu5zPnXuUR4oThieHo4OvcK9rb2sHbeNsr2OzZwNm52rPd0tzi3gbeFuBW4uLlquZW6T/t5O7y8773wPY++j8A2ASfCHIL7Q2FEDUWCBsAH9McUh1TJJolkiRzJe0lSypAK8gr5C7TMuc0+zZzOMg3oTfYNJAxhzOUNPE06ThAN1s4PjhgOEc4zTyRPzxAWENQQE0/qj9gP2lCxEWUTMBTtFJMUOpN/Us4SYdQSVkcV/pR+FLKU7ZR9E/sUeBZo1hIV4ZTR04GTGdKK00pTsZJOE6yTm9EMkBTQwxJpUHEPnVB3D5YQ81BL0QkRxhBfj/OPphDnEiVSepI2kRoR15MyEjYRW5JU0/pSwxHF0YuQjJF30SQQjJFQEPdRflD0T+HP8k+ITquOCI3hzhCNoIzfjWkONs1Ty2NMLIxKjNiN2oz3jHVMZUx5znDPPA5z0LEQ6pBDz7cPlI/rj0fQCBCWUAaOxc6IT+CPRc6LjYoLVEl+x6dGowUigkMAQf/kfzo7tnn8OjP5WnnANySzhPJq8RWxVvABLtjusa3YrM8sP2vELVZtaq297msweC9Y7o0wELDxci10CDPhc0T07zW5teV20nhXeiC7sbu0O568vX7Tv4c/I3+2wD7ASADOweNBXIGDQrJCXcLXAxMDXAMLw+gD0cNHwsdB+gIwwwRDfsLIgcCBuUH4gSyAYEB4/9OALb9OPhq9QX05PD171fwrukC5Z3jhd6Z2e/VPtFvzIXLJcoZxtrA6r2bu5i6u7WBsButpqxVq5elCKHbnoycHZm9l3GWbpWuleKRgpDCkCGQlJE1krGRA5XKkwyTmZENkJmRq5S3k6iT5pbFmG+cOZzOnVCkLqYDqNWogKlfq5Osl6wmr660dbgtuoO7Z7/7w5LH/MWUyMDN1M990enRxdTB1kjYytks3N3er9+14V7jeuYj6JHpD+jt5xLuzu+Q7t3qK+tT7eDrAeo76Jzmlefl5vTmwuRp4tXiMuPy4nLgYd+u3ULb79p32U3YANXA1NDWrNe/1xvW9ddT2tnbeNv53PPfW+Lz5J3jSebH677tLe/78dj2mvrB+vD7aQE2B2cJvAhLC2ITPhYLF04YhRxWINUgpR16H9ckmSiqKXApHyooLbwxazB2LdYuRzG3Mc0wpzK/MvwzYje2OZlAkkEnQ+BBbD6zP5dBHj5EPElBEkQ2Sq5JekgPSsJQd1OXVHZWVlWyU0JOQE/vTedMk09vUm1RJFOsTA1LJVDnU/ZTcVFoUSdUBFKsSoRIQkltRy1Ap0BKRQVD7ULLQtdDTERESMBMlEcPQ/9K2024Px4560NSRuE+IUbESqhMg0ZJQbpKckwETeVGBkXKR1NIrErHPwg9BkDESihKAz1CPVk+ET2eQHpDtT4IP6I+20GMP6E89EPpPyA2BDVmPPw4WDImLt42J0O9P8U7a0EfR/ZC/ESKRelEP0E7PlBCWT6uRExC6znuOmlCU0OsNO8rCy1rKcQhthUPB5IHNge5/jj49O2f56bmBeF61anRHNPjyjO+kbmhvTO3ZKuzrfet0K1qr4arzazSsQO0pbQJthu3wLziwVbAQsNEyWPNPsxDzPjYeOIm5IPmaOpC7rD0X/iA9in4ZAF8BkACyP5tBCQLwgpvCn8MeBRXFqYOzArNDJIRyw+BC1kJVwz1EMYNugmFC7AOJQ0NCHwGgASlBUEEWP5Q/eT69vjk9SXzkPMF8hjtV+bP4A/hTN1C1p/PidCk0YvKzMAXu2a7k7q0trGuiKqErO6oSKOhoA+gJp51mWeWC5jWmQWUXI0ci4+MsI/NjWCJS4xWkNSTv48Gir+Pl5TLlc2USJJplaWXe5Znlhec7aHQoUGkLKX4qKWqP6rjq/Gwd7fKtzm0JLcsvZHAGsE7v8jCi8iYyxbKYssB0iPXCNZk1tTZbd5I38nelN4r5NHk+eEl4uTk9erF7ETr5+pw7UXvg+s56VvpOuud6lfmk+Of4pHkfuS34Orfkt9n44DeVdlw2gDcLdlW1nvXp9cy19fVi9Sk1uHXediV1hLYW90u4Jvfb98U45nqYu0S8JTx5vTj+LD5W/qy/TMGzAr2C9oP3BMpFw0bEx0MHscidSSWIqIhDCXuJ2MofCp5LvwxdDMDMwMz+jJHNus3ijRCMfQw1jV9OHE3gji9Ojs3ITPMMyc8NkOjQKo/Lz/HP1tEDkaHScRPvFXEUd1M1VC8TslRiVbyWuBeelnIWc1UWE8BVhVd8loNVYtTb1ABUSZL+UjaUK9SzUhaQnpBGEi7RQA8Ej/VP4hBO0MPPkZA2Uf3SdxDdUGZQBNBIT/oQhZJb0uFSklDgUL8RBtO3k4tUTZUZ09gUIpMwkYaR7ZM8E9DSxhImUfhPrI99DyLPSJDRT5bP8I6bDfNN4YvNTU7Mu4ujy2vLh8v3i/jNlc1JTGSML85OD09QmFBXkUkQAE+skIiPDlEiUi/SpBT91DvQb0/YUF4RNRCLDwzNpgriCKgFjUMRgYcBZEDB//m+S/u1OU85UXcpNYf1A7HLMTvvZ+52bJfq06sMKpTrHew3a4fsCG0rrnSuNOzArduuZi/rMb6xn3KPsfQypfOw9UN3T3iTOkj70vxDe7J77LzZPjC/CAB9/+2/T3/G/8qA6wEeQV9CAINfQ+QDQ4MEwz7C6MLfAtyC5YKgAmZC5cMUgo/B8IDrgjECfYGtgTCA10C2f3O+4b4Q/UN9XH0tPD56EPk4N+g2GnWktWi0mTPtMemxEPA4Lsvuae1w7E8rkmqYqdqo7udbZ1sm0GYbpVWlR6W1ZUNlZeUo5MokcCRa5JekZOPoJL2ky6Ts5AhkEKVwJiQmlObKpwAm5Ca550Cn2mhC6KnohCklabypk2omqbYqcyvSLREtj60Ebc+u4a+vcDswVrDL8WEyfrLv8ufz+nRCtU62undbeB64XbjeeSt5zzqNOko6rrtye9q8Bzw/+/y7ibwTfCV7vbssuxO7crsSuos5rPkPef25bjikt883lPc8dkk2TvXodWh1fvUrNfD1abVgNeU2Vrbdtyx3jDfwt9+3+7kwOpc6/jrEvC99Qr5afjd/XsE6QpTDkUOZhHjEtgVqxqTH3EhYSIXIoIgvSLJJgomUSdMLAMxfC/kLDouQC2/MlY40DhiNxMwSjJeNBQy9i++NWc+tTyTN2Y6H0CnPjhC+EsRUwtRlU7ITSJPBFKbUD1Ou1FdVF9TfFNWUJBTFFuPXVde013pXPlZ01buUC9Q01HHS1lKHETYQGdKv0reR31E5kMISyJIFUVQR0pKw0E8Oaw5kjw1Qe46JjXuPyhKAkxvRlhDhEgOUkxQjETLSexHf0NFPspAj0XuRH5Gf0h8Tg1LsUreR4NBdUMxSCRHFEN5P8E9ZjwMNsQtRzjVP9o9PjpLNC05OD1MPQA8qzw+P7xCHUFKOQ0/DkG4PxNG8UfnTJFLEUk2SCFSAlP1SpdIaEVHRBtCpD0XM/MuFiqfIJcYARDWEXYO9wOz+un1avCm6KbcE9W81ATOqMPDvX+4a7GArm+jpqWsrgGuVasfpNCm3quBsFqrh63jskqz2rRWtPG3f70twSLEFc1M1iXd0OI33uHhyeiA7/bxPvWs9l77iwET/qT/RgRVBpoICg4/EYAVqxMhD08QbBVtF2UWsxSKFf0W5BSnEKwQhRC3EmcT9Aw7DosSXQ6PCwwGzQKUBIcDrwDa+t/1wvB67Z3qvOej5dvfdty02pPXHNOCyu/CCcJ0wNS807XisKasVasqqJygSaBZnX2aN5jhlg2V0ZLfkI6PcY9XjVqO2IzaiUWKh4t1iPyJfIwAj+KR6ZDfkFuVjJcml4KVeZd2m4WdKZ+0noehlqOvpaunGKo8sPuwabJWtCK4iLtuvkq/T78exLnHcsgGy6fLvM/A0j3UxtaL2/zdEN5W4ivky+dn6P7m7unS7Wzv5O5M7rXtHu858FTv4e9F72rwUvAP7errWuy066bof+ZI5I7jPOWg30DcaN5l3RbbUtis2TndSNgz1FPVzdp8217ZOdjP2xHgud9f4LLgQ+Qe6LrtDe6I8HH0H/bB+IH9qwKbBWcJrwq9CvkOyBO2F34WsBqPIQIjoR/DHygogylmKWonPixHMeYtzi1oLys19zhnN1k5ijknPHk6zzuVPeU8zUGNQeFDPkTrRftH2ErMS0FMalC1TzpSEVU4WnBZRlheVgRXfFhmWYhZpVeWXHtd9V0PYIJhI2K/YrNh/mBZXS5TuFAXUJ1Ps1BFUWtUV02tQoxEFUXoQoZCZD1vOpE6GjSCMyg0pzKwMjU6Vj0pNnkzCS7KNFY4ajo9PQM9cT5xN3Y5/TrCOlI6ajoXP7M//D2yOxE97DsQQIZCYD/XPFE4ZDsTPNQ2dTeUO8I6LTn6NBA5kD29OjQzYjL0N1c1Szb4OrI7WkICQhE9Pj/iQJhF0kjwRZpEIEQXP6w+rj1zPVhDXkU0P+c5nDe2LxsqHCLzHS8gIR25DCsApfxf+L/0F/AF6C3j39j01X7Ogcifw/u89bo3unu6xbDVrRat66zws2axq6zVrXO33ryYvwG/CL5jwSXF4Mn3yqbQwNkY2n7ateF+5PLn7e769D344v0Z++34UwK1AhQCZgU/BUUJxA5VDVoLnQkuDT8RuxBaDdIOPg+/DhcPIQ98C5IMjAqsCX0NsA5+CiMENQCcAE4CoQDm+Uz6pfwH+GPxnerQ6ZPoCuih4WnbnNpO1ZzO", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAAD8CAYAAAAfZJO2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO19bcwtV3Xes+ace6997UvNR2q5tqmdxqFyUGMSi1LRpBTSlqQoJFVEcVriJG6cSKQhLVUDVCpp00ikTUKp2tI6MY0jUQgCUlBKkyKXNI3UODEf4suhgAPB1sXGfNlg+957zqz+mL327L322jNzzjvvue+5Xo/0as7sr5kzZ96ZZz/7WXsTM8PhcDj2Fc35PgGHw+E4CPwh5nA49hr+EHM4HHsNf4g5HI69hj/EHA7HXsMfYg6HY6/hDzGHw3FoIKKrieh9RPRxIvoYEb0ipD+FiN5LRJ8M2yeHdCKif0dEnyKiDxPRt40d40APMSJ6IRF9IhzwVQdpy+FwXJBYAXglM18P4DkAXk5E1wN4FYA7mfk6AHeGfQD4bgDXhb9bAbxx7ABbP8SIaAHgP4SDXg/gpnByDofDAQBg5tPM/IHw+REA9wC4EsCLAdwRit0B4PvC5xcD+HXu8AcALiOiK4aOsTzA+T0bwKeY+V4AIKK3hhP4eK3C056y4GuuPoY1WgBAm0QLrEFdWtxvQhlS+/1zt5U6TGq/yfbTMqzqcCUfAOT0JC3uc18mbaPbUXk6IELllw1MSAcAqHb2LfCiuAwDX8C4ZNV0ytshXSbkm1Ulj6T5fD9Na1Q7/X6eDwBNTGvVPmf7aZlF+E+QMnE/lFtkdSikNfjM587hoS+ta1dsEv7WX7+Ev/il9aSy7//wmY8BeDxJuo2Zb7PKEtE1AJ4F4C4AlzPz6ZD1eQCXh89XAvhcUu2+kHYaFRzkIWYd7C/rQkR0KzpaiKdfucQf/s7V+FrbfedH2lUs90j453607U7pYT4RylwEAPh6G/bXF8c6j4a0R9vj+XbdbR8L2+7zMQDAmdD+4+tuezbsn1nJ/iLWObfuPq/aJux321VIX4f0tu3vmXUow616WIb7ipOy8bNs4xNVpacIZUjX0VugeGBS8UAtm98K+nlaeXBkZdWWG87TU0ieLhP2qenbl8+0UA+bkL5YhIdBUmfRdGnLRfePeyyUWYb0Y4v+H/p4030+sVyF/W570aLbngj7Fy/OxToXL84CAE7KttHbM7HsqcVjAIBLQtqppvtfeRKdCWW79k8l1/RU0927lzYX4dl/K/2X3A5f/NIaf/g7T59UdnHFJx9n5hvHyhHRpQDeAeCnmflhSt4MzMxExd05GQd5iE1CeCrfBgDP+tbj/LX28fjweiS52x9pu4fM1/l42O8eXvLQig+xkA4Aj67zh5g8qB5T++nns+EB9HjYPxceWvIQO9f2TE8eVit5eIU8eVDpBxYAtK2kIcvjUDZSTaD+sApligdV8rn2ECOjbL9PZRmNsVtp4B0vP2dxP6Y3bOUhFilG2n58wEkZdfDwIOLkgSRlqW2zPArp8nukD752oRh9qLsOD7N1cp+um5zlr5q8x7BaGL0Axf7Xocw6nOzauKhpj6P7ruH48rs355LCQgYej72cg4ABtDO0IyCiY+geYG9m5neG5AeI6ApmPh26iw+G9PsBXJ1UvyqkVXEQYX/jgzkcjqMPBuMcryf9jYE6ynU7gHuY+ZeTrHcDuDl8vhnAu5L0HwqjlM8B8NWk22niIEzsjwBcR0TXont4vRTADw5VaJnxSLuKDEzYV/c5dBuFiQUG9nDbbYVtfW2dMrG8GxmZWNg+njCxxxUTOxO6k9JlPKtYF1BnXq1sFesCesbVdxVDhsgUaV+rxriELUjdtDemywx0J6uy05D8NMLELEkv1iX9oTwcKQYW2VuT76dlIgNT3UmToYUvwPLbCDMT1rbIj9eVFQYWtoGZCQNbp3LBQvRcxbxkP/xjtyl7iwxM67u5lptiXeEXLRnpwsraVaYzHwQzMrHnAngZgI8Q0YdC2msAvA7A24joFgCfBfCSkPceAN8D4FMAHgXwI2MH2PohxswrIvpJAL8DYAHgTcz8sW3bczgcRwMMxnqmhyEz/z7qIsQLjPIM4OWbHONAmhgzvwfdk9PhcFxAaPdouPvQhf0UaxAeYYrdyFSkfzh8lhFH6UZK91G6jI8k3cm++5h3J2XkMe1O6u7jmdh9DN3JVT7iCKTdSOluhC6KjDQawn7sNsauYOj26XSg2m2kKcJ+TdAfEPb7MuMj8LpbGbt9Eyrp5snoIvaDALJP9bJRwFcnobuZSVqc7JPyupawL13MXtjPf+920f9oaxkwkC6ijD7H/byrmLUb86TdvHuZohD25fjNgIzdnDMHCTYFA1j7Q8zhcOwznIlV0KLzgYl4L1ugzsAeUUwstU18fXUiS9MMTNgX0FsoRKwX5iX7K2FiibDfC/jK66XtEqm3MLIrxbw060o/q7yCZaXsrcirCPwpLPtFrWwFwwws/1DYKIyyrFiWFvy7vJDUkqoT0jVDy+qEBGFgwrzE+tLbAcHBZhNtGQthbV2d1Aco7EkunYj+wsTkfrKZmL21sK4wMcEiuSmaMLK0aHkWOZ4BnNujaeudiTkcjgwM9u5kDWs0eJhPFEZWYJyBadaVfn501ZURJqb1L6C3UJyrMrBcBwGAdpVrYL3elW8pY2LI06K+JVujrGZcRXpKT/LtoMVigqUiK7chakRCETPTNqG1sML8ikQL0zaMJq+b2SU0O+vjdMK+0syA3jQbLTNixwjb5PR16Bkv19l+uyy9UyUDq7OsmLfNf2ZTt2ZsBAbW+/MMcybmcDhydI79/cFuNTEmPNJeVBhZgekM7OtJPOTjq1wLEwZ2No449l9Pjz6uVrlxNYYQJawqal8FE+s2pJkZAAovYlJlepNqfz1IsbQ4klmkl3XqI49GGlTeTGbXgohVtDCLiRWjndrACkDi61gxMIojjkYdYVrS3kK0sJAuZtfUoKxYmtAtYWstp2WlTJsWBS9ztpVOEjBGaiyza8SG/6FDOtt00CyjnLuCMzGHw5GhE/b9IWZijQZfb0/EYG5hW+nnMQYm7AtIRiNXMhqZe75STUyYlh6FLDxfK8vzZXu9IstKZBDSo5CFJlaWrZYZCOquaWGTyqKyPwHmra0TK14wM02Xbetle+aVa2FWALhIQyTMKAaAi95l6IxSRrFmblPRrcsUzUgzL17mTXZl7LIbIbQro5JNcqH6aXvaWTSxzifmDzGHw7HHmKdbuhvsWBNr8Mj64jg6mQZzixamg7g1A3tsVbrwawxMWFf3OQ/aLkYeV0r/AgzGlTMvy4Wv2VShjWWOfZRpRl1L5yryJkzFs5FPTOcN3dMVDUzrXWleOZ+YykfJwOJ3XOfpZPjE4siiYmaie2WMT3vHWO8n7Ue9LBxb+alqE2cOYUrZRt8kFQyNfE6FMzGHw7HXYNA8Vo0dwR9iDoejgHcnK2hBeLQ90c/IakwfXYQSVWwU3efhbqR0IQGgDXntKhfyIUK+ZVxV3UbdjTTF+mixUKK/VXbU5BrSBywWw2ZXLtKyOoJtjY0Tu5GcKPtVQd+wWFS7mkqAT+dzi4K+slSwmk8s6wVGPwar/ZCfhijFD0GO0DaMYLXoJ17fDHpW3Kby4ywSDUPKLMDDdo2JYBDOpnFZRxzOxBwOR4bO7OrdSRMtEx5tjxd2CqCcTkeHEmkbBVAysHPnurJrJeIDCQPTAr4S7VNhP6zJUIryUawP5czBAGR1CnaVlq1ZK3RAeFpHsaxBs+sI85or7KhcWUjKsZGW1zFDiBTzKthaFPaTOpqdyXaR/4btIjknMcCKBSJaK0JZ45pqosJxha14wJi3Ooi1QiGukJSupiQrIlE7WzfQhX2Hw7G3YKbRWTSOEs6DJna8sFGkn/vpdHINTOtfQJ2BmSFEq4oGtrLtE1lejV2ZZld7a2piY2UDrbCm4pnF7AqVvyGqL/2tzK6c7QMoAr2jFlbZpmVI62acl20s24QOFg9lUl2KlV7Wa2Sy0YwM4IV+IIz/2xXaWDS5crbfnW6YiofaWTQxYCQUagMQ0ZsAvAjAg8z8zJD2GwCeEYpcBuArzHxDWJfyHgCfCHl/wMw/MXYMZ2IOhyNDJ+zP9mj4NQD/HsCvx/aZ/658JqJfAvDVpPynmfmGTQ6wc7Pro+vj5rqQtQkNzw6EEsUQIs3AtJEV6BmYNq6ucjaVjk72ad22KcKOwtZiV5q1DTCxnqXlzMsMGq8xr0EmpqjWIWli5WilHq4sza6lNpY0F5mYNq7qsKOkfZ1WsCu1TQ4q7cUVg+Ktln4BNYIpyVojQynU6Ul6iOojgE3BxFhtEyYmaWuezew6l7DPzL8XGFaBsJzbSwA8/yDH2J+Or8Ph2BnWTJP+DojvAPAAM38ySbuWiD5IRP+biL5jSiM718QeWx8fXBeyWA9yle8PhRL1wdwSSpR6vioamGZihuerKXxiedlBTUy3mzExNusMjU6WPrHKKGUtLUmPbR4aEzN0roKJ5WwtY1VxiulQREYNG5uZASU7074wnZ7lLeRwXXvmPPPaQxbT7eQsLXxXWTtytapf+HJNFM3E+rqRic3oE9vAsf80Iro72b+NmW+bWPcmAG9J9k8DeDozf5GIvh3AfyOib2Hmh4cacU3M4XAU2KBb+hAz37hp+0S0BPB3AHy7pDHzGQBnwuf3E9GnAXwzgLvNRgL8IeZwODJ0AeCHrjR9F4A/Zub7JIGIvgHAl5h5TUTfCOA6APeONbRzs+tj62NmdzJaKVa2oN/PBzYQSqRtFKlIX+lGNrqLmHYNJ3Yj7bAjvV/aJUa7kdrYapUdFPbz7sqUOffnmNm1DD9K7Awj1oqsO1mb2bWFSk8sELqLKVk1gd9KC1uxYaTz8cfuadiP3bfhsZOQZhti0xAlsVacVfuCIbNrA57F7MognJsp7IiI3gLgeei6nfcBeC0z3w7gpci7kgDwnQD+JRGdQye8/AQzf2nsGM7EHA5HBubxJeOmt8U3VdJ/2Eh7B4B3bHqMnT7EGIQz7bJnWevSuCqrEJ0r5sQPrGsolEjbKBJhf5SBKYE/ywsvzqLOkLC/roj2U+YeE9ZmhSopxiVlqyJ+ljeBLozAfM+PWisSJqOZmJoTP5vnK65CpMqq+cWsUCs971dcS9IIG9Jp8RRi++nIRP5BTiUyMuMClWMAipElcVMrCXUL7cj/gbAt+T9J151cBqvGkpbgWUyqNJvZdRdwJuZwODIw5mNiu8DONbHH10t7hW6lga3UqkSiibWJJlasRqSm0yFDExtjYBarqulmdh3FwCqm1zzNNrn2+lepiZVaWDnGX18Z6eCMrGtINSNB3PGkQnq2gpEqK3PeW2XbnHnF+fHVXPuW2bXUwEToMjQsJf/07GoI8uUrjMwoGgmdzEwbGFhrVQk/cNyG/wudDuQ62XwB4P4QczgcewoG+aSINTCAs+0S51ojhGitGVjQwIpViQZCiVb2FhhnYHHaHWuksQg/CgUiUzOYUjXsyChbK2NoYoW5dW2nZ6iaXrelYAqKgWndK2WqmpXEdSBlP6EloomR1sQqulf3WZfJjxMnMUwYk1yX+NPE0cm8btpe/5NswMjy5vv9bPRWGWJjWFZXayGTHiQ/5rLpzuZsu9yaVOvzOzdf7OShY3/O1OFw7Ai+eG4VLRPOrJaFFwxItLDoC6OwFSYmI5BJX72igdmer7AdYWBmHcXA4sjjBJ9YUxulzNJs5mV7yxTjKvxiCdPTr2U16mli7FVu3ts5A0tXH0rTu0wppL6b5RNT2pd8t4KZZXVy3ayNK3aHAhJaZHi/+nCjcch9U2Nk2RWIzFSFWEl6qvNqi2PUwBaqqcP0ic2zatKu4EzM4XAUcCZWAYNwtl3gnOhe6/5pL36wOAqpg7otF34xxXSePkXfKjQsg4lVGZjWyNL2WputDWtimrUNjTgqVmWxrIn+sCJ/IljNRx1315zl55MihvNU/rBeFCuvTzkJoiqbfeececmEhlora01DujCa6Yws0/uAXgdML43cp2Rfl/z08wbaRv4vuuQmMM30f+dcKLNoF7P4xJhpr5jY6JkS0dVE9D4i+jgRfYyIXhHSn0JE7yWiT4btkw//dB0Ox2GjE/YXk/6OAqY8blcAXsnM1wN4DoCXE9H1AF4F4E5mvg7AnWHf4XDsPbo59qf8HQWMdieZ+TS6eX7AzI8Q0T0ArgTwYnSBnQBwB4DfBfAzw211tgptpwCSbqQytZaG1qRBLc4PGVd1l7PSjUzr9KsdhW5GYa0wjtPmZaeI9DpIvFx/Mulw6G7jkNm19AOEMnn3cdv5xIqKunvZ5N2ntIiEEvXm17ybCSTdRvnO1bnCkjpc6z7K9Qmm5+Q849hCtFqE35DHu5XlCk/SVbQuqhw72DyUFQVAvM+5yY2wsacu3cmm/wap7WIO10wn7F+gmliYZvZZAO4CcHl4wAHA5wFcXqlzK4BbAeD4n33StufpcDh2iAvSsU9El6KLMP9pZn6YKHv7MdmvHoRZHm8DgEu++QpetU0UJdepsB/eQK2Emuh1II0VugtrhWJXTVYWWZlaKFEm0isGVmNxttnVtlZkwn5lmp6ekRnsrZjJVbEty2IxZIRN29gUBQ2Rkwq7kUak9DD8VoqlaYYGILpN4yBAbaXudA3JokxoCtJGaXaN8eSc78vMrk3yPTUri2RREuSeyOqo6yL3qxwoG/jI24nm10YsR4HNJUxsJUbYpplH2L8QHftEdAzdA+zNzPzOkPwAEV3BzKeJ6AoADx7WSTocjt3igloBPKxIcjuAe5j5l5OsdwO4GcDrwvZdY211mlgTtbCUiWlLRW2FbnM1ogoDG7ZL1NITE+GILaNRlosuT2tiFd0LKFc5kva0FpYSGTk/bbEY1MRGNLAtmRgpJla8vONE8UlGFJ4US5Myi7JoPD35HsrAmn6fml4W2ZCxlmRtYsPIyFJjqbZfkCqr0rM6agLIeN9k1yc7zZgn+mBvuejPadXIPdfMo4kxog1qHzCFiT0XwMsAfISIPhTSXoPu4fU2IroFwGfRLb3kcDj2HF138gJ6iDHz7wPVjvYLNjkYM2G1XhQjkUBiapU0eVPrtRmNEcdide3ByQrzbc3IarVbY2ApuyoY2Ertm6OTnO33wd2aihhlFNsyp6fWr2cl7MxmdtX3veiY1vTUmqURqwJJng4Sl6LG6GShly21gVW+a6qJKZ1MsaHc0KraU/8ZveE3qSHtiHk33oulZsia0rX5/4WEVbXJxY4jlrTIr8UB4I59h8Oxt7igLRZzYN02RWgRkDKwkFAN7k40sYJd2V4wKy2+XQfCjrQmphmYDu7u8myW1qcbI5mRRYW8CjNLyxQszfCEleFGI/spimG4skj8JShnxD0dMXxivdAUigamoQO1gZKd6TKyTRYKiWUEEq62yBlUuvhHq/1bcT//WikKllbZz9OUh0yNVgLliGXPzMK1lP+d5PcQfaxpBn7PjTBfd5KI3gTgRQAeZOZnhrSfBfBjAL4Qir2Gmd8T8l4N4BZ0XPanmPl3xo6xPx1fh8OxM7Rhnv2xvwn4NQAvNNJfz8w3hD95gF2PbhWkbwl1/iPJ9B0D2PmkiG1LceK71BMUJ8PTjKvN2ZW10EaxQvdGmljOpnKfmCpT83Wl7EprbIXulZ5TRRNTzCxtv8a8yNK/amV0/hRsYFuPzEuWWMsjwNNN7wVjQz+rMq/iBNKj51msy5SaWG9xHGZkQK+ByT2hdTRLE9NpTfR+CVNNyoo/rMnv6WL5OuN/p21Jf/ut0I1OzhMXycy/F0zyU/BiAG8Ni+j+CRF9CsCzAfzfoUrOxBwORwYxu075Q7ee5N3J360TD/OTRPRhInpTMnnElQA+l5S5L6QNwoV9h8NRYIMl2x5i5hs3bP6NAH4OHS3+OQC/BOBHN2wjYrcPMSas101ibE3Vybz7WAju0q00xPqaFWJQ2B9Zlcgso42sltlVdQ2blepWpsbTqrWiVelpd3VY0CerO6n324FOx1gXswg1StCoLmEh9CdhRkrghxb40XcxpV1Zr5GUjYKSOkXgd3GH626lYb8oBPjknLSQr8y7prCvZ6/V91x6SWM7oaupr1PsbiZGcZkjYc2G43hzHPboJDM/IJ+J6FcA/FbYvR/A1UnRq0LaILw76XA4CrTcTPrbBiFMUfD9AD4aPr8bwEuJ6AQRXQvgOgB/ONbezruT3FK/onPqFIxsR1kqhtiVevsNsyrJG2ZgpnFVB4LrUKLMNjHCwIyyWuBHG04mnlOq4o4I+imTMpjcpP2p0KxMv70pZ1JdUu4krQn8QM824gCHfB1lo8hcGeoU41z4VUbWN6wZWREulJ6/ZlFyX2kWCoO9yb4wVzMUTdrNB0ni2pvpqlDW/9MBwExYzWexeAu6KbueRkT3AXgtgOcR0Q3ofrrPAPjx7rj8MSJ6G4CPo5vH8OXMrOfOLeCamMPhKDBXd5KZbzKSbx8o//MAfn6TY+zWYsHdxWEdUgT0r+QidEhpZIM6l9paKxdVGJgdzK23oUwRSpSwtxEGlrE2baEIjKvQvYw6fV6b71usisvzrJbdBtpioUOKWqOs6E4LoRiKmQEgqSh5YZ+0CsLlx1FGlhYQQ+xSsSnNnJBOaGhrYKYmJp/VRJCRzaWrNan7XsKM+qmW5JpyUicwRiafFNHhcDgAf4gNgtdUTjmNlHEpLUwGiDQzA4ppnGujlN1nPdI4vDXrTAolGmZgMvJoluERRpZ+rjCwjG3VtK8pr2vN2poJN7Wwk5o2BoOlybkERmYaY4MGJgyM5fqo0cuw05WRQ+tTHFJYRIeVSqSYWdIgaVYV9/PRyrRsZFnKsJqF0gnzanRd2/wK9NohzxR2dEFOiuhwOJ5Y2MAndt6xc58Yt1T27wGDRdlamL2CdqWMUbZsz/aC2WU0M8v3s/oVBmb7xHJWVY5SGuyqVe0NhR0JaqOVKWp5huergDEaqetE9qQm+7PKxtG7yK7Cd5a64hszT9RmZD2rSr5ndVVy5RdL09qcpRULnwzcp4U2ZpRl9X9Q+May/51kxHIOnxjni/gcdTgTczgcBbw76XA49hauiY2g604aQ+86rGikewmMC/p213DaNq1fhjfVu6A6lIi04J4NArR5HdVVLMT75DPVrBVThP3UPKtxoLCj3C5h1lHCPkX7hFFWtRO7ldEB0Ya6TVJGjpNbE2K3knQHE313rLBNTBf2dWhRbmDN7+2awN+Vybursaz8zPH/oGx/LrMr0Idv7QOciTkcjgIu7NfA6N4a8W1TDkPHPNbpaj/5XBVOB8vabMo20yp2VZkrbKhsIeJbado+ocX7tIwW/c2wI8W4FMviIdZVs1gYdfpQHCuiGT1DAxIalQ8CxBqWHaNyvF7Y779nTKsta7420vVpRzOqslwAififi/7xXtbMDKlIr/K0wG+VVQysn3OOijpoCXNMKCam9H2BMzGHw6FAWPvo5AB4+HPxtpLpViwZZ0QLy+pU2u+Pk9e12ikYmGkwzctGNmUwpWoIkWZgZgC4ZmSGfharGHoZkIsxYxgwibJe5khPybNOY7mEgUkdNZN9asdQ1oqIRR4Ynn7lmCbXMOpoislk07WGunodSG25QM8Oa5oYK5NqdsyKNpattRl/RmXl0D+vxbjm8bpmx98HOBNzOBwZGN6dHEZqdjU0sfERx74p0m+lCrvK6wuLUvtG+8VopD7eumQ4pNlULbg7SRtlYCnV0KOSqkymc0W9bFgbG5wkcQhRJ1OiUgyNafJySLSvQq8LOYuEImk2VZnoPw0I10HicV/OScqmzDKOlMpx1Wiloa1GltZoxiQm3rIOq/uy0H27Ezfr6LL5NFalTnYg8LTItKMCZ2IOh6OAj07WEEYnzamm5S1Se0sZb62CpbFmWUbZarulvqXfzNXRSWuF7ti+GqXMRidHGNiAT0x0pkLvypbBGWFcQ5rYlADwqCHFWJi8LEdK1h9SsbN47RZBGFqnP1rFJzaw9FKvgSkdSvb11DZAz6jltIUNyfcw/IaFNqa0sIxdSV7UUO2Quq5d1Y6STbWPLP2O3GKe0UkX9h0Ox77Du5NjsEZYitFDm5mZdTS70voa0reg1K1oYZmOpuvkdYuRyKxdYVPqVWp4vqoamOX9GmNgUzQxxbIG/WLxuGWZ3skeF1TMdiM9yV7qwj5l+phQVEYwF8Z6hzrovWBb2Q+dnW909ctU1xJInZmz5DrpqJFQNtX01P0i099EhmRNs13zfhn39Bjz4qasM+eoZGxyj4T9/eGMDodjJ2DuHmJT/sYQ1pV8kIg+mqT9GyL647Du5G8S0WUh/RoieoyIPhT+/tOU8/WHmMPhKLDB4rlj+DUAL1Rp7wXwTGb+SwD+H4BXJ3mfZuYbwt9PTDnA+TG76i4i+jS9LQR4wzaBShlzaFx3W1WXLrdY5MJ9VdAfWBdycDWiWp4W9BOzaNGNbNf5viXWS1ekEPo3MLsaiK2JcVWv+NNIlzqpFLuYUrvrPhbdSqAU++N8/OPXVBth+25kORgT7x8t8Gtpo6uYbgpLhWkFUqdd2IeMW6JqbjX+DwYNsFtiLk2MmX+PiK5Raf8z2f0DAD9wkGM4E3M4HBkYhLZtJv2hW4rt7uTv1g0P96MA/keyfy0RfZCI/jcRfceUBnbMxDp7RT/EnAimlTfOoDEw5uVvx8GBg9pAgRbtzTIVQd9iV2oAQdspuvoqTQdzaxE/LVNjYOkqODXmNWmOfcXSmoH3nQr85hozA3p2FofwhXnljAwwxP743UTg72B+G1L3mFLM08GYKPJrgT9WSX/fihVoQKwvywpLNKxGtXb0cczJEwDM5O/agIg9xMw3bnMMIvpn6NaXfHNIOg3g6cz8RSL6dgD/jYi+hZkfHmrHLRYOhyMHH/7oJBH9MIAXAXgBh7cEM58BcCZ8fj8RfRrANwO4e6ityQ8xIlqExu5n5heFZcbfCuCpAN4P4GXMfHa0oRFNjNRUPDrfGo6usjaDVfVz0of9tV03T1M6SDERYVpHaS5K37Kn1ZFtzszMwO0RBpaztgrzGtDCqoYrEqQAACAASURBVHaLwIpoyqSINWaGhDWMMLKuntTR5xvdoyE/ZVX5dY/T9ig9Kv2hSTEwaKZkaVbi443nGM5Fm3jR2y00uypYV5LX15X2pQ3V6zDanQVztqVARC8E8E8B/DVmfjRJ/wYAX2LmNRF9I4DrANw71t4mmtgrANyT7P8CgNcz8zcB+DKAWzZoy+FwHGHMaLF4C4D/C+AZRHQfEd0C4N8DOAXgvcpK8Z0APkxEHwLwdgA/wcxfGjvGJCZGRFcB+Nvolhf/x9S93p4P4AdDkTsA/CyANw42xMkfAItVaXa1ic5V09OsNFKMSYcYpXmFvqW0K3OkqzaCNjQ6qZmTNeI4xsDMaXtyJrPRZIgKPPDaKxiTMLAkPZpOa4wsFYjanHHFdgoNa+CaxmuQm1GzSxCn56mUzUYa82P3bCrXyobvPXXaA/c0q/1B9pb+bx0ADKCdKZicmW8ykm+vlH0HgHdseoyp3cl/i47+nQr7TwXwFWYOi8PjPgBXWhXDaMWtALB48mWbnp/D4dg1GJhj6bddYfQhRkQvAvBgENqet+kBmPk2ALcBwImnX81ggzmln0d1rnodXSYPO1JpxbbUGqqjklpfyfQPmwkU60MC1amlI1OyQonGGJihiZWjlAOv67GJEgcCgzVLi8wsHdmUc6oxsuyfR85fTWGtmWqqb8VpdGy2zIqZAYaPqzJKmdUfGaUcuvdq2thQmaFehsnODog52zpsTGFizwXwvUT0PQAuAvAkAG8AcBkRLQMbuwrA/Yd3mg6HY6fYo4fYqLDPzK9m5quY+RoALwXwv5j57wF4H3qn7c0A3nVoZ+lwOHaIaaL+UQkSP4hP7GcAvJWI/hWAD6Ii1hXgfkWW7BKoJ/9o9w8TTK5Z1zA/gJ6z3+rijlkrrLCjoquj082ylVkmam1hoBuZiui1buSEufVZHbMXtIfmIMvnCot2gPT7KbE/divlbkiPG6ffD2kLyuoWAr/+nNatdC+z8xyxWmTNyL5cfnGG6DbSwkWXs2y/aqLV+clX7LueMz5U9oiJbfQQY+bfBfC74fO9AJ49/yk5HI7zCsasC/EeNo6eY99iUTDMr0ZZ/YabUqc8TiqMSxnFiIq3vXWczdXWQtCPGYbFQh+nJuKndVS7mm0NnttA2YKlVRgZUBH703Ns0nNcZO1GgX/IcBtPeOS3aoyyI1YLAGBUrBQD92t/P9qmV6ueZl67Z0b+EHM4HPuMC7U7OQeIUQxPx3QY7GlgOLrAQJ4VipS1N2g7qKWX+kqpvQ3oW4Uhs6LnZIes6GgWpjKwTdafTBG8CdLeGCOzz7GijQGGFmbrW9bMruVMqPlvlTNWdX5D95j6rlEb02zLqltpd0oI0bDZtQx1OjD8IeZwOPYWKdHYA5yXh5htdq1ctAnsqihjtq/rVhhZVqfG2urnVNXNLI2mxqammFNrWljG9A6Jgen6UxkZUAZ117QxoI8Fj7E36vh6lDItq/etlb9jO9nXSPQo+c0GRieF2dW0Mv052S/0L6NMmV6OyA62syUuNLOrw+F4osFHJwcw9oSvvoEm1t/0+Ad55UwZgZzQ/qRRScEWU0qPMrBtrwEpxlVjZFMg3ytd7Sie5xajlLXvtMWo8XD7pb67eVuVz7UyU9o5IAa15yMGZ2IOhyMHw4X9OTDpTaC0haEg3Frd8ril1lB16g+e2wHugm3WhZyCuRiYrl9hZNs1mVx/7eJfbNHFmfAd9YhlzbkPJNpXn1Bps/w8OMJYPbfBwxwSyIV9h8Ox53Am5nA49hoHHLjeJc7PQ2xKdw/Ty0zBaDtzvXnG+ghDwcpbHU5ZCA5qmzgMZGFTQfwXq8WB2t2gXzZbl3w4e67u31g7pkF2LuyZT8zXnXQ4HAWIp/2NtkP0JiJ6kIg+mqQ9hYjeS0SfDNsnh3Qion9HRJ8iog8T0bdNOdcj8xCbelGKefrPJ1pMp90t10ObanmDddpRuwW3vFGQ99yYdPyh77HVdRnIy8phs9/vMLHBPT35/+Sg4Il/4/g1AC9Uaa8CcCczXwfgzrAPAN+NboWj69BNaT+8ZkfAkXmIORyOCw/M/HsA9IpFL0a3uBDC9vuS9F/nDn+AbvboK8aO4cK+w+EosAHbexoRpYvb3hbW1RjC5cx8Onz+PIDLw+crAXwuKScLEJ3GAPwh5nA4cjA2CTt6iJlv3PpQzEx0sA7ykXmIyWDI6KU7SoMmcfrkKWXFuDmQt66lG7+xXm3bQJwu5jzpYpPCjnQAeJZXqT/U7tRQp6MkpGxwT+9s0PBwb5kHiOgKZj4duosPhvT7AVydlJu0ANFR+ikdDscRwVyjkxW8G93iQkC+yNC7AfxQGKV8DoCvJt3OKs4PE5NoDiqSCkxmaCMYbWeuN9zY1MlpvrXQxcaHC2wrssLkvXRUPGNpGFKzwRTTo+1Svp1S9sDHHM6eiymNtZPlHwY7m8ufSfQWAM9Dp53dB+C1AF4H4G1EdAuAzwJ4SSj+HgDfA+BTAB4F8CNTjnFkupMOh+MIYS5vMPNNlawXGGUZwMs3PYY/xBwOR4adedFmwpF9iE3qRqpuaW1rtlObSDbr7uWzNMSum+wPntsBOL4S+tOu14HurTh16cC6jRu1p77jAWav6Js0rtsm85KVDY4WYdUt5bhV+Wb7tTbLz8V9OWXRpvM1kOWTIjocjn2GM7EhjD3ga/kbvL02aj++Zbf41aYIyxOYQM/whCkJBRNmk9goJlgriva11aLGyLaFYmAbzegqsKwWmtmF/UmDArUymwwGbNL+QZqbItJPaX9O8uQPMYfDsbdwTWwcbL0M41Wb/oYz20nrDLzhel2LB84pZ2mxzJDJNa70o7+HcYAaq9LsMGU261ynkzYort+YtNPmjGuUkW2KMQYm+Uk6qfMufjyLxdVYk9VGwZDkeEMG2W5T6E/xN+uTdJlCL5tw71kWowJVRsZF/qHoZv4Qczgc+ww6IhbDKdj5Q4wJIDXqJ+npNuaoN9s2I455+xUGNhTiU30r5qNZXVJemMXcKQdqjFeoZgtCzIxwpN7cOkEbi6FOExnZlpjCwOrnOKBz6fqNul4Wy4rXx2ZkeiTSxNBpy7WrMLJt2JVpXC3aV2WNXswezWM4K5yJORyOEt6dPABG3kQ0UFazLU7UyRqzq2llAECNTP2s3vjRQyOaVdKA0PAtRsHGRykBNOEAI9oYkExdPcLILOig8UkjjhUGRpYOWNPCLFa4yahkf9DKcQbKaqYXtTJLp6tsIXXSz4qlVeroemNlDw0u7Dscjr2HP8QGQNzrE2nyiAZAxhtJM66iTKYb5OwpLlSxrhwnaX/UuW+NjumpdyxmoEfqRN/SI5wpe1Au/qiNCQNL/FZxxLLGyCyMsbQh/azGwFIPmGaOQ6OTtZFFzeaGRicrOhobdapOfUPGjPv6chh1xnoMVlkr6iTLN9JmpU/+EHM4HPsKgo9OOhyOfcaFqIkR0WUAfhXAM9ERzR8F8AkAvwHgGgCfAfASZv7yeGM1Y+nw1gzqHikzFIRbdj2NwQCVp4eyY88qOVDRxVRD/pSelO42qsBytly1UTwP3b6QVXQrAVPs78qijqGuZnrOBsquoSHi626kFvSzbp4qW7NWpFadse6jEu27PDke8jJWl053Abe494ZsQ1Xxf0Aq2SSgfDL26CE21SD0BgC/zcx/EcC3ArgH9WWXHA7HvmO+JdsOHaNMjIj+DIDvBPDDAMDMZwGcJaIXo5uxEeiWXfpdAD8z3FjyB5hvE82UhoR9/SYbFvZ1nVzEFZaVCtoxPnrEapGxQ83OaizCSitEejlOarHgPK3GyLJ2VHjQwHqVgywNBttKoYO4DWG/ysAsi0VheagI+kPXtGaXyNjhSNn0nijuH5uZTRH2h8rqMsNm12Q7Exvbp+7kFCZ2LYAvAPgvRPRBIvpVIroE9WWXMhDRrUR0NxHdvf7a1+Y5a4fDcbi4kJhYKPNtAP4hM99FRG+A6joOLbsU1qC7DQBO/PmrOX1bWPoWN6I75frQEHura2PpG1SsFaHdYObkRaja5nWzcxqxWkR2BBTsjBbyWs+P3zWn3/SKMcU6aWo4YfFaVBhZV0+9oyrMLDumLisYWpUoVi6ZV5dssR7FwJpFvp/Wk/YazdrCtbZsGeG6V7Ww7N7IfzPNrqywILlv4n5TaSOtP8bI9Oe0PbnHBs5pNk2MMdvoJBE9A512LvhGAP8cwGUAfgwdQQKA1zDze7Y5xhQmdh+A+5j5rrD/dnQPtQdkdV617JLD4dh3zMTEmPkTzHwDM98A4NvRLQDymyH79ZK37QMMmMDEmPnzRPQ5InoGM38C3QT/Hw9/N6NbuSRddmmote6NItJGNkIk7CYk1NiV4ZscNb1a7VRYHAz2Vh2lXIRztuibvDklb1G+L8rJhxQdXHSve0qCvPvvP8zIunZFUxNGV2FmFhaLep5GjXmZ0+oMM7CMtck56PbC8XihGBrQX+ca85J7ZZH+ZrpMt2HjnhgdNZ9076njDI6U2m2k7D/2Xpr5+niHpIm9AMCnmfmzs6x2FTDVJ/YPAbyZiI4DuBfdUkoN7GWXHA7HvmP6Q+xpRHR3sn9bkJAsvBTAW5L9nySiHwJwN4BXTrJoGZj0EGPmDwGwliovll0axYgmVrx55MVqaFasGd0AayvaibHQlJdNFs3op6wJCUJO4gHk3BP2pthZz/g09UPBDrSeg3U4cMKKhJUVjMy6QBLELXqZYmbSLm+5UMhgyBBQsq6ukpkX20oZoL4etes1EEJUMC8j7CjqWQuVJ+nZfZSXYX3vNSjr6HtblTE1N9XukLfsMDSxDR5iDzGz9WzIEAjQ9wJ4dUh6I4CfC0f6OQC/hM5/ujHcse9wODIQDqU7+d0APsDMDwCAbAGAiH4FwG9t2/DB19hyOBwXHGTtybG/DXATkq6kDAoGfD+Aj257rueHiQ2Jn5Fqi6iuu2VGHd31NKaO7+l/aLfN93V3s0vLRfp+GQBb4O+SpN0QMqPFemNm12j7kHeKCO6W+KnE/tjtiIbYNOwoVgpZnO3GGSusfoiaT2xwllY9s0VlVtWsbK0bOcEMXIQWmRaL/Hcou5XG+RX3YFm26C6qbqU5w2ut+2j8HxQmV3V/Dppp58SMTCz4Sv8GgB9Pkv81Ed0QjvQZlbcRvDvpcDhKzDmrD/PXATxVpb1srvZ3+xAjAA33b5U0nEMzJM2uBsR6HSYSg7iNsqyE/V7oL0VcYSNR4JcftiLwp99JjKqRbYngP9CDZ7R2mVR4V2J/DCESVmgJ+/KlhYXoL6JZV5I1iCHGBZjCfjHAoUOJUitKjYFJHcNioQV8KFbVM/JyMKZvX9+D5SBAwdomCPt6MMAqW2u3ysySNDQ8Dyu7EGexcDgcTzD4Q2wADSemxdSwp7Sv2tsqubiFTqbK5vqWOk40gObsJDPTxoihUEaYmRwvMpvkOOEk5E2m2RUjNaParKxgZKkpVdiHZk+t1EkgDEOdfz/Xj2Jo26KiiZmGxomhRGneGAPLjKs6rTDG5ppZd8xuUzAvi1UVzE7ta+0qTdvAClT2MnR68vtbaQeET4rocDj2Gt6dHEJtVKWiKZAO3E6XWayxtfhWTIyr2uQaWZbOT/UP5IUis5H0/DyAXgvTGhgLUzICg8nSg1DRyOLB5VWpRcM0GF0dU92ZmX6mscHoZMG4ChOsoXNVQonMCQ41A6sYWrM0zcg0Yxoyu2q2lY1+QpXJt2YoUaPbDRkGEe/byXsGg6OTGEjbBkdohoopcCbmcDhK+EOsgjA6CWOEJeooaiqewvtlkRLN3ga0DPlx4ttRT5GTMBmujEL26cZ3rLCb6B9LXr/iIet1NPvOSafMlvOLR4niW9imDEozolimZIVFmZpONmVSxCFmVps+WocWpZ+1BlbzgqVpasSxZFv10cm+bMgfZFUTRhwreZPKRr1XM7NUE5t3dJLg3UmHw7HnIMt2c0Sx84cYNZz4WtI3tNK+irdV7tkCkEwfrctKm6nuEYcL87JqPxtpjFPi5I79mB7fhv1xSN7qsZH8XNIXZWRgwsji4KESS9qSicUjt4qJGaytaGeITY0Fgw/VrU3BM+DCL3Qvi7UV+pZiYIv0d841r9h+wbZQ1IksaIGBslO3pbZaG3HM/Yw8Urb0QMaIkrlGJ10Tczgc+w7vTjocjv2GP8QqIA7dyX4/ohBIVcjPkAg6IvBnaUV3Utkx0jUkdehQxXKR/uLSXpkjlVOzq5TJhf3CWjHQRWQl7JPR9ewPyHa6hU0CwGP7peVB79fWhSzmDEs+F8bVQthPRXrV9ax0I3lhdfcqZc2uobonBuwTU7ugdnti2VHtZv87IamZL17ImZjD4dhv+EOsDlpwDFrmZD1Fjkwi7Kuwjl50TQ2socyYwA/0TE9YyCbCPqu34YBJtCA/RbPJScXphkL7rQpRktfhOvnOUcAPLUtAuJyj9Qq1WJp1sikMI2YVinkVbMsqW2FgqQkVWsgvQonKOnUGpiwW1mCAslRsJ+zX69QE/fSergWUx4EvKZv+HyzCfbOY6cnDHnbkcDj2GO4TGwAR0FBvscinIFG2C/WWIq1LIWFGORkphsq7HVVmke+34c3cZPqWrhvObRkSVpTlA0AbrmizQoaSkSGbv7ArExiGZLSir/UF+6ijkKfDjbKwozyt0PSKRjfEWLjR0KSFmnk1Kh/oLRSRjSgGZoUFVfLaZb0OL6HykG+T+6jVoUmavS3KOlXWZphpC3amNTZjmimxVjTEgw6YjbDtPXEe4EzM4XAUcCY2AGo4aldkTcUjaZFl2aNAeVnRu5DVzV4melSq0LkkuX+VteFt2AQe1SLf73WJ8vU3xsiSQ/b74TUqQe598Hv/pUn0sTgJohww1E2/tL4TrdAkjYOYXWtamBmgrfLM9SC1niU3DrJ00+xaY2BRE0NRp40sSu1bo5MFA6uPolfZmjnBoS7LWVkY/zvW/9OB4GZXh8Ox75hT2CeizwB4BN1KzytmvpGIngLgNwBcg26O/Zcc6rqTs4EYi0Xbr/WYvg1DWj/DjBoximsopiNRoVk1zY4OLQJQsjM9WmmxN1ZluMLIstdWzkKEkfXsqs8nNfooo4cxSFxGL5PRSe0LQxyZFWZm+MTiDNZKT5lL99CjkwM616gWZow0lutAKlZlMqVhBpYyPs24BkcaR0Yw7aBxlTZYtuILi72OcE8s+qdME9YVXSza+Xxi849O/nVmfijZfxWAO5n5dUT0qrD/M9s0vMlAusPheCKA0b3gpvxtjxcDuCN8vgPA923b0G5HJwE0DUfWkDrqSb2BCt+YTDKYTjkdRxYDM6pNmWOlRZISRiVDY21Sp/fY65FLxdBMpYvKrCzfyJQDysSPcbW3hL3JdRnRxtKyvSdug1FJ/SYeet2NjFJm3q8RLSwrW9G+dHB3zpRslqYZmDm9jqybstD7aVm7TE33stLaqHOFAtaIe8UXNvS/0zQ827yIGxC6pxHR3cn+bcx8myrDAP4ndV2P/xzyL2fm0yH/8wAu3/ZcXRNzOBwlpj/EHmLmG0fK/FVmvp+I/iyA9xLRH2eHYmai7fvB3p10OBwZCJh1BXBmvj9sHwTwmwCeDeABWQU8bB/c9nx3zsQWTdtT8aTr0wv44YMWOKU7mHZz4nxfYVcHbKcXWQv3MihgdT0D1Cz2RbdS9tOXSBT7JW010NWSwQrVfexDiiwDa0gSO4ayTWRB74UBVg2eSKrVrZzwemPdjdR1zDnwpazqPuquY1KvOk/+kLAvZZSR1bRNjHQjs66hEtzr9omyTrRLFHWSgZtYRqQAZa0Igr6I+UAQ9NH9b80C5tkmRQyrfzfM/Ej4/DcB/EsA7wZwM4DXhe27tj2GdycdDkeJ+XxilwP4zTAqvwTwX5n5t4nojwC8jYhuAfBZAC/Z9gA7DjtiLBdrtGJVSJiYpBXB4ZVZN7udwD5USBKZZY009GTIsksUM9fowQAt4sOwX0iI0loxNCRsSrLWqkg8pYSdaHamZpnNva62uVUvE1kI/lNRCPgq31hZqF+th/I6ptk1tKvXeCxW7E7OoQjmthnYYChRxQqRHluztCFhvzZNj2Zm2XdR1god5N0sSia2XKxxAGkpw1yOfWa+F8C3GulfBPCCOY7hTMzhcORgDEd1HDHsPAD82KJFG9hWmxoO2/xNzDp4WbGh7rOUDfuiZbA2o/b1tM5VpqfskPOy8YtIHc3IEBmFMDLSbCuRLeIamoqNyA3ERp2CnUW2pfbTMnp9Af11tmRihSamz1GzrSStn5ZG6V1ZAHj4MDJZoRVCVIbv5OnpvVdjUToMKU+rlc23XV5NC5NtqYlBWyuEgaXG1oBlSDu2aGcMAJ+pnR3AmZjD4ShwwQWAE9E/AvAP0D2fPwLgRwBcAeCtAJ4K4P0AXsbMZwfbAWPZtFiHt8g6DbYOGpgwsKgXqNAZU+eSl5IarWyT14k2wkbmpX6slPQ0RZhRfhg9agn0I5WNNrvKXZHpQ7ZeFrUy0XwSah8ngIxEVcoqjazLDPXV67kwvW73+i6qVUYrTQNrwcCkTsrEFJOrMLAp00cPa2J5+7VA8OyYmoFVDK35eco+m9vuHGoMrNsuFrJNmJhoYk0LmolC7dOSbaMD6UR0JYCfAnAjMz8T3SPipQB+AcDrmfmbAHwZwC2HeaIOh2NH4A3+jgCmdieXAC4monMATgI4DeD5AH4w5N8B4GcBvHGokU4TW0cGtk5HJ8PbJGpjkh7Zlp7bF4kG1m2t0UKB9pDFdMMfFs8pbBvRuQL9ES2r0NeAXhNTZXttLBn9rOhlUQMTVpowjTgldxyZDd9DMbSujGJpMWOEmU1EoYnpZhXbyg6tWZZa8T2tN3XVbTOvEtw9xK5qI5Bm2Yq+ZdYJI9UyKQAUA+zS8tHIZhm2i1wLWzYpE+tusmOL9SyaGGF7nfR8YJSJBbftLwL4U3QPr6+i6z5+hZlltqz7AFxp1SeiW4nobiK6+9xXHp3nrB0Ox+Ginfh3BDClO/lkdBHn1wL4cwAuAfDCqQdg5tuY+UZmvvHYZSe3PlGHw7E7EPOkv6OAKd3J7wLwJ8z8BQAgoncCeC6Ay4hoGdjYVQDuH2uIwDjerLEOM5WuE3FyrWwXsfenZ2JNLlzsPCqRuzCCIqH3umc14Xco7Rd5pVQ3193H2MXVNoosLe826m5lbrHIv1tc/EjPj5YWjZ6QvAsqYMOKUsVAd8US57N0wDC55ttJazxWupl5nW47Nid+ljZiZLXql11Rq33VxdSCfrpy0XLYUiGhRcvkf+dYSDverOcR9o+Q3jUFUwLA/xTAc4joJHX/mS8A8HEA7wPwA6HMzThA7JPD4ThK6GInp/wdBYwyMWa+i4jeDuADAFYAPgjgNgD/HcBbiehfhbTbx9pqiHFiuYqWhDZlSsIs1L4o1lYstLzuCpal7BT5x1z8jyxLzYVvQTOyaLVIZl6NzELEf9LsKnnrxrS8TI2ZJVnxa0TDrMU+1YfI1qDqHBS18COLtSmLRfzthsyuVYFflRsqoxhSanYtrRX2Nqu/VGWWXK9TiP4yEhW2y2RVeCXgi6Viuex+6OOyXaxjnRPLVdw288ULzdPODjBpdJKZXwvgtSr5XnRTajgcjgsJjMOYnvrQsPOZXY83K6yCJrZa9K9Qbbvg8MbpY5gDK0k1MfW2GHp39CFCunTOyKh/wZXLJoq0RHlZy+xaBHXLfjbHfqWOYmCcrmwTVzWSPGT7WQRUm6f1GqKyomz70q1ZKlS+aZuomF3zsopVqTKTVuiuzYk/aLHottrIapZVDKxV6VkZSRMmpvSv9LNYKoSBLaMW1tspBMeawM6a1Wwzu15wTMzhcDzBsD/PsN0+xBpiXLRY9VPxWJqY3i7z/RR9jLi8ZsPGGokURjfCyCyYpta0SlpVaFqcAz9vJJ3UsaaJkZrgkNLJIxXziiskcc7QgPI6CAPjgzIwjQkm1z4vr1OEFqUDpQUDG9fE9LQ31XUhB+fAt9PTz2MMzAzqrqxY1CSaWDSzLnNTq2hhJxay7UXcixbnwnY+TUymxNoHOBNzOBw5GEfGyDoFO9bEGCeaVdTCVtz369fhtbcK4UVtePO0kZF15bKu+lL0rDCRouJK5jtJdK0aIzM8TVBhRjW9K08jtc9F2dIjFXY1M8s0sVBWjTj2bCtpX+kaZIzaaoy9yAdjxalSxpqeWpc1NDHWmlgxWmnUqQaJw9wfLGNOlZNvawws1cQKDUxCiZa5FwzoNTDxgx1TmphoYenopHw+0axm8YkRjo6RdQqciTkcjhL+ELPREOPixTnTJ2bpZADq/jF0prUO3euwxsjS+hpxsY+wny9WHd6UWuPRkxkmI5paA+v3w/fINLHwZlbO/J6RhW3ynfWIY3xjmkxMjWTGdGTIdDRMR8m4KvlUTysXCinLjjGwbHGR0dHJPN0sq6bTGSxbY2Dp9Do1BhYY1NLQxLQfLHrBghYmOhgAXBw+X7w4d+R8YkR0NYBfRzfXPqNbl/INRPSzAH4MwBdC0dcw83u2OYYzMYfDkWNeTWwF4JXM/AEiOgXg/UT03pD3emb+xYMewB9iDoejwFyjk2GV79Ph8yNEdA8qM95si912J8G4eHE2duHWA93JVnUjh8K0VlJWzLPRSlAiptW6QmudUa5gFOe+t4T91s4zg7lVF1N3L2PXKO2Cxullw74S6/PupKSpKzHQndwE493J0moxKuynbYyYXItVhLIyalvpVqZ5ffjRUAiRytOWCiXiA72BVQd1RxvFMjGuinAfuo/HlKWit1NY3cmz+XoPW4MPRRMjomsAPAvAXegmkfhJIvohAHejY2tf3qbdKQHgDofjiQRG9xCb8gc8TeYLDH+3Wk0S0aUA3gHgp5n5YXQTqP4FADegY2q/tO3p7ljYb3FycTayrHW6ikx4NdYEfr2fQhth43stHdrX9ouad0LtaQAADApJREFUDSCjJTmTiLO1Fit1l1VqJtcsmLuYyVUxM+aiDivGpVeBspnYsLViNiYWG1T5A0xssKyeo7/GsgwmNlbWZFc11paGEOlgbsmLwdy5iA/0DCwGdSsGloYQFYJ+wcC6/YtTJtZ0S1ucXJxFM1fQ4/RmHmLmG4cKENExdA+wNzPzOwGAmR9I8n8FwG9td6LOxBwOh4G5JkUM03fdDuAeZv7lJP2KpNj3A/jotue6c03sZHMW66BdrZNnaMnEFHOatCJP/nXaZKnrwn4RXn5aI0uDmKO+sM4ZWWRK2oKR5mlNTE4lZVW1yQ9jSFFukUjr16wV+QrgZVpaR5fbFGOamKlzVbWwnG2lZUZNrpYmpstWdC8rT69K1Ka3VW1Cw0XOwJqEvcWJDUPesWO53nU80cR0WNFFapvaKQTy+WQzlyaGOTWx5wJ4GYCPENGHQtprANxERDeguxs/A+DHtz2Aj046HI4czMB6ttHJ30f5egOArTxhFnZudj3ZnI0hRpnZVaYG3nINxBRE3at1tUrfJsoQS7ZGlo40topFRXalmFmbhgXJS1VG0ITxRfaWnKdiZ8WKRSrECEjDjpSRVWljXZ52uar2pcq2L92auVXlW+tOTgk7KpiXlNWMydDRUOhbalTRYm/FqKSwrKRsMaGhjDzaRlagHIXUDOxEUvaiZa59nVx2elc6Agl0rEsgn082Z4+c2XUXcCbmcDhK+EPMRqeJncE6TkTYv0LXlTGGVr3up2ljJWKIUqA/rWYJqzDVdVqpGElTI5jr3DeWFdHT6Qh7szQxqb+Quvk2Z1d53tDopL5WY+FHGXTe0GWfyMiyvAoDM/Uza8odlKwrK6tHHId0tAoD61lXctDoA+t+gOj9Ei1MecC6z8MMLJ9WJ2hgy1z7umR5Jts/uUiY2KLLO9mcmUcTYwwbM48YnIk5HA4FRuawPuLwh5jD4cjBmE3Y3wV2bnY9tXhsUlltsbBAG4iYUnalVjWKc1ZZIrTuLqrujRb8AfT9VC3WN6VxlYqwo8pxsi6iSptkds3r6vwDY8xasa3ZtdblLAytiV2iWiYva5ld0eh9ZaMAknUh8+7kQs2Jv0jXhax0I7WIn6ZdstCCfrc9tXgcAHBp2ALAqebxkPfYfGZX18QcDsdewx9iNhZocUlzJrIsy+wq9ottzqw3n8q2zzsby+RlxRAb476zdQ+VMVaFElmrVtM6Z1xR0LeCuVXAd7RN6PnFTIsFMgyaXeMXUlsDc8zsOij0WwbYNH3IYhFNr7ZoD6AMGq+EFCFlb1rA1wbWhFVp5tWoOfEXak787nPHtMpQolzEB0oGJoJ+aqNItwBwSXMmbhezzKHD/hBzOBx7DAbgC4XYaIhj/30yBs5wbDg5IwDh7X1utcj2V5E9BGbWJOxQ62SyFS3L0MQiKxA9TWlh2cpFytwaVy4q0pM6FQ3MNruWaRZmm9m1aNgoN6aFZcZVzsvUTK6NUacwvVZ0L6BnZcVqRLl9AkhCiNTK3Es1J346B345nY5tZE0/awamtbAnNb22LDrzqeZxN7s6HA4HMF/Y0S6wc03sSXRmu7kzwpkOjb5IXqO0sbxMeMsqRiahSut0BfCwbeN6h2G7lihiYQpGrFIRUhT0rnV/TpFF6dWNFLui1qBKiqVZrEtrYcXl0JrZtqhpYBZTUwwsjiyaTKxWJ6RrpgZD89IjmMaIo5TRI45NKNskmpgehdTrQsq+zIkPjE+nI6wrTRtjYOkov/RunkQzaWIMsPvEHA7HXsMd+zYaACebFdaBPaRT5aybYXq2GGRgelSyZGLy+dw6Z2AL2ZdyyajVOnxeB31L9LKou6xlPzmZGPAtNEcYGIqyPQML7UV2JVsq6pRaGGf71qrngr7MeOhWESQ+JdqLSmbUpZefx6apzvK0zlVhZN3nkLdQF0qNPGZreRYMLNe9Us+XHn1cLnLvl9a/gDoDu3hRamLCvISJaQZ2UkYiKRmdJBmxXM03QaBrYg6HY2/B7KOTNSzAOEUMNOfqZSqMy9LCpP/fM69WbUsmJu3H0cqoiYXRynX/LlsF5tWE7Xqde8taw/sl3jKOzn2lm6U0RdhaHAZFVjdqYZb3S2lh5ugkcvRl6m/Zwlum29jGJzZQph9hNFhcjXFpPS3zlinNK0ZX5J6vdCYmYV6ifS3Udpmu0C3rQlaYl6SnC3lcpFz3WvdKg7kvVUxMa2DCutJR/lPh/+kUMRZHb1LEQ4czMYfDocDgdITriMMfYg6HIwfDhf0aGiKcapZAG0RPo1vZVIZ2raFjMbvGrmIos4hdx7I7uQxWirjf5F3Pc8kAg4j+K+lqitAfBX8xp/Z9IN3F5CjO57aM7nMeAN6n291MoBT/h+cTU+2q2WAtjPYiBrqTvTivRxSsMvm2sFpYeVq11raJpEzfbRQhP2Q3eTpQ7z5K13GZGleVheJYk3cfpTtpGVhlVaKyO9lbLKSbKKFEqZEVSLuTyWBAuN6nmmW23sOB4BYLh8Oxr2Ako+t7gB0L+w0ubS4CEETJNpkXJ7xZFq391rWF/Vysl20TGFIaliSfl7QM7XX7Z8NSNpK/aPs5WkT0X4jAH0T/lbC58DZvEyam2VlcybwpWVsv/ivGVWNoWRm1rwV+oFDhZc59bYI9MIYCvrsDl2WnMDGBZlxqMCCzS0QBP2fpkh4Dt1Mm1uSM65hiZNm6kIF5CRM73uShRCcaY13IRS7gl8HcCRMTAV+YWGJk7cp27Z9KrumppruHL20uwmIOkwWzMzGHw7Hf2Cdhn3iHQ6lE9AUAXwfw0M4OejA8DftzrsB+ne8+nSuwP+f755n5Gw7SABH9NrrvOwUPMfMLD3K8g2KnDzEAIKK7x5Y9PyrYp3MF9ut89+lcgf073ycSZotScDgcjvMBf4g5HI69xvl4iN12Ho65LfbpXIH9Ot99Oldg/873CYOda2IOh8MxJ7w76XA49hr+EHM4HHuNnT3EiOiFRPQJIvoUEb1qV8edCiK6mojeR0QfJ6KPEdErQvpTiOi9RPTJsH3y+T5XAREtiOiDRPRbYf9aIrorXOPfIKLj5/scBUR0GRG9nYj+mIjuIaK/clSvLRH9o3APfJSI3kJEFx3la/tEx04eYtRNYP8fAHw3gOsB3ERE1+/i2BtgBeCVzHw9gOcAeHk4x1cBuJOZrwNwZ9g/KngFgHuS/V8A8Hpm/iYAXwZwy3k5KxtvAPDbzPwXAXwruvM+cteWiK4E8FMAbmTmZwJYAHgpjva1fUJjV0zs2QA+xcz3MvNZAG8F8OIdHXsSmPk0M38gfH4E3T/ZlejO845Q7A4A33d+zjAHEV0F4G8D+NWwTwCeD+DtochROtc/A+A7AdwOAMx8lpm/giN6bdGF411MREsAJwGcxhG9to7dPcSuBPC5ZP++kHYkQUTXAHgWgLsAXM7Mp0PW5wFcfp5OS+PfAvin6EPBnwrgK8wsUfVH6RpfC+ALAP5L6P7+KhFdgiN4bZn5fgC/COBP0T28vgrg/Ti61/YJDxf2FYjoUgDvAPDTzPxwmsedH+W8e1KI6EUAHmTm95/vc5mIJYBvA/BGZn4WuvjZrOt4hK7tk9ExxGsB/DkAlwA4r7GBjmHs6iF2P4Crk/2rQtqRAhEdQ/cAezMzvzMkP0BEV4T8KwA8eL7OL8FzAXwvEX0GXdf8+eg0p8tCFwg4Wtf4PgD3MfNdYf/t6B5qR/HafheAP2HmLzDzOQDvRHe9j+q1fcJjVw+xPwJwXRjhOY5OKH33jo49CUFTuh3APcz8y0nWuwHcHD7fDOBduz43DWZ+NTNfxczXoLuW/4uZ/x6A9wH4gVDsSJwrADDz5wF8joieEZJeAODjOILXFl038jlEdDLcE3KuR/LaOnbo2Cei70Gn4ywAvImZf34nB54IIvqrAP4PgI+g15leg04XexuApwP4LICXMPOXzstJGiCi5wH4J8z8IiL6RnTM7CkAPgjg7zPzmaH6uwIR3YBuEOI4gHsB/Ai6l+iRu7ZE9C8A/F10I9YfBPAP0GlgR/LaPtHhYUcOh2Ov4cK+w+HYa/hDzOFw7DX8IeZwOPYa/hBzOBx7DX+IORyOvYY/xBwOx17DH2IOh2Ov8f8BkSe7wPPBAr0AAAAASUVORK5CYII=\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "data:image/png;base64,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\n", + "http://legacy.python.org/dev/peps/pep-0465/", + "https://commons.wikimedia.org/wiki/File:Ball_python_lucy.JPG", + "https://creativecommons.org/licenses/by-sa/3.0/deed.en", + "https://docs.python.org/3/library/array.html", + "https://en.wikipedia.org/wiki/", + "https://en.wikipedia.org/wiki/Piano_key_frequencies", + "https://en.wikipedia.org/wiki/User:HCA", + "https://matplotlib.org/", + "https://matplotlib.org/contents.html", + "https://matplotlib.org/gallery/index.html", + "naucse:page?lesson=intro/notebook", + "naucse:static?filename=python.jpg", + "naucse:static?filename=sample.wav", + "naucse:static?filename=secret.png" + ], "modules": { "katex": "0.7.1" }, @@ -614,7 +1299,57 @@ "content": { "path": "pandas/index.html" }, + "ids": [ + "analyza_dat_v_pythonu", + "grafy", + "groupby", + "indexer_codeiloccode", + "indexer_codeloccode", + "indexy", + "merge", + "nan_neboli_null_ci_na", + "pandas", + "presypani_dat", + "proces_analyzy_dat", + "sloupce", + "tabulky", + "tabulky_a_vybirani_prvku" + ], "license": "cc-by-sa-40", + "links": [ + "#analyza_dat_v_pythonu", + "#grafy", + "#groupby", + "#indexer_codeiloccode", + "#indexer_codeloccode", + "#indexy", + "#merge", + "#nan_neboli_null_ci_na", + "#pandas", + "#presypani_dat", + "#proces_analyzy_dat", + "#sloupce", + "#tabulky", + "#tabulky_a_vybirani_prvku", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAY0AAAEVCAYAAAAckrn/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdcltX/x/HXYSPgANwL914ogpp7ZFaapjlTU9PMcv3K\n8bVv2TJLs/JbZmIOtBwNc5R7lJqDIS6cIAIOFNkg8z6/P+5b00RF9vg8Hw8eN/e5z3Wuc6Hy9hrn\nHKW1RgghhMgMs/zugBBCiMJDQkMIIUSmSWgIIYTINAkNIYQQmSahIYQQItMkNIQQQmSahIYQQohM\nk9AQQgiRaRIaQgghMs0ivzuQ05ydnbWLi0t+d0MIIQoVX1/fCK112cfVK3Kh4eLigo+PT353Qwgh\nChWl1OXM1JPLU0IIITJNQkMIIUSmSWgIIYTItCJ3TyMjqamphIWFkZSUlN9dKVZsbGyoUqUKlpaW\n+d0VIUQOKRahERYWhoODAy4uLiil8rs7xYLWmlu3bhEWFkaNGjXyuztCiBxSLC5PJSUl4eTkJIGR\nh5RSODk5ydmdEEVMsTjTACQw8oH8zIXIO7fikzFTCmtLM6zMzbAwz51zgmITGkIIURQdD41m3vZz\nHLgYcV+5uZnC2sLM9GV+N0ysLU3v//VZZklo5JN9+/ZhZWVF27Zt87srQohC6OKNOOZvP8+209dx\ntLNiSre6lLK1IDnNQEqageQ0A8lp6cbX1H++v/ez+OS0u59lloRGPtm3bx/29va5Ghpaa7TWmJkV\ni1tXQhQLoZGJfLnrAhuOhVHCyoIp3eoyun0N7K2z9+tcTctcPfltksO8vLxo2rQpzZo14+WXX2bz\n5s24u7vTokULunXrRnh4OMHBwSxevJgvvviC5s2bs3//fm7evMmLL76Im5sbbm5uHDx4EICbN2/S\nvXt3XF1dGTduHNWrVyciwngaumDBAho3bkzjxo358ssvAQgODqZBgwa8/vrruLq68uGHHzJlypS7\n/fP09GTq1Kl5/4MRQmTLzbhkZm86TZfP97H5xFVGP1WDv6Z1ZlK3OtkOjCdy53+jReWrZcuW+t8C\nAgIeKMsNp06d0nXr1tU3b97UWmt969YtHRkZqQ0Gg9Zaa09PTz116lSttdbvvfeenjdv3t1tBw8e\nrPfv36+11vry5cu6fv36WmutJ0yYoOfMmaO11nrr1q0a0Ddv3tQ+Pj66cePGOj4+XsfFxemGDRtq\nPz8/fenSJa2U0ocOHdJaax0fH69r1qypU1JStNZat2nTRp84cSIPfhpGefWzF6Koik5M0Z9tO6Pr\nv7NV15z5u57xy3F9NToxx/cD+OhM/I6Vy1M5aM+ePfTv3x9nZ2cAHB0dOXnyJAMHDuTatWukpKQ8\ndMzCrl27CAgIuPs+NjaWuLg4Dhw4wIYNGwDo2bMnZcqUAeDAgQP07dsXOzs7APr168f+/fvp3bs3\n1atXx8PDAwA7Ozu6dOnCli1baNCgAampqTRp0iTXfgZCiJxxOyWdFX8Hs/jPQGJup/J8s0pM6VaH\nmmXt87VfEho5SGv9wGOmb775JlOnTqV3797s27eP2bNnZ7itwWDg0KFD2NraPtDmw/b1MHeC5I4x\nY8YwZ84c6tevzyuvvJKJIxFCZMWJsGjOXY/D2d4aJ3srnO2tcbSzwsbSPNNtpKQZWOcTyv92X+BG\nXDKd65Xlrafr0ahSqVzseeZJaOSgrl270rdvX6ZMmYKTkxORkZHExMRQuXJlAFauXHm3roODA7Gx\nsXff9+jRg6+//pq3334bAH9/f5o3b85TTz3F+vXrmT59Ojt27CAqKgqADh06MHLkSGbMmIHWmg0b\nNrBq1aoM++Xu7k5oaCh+fn6cOHEitw5fiGJLa83yg8F89HsAhgz+P+dgbXE3RJzsrXCyt8bZzgpn\nB2uc7O4EjBUnr8Twxc4LhEQm0trFkW+GuuLm4pj3B/QIEho5qFGjRsyaNYuOHTtibm5OixYtmD17\nNgMGDKBy5cp4eHhw6dIlAJ5//nn69+/Pxo0b+d///sfChQuZMGECTZs2JS0tjQ4dOrB48WLee+89\nBg8ezLp16+jYsSMVK1bEwcEBV1dXRo4cSevWrQHj2USLFi0IDg7OsG8vvfQS/v7+dy9vCSFyRkqa\ngf/+dop1PqF0b1ieGc/UJ/Z2KhHxKdyKT+ZWQgo344yvt+KTuRSRgE9wFJGJKWR0waBhxZIsf8WN\nTnXLFsgBsupRlzkKo1atWul/L8J05swZGjRokE89yp7k5GTMzc2xsLDg0KFDjB8/Hn9//ydu57nn\nnmPKlCl07do1F3r5cIX5Zy/E40TEJzN+tS/ewVG80bk2U7vXxcwsc7/o0w2ayIQUbiUkcys+hYj4\nZBxsLOhUt1ym28hJSilfrXWrx9WTM40CLiQkhJdeegmDwYCVlRWenp5PtH10dDStW7emWbNmeR4Y\nQhRlZ67FMmalDxHxySwc3ILezSo90fbmZoqyDtaUdbDOpR7mDgmNAq5OnTocO3Ysy9uXLl2a8+fP\n52CPhBDbT19nyjp/HGws+Om1NjStUjq/u5RnJDSEECKTtNZ8vecin+88T7OqpVnyckvKl7TJ727l\nKQkNIYTIhNsp6Uz75QSbj1/lheaVmPti0yd6lLaokNAQQojHuB6TxKtePpy6GsP0nvV5rWPNAvlk\n05NISU/hcuxlAmMCCYoOyvR2EhpCCPEIx0KiGLvKl8TkNDxfbkW3huXzu0tPJDk9meCYYIJigrgY\nfZGg6CACYwIJiQ0hXRtntzVTMjV6gXP9+nUmT56Mt7c31tbWuLi48OWXX9KvXz9OnTr10O38/f25\nevUqvXr1AmD27NnY29vz1ltvPVC3bdu2/P3337l2DEIUNxuOhTH9l5OUL2nN6tHtqFfBIb+79I/k\neIi9CrFXIPYqSXHXCE6JIjA1msBk42tQagwhqXEYMA6tMEdR1cKBWpal6OZQn9pWpallUZLqFg7Y\nkrmBvxIaeUBrTd++fRkxYgRr164FjGEQHh7+2G39/f3x8fG5GxqPIoEhRM5IN2jmbT/H4j8D8ajp\nyKKhLXG0s8qbnWsNSdGmQPgnFIyv1/4pT44BINZM8XXp0vxU0p400yUzc62pnppGndRUnk5JpXZq\nKjVTUnFJTSW7R1HsQuP9zacJuBr7+IpPoGGlkrz3fKOHfr53714sLS157bXX7pY1b978vtHbSUlJ\njB8/Hh8fHywsLFiwYAHt2rXj3Xff5fbt2xw4cICZM2cCEBAQQKdOnQgJCWHy5MlMnDgRAHt7e+Lj\n4+/OceXs7MypU6do2bIlq1evRinFH3/8wdSpU3F2dsbV1ZWgoCC2bNmSoz8PIQqzuKRUJq/1Z/fZ\nGwx1r8bs3o2wzKWlU+/j5wUHvzIGQmrivz5UYF8eSlYCp1pQowPaoSKb0iJYcG0P0amJ9K35PB4V\n3aldqibVS1bH0twUD3fvvah73qv7P1MK3s/cPZpiFxr54c4v7kf55ptvADh58iRnz56lR48enD9/\nng8++AAfHx++/vprwHh56uzZs+zdu5e4uDjq1avH+PHjsbS0vK+9Y8eOcfr0aSpVqkS7du04ePAg\nrVq1Yty4cfz111/UqFGDwYMH584BC1FIxSSmMnDJIS7ciOfDPo14uY1L3uz45M+waSJUbgl1exrD\noWQlKFnZ+GpfHsz/+Td+LvIcc47Mwe+GH03LNmWx+zs0cMqbmReKXWg86owgPx04cIA333wTgPr1\n61O9evWHDsp79tlnsba2xtramnLlyhEeHk6VKlXuq9O6deu7ZXfOauzt7alZs+bd6dkHDx7MkiVL\ncvGohCg8UtIMjFvtQ9DNBJaPdKND3bJ5s+PAvbDhNajeFob9CpYPH/cRlxLHIv9FrDm7hpJWJfmg\n7Qf0qd3niW5kZ9dj96SUWqaUuqGUOnVPmaNSaqdS6oLptYypXCmlFiqlLiqlTiilXO/ZZoSp/gWl\n1Ih7ylsqpU6atlmoTM+xPWwfhVGjRo3w9fV9ZJ0nmQPM2vqfaQfMzc1JS0vLVJ2iNs+YEDlFa83M\nX09yOCiSz/o3zbvAuHoM1g0D57ow6MeHBobWmi1BW+j9W29+OPMDL9Z5kc19N9O3Tt88DQzI3HKv\nK4Ce/yqbAezWWtcBdpveAzwD1DF9jQW+BWMAAO8B7kBr4L17QuBbU9072/V8zD4KnS5dupCcnHzf\nvFHe3t5cvnz57vsOHTrwww8/AHD+/HlCQkKoV68eDg4OxMXF5Ug/6tevT1BQ0N17KevWrcuRdoUo\n7P635yK/+IUxpVtdXmhROW92eisQVvcHW0cY9gvYZjwVycWoi4zaPoqZ+2dSoUQF1jy7hv+2+S+l\nrPNnfY3HhobW+i8g8l/FfYA7i0OsBF64p9zLtHrgYaC0Uqoi8DSwU2sdqbWOAnYCPU2fldRaHzIt\nN+j1r7Yy2keho5Riw4YN7Ny5k1q1atGoUSNmz55NpUr/THD2+uuvk56eTpMmTRg4cCArVqzA2tqa\nzp07ExAQQPPmzbP9S97W1pZFixbRs2dPnnrqKcqXL0+pUgVjYRch8stvx66wYOd5+rlWZmLX2nmz\n07hwWNUX0PDyBihZ8YEqCakJzPeez4DNA7gQfYF327zL6l6raeScv5fYs3pPo7zW+hqA1vqaUqqc\nqbwyEHpPvTBT2aPKwzIof9Q+HqCUGovxbIVq1apl8ZByV6VKlVi/fv0D5XfGaNjY2LBixYoHPnd0\ndMTb2/uh7d47xiM+Ph6ATp060alTp7vld26iA3Tu3JmzZ8+itWbChAm0avXYmZCFKLKOXopk2s8n\n8KjpyNx+TfNmlHdSDKx+ERIiYMRmcL4/qLTWbA/ezjzvedy4fYMX67zIJNdJlLEpGFfoc/pGeEY/\ncZ2F8ieitV4CLAHjehpPun1x4unpycqVK0lJSaFFixaMGzcuv7skRL64FJHA2FU+VHG0ZfGwllhZ\n5MG9gdQkWDsUbp6BIeugyv1PVQbFBDHnyByOXDtCA8cGLOi8gGZlm+V+v55AVkMjXClV0XQGUBG4\nYSoPA6reU68KcNVU3ulf5ftM5VUyqP+ofYhsmDJlClOmTMnvbgiRryITUnhl+VHMlGL5SDdKl8iD\ngXuGdNgwFoL3Q98lULsbWmsCowPxDvfG+7o3e0P3Ymthyyz3WQyoOwBzs4I3IWJWQ2MTMAKYa3rd\neE/5G0qptRhveseYfulvB+bcc/O7BzBTax2plIpTSnkAR4DhwP8esw8hhMiypNR0xnr5cDUmiTWv\nelDdyS73d6o1bJ2GDthIUMe38LbWeO/7P3zCfYhMMt4yrmBXgRfrvMj4ZuNxsnXK/T5l0WNDQym1\nBuNZgrNSKgzjU1BzgfVKqdFACDDAVP0PoBdwEUgEXgEwhcOHwJ2L8x9ore/cXB+P8QktW2Cr6YtH\n7EMIIbJEa820n0/gczmKr4e0oGX13L1PoLXmUswlvPd/zNGQvfjUqkNkyHoIgfIlytOuUjvcKrjh\nVsGNyvaVC8XMuY8NDa31w4YNP7B2qOkJqAkPaWcZsCyDch+gcQbltzLahxBCZNUXO8+z6fhVpvWs\nx3NNn2x51szQWnMp9hLe17zvXnK6cyZRzqEMbat3o3VFd1pVaEUV+yqFIiT+rdiNCBdCFE8/+YSy\ncM9FBraqyviOtXK8/cTURF7f/Tq+4caBvOVKlKOtXTXcwi7iVq4lVQb/jLLIo0kPc1HeDiUsxszN\nzWnevPndr7lz5wLGx2N9fHyeuD1/f3/++OOPHO1jr169iI6OztE2hSgI/r4YwcxfT/JUbWc+6ts4\nx/+Hn5KewsS9E/G/4c9brd7i976/s6vV+3xybDv9Stan6sA1RSIwQM408oytrS3+/v451t6jpkxP\nS0vDwuLJ/2hzOoSEKAgu3ojjtdW+1HC2Y9Ew1xyfsTbNkMa0v6Zx5NoRPn7qY3rX6g3XT8HaIVCm\nOgz9Cazy4GZ7Hil+obF1Blw/mbNtVmgCz8zNdjM7duzgvffeIzk5mVq1arF8+XLs7e3x9vZm0qRJ\nJCQkYG1tzc6dOx+YMv3MmTNcvXqV4OBgnJ2dWbZs2QNTrXfu3JkVK1awadMmEhMTCQwMpG/fvnz2\n2WcAuLi44OPjg7OzM15eXsyfPx+lFE2bNmXVqlX89NNPvP/++5ibm1OqVCn++uuvbB+zELkpIj6Z\nV1Z4Y2VhzrKRbpS0sXz8Rk/AoA3M/ns2u0N2M6P1DGNgRF02Dt6zsjNOQFjCMUf3md+KX2jkk9u3\nb9O8efO772fOnMnAgQPvvo+IiOCjjz5i165d2NnZ8emnn7JgwQJmzJjBwIEDWbduHW5ubsTGxlKi\nRIkMp0z39fXlwIED2Nra8vnnnwMPTrUOxrOUY8eOYW1tTb169XjzzTepWvWf4TWnT5/m448/5uDB\ngzg7OxMZabyR98EHH7B9+3YqV64sl7FEgZeUms6rXj7cjEtm3dg2VHUskaPta62Z5z2PjYEbeb3Z\n6wxtMNQ4ynt1P0i7Da9sg9JVH99QIVP8QiMHzgiy4nGXpw4fPkxAQADt2rUDICUlhTZt2nDu3Dkq\nVqyIm5sbACVLlnxoG71798bW1hZ49FTrXbt2vTvnVMOGDbl8+fJ9obFnzx769++Ps7MzYJzKBKBd\nu3aMHDmSl156iX79+mXp5yBEXjAYNFPX++MfGs23Q1vSrGrGkwFmKGgfRFyAlARIvQ2ppteUxPu+\nX2yIYLVFIsOS4LUd8+H3D4yLJ1nYGOeTKt8w144vPxW/0CigtNZ0796dNWvW3Fd+4sSJTN+0s7P7\n57rpo6ZBf9zU6lrrDPe5ePFijhw5wu+//07z5s3x9/fHyangDkISxddn28/xx8nrvPNsA3o2rpD5\nDf/+GnbMur/MwgYsSxgvN1nagmUJVluls8gikT7mjrztXA9V2c5Yx7IE1OkOVVvn7AEVIBIaBYSH\nhwcTJkzg4sWL1K5dm8TERMLCwqhfvz5Xr17F29sbNzc34uLisLW1feyU6XemWu/Spct9U637+fk9\nti9du3alb9++TJkyBScnJyIjI3F0dCQwMBB3d3fc3d3ZvHkzoaGhEhqiwFm6P4jFfwYyzKMao5+q\nkfkND31jDIwGvaHXfFNIlACz+2+cb7y4kU8PvkO3at2Y3XEeZmbF69eoPHKbR+7c07jzNWPG/cuD\nlC1blhUrVjB48GCaNm2Kh4cHZ8+excrKinXr1vHmm2/SrFkzunfvTlJS0mOnTH/YVOuZ0ahRI2bN\nmkXHjh1p1qwZU6dOBeDtt9+mSZMmNG7cmA4dOtCsWcGaSE2IlX8H89HvZ3i2SUVmP98o84/WHloE\n2/9jDIz+y8ChPFjbPxAYuy/v5t2/38WjogefdvgUi2IWGACqqK3m1qpVK/3vcQ9nzpyhQYO8WT9X\n3E9+9iKv/HgkhP9sOEmPhuX5ZugTPFp7eDFsmw71n4MBK+5bi/teh64eYsLuCTRwaoBnd09KWObs\njfX8ppTy1Vo/dq0EOdMQQhR6P/mE8p8NJ+lSvxz/G9Ii84FxZMk/gdF/+UMD4/jN40zaOwmXUi4s\n6rqoyAXGk5DQEEIUar8du8K0X07Qvo4zi4a6Ym2RyenEj3rC1reh3rPGwHjIiO3zUed5fdfrONs6\ns6T7knxbZrWgkNAQQhRav5+4xtT1/njUcGLJy62wsXyCwPjjLajXy3hJ6iGBERIbwrid47Axt8Gz\nhyfOts451/lCqvjdxRFCFAnbT19n4tpjtKruyPcjW2FrlcnA8P7eGBh1n4EBKx8aGOEJ4YzdOZY0\nQxoreq6gsn3lDOsVNxIaQohCZ8/ZcN740Y+mVUqx7BU3Slhl8leZzzL4fSrUeRpeenhgRCdFM27n\nOKKSovj+6e+pVTrnZ8UtrCQ0hBCFyp/nb/LaKj8aVCzJildaY2+dyV9jvitgyxRjYAxcBRYZP4Ke\nkJrA+F3jCY0LZXH3xTR2fmC5n2JN7mnkkTtTozdu3JgBAwaQmJiYp/v/+OOP744RuXea9oULFz5x\nW++88w5ffvllLvRSiEf7+2IEY718qF3OHq9RrSllm8kJCH1XwuZJUKfHIwMjKimKCbsncCbyDJ93\n+hy3Cm452PuiQUIjj9yZe+rUqVNYWVmxePHiXN9nenr63e9nzZqFv78//v7+d/vi7+/PxIkTc70f\nQuSEo5ciGb3SBxcnO1aPcad0iUyuT+G3CjZPhNrd4KWHB4b/DX8GbB7AiZsn+KT9J3Sq2innOl+E\nFLvLU58e/ZSzkWdztM36jvWZ3np6puu3b9+eEydOALBgwQKWLTOugjtmzBgmT57MZ599ho2NDRMn\nTmTKlCkcP36cPXv2sHv3bpYvX87q1asfOo26i4sLo0aNYseOHbzxxhsMGjTosf25dOkSo0aN4tat\nW5QvX57ly5dTpUqVh5bf64svvsDT0xNLS0uaNGnC6tWrn+AnJ0Tm+F6O4pXlR6lU2obVY9xxtMtk\nYBxbDZvehFpdYeAPYGnzQBWtNV4BXnzp+yUV7CqwutdqGjoVzckGc4KcaeSxtLQ0tm7dSpMmTfD1\n9WX58uUcOXKEw4cP4+npybFjx+jQoQP79+8HwMfHh/j4eFJTUzlw4ADt27e/bxp1Pz8/WrVqxYIF\nC+7uw8bGhgMHDmQqMMA45ciYMWM4ceIEAwYMYPLkyY8sv9dnn32Gv78/x48fvztNuxA56URYNCOX\nHaWsgzU/vupBWYfMTYfDsR9g4xtQqzMM+jHDwIhJjmHi3onM95lPp6qdWP/8egmMxyh2ZxpPckaQ\nk+5dT6N9+/aMHj2ab7/9lr59+96dnbZfv37s37+f8ePH4+vrS1xcHNbW1ri6uuLj48P+/ftZuHDh\nQ6dRv+PedToy48iRI2zZsgWA4cOH89///veR5fdq1KgRw4YNo0+fPrzwwgtP+FMR4tFOXYlh2NIj\nlLaz5MdXPShf8sFf/Bny/xE2ToCanR4aGKciTvHWn28RnhjOdLfpDG0wNMeXgS2Kil1o5JeM1tN4\n2LxflpaWuLi4sHz5ctq2bUvTpk3Zu3cvgYGBNGjQgMDAwAynUb/j3inSc9v27dv5888/2bhxIx99\n9BGnTp3C3DyTz8sL8Qhnr8fy8vdHcLCx5McxHlQqbfvoDQzpcHGXceDexZ3GwBi8xjid+T201vx4\n9kfm+8ynnG05vHp60aRsk1w7jqJGLk/low4dOvDbb7+RmJhIQkICGzZsoH379nc/mz9/Ph06dKB9\n+/YsXryY5s2bo5TCw8ODgwcPcvHiRQASExPvLrCUFR4eHqxfvx6A1atX06FDh0eW35Genk5YWBhd\nunRh3rx53Lx5M8+fChNF0/HQaIYtPYKVhRk/vur+6FX3Em7BgS9gYXP48SXjcs6dZsLgtQ8ERlxK\nHP/35/8x9+hcnqr0FOufXy+B8YTkTCMfubq6MnLkSFq3Ni7YMmbMGFq0aAEYL2F9/PHHtGnTBjs7\nO2xsbO4Gyr3TqCcnJwPw0UcfUbdu3Sz14+uvv2b06NF88sknd294P6r8jrS0NIYMGUJcXBwGg4Hp\n06fj4OCQpT4IAZCYksYXO8/z/YFLlHOw4YdX3anulMGZs9ZwxRe8l8KpXyE9GVzaQ/cPjJMPZjDx\nYMCtAN768y2uxl/l/1r+HyMajZDLUVkgU6OLXCU/e5FZ+y/c5D8bThIaeZsh7tWY3rP+g+MwUhLh\n1C/GsLjmD1b20GwwuI2Gchn/PdNa89P5n/j06KeUtinN/I7zaVGuRR4cUeGS2anR5UxDCJGvohJS\n+PD3AH71u0JNZzvWjfXAvea/VoS8FWicAuTYakiKhrINjKvrNRsE1g8/u01ITeD9Q++z9dJW2lVu\nxydPfUIZmzK5fERFm4SGECJfaK3ZdPwqH2wOIOZ2Km90rs0bXWr/M1OtIR0u7DDe2A7cDWYW0OB5\ncBsD1dvBYy4tnY86z//t+z9C4kKY5DqJUY1HYabkNm52ZSs0lFJTgDGABk4CrwAVgbWAI+AHvKy1\nTlFKWQNeQEvgFjBQax1samcmMBpIByZqrbebynsCXwHmwFKt9dys9lVrLdcv81hRu/Qpcs6V6Nv8\n97dT7Dl7g2ZVSrF6dGsa2CfC5X1w44zx69JfEBMCDhWh03/AdTiUrPjYttMN6WwM3MicI3MoaVWS\npT2WynQgOSjLoaGUqgxMBBpqrW8rpdYDg4BewBda67VKqcUYw+Bb02uU1rq2UmoQ8CkwUCnV0LRd\nI6ASsEspdeeO7jdAdyAM8FZKbdJaBzxpX21sbLh16xZOTk4SHHlEa82tW7ewscnkc/WiWEg3aNb9\ndZxte/ZQm1C21o6jvlkYyuuM8bLTHXbloFJzePoj45oXD1lR7w6DNuB/w5/twdvZcXkHEbcjcK/o\nztz2c2UNjByW3ctTFoCtUioVKAFcA7oAQ0yfrwRmYwyNPqbvAX4GvlbG3+B9gLVa62TgklLqItDa\nVO+i1joIQCm11lT3iUOjSpUqhIWFcfPmzSc+QJF1NjY2D0w7IoqR9FS4dgJuBMCNMySEnST56imG\nGCIZcucq0c1SxhvYjfpCuYbG78s1ALvH/6LXWnMi4oQxKIJ3EJ4YjrW5Ne0rt6dnjZ50q9YNczMZ\nM5TTshwaWusrSqn5QAhwG9gB+ALRWus0U7Uw4M7KJZWBUNO2aUqpGMDJVH74nqbv3Sb0X+XuGfVF\nKTUWGAtQrVq1Bz63tLSkRo0aT3iEQogsS46H1f0g9AgAqWbWBKZV5pJZU2o2cqNxcw9UuQZQstJj\n703cS2tNwK0AtgdvZ3vwdq4mXMXSzJJ2ldsxpeUUOlXthJ1l3g1uLY6yc3mqDMb/+dcAooGfgGcy\nqHrnwnZGfzP0I8ozumOV4UVyrfUSYAkYH7l9ZMeFELkrLRnWDYMwby57fMA7p8pzMMKO3s2r8N/n\nGuJkn8m5o0y01pyLOnc3KELjQrFQFrSp1IYJLSbQuWpnHKxkfFBeyc7lqW7AJa31TQCl1K9AW6C0\nUsrCdLZRBbhqqh8GVAXClFIWQCkg8p7yO+7d5mHlQog8km7QxCenEZeUSnxyGvFJacQlpRF39/tU\n0+dpJNzjwa5dAAAgAElEQVROYnDIe7gm7OcLuyl8ta82lUvb8v0rjelcr1ym9qe1Jjk9mZC4EHYE\n72B78HaCY4MxV+Z4VPTg1Sav0qVaF0pZl8rlIxcZyU5ohAAeSqkSGC9PdQV8gL1Af4xPUI0ANprq\nbzK9P2T6fI/WWiulNgE/KqUWYLwRXgc4ivEMpI5SqgZwBePN8jv3SoQQucBg0Fy4Ec/RS7c4fCkS\n70uR3IhLfux2SoGDtRlzzJbgatjPModxHChTlzY1jtK4ii37Iw+w60Ayt9Nuk5yeTFJaEknpSSSl\nJd33PjktmaT0pLvtmikz3Cq4MbzRcLpV6yZjLAqA7NzTOKKU+hnjY7VpwDGMl4h+B9YqpT4ylX1v\n2uR7YJXpRnckxhBAa33a9ORVgKmdCVrrdACl1BvAdoyP3C7TWp/Oan+FEA9KN2gCrsZy5NItjl6K\nxDs4kqjEVAAqlrKhTS0najrbY29jgYO1hfHVxgJ76zuvljjYWFDC0gy1YxYc3oPuOAPrCtUI9P4M\nnagJCrTBxsIGG3Pjq7W5NbYWtthZ2OFk43S3/N91HG0caV+lvTz9VMAUi2lEhBBGKWkGTl6JuRsS\nvsFRxCUbn1up7lSC1i6OuNd0wr2GI1XK2Gb+EfV9n8K+OSS3HsuHJa3ZGLiRTlU78clTn2BvZZ+L\nRyRyikwjIoRAa41fSBQHLtziaPAtfC9HkZRqAKB2OXt6N69E6xqOuNdwokKpLI6pObwY9s0hvGl/\nphjCOBl4ivHNxvNas9dkBHYRJKEhRBGktebP8zf5avcFjoVEoxQ0qFCSQW7V8KjpSCsXR5yf8Cmm\nDPmvgW3TOVa3M1NSA7l9+zZfdv6SrtW6Zr9tUSBJaAhRhGit2XfOGBb+odFULm3LRy805vmmlShV\n4tGjqp/YmS2wcQI/1XBlTvplKtlUYmmPpdQuUztn9yMKFAkNIYoArTV7z93gq10XOB4WQ+XStszp\n24T+LatgZZELl4iC9pH68yt8UrU2PxFBu4rt+LT9p/IYbDEgoSFEIaa1ZveZGyzcc4ETYTFUKWPL\n3H5N6OeaS2EBEOZDxLqhTK1ciWPmtxnVeBQTW0yUKTuKCQkNIQohrTU7A8JZuOcCp67EUs2xBJ+9\n2JS+rpWxNM/Fm8/hAZxaN4BJFRyJtbRkXruP6FmjZ+7tTxQ4EhpCFCIGg2ZHQDgLd18g4Fos1Z1K\nMK9/U15okcthARAZxMb1/fjAyY6yduVY3XUR9Rzr5e4+RYEjoSFEIWAwaLafvs5Xuy9w9nocLk4l\nmD+gGS80r4RFbocFkBodyuc/9eGHkpa4OzVmXrdFMjq7mJLQEKKAuxAex5trjnH2ehw1ne1Y8FIz\nejfLm7AAiIwK4u1f+3LUBoZV7cH/dfoUCzP51VFcyZ+8EAXYxRvxDPY0Ti/+5cDmPN+sEuZmebOQ\nmEEbOH7lEDN2vU6EeTof1xtBb4+382TfouCS0BCigLoUkcAQz8OAZu1YD2qXy93pv1MNqQTcCsAv\n3A+/q4c5dsOPmPQkyqen4dV8Co1ajs3V/YvCQUJDiAIo5FYiQzwPk2bQrHk1dwIjMTWR4zeP43fD\nD79wP07cPE5SunFG2+qpaXRJSsLVogyd271DqSYDc3z/onCS0BCigAmLSmSw52Fup6bz4xgP6lXI\nmcCISoq6GxB+4X6ciTxDuk7HDEU9M1tejInCNTEBV0snnBsPgCYDoHzjJ1pZTxR9EhpCFCDXYm4z\n2PMwcUmp/PiqBw0rlcxWe0lpSSw8tpCDVw4SFBMEgJWZFY0dqjHKugotrwTQLC4Se5syxnW6mwyA\nqu5gJhMNioxJaAhRQITHJjF4yWGiE1JZNcadxpWzNyVHSnoKU/ZN4eCVg7Sr3I7ny7bCNeoqjc/t\nwypwD1jaQf1njUFRqzOY5/DcVKJIktAQogC4EZfEYM/D3IxLxmu0O82rls5We6mGVKb9NY0DVw7w\nrnNbBpz1gYjzYGYJtbtBjw+h3jNgZZdDRyCKCwkNIfLZrfhkhnoe4Vp0EitHtaZl9ewNmks3pDNr\n/yx2h+xmRmoJBnivhepPQZsJ0KA3lHDMoZ6L4khCQ4h8FJWQwtClRwiNSmT5yNa0rpG9X+gGbeC9\nv99ja/BWJsckMjQxBgb9aLwMJUQOkNAQIp/EJKYy7PsjBEUksGyEG21qOWWrPa01cw59wMbAjYyP\nimG0fV0YvgxKV8uhHgshoSFEvohNSmX4siNcCI9nyfCWPFXHOVvtaa2Zv38W6y5t5pXoWMY3HAFd\n35Wb2yLHSWgIkcfiklIZsewoAddiWTysJZ3qlct2m19vfx2v8AMMTkhhSs8lqHpP50BPhXiQhIYQ\neSghOY1RK7w5ERbDN0Nc6dqgfPYaTEnEc8NAliQF86KhBDOG/IEqXTVnOitEBiQ0hMgjt1PSGb3S\nG7+QaBYOakHPxhWy1+CNs6z6bSgLrVN4tkQ1/vvCr5hZWudMZ4V4CBn2KUQeSEpNZ4yXN0cvRbLg\npWY827Ri1hvTGo6tZv0PPfnMOoXuTs346MWNmEtgiDwgZxpC5LKE5DTGrvLh78BbzO/fjD7NK2e9\nseR4+P3/2Bi0mQ/LOtGxggefdlsk61uIPCN/04TIRTGJqYxccZQTYTF8PqAZ/VyrZL2x66fgp5Fs\nS7rCu+XK4lGhNZ93+xpLeUJK5CG5PCVELrkZl8wgz8OcvhLLN0Ncsx4YWoPPcljald06nhnlytG8\nXAu+6rIQa3O5JCXyVrZCQylVWin1s1LqrFLqjFKqjVLKUSm1Uyl1wfRaxlRXKaUWKqUuKqVOKKVc\n72lnhKn+BaXUiHvKWyqlTpq2WaiUzNEsCocr0bcZ+N0hgiMS+H5kq6zf9DYYYOt02DKZA1Wb8XaZ\nEjRybsyibosoYVkiZzstRCZk90zjK2Cb1ro+0Aw4A8wAdmut6wC7Te8BngHqmL7GAt8CKKUcgfcA\nd6A18N6doDHVGXvPdj2z2V8hct2liAReWnyIm3HJrBrdmvZ1ymatofRU+O01OPodR11fYrJ5JLVL\n1+bb7t9iZykTDYr8keXQUEqVBDoA3wNorVO01tFAH2ClqdpK4AXT930AL210GCitlKoIPA3s1FpH\naq2jgJ1AT9NnJbXWh7TWGvC6py0hCqSz12MZsPgQt1PTWTPWg1YuWZxLKvU2rHsZTqzDv+1Y3og7\nTlWHqnzX/TtKWmVvjQ0hsiM7Zxo1gZvAcqXUMaXUUqWUHVBea30NwPR6Z7hrZSD0nu3DTGWPKg/L\noPwBSqmxSikfpZTPzZs3s3FIQmTdsZAoBn53GAszxfpxHllfDyMpFlb3h/PbCOg8jdcjDlKuRDk8\ne3hSxiZ7M+AKkV3ZCQ0LwBX4VmvdAkjgn0tRGcnofoTOQvmDhVov0Vq30lq3Kls2i5cChMiGvwMj\nGLb0CKVsLfnptTZZX9M7IQJWPgehhwl8Zg7jrm3D3soez+6eONtmb34qIXJCdkIjDAjTWh8xvf8Z\nY4iEmy4tYXq9cU/9e+c3qAJcfUx5lQzKhShQdp8JZ+RybyqVtuWn19pQ1TGLN6hjwmBZT7h5jtAX\nFvLq5Z+xMLNgaY+lVLTPxmBAIXJQlkNDa30dCFVK1TMVdQUCgE3AnSegRgAbTd9vAoabnqLyAGJM\nl6+2Az2UUmVMN8B7ANtNn8UppTxMT00Nv6ctIQqEzcevMm6VL/XKO7BuXBvKl7TJWkMRF+D7pyE+\nnOsDvmfMeS9SDal4dvekWkmZ2lwUHNkd3Pcm8INSygoIAl7BGETrlVKjgRBggKnuH0Av4CKQaKqL\n1jpSKfUh4G2q94HWOtL0/XhgBWALbDV9CVEgrDkawn82nMTNxZHvR7TCwSaLg+yu+sPqFwGIGPwD\nrx6bR2xKLEufXkrtMrVzsMdCZJ8yPphUdLRq1Ur7+PjkdzdEEbd0fxAf/X6GjnXLsnhYS2ytzLPW\nUPBBWDMIbEoRM3AVo3w+IjQulMXdFuNa3vXx2wuRQ5RSvlrrVo+rJ9OICPEEtNZ8uesCX+2+QK8m\nFfhyYAusLLJ4lff8dlg/HEpXI2HQD4w/MptLMZf4pus3EhiiwJLQECKTtNZ8uOUMyw5eon/LKszt\n1wQL8ywGxomfjAP3yjfm9qAfmXBoFgG3Avii0xe0qdQmZzsuRA6S0BAiE5LT0vnPr6f4xS+MkW1d\nePe5hpiZZXFWm6Oe8Mfb4PIUKQNWMOXQO/iF+zG3/Vw6V+ucsx0XIodJaAjxGLfik3lttS/ewVFM\n7laHSV3rkKVp0LSGv+bD3o+gXi/S+nky/e//cvDKQd5v+z69avbK+c4LkcMkNIR4hLPXYxm9woeI\n+GQWDm5B72aVstaQwQA7ZsHhRdBsMIbnF/LuodnsCtnFdLfp9KvTL2c7LkQukdAQ4iF2BYQzae0x\n7KwtWD+uDc2qln7yRgwGuLAdDnwBoUfA/TV0jzl8fHQOm4M280bzNxjWcFjOd16IXCKhIcS/aK35\n7q8gPt12lsaVSuE5vBUVSj3hoL30VDj5Mxz8Cm6egVLV4Pmv0C2Gs8DvC9afX8+oxqMY23Rs7hyE\nELlEQkOIeySnpTPz15P86neFZ5tWZH7/Zk82BiMlAfy84O+vITYMyjWEvkugcT8wt2Tx8W9ZcXoF\ng+oNYrLr5KzdGxEiH0loCGFyMy6Zcat88AuJZkq3ukzsWjvzv9QTbsHR7+DoErgdBdXawnNfQJ3u\nYGrD67QXi/wX0btWb2a6z5TAEIWShIYQQMDVWF718uFWQjLfDHHl2aaZnCAwOsR4VuHnBWm3oV4v\naDcZqrnfrRIWF4ZXgBdrzq6he/XuvN/2fcyUrLQsCicJDVHsbTt1nSnr/Clla8nPr7XN3DoY4aeN\n9ytO/mw8k2g6ENpOhHL171bxv+GPV4AXu0N2Y4YZL9Z5kVnus7Awk392ovCSv72i2NJas2hfIPO2\nn6NZ1dJ4vtySco+apVZrCDkEB740PhFlaQfur0Gb16GUcRb/NEMae0L2sDJgJSdunsDByoGRjUYy\npP4QytuVz6MjEyL3SGiI4iU9DZKiSY6PYuFWX/zOh/DfWjYMb1EGy4ATxlXzkmMhKcb0GvvPa1I0\nJNyEEk7QeRa4jYESxuVc41Pi2XBxAz+c+YEr8Veo6lCVma1n8kLtFyhhmcX1NYQogCQ0RPFx4yys\n7gexV7AG3gawAq6Yvu6wtAObkmBd0vhqUxpKVzO+r9gUmg0BK2MQXIu/xg9nfuCXC78QnxqPazlX\n3m71Np2qdsLcLIsz3wpRgEloiOIh/DSs7E2qVvzPfDThqTa89FQjWtat/k84WJu+zB//z+JUxCm8\nTnux4/IOAHpU78HLDV+mSdkmuX0kQuQrCQ1R9F07AV59SMaSF+JnEFOiOktHu9GwUsknaibdkM6+\n0H14BXjhd8MPe0t7hjUYxtAGQ2U5VlFsSGiIou2qP3j14bay5bnY6ViWrcVvo1tTziHzI7zTDen8\ncekPlpxYQnBsMJXsKjHNbRp9a/fF3so+FzsvRMEjoSGKriu+sKovCcqOZ6Kn4Vy1LstHtqZUicwt\ny5puSGdb8DYWH19McGwwdcrUYV6HeXSr3k0emxXFlvzNF0VTqDes7kesmQPPRE2jZp0GfPdyS0pY\nPf6vfLohne3B21l8YjGXYi5Ru3RtPu/4Od2qd5NBeaLYk9AQRU/IYfTq/kSblaZX1DSaNWrEV4Ob\nY23x6KeZ0g3p7Li8g8XHFxMUE0Tt0rWZ33E+3at3l7AQwkRCQxQtwQfQP7zELTMnno2eRoeWTfnk\nMcuyGrSBHcHGsAiMCaRWqVrM6ziPHtV7SFgI8S8SGqLoCPoT/eNAws3K8XzMNHo/5cqsXg0euiyr\nQRvYeXkni48v5mL0RWqWqsm8DvPoXr27jLEQ4iEkNETRELgHvWYwV1VF+sROY3h3N97skvEstQZt\nYNflXXx7/FsuRl+kRqkafNbhM3pU7yFhIcRjSGiIwu/CTvTaoYSYVaJv3HQmPu/ByHY1HqiWlJbE\nvtB9eJ705HzUeVxKujC3/Vx6uvSUsBAikyQ0ROF2bht6/csEqaq8lDCdWQPa8WLLKnc/TjWkcujq\nIbZd2sae0D0kpCbgUtKFT9p/wjMuz0hYCPGEJDRE4XVmC/qnkZxX1Rl6ewafDG1Pj0YVSDek4xvu\ny9bgrey8vJOY5BgcrBx42uVperr0pHWF1hIWQmSRhIYonAI2on8eRQA1GZU6gy9HdsC+1BXmHl3B\n9uDtRNyOwNbCls5VO/NMjWdoW6ktVuZW+d1rIQq9bIeGUsoc8AGuaK2fU0rVANYCjoAf8LLWOkUp\nZQ14AS2BW8BArXWwqY2ZwGggHZiotd5uKu8JfAWYA0u11nOz219RBJz6Bf3LqxynFuMsX6Fz+3N8\neHwJVxOuYmVmRYcqHehZoycdqnTA1sI2v3srRJGSE2cak4AzwJ3Z3z4FvtBar1VKLcYYBt+aXqO0\n1rWVUoNM9QYqpRoCg4BGQCVgl1Kqrqmtb4DuQBjgrZTapLUOyIE+i8LqyBKCds9iWSkXNtvbY7D8\nlu2hFnhU8uCNFm/QuWpnmQ9KiFyUrdBQSlUBngU+BqYq4/ONXYAhpiorgdkYQ6OP6XuAn4GvTfX7\nAGu11snAJaXURaC1qd5FrXWQaV9rTXUlNPKZwaD5bPs5NvlfeXzlh9AYF8LTaNOr8T33vdd365qp\nW3Sw8+Sq/RXOVK4AOo2mztV5oe7rdKvWjTI2ZbJ/YEKIx8rumcaXwDTAwfTeCYjWWqeZ3ocBlU3f\nVwZCAbTWaUqpGFP9ysDhe9q8d5vQf5W7Z9QJpdRYYCxAtWrVsnE44nHS0g3M+PUkP/uG0bleWZzt\nrbPcllKgUMZXBdz53vRZqk7kWupRrqb8yY20c+xWUD3dkVb2/XjrqUE0Kl81pw5LCJFJWQ4NpdRz\nwA2tta9SqtOd4gyq6sd89rDyjOZv0BmUobVeAiwBaNWqVYZ1RPalpBmYvO4Yf5y8zuRudZjUtU6G\ng+eyIzk9mf1h+/k96Hf+CvuLFEMK1dIVr8XF0ct9Ki4eE3N0f0KIJ5OdM412QG+lVC/ABuM9jS+B\n0kopC9PZRhXgqql+GFAVCFNKWQClgMh7yu+4d5uHlYs8djslnddW+/Ln+Zu882wDxrSvmWNtpxvS\n8Qn34feg39l1eRdxqXE42TjxUsV29Dq+mcZpoAb+AC7tcmyfQoisyXJoaK1nAjMBTGcab2mthyql\nfgL6Y3yCagSw0bTJJtP7Q6bP92ittVJqE/CjUmoBxhvhdYCjGM9A6piexrqC8Wb5nXslIg/FJaUy\neqUP3sGRzOnbhCHu2b8EqLXmbORZfg/6na2XtnLj9g1KWJSgW/VuPFvjWVpfO4fFH2+BYy14ZS04\n5lxICSGyLjfGaUwH1iqlPgKOAd+byr8HVpludEdiDAG01qeVUusx3uBOAyZordMBlFJvANsxPnK7\nTGt9Ohf6Kx4hKiGFEcuPEnA1li8HNqdP88qP3+gxdgTv4Bv/bwiKCcLCzIKnKj/F2zXfpmOVjtia\nWcHOd+HQ11CrCwxYATalsn8gQogcoe48oVJUtGrVSvv4+OR3N4qEG7FJDPv+CMG3Elk0xJVuDctn\nq72I2xHMOTKHnZd3UrdMXQbWG0iP6j0obVPaWCEpFn4ZAxe2Q+tx8PQcMJfxp0LkBaWUr9a61ePq\nyb9IkaGwqESGLT3Cjbhklo90o11t5yy3pbVmS9AW5h6dS1JaEpNcJzGy0cj7l0yNugxrBsHNc/Ds\n5+A2JgeOQgiR0yQ0xAMCb8YzbOkREpLTWDXanZbVsz4G4nrCdT449AH7r+ynednmvN/ufWqW+tf9\niZAjsHYIpKfCsJ+Nl6WEEAWShIa4T8DVWIYvO4LWsGasB40qZe1+gtaany/8zOc+n2PQBma0nsGg\neoMenCjw+DrY9AaUrAxD1kPZuhk3KIQoECQ0xF1+IVGMXHYUO2sLVo12p3a5rE3HERoXyvt/v8+R\n60doXaE1s9vOpqrDvwbiGQyw9yPY/zm4tIeXvKCEYw4chRAiN0loCAD+vhjBGC8fyjpYs3q0O1Ud\nSzx6g7hwCD1yX1G6NrAm/DALr+zADDPerd6H/mXdUKHHMD5Id4+T6+HMZnAdDr0+BwuZgVaIwkBC\nQ7D7TDjjf/DDxakEq0e7U66kzaM3OLcVfhsPt6PuFgVZWvCesxP+Nta0T7zNuxGRVAj83yMaUdDj\nY2gz4c4cIkKIQkBCo5jbfPwqU9b506BiSVaOao2j3SP+x5+WArveg8OLoEJTGLSGNMsSrAjewreB\nv2BjZsWcBiN4ruJTj59exLYMlMr+mA8hRN6S0CjG1h4NYeaGk7hVd+T7ka1wsLF8eOXIIPh5FFw9\nZhxD0eNDzsUG8+7f7xJwK4Du1bvzH/f/4Gyb9UdzhRAFn4RGMfX9gUt8uCWADnXL8t2wlthaPWL5\n01O/wKZJYGYGA1dzplxtfvGZxy/nf6GkdUk+7/g5PVx65F3nhRD5RkKjGPp6zwXm7zjP043Ks3Bw\nC6wtHhIYqbdh2wzwXUFMlZb84dqfDRdXceboGazMrOhduzdTXKf8M6JbCFHkSWgUI1obF0/6dl8g\nfVtUZl7/pliYZzQDPXDzHIafRuIdG8ivDduxKzmclJPfUt+xPjNbz+TZms9SylrmhBKiuJHQKCYM\nBs0HWwJY8Xcwg1tX4+MXGmNmlsHNaq25fnQxG4/MY4OdLVcqlschPZp+dfrRr04/Gjg1yPvOCyEK\nDAmNYiDdoJnxywl+8g1j9FM1eOfZBg883ZSansq+S1v59fA8/k6LwlDKDveyzXmz/iC6VuuKjcVj\nHsMVQhQLEhpFXGq6gSnr/Nly4hoTu9ZhSrf7V9sLjA7k1wu/suXCb0SmxlIuLY0xTs15ofNcqpaq\nno89F0IURBIaRVhSajpv/OjHrjM3mPlMfcZ1rHX3s5T0FN7+8232hO7BAjM6JybSN9WCts9/h3mN\nDvnYayFEQSahUUQlpqQx1suXAxcj+LBPI15u43L3M4M28M7Bd9gTuofXLcrzUqAvTjW7Qt/FYCfj\nLIQQDyehUQTFJqUyark3fiFRzB/QjP4tq9z3+RdHP2Prpa1Mik9lzK1j0PV9aPOGcRyGEEI8goRG\nEROVkMLwZUc5cy2W/w125dmmFf/5MCWB1TsnsyLiMINi4xhdsjG88ANUbpl/HRZCFCoSGkXIjbgk\nXl56lEu3ElgyvCVd6puWZ02OB29Ptvsu4rNS1nRV9sx4fjHKpV2+9lcIUfhIaBQRV6JvM9TzMDfi\nklkx0o22tZ2Na24fXQKHvsFbJzCzYgWal6rF3OfWYC6P0AohskBCowgIjkhg6NIjxCalsmp0a1qW\nN4c/58GhryEpmou1OzJJhVPFrjz/e2aFjLkQQmSZ3Pks5M6HxzHgu0MkpqSxbngDWl5aAl82Ma6K\nV60N11/+hdesE7GxtGNxt8Uy9YcQIlvkTKOQSk038OORED7fcY5yFomsa3EMp3WjITkW6j0LHacR\n61yT8VtHEJ8az4qeK6hkXym/uy2EKOQkNAqhvedu8PHvZ7hx4zrvl91Hn6RNmPnGQ4PnocM0qNiU\nlPQUJu96jeDYYL7tZpxoUAghsktCoxA5Hx7HR7+fwed8KFNL7mGEwyYs42KhYR9jWFRoDBgH7806\nMAvv69580v4TPCp65HPPhRBFhYRGIRCZkMIXO8/z89FAhlvt4TuHTdimRELdZ6DLLKjQ5L76n/t8\nzrbgbUxtOZXnaj6XT70WQhRFEhoFWEqaAa9DwXy9+yw90/ZyyG4jpVPDoXJ76PoeVHV7YBuv0154\nBXgxpP4QRjYamed9FkIUbVl+ekopVVUptVcpdUYpdVopNclU7qiU2qmUumB6LWMqV0qphUqpi0qp\nE0op13vaGmGqf0EpNeKe8pZKqZOmbRaqf8/nXURprdlx+jpPL9jL8a3fs83iLeZaLKF0uaowfCOM\n3JJhYGy7tI15PvPoXr0709ymPTD9uRBCZFd2zjTSgP/TWvsppRwAX6XUTmAksFtrPVcpNQOYAUwH\nngHqmL7cgW8Bd6WUI/Ae0ArQpnY2aa2jTHXGAoeBP4CewNZs9LnAC7gay4ebT1Pi8k6W2vxCLatg\ncGwIXeZDvWfgIUHgfd2b/xz4D67lXPmk/SeYmz1izW8hhMiiLIeG1voacM30fZxS6gxQGegDdDJV\nWwnswxgafQAvrbUGDiulSiulKprq7tRaRwKYgqenUmofUFJrfchU7gW8QBENjRtxSSzYcZ4Q323M\ntFpPU6sL6NI1ofP30KjfIycTPB91nkl7JlHNoRoLuyzE2tw6D3suhChOcuSehlLKBWgBHAHKmwIF\nrfU1pVQ5U7XKQOg9m4WZyh5VHpZBeUb7H4vxjIRq1apl72Bymdaa+OQ0ohP/v707j66qyhI4/Nsh\nCZAQEkIYwhgIKAq2iAFRBAERnFaJli5FSkVJYwGiNsu27dLucllDW4W6bBWRSQQaZ0QoUQEVFNTC\nhMEAIpKQIGEKIROQBDLs/uNeIEAgL+Mbsr+1WHnvvHve3TfvPHbOvfecU0Ju4QlyC0tI2ZPHt19/\nzhTeZVDoVsojOsDQV5C+90KTkAu+34FjB5j4xUSaBzdnxogZNnjPGFOvap00RKQFsBh4XFULLnAe\nvbIXtAbl5xaqzgJmASQkJFS6TX0qKStn4+5cco45SSC38AT5RSXkus/zCk+QV+T+LCyhtPx0iG3I\n4y8hc5nSZANlzVvDkP8hKOEhCKl6qo+c4hwmfjGRwpJC3rrxLWJbxFZZxxhjaqNWSUNEQnASxiJV\n/cgtPigisW4vIxbIcsszgc4VqncC9rnlQ88qX+OWd6pke59yvLSMxPnJrN2ZfUZ5s5AgWoWFEtk8\nhFZhoVzUrgWRzUNpFeY8jwwLoUP5ARLWPkVo0SEY8gxNrpoITVt4tN9DhYdIXJnIvqP7mH79dC6O\nvopGyToAAA+vSURBVLg+Ds8YY85Q46Th3sk0F9iuqi9VeGkZ8ADwvPtzaYXyR0TkXZwL4fluYlkB\n/PXkXVbASOA/VTVHRI6IyECc0173A6/WNN76UFauTH3/R9buzOaZWy5hUI8YWoWFEhUWQrOQKi5E\n70+B/7sXykudu6E6JXi83wPHDjB+xXiyi7J5fcTr9G9/7p1UxhhTH2rT0xgE3AdsEZHNbtkfcJLF\n+yIyHvgVuMt97VPgZiAVKAQeBHCTw5+AJHe7505eFAcmAm8BzXEugPvMRXBV5b+WbmV5yn6evvkS\nEgd397xyxjp4Zww0jXASRhvPewmZRzJJXJlI/vF8Zt4wk75t+9YgemOMqRlxbmYKHAkJCZqcnFzv\n+5m24memr05j0tB4nryxGvM6bf8EPnwIWnWF+5ZAZKeq67gy8jNIXJlIUWkRs26YRe+Y3jWI3Bhj\nziUiG1S1ylMeNiK8Buas3cX01WmMGdCFfx9VjWsJGxfAPx6DDv1g7AcQFu1x1bS8NBJXJlKu5bw5\n6k27hmGM8QpbT6Oa3k/ew5+Xb+eWy2L58+g+no26VoW1L8GyKdB9mDOquxoJY0fODh78/EEEYd6o\neZYwjDFeYz2Nalix7QBPLU5hcM8YXrr7cpoEeZAwysth5TPwz+nQ504YPQOCQz3e59bsrTy86mHC\nQsKYM3IOXVt2rcURGGNM7VjS8NB3adlMeXsTl3eO4o3fXUnTYA+m6SgrgaWTIeU9GPAw3Pj8BUd2\nn21T1iYmfTGJyKaRzB01l44tKh3baIwxDcaShgdSMvP41/nJxMWEMW9cf8KbevBrO1EIHzwAO1fC\n8Gdg8BPnnTeqMkkHkpj85WTahrVlzsg5tA9vX4sjMMaYumFJowqpWUcZNy+JVuGhLHjoKqLCPDi1\nVJgD79wDmUlw68uQ8GC19vnd3u94dPWjdGrRidkjZ9MmrE0NozfGmLplSeMC9uYVcf/c9QQJLBx/\nFe0jq57ag4J9sPAOyEmDu95yVtWrhjV71jB1zVTio+KZecNMopt5fsHcGGPqmyWN8zh89Dj3zV3P\nkeJS3n14IN1iwquulL0TFt4ORXnwu8XQbUi19rlq9yqe/PpJekX34o0b3rDJB40xPseSRiWOFJcw\nbl4Se3OLWDj+Knp38OA/770bYdGdgDijvDtUb6T28l3LeXrd01wWcxmvj3idiNCImgVvjDH1yJLG\nWYpLypiwYAM/7S9g9v1XMqBbJaeHVOHIfqdncXgnZKfCpoXO2Iv7PobW8dXa55KdS/jjd3+kf/v+\nvDr8VcJCwuroaIwxpm5Z0qigtKycKe9s4vtdh3n57r4M7xYO+zbD4dTTCeJwKhxOgxNHT1cMCYNO\n/eH2mdDy/NOT5xXnkZqXyq78XaTmpZKWl0ZaXhqHiw8zqMMgXh72Ms2CPbhuYowxXmJJw6UHtrD8\n43e5LnM7z8UWEPtVJizdX2ELgajO0LondLkaWveAmJ7Oz4gOZ4y/uFByOCk8JJz4yHgGdxpMr+he\n3HnRnbbinjHG5zXupKHK0V++5thXL9Du4FpuA4qbRtAs7GKIGXpmYojuDiHNK1RVDhYeJD0/nYz9\na0nPT68yOfSI6kF8VDzxkfG0D2/v2RQkxhjjQxpl0thz+Cg7vvmALttnctGJ7RRrS14LGkPT/g+Q\neONVZ/QaCksKSS9IJ2PPV2QUZJCRn0FGQQa7C3ZTVFp0aruTyWFIpyFOYoiKp0dUD9qFtbPkYIwJ\nGI0iaZSXKyl78/lq617KtnzAb45+wIigTA5IW1bGPUHM4ETGdgxj2+EtLPr57VPJIb0gnazCrFPv\nIwgdW3QkLjKOhHYJdIvsRlzLOOIi42jTvI0lB2NMwAvYpFFcUsZ3adms+imLdT/9yvCiFUwIXk5H\nySYnogdZ17xG+4H30FrgvZ/f45Elr3PkxBEAIkIj6NayGwNjB55KCnEt4+jSsotddzDGNGoBlzRy\nC08wYYGzZndIST6JoV/wacgKIkLyKe3QH66bTvRFo0CEdXvX8fekv5Oen87VsVcz/rLx9IjqQXSz\naOs1GGNMJQIuaWTmFrE/M53Z7b9kYO4ygkuPQfeRcO1UgrteDTgr4E1LnsY3md/QJaILrwx7haGd\nh1qiMMaYKgRc0rikeR7LyiYh2aXQ57cw6DFofxkABScKmPnjTN7e/jZNg5sy9cqpjL1kLKFNPF/f\nwhhjGrOASxrBx/OQK6bANVMguhsAZeVlfJT6Ea9teo3c4lzu6HkHj1zxCDHNY7wcrTHG+JeASxq0\nuxRufenU06QDSfzth7+xI3cH/dr2Y8aIGVza+lIvBmiMMf4r8JJGUAgAe4/u5cXkF1m1exWx4bFM\nu24ao7qOsusWxhhTCwGXNMq1nFc2vsL8bfNpEtSEyX0nM673OJvTyRhj6kDAJY3UvFRmb5nNLd1v\n4fF+j9syqcYYU4cCLmkEBwWz8KaF9G1bvfUsjDHGVC2o6k38S/fI7pYwjDGmngRc0jDGGFN/fD5p\niMiNIrJDRFJF5Clvx2OMMY2ZTycNEWkCTAduAi4FxoiIDbIwxhgv8emkAQwAUlV1l6qeAN4FbvNy\nTMYY02j5etLoCOyp8DzTLTuDiEwQkWQRST506FCDBWeMMY2NryeNyoZv6zkFqrNUNUFVE9q0adMA\nYRljTOPk60kjE+hc4XknYJ+XYjHGmEbP15NGEtBTRLqJSChwD7DMyzEZY0yjJarnnO3xKSJyM/Ay\n0AR4U1X/UsX2RcC2Gu4uEsj3s7re3Lcdc8PV7QL8WsO6td23P9b15r79sS5AT1WNrHIrVQ2of8Ch\nWtSd5W91/TVuO+Zq161xu/bjY7Y24oO/L18/PVUTebWo+w8/rOvNfdsxN1zd2rTr2u7bH+t6c9/+\nWNfj+j5/eqq6RCRZVRO8HYcxdcnatfEVgdjTmOXtAIypB9aujU8IuJ6GMcaY+hOIPQ1jjDH1xJJG\nAxKR20VERaSXt2OpCRE5WsXra0TEJ867i0gnEVkqIjtFJE1E/tcd63O+7R8XkbCGjDGQ+HPbtnZd\nPX6bNKr6oH3UGGAdziBFj7mz/RoPiYgAHwEfq2pP4CKgBXChMT6PA15PGn7arsHadr3zlXbtt0nD\n34hIC2AQMB73iyUiQ0XkGxFZIiI/icgbIhLkvnZURJ4TkfXA1d6L/ExuzJ9UeP6aiIzzYkiVGQ4U\nq+o8AFUtA/4NeEhEwkXkBRHZIiIpIjJFRB4FOgCrRWS1F+P2S4HQtq1de86v1wh3G+tSoBUQAjyj\nqktFJA74DOcvn2uAvcBtqlrkpVABRgOfq+ovIpIjIv3c8gE4a4XsBj4H7gA+BMKBrar6316J1r/1\nBjZULFDVAhH5FUgEugFXqGqpiESrao6ITAWGqWq2F+I9g5+1a7C23VB8ol37e0+jGLhdVfsBw4AX\n3S4cQE9guqr2xhkY9VsvxXjSGJz1QHB/jnEf/6DOeiFlwDvAtW55GbC4YUMMGEIlsyG75UOAN1S1\nFEBVcxoyMA/5U7sGa9sNxSfatV/3NHB+WX8VkSFAOc5aG+3c19JVdbP7eAMQ1/DhOUSkNU7Xso+I\nKM48Wgp8yrmN4OTzYvfL5mtKOfOPjWbeCuQCtnHWf6Yi0hJnxuRdVP7F8yV+0a4hoNq2tWsP+XtP\nYyzQBrhSVfsCBzn9YR+vsF0Z3k2QdwILVLWrqsapamcgHecvrwHuLL5BwN04px582W7gUhFpKiKR\nwPXeDqgSXwJhInI/nLrY+iLwFrAS+L2IBLuvRbt1jgARDR9qpfylXUPgtG1r1x7y96QRCWSpaomI\nDAO6ejug8xgDLDmrbDFwL/A98DywFefLdvZ2PsFtjMdVdQ/wPpACLAI2eTWwSqgzYvV24C4R2Qn8\ngnPK5w/AHJzZYlNE5EeczwCcEdef+ciFcH9p1+DnbdvadfX55Yhw94M+CFyMM8lWCLAZ5w6Om9zN\nPlHVPu72TwAtVPXZho/2/ERkKPCEqt7q7ViqIiKXA7NVdYC3YwlUgdKuwX/atrXr6vN217amegNp\n7h0B57tlr8/JB6r6QoNEFaBE5PfAozj3fJv6Y+26AVm7rhm/62lU/KBVdaW34zGmLli7Nv7C75KG\nMcYY7/H3C+HGGGMakM8nDRHpLCKrRWS7iGwTkcfc8mgRWSXOxF2rRKSVW95LRL4XkePuhcKK75Xh\nDrPfLCLJ3jgeY06q47YdJSIfisjP7vv5xPQcJvD4/OkpEYkFYlV1o4hE4AxoGg2MA3JU9XkReQpo\npar/ISJtcW5RHA3kVrxYKCIZQIIvTBVhTB237fnAWlWdI86sp2GqWtslYo05h8/3NFR1v6pudB8f\nAbbjjJC9DZjvbjYf54uEqmapahJQ4oVwjfFYXbVtd1TwEGCuu90JSximvvh80qjInbDtCmA90E5V\n94Pz5QPaevAWCqwUkQ0iMqG+4jSmumrZtrsDh4B5IrJJROaISHg9hmsaMb9JGu7Mn4txbkksqOHb\nDHIngbsJmOzO7WOMV9VB2w4G+gEzVPUK4BjwVB2GaMwpfpE0RCQE50u1SFU/cosPuueET54bzqrq\nfVR1n/szC2dKAxsFaryqjtp2JpCpquvd5x/iJBFj6pzPJw13Sui5wHZVfanCS8uAB9zHD+CsP3Ch\n9wl3Lzbidt1H4syJY4xX1FXbVtUDwB4Rudgtuh74qY7DNQbwj7unrgXWAltwpokGZ4Ku9TgTjHXB\nmajrLnfRkfZAMtDS3f4ozkIwMZyeMC0YeFtVL7RMojH1qq7atrsQT1+cSetCcabJflBVcxvyeEzj\n4PNJwxhjjO/w+dNTxhhjfIclDWOMMR6zpGGMMcZjljSMMcZ4zJKGMcYYj1nSMMbL3BlqJ1V4PlRE\nPvFmTMacjyUNY7wvCphU5VbG+ABLGsZUg4jEuWtWzBGRrSKySERGiMi37voXA9z1MD4WkRQR+aeI\n/Itb91kReVNE1ojILhF51H3b54F4d52XaW5ZiwrrYyxyR48b43XB3g7AGD/UA7gLmAAkAfcC1wK/\nwRnRvQfYpKqjRWQ4sADo69btBQwDIoAdIjIDZ3LBPqraF5zTUzgz3vYG9gHfAoOAdQ1xcMZciPU0\njKm+dFXdoqrlwDbgS3WmVtgCxOEkkIUAqvoV0FpEIt26y1X1uLsQWBbQ7jz7+EFVM919bHbf1xiv\ns6RhTPUdr/C4vMLzcpzee2Wnkk7O11Oxbhnn7+17up0xDcqShjF17xtgLJw61ZRdxToZR3BOVxnj\n8+yvF2Pq3rM4q+ilAIWcnua8Uqp62L2QvhX4DFhe/yEaUzM2y60xxhiP2ekpY4wxHrOkYYwxxmOW\nNIwxxnjMkoYxxhiPWdIwxhjjMUsaxhhjPGZJwxhjjMf+H0VCpa8qrD5ZAAAAAElFTkSuQmCC\n", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYAAAAE7CAYAAADUylYJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAF05JREFUeJzt3Xu4XXV95/H3R8JVuUrKaACDmqooXiPgpY4FB8E6ovOI\nUqumDpW5oHhpx2pnplBbZuo8Lajt6JSKTuSxIqKOeBktBRFtBQ0XiYAMGa4R1DggIl4w+J0/1grs\nxJOcfcJhr33ye7+eZz9nrd/6rZXvzkn2Z6+1fmutVBWSpPY8ZOgCJEnDMAAkqVEGgCQ1ygCQpEYZ\nAJLUKANAkhplAEhSowwASWqUASBJjVo0dAFbsvfee9fSpUuHLkOSFpRLL730B1W1eLZ+Ux0AS5cu\nZdWqVUOXIUkLSpKbxunnISBJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSo6b6QjBp\nECfvPo/bunP+tiXNM/cAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaA\nJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUqLECIMlbklyV\n5FtJPppkpyQHJLkkyXVJPpZkh77vjv38mn750pHtvKNvvzbJCx+ctyRJGsesAZBkCXAisLyqngRs\nBxwLvAs4raqWAXcAx/WrHAfcUVWPBU7r+5HkwH69JwJHAu9Lst38vh1J0rjGPQS0CNg5ySJgF+A2\n4DDgnH75SuCl/fTR/Tz98sOTpG8/q6p+XlU3AGuAgx/4W5AkbY1ZA6CqvgP8BXAz3Qf/ncClwA+r\nan3fbS2wpJ9eAtzSr7u+7//w0fYZ1rlPkuOTrEqyat26dVvzniRJYxjnENCedN/eDwAeCTwUOGqG\nrrVhlc0s21z7xg1Vp1fV8qpavnjx4tnKkyRtpXEOAb0AuKGq1lXVL4BPAs8G9ugPCQHsC9zaT68F\n9gPol+8O3D7aPsM6kqQJGycAbgYOTbJLfyz/cOBq4EvAy/s+K4BP99Pn9vP0yy+oqurbj+1HCR0A\nLAO+Pj9vQ5I0V4tm61BVlyQ5B7gMWA9cDpwOfA44K8mf9W1n9KucAZyZZA3dN/9j++1cleRsuvBY\nD5xQVffO8/uRJI1p1gAAqKqTgJM2ab6eGUbxVNXPgGM2s51TgFPmWKMk6UHglcCS1CgDQJIaZQBI\nUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1\nygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjVo0dAGSNK9O3n0et3Xn/G1rCrkHIEmNMgAkqVEG\ngCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBI\nUqPGCoAkeyQ5J8m3k1yT5FlJ9kpyXpLr+p979n2T5L1J1iS5MsnTR7azou9/XZIVD9abkiTNbtw9\ngPcAX6iqxwNPAa4B3g6cX1XLgPP7eYCjgGX963jg/QBJ9gJOAg4BDgZO2hAakqTJmzUAkuwGPA84\nA6Cq7qmqHwJHAyv7biuBl/bTRwMfrs7FwB5JHgG8EDivqm6vqjuA84Aj5/XdSJLGNs4ewKOBdcCH\nklye5ANJHgrsU1W3AfQ/f63vvwS4ZWT9tX3b5to3kuT4JKuSrFq3bt2c35AkaTzjBMAi4OnA+6vq\nacDd3H+4ZyaZoa220L5xQ9XpVbW8qpYvXrx4jPIkSVtjnABYC6ytqkv6+XPoAuF7/aEd+p/fH+m/\n38j6+wK3bqFdkjSAWQOgqr4L3JLkcX3T4cDVwLnAhpE8K4BP99PnAq/tRwMdCtzZHyL6InBEkj37\nk79H9G2SpAEsGrPfG4GPJNkBuB54HV14nJ3kOOBm4Ji+7+eBFwFrgJ/0famq25P8KfCNvt87q+r2\neXkXkqQ5GysAquoKYPkMiw6foW8BJ2xmOx8EPjiXAiVJDw6vBJakRhkAktQoA0CSGmUASFKjDABJ\napQBIEmNMgAkqVHjXgimgRy08qB529bqFavnbVuSFj73ACSpUQaAJDXKAJCkRhkAktQoA0CSGmUA\nSFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAk\nNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktSosQMgyXZJLk/y\n2X7+gCSXJLkuyceS7NC379jPr+mXLx3Zxjv69muTvHC+34wkaXxz2QN4E3DNyPy7gNOqahlwB3Bc\n334ccEdVPRY4re9HkgOBY4EnAkcC70uy3QMrX5K0tcYKgCT7Ar8FfKCfD3AYcE7fZSXw0n766H6e\nfvnhff+jgbOq6udVdQOwBjh4Pt6EJGnuxt0DeDfwNuCX/fzDgR9W1fp+fi2wpJ9eAtwC0C+/s+9/\nX/sM60iSJmzWAEjyYuD7VXXpaPMMXWuWZVtaZ/TPOz7JqiSr1q1bN1t5kqStNM4ewHOAlyS5ETiL\n7tDPu4E9kizq++wL3NpPrwX2A+iX7w7cPto+wzr3qarTq2p5VS1fvHjxnN+QJGk8swZAVb2jqvat\nqqV0J3EvqKrfAb4EvLzvtgL4dD99bj9Pv/yCqqq+/dh+lNABwDLg6/P2TiRJc7Jo9i6b9YfAWUn+\nDLgcOKNvPwM4M8kaum/+xwJU1VVJzgauBtYDJ1TVvQ/gz5ckPQBzCoCquhC4sJ++nhlG8VTVz4Bj\nNrP+KcApcy1SkjT/vBJYkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBI\nUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjHsgzgaWpsvTtn5uX7dy407xs\nRpp67gFIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAk\nqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWrUrAGQZL8kX0pyTZKrkrypb98ryXlJrut/7tm3\nJ8l7k6xJcmWSp49sa0Xf/7okKx68tyVJms04ewDrgd+vqicAhwInJDkQeDtwflUtA87v5wGOApb1\nr+OB90MXGMBJwCHAwcBJG0JDkjR5sz4UvqpuA27rp+9Kcg2wBDgaeH7fbSVwIfCHffuHq6qAi5Ps\nkeQRfd/zqup2gCTnAUcCH53H9/OAzNdDxQFu/PPfmrdtSdKDYdYAGJVkKfA04BJgnz4cqKrbkvxa\n320JcMvIamv7ts21b/pnHE+358D+++8/l/IkLVDz+uVrp3nb1DZv7JPASR4GfAJ4c1X9aEtdZ2ir\nLbRv3FB1elUtr6rlixcvHrc8SdIcjRUASban+/D/SFV9sm/+Xn9oh/7n9/v2tcB+I6vvC9y6hXZJ\n0gDGGQUU4Azgmqo6dWTRucCGkTwrgE+PtL+2Hw10KHBnf6joi8ARSfbsT/4e0bdJkgYwzjmA5wCv\nAVYnuaJv+yPgz4GzkxwH3Awc0y/7PPAiYA3wE+B1AFV1e5I/Bb7R93vnhhPCkqTJG2cU0FeZ+fg9\nwOEz9C/ghM1s64PAB+dSoCTpweGVwJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNWpON4OT\nNDcHrTxo3ra1esXqeduWBO4BSFKzDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhS\nowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDVq\n0dAFbLNO3n1+tnPA/vOzHUnahHsAktQoA0CSGmUASFKjPAcgSZtx0MqD5mU7q1esnpftzDf3ACSp\nUQaAJDXKAJCkRk08AJIcmeTaJGuSvH3Sf74kqTPRAEiyHfDfgaOAA4HfTnLgJGuQJHUmvQdwMLCm\nqq6vqnuAs4CjJ1yDJInJDwNdAtwyMr8WOGS0Q5LjgeP72R8nuXZCtc2rjNdtb+AHW+7yrQdcywb5\n3TGratwc/pb8/U2h+fu/B/P1+xvgd/eocTpNOgBm+luojWaqTgdOn0w5w0qyqqqWD12Hto6/v4XL\n311n0oeA1gL7jczvC9w64RokSUw+AL4BLEtyQJIdgGOBcydcgySJCR8Cqqr1Sd4AfBHYDvhgVV01\nyRqmTBOHurZh/v4WLn93QKpq9l6SpG2OVwJLUqMMAElqlAEgSY0yACQ1JZ2HDl3HNDAApK2UZM8k\nTx66Ds0uyYeT7JZkF+Aq4IYkbx26rqE5CmjCknyGTa5+Bu4EVgF/U1U/m3xVGleSC4GX0A2hvgJY\nB3y5qpr/MJlmSS6vqqcleRXdPcneBqyqqqYD3D2Aybse+DHwt/3rR8D3gF/v5zXddq+qHwH/CvhQ\nVT0DeMHANWl2OyRZRHfzyf/V34zylwPXNDifCTx5T6uq543MfybJRVX1vCQtXxS3UCxK8gjgFcB/\nHLoYje0DwM10d3f7cpL96b6INc09gMlb3P/jA6Cf3rufvWeYkjQH76S7kn1NVX0jyaOB6wauSbOo\nqtOq6pFVdUR1x71vAQ4buq6heQ5gwpK8CPgfwP+luzvqAcC/By4EXl9V7x6uOmnbkuTELS2vqvdO\nqpZp5CGgCauqzydZBjyeLgC+PXLi1w//KZdkJfCmqvphP78n8JdV9a+HrUybsXjoAqaZewADSPJs\nYCkjAVxVHx6sII1tw2iS2dqkhcA9gAlLcibwGLohhPf2zQUYAAvDQ5LsWVV3ACTZC/8fTb0kjwTe\nAzy3b7oIeEtVNf08Ev/hTt5y4MBy12uh+kvgn5Kc088fA5wyYD0az4eAc4BX9/Ov6dteOFhFU8BD\nQBOW5OPAiVV129C1aOskOZBuBEmA86vq6oFL0iySXFFVT52trTXuAUze3sDVSb4O/HxDY1W9ZLiS\nNJsku1XVj/pDPt8F/m5k2V5Vdftw1WkMtyc5FvhYP/8KoPnfmXsAE5bkn8/UXlVfnnQtGl+Sz1bV\ni5PcwMa38ghQVfXogUrTGJIsBd4HHNI3fQ14Y1XdMFRN08AAkKRGeQhoQpJ8taqem+QuZv4GudtA\npWmOkiwBHsXGw3gvGq4izcZRQDNzD0CagyTvAl4JXM3IMF7P4Uy3JF+kGwW0Ybj1a4BjqspRQJqs\nJNsB+7DxN8ibh6tI40pyLfDkqvr5rJ01NRwFNDMPAU1YkjcCJ9HdAnrD7WgLaPq+5AvI9cD2jIzg\n0oLgKKAZuAcwYUnWAIdU1f8buhbNXZJPAE8BzmfjYbxbvOmYhrXJKKACLsZRQO4BDOAWuieAaWE6\nt39pAUjyhqr666q6EXjR0PVMG/cAJmTk+aNPBB4HfI6Nv0GeOkRdmrskO9A9wQ3g2qr6xZD1aPOS\nXFZVTx+6jmnlHsDk7Nr/vLl/7dC/4FefEawpleT5wErgRrohvPslWeEwUC1E7gFMWJJjqurjs7Vp\nOiW5FHhVVV3bz/868NH+2cCaMknWAz+ZaRFef+MjIQfwjjHbNJ223/DhD1BV/4duVJCm0+qq2m2G\n166tf/iDh4AmJslRdCehliQZfQzdbsD6YarSVliV5AzgzH7+d4BLB6xH2moGwOTcCqwCXsLGHxh3\nAW8ZpCJtjX8HnACcSHcY4SK64YWaTh5a3QLPAUxYku3pPjgcRbLA9Fdwr6yqV8/aWVoA3AOYvGfT\n3Y/kRhxFsqBU1b1JFifZoaruGboe6YEyACbvVOCITUeRAI4iWRhuBP4xybnA3RsavY5jeiV5CPDy\nqjp76FqmjaOAJs9RJAvbrcBn6f7v7Nq/HjZoRdqiqvol8Iah65hG7gFMnqNIFrarZ7qOY6hiNLbz\nkvwB3c3gRvfcmr4hnCeBJyzJjnSjSJ7LyCgSby+8MMx0awFvNzD9+kd5bqr5R3kaANIYRq7jeAX3\n31IYuus4DqyqgwcpTHoAPAQ0IUlWs4V7/lSVzwOYbl7HsYAl2QV4K7B/VR2fZBnwuKr67MClDco9\ngAnp/8HtQ3c76FGPAm6tqjWTr0pzlWQ34O6quref3w7Ysapmut+MpkSSj9EF92ur6klJdga+1voT\nwRwFNDmnAT+qqptGX3Q3qjpt4No0vr8Hdh6Z3xn4h4Fq0fgeU1X/DfgFQFX9lO4cXNMMgMlZWlVX\nbtpYVauApZMvR1tpp6r68YaZfnqXAevReO7pv/UXQJLH4GM9DYAJ2mkLy3bewjJNl7uT3DfiJ8kz\ngJ8OWI/GczLwBbor7z9C90jPtw1a0RTwHMCEJPkocEFV/e0m7cfRXRn8ymEq01wkeSZwFt1JYYBH\nAK+sKq/lmHJJHg4cSnfo5+Kq+sHAJQ3OAJiQJPsAnwLu4f5RJMvpngr2sqr67lC1aW76G/o9ju6D\n5NvezG/6JTmT7pqbr1TVt4euZ1oYABOW5DeBJ/WzV1XVBUPWo7kZGU74qKp6vcMJF4Ykh9FdfPkb\nwKOBK4CLquo9gxY2MANAmgOHEy5c/ZDdZwK/Cfxb4KdV9fhhqxqWF4JJc/OYqnplkt+GbjhhkuaH\nE067JOcDDwW+BnwFeGZVfX/YqobnKCBpbhxOuDBdSXf+7UnAk4ENe29N8xCQNAdJ/gXwn4AD6S4K\new7wu1V14ZB1aTxJHga8DvgD4J9V1Y4DlzQoA0CaI4cTLjxJ3kB3AvgZwE3cPyKo6UEYBoA0htGL\nv2ZSVZdNqhbNXZL/QPehf2lVrR+6nmlhAEhjSPKlLSyuqjpsYsVoqyR5Ct1eAHTf/r85ZD3TwACQ\ntM1LciJwPPDJvullwOlV9VfDVTU8RwFJY0jytpHpYzZZ9l8mX5Hm6PeAQ6rqj6vqj+nO4bx+4JoG\nZwBI4zl2ZPodmyw7cpKFaKsEuHdk/l68HbQXgkljymamZ5rX9PkQcEmST/XzLwXOGLCeqWAASOOp\nzUzPNK8pU1WnJrmQ7n5AAV5XVZcPW9XwPAksjSHJvcDddB8eO9M9yY1+fqeq2n6o2rR5SXaiu+/P\nY4HVwBkOA72fASBpm9XfvO8XdPf/OQq4sarePGxV08MAkLTNSrK6qg7qpxcBX6+qLV7U1xJHAUna\nlt33sB4P/fwq9wAkbbNGzt3AxudvQncF925D1TYNDABJapSHgCSpUQaAJDXKAJCkRhkA0ogkz0/y\n7KHrkCbBAJA29nzgQQ2AdPy/p8H5j1BNSPLaJFcm+WaSM5P8yySXJLk8yT8k2SfJUrrbBrwlyRVJ\nfiPJ4iSfSPKN/vWcfnuLk5yX5LIkf5PkpiR798vemuRb/evNfdvSJNckeR9wGfCfk5w2Ut/rk5w6\n6b8Xtc1hoNrmJXki3YNAnlNVP0iyF90N3H5YVZXk94AnVNXvJzkZ+HFV/UW/7t8B76uqrybZH/hi\nVT0hyV8D36mq/5rkSOB/A4uBRwH/k/ufGXwJ8GrgDuB64NlVdXGShwJXAo+vql8k+Sfg31TV6gn9\ntUjeDVRNOAw4Z8PD26vq9iQHAR9L8ghgB+CGzaz7AuDA5L47Pu+WZFe6u0q+rN/eF5Lc0S9/LvCp\nqrobIMkn6R5DeC5wU1Vd3K9zd5ILgBcnuQbY3g9/TZoBoBaEX71l818Bp1bVuUmeD5y8mXUfAjyr\nqn660QZHEmGGP2tz7t5k/gPAHwHfprtfvTRRngNQC84HXpHk4QD9IaDdge/0y1eM9L0L2HVk/u+B\nN2yYSfLUfvKrwCv6tiOAPfv2i4CXJtmlP8zzMro7Uf6KqroE2A94FfDRrX1z0tYyALTNq6qrgFOA\nLyf5JnAq3Tf+jyf5CvCDke6fAV624SQwcCKwvD+BfDXdSWKAPwGOSHIZ3W2GbwPuqqrL6M4BfJ3u\n+P8HZnnwyNnAP1bVHVvoIz0oPAksbYUkOwL3VtX6JM8C3l9VT51tvRm281ngtKo6f96LlGbhOQBp\n6+wPnN2P578HeP1cVk6yB91ewjf98NdQ3AOQpEZ5DkCSGmUASFKjDABJapQBIEmNMgAkqVH/H5Hp\n1WkeGrroAAAAAElFTkSuQmCC\n", + "data:image/png;base64,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\n", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAAEKCAYAAADAVygjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VPX1x/H3ISRAkJ2A7KAGFBACGWSxWnfRqoCKggpB\nsCzi3l8r1Vqt1talVsWFHQFBAcGtVURcqlUBkwASkC0sQljDFnbIcn5/zDc6pAkJyWyZnNfzzDM3\n37n3zpkhzMld5nNFVTHGGGMCoVKoCzDGGBO5rMkYY4wJGGsyxhhjAsaajDHGmICxJmOMMSZgrMkY\nY4wJGGsyxhhjAsaajDHGmICxJmOMMSZgKhc3g4g0A6YBZwJ5wHhVfVlEngeuB04A64E7VXW/iLQE\nVgFr3CoWqepwt65EYApQDfgYuF9VVUTqArOAlsAm4BZV3SciArwMXAscAQap6pJT1Vu/fn1t2bJl\nCV++McYYgNTU1N2qGufv9UpxsTIi0ghopKpLRKQGkAr0BpoCX6hqjog8C6CqD7sm829VbV/Iur4H\n7gcW4W0yo1V1nog8B+xV1WdEZBRQx63rWuBevE2mK/CyqnY9Vb0ej0dTUlJO4y0wxhgjIqmq6vH3\neovdXaaq2/O3HlT1IN6tlCaq+qmq5rjZFuFtOkVyzaqmqi5Ub2ebhrdZAfQCprrpqQXGp6nXIqC2\nW48xxphy4LSOybitlE7A4gIPDQbm+fzcSkSWishXInKRG2sCZPjMk+HGABqq6nbwNjWggc8yW4pY\nxhhjTJgr9phMPhE5A5gLPKCqB3zGHwVygBluaDvQXFX3uGMw74tIO0AKWW1xEdAlWkZEhgJDAZo3\nb17cSzHGGBMkJdqSEZFovA1mhqq+6zOeBFwH3O52gaGqx1V1j5tOxXtSQGu8WyG+u9SaAtvc9M78\n3WDufpcbzwCaFbHMz1R1vKp6VNUTF+f341bGGGNKqdgm487wmgSsUtV/+oz3BB4GblDVIz7jcSIS\n5abPAuKBDW432EER6ebWORD4wC32IZDkppMKjA8Ur25AVv5uNWOMMeGvJLvLLgQGAGkissyNPQKM\nBqoAC7w94+dTlS8GnhSRHCAXGK6qe91yI/jlFOZ5/HIc5xlgtogMATYDfd34x3jPLEvHewrznaV7\nmcYYY0Kh2FOYyxs7hdkYY05fyE5hNsaU3cFj2cxY/BOHjucUP7MxEcSajDEBlpObx8i3lvLoeyu4\nfeJi9h4+EeqSjAkaazLGBNiT//6Rr9dmclvX5qzafoBbxi1ke9bRUJdlTFBYkzEmgKZ+t4lpC3/i\ntxe14m99zmfa4AvYmXWMm8csZH3moVCXZ0zAWZMxJkC+XLOLv/xrJVec15BR15wHQLez6vH20G4c\nz8nllrELScvICnGVxgSWNRljAmDNjoPc+9ZSzj2zJi/3SyCq0i/hFe2b1OKd4T2oGh1F/wmLWLh+\nTwgrNSawrMkY42eZB48zeEoysTFRTBrkoXqV//06Wqv61Zk7ogeNalUl6Y3vmb9yRwgqNSbwrMkY\n40fHsnP57bQU9hw+zqSkLjSqVa3Iec+sVZV3hnenbaOajJieyuyULUXOa0x5ZU3GGD9RVf7vnR9Y\ntmU/L92awPlNaxW7TO3YGGbc1ZULz6nPH+YsZ8LXG4JQqTHBY03GGD958bN1/Hv5dh7ueS4925f8\nskfVq1RmYpKH33RoxNMfr+LZT1YTaUkcpuIqcdS/MaZo7y/dyujP19E3sSnDf33WaS9fpXIUo/t1\nola1aMb8Zz37Dp/g6T7nn3TCgDHlkTUZY8ooZdNe/jBnOV1b1eXpPufjAmNPW1Ql4ene7alXPYZX\nvkgn62g2L/VLoErlKD9XbEzw2O4yY8pg854jDH0zlSZ1qjH2jkRiKpftv5SI8Lur2vDYdW2Zt2IH\ng6ckW96ZKdesyRhTSgeOZTN4ajK5ecqkJA91qsf4bd1DftWKF/p2ZNGGvdw+YZHlnZlyy5qMMaWQ\nk5vHyBlL2LT7MGPu6MxZcWf4/TluSmzKuDsSWb3jIH3Hfse2/ZZ3ZsofazLGnCZV5Yl/reS/63bz\ndJ/29Di7fsCe64q2DZk2+AJ2HTjOzWO+s7wzU+5YkzHmNL3x7SamL9rMsIvP4tYuzQP+fF1d3tmJ\n3Dz6Wt6ZKWeKbTIi0kxEvhSRVSKyUkTud+N1RWSBiKxz93XcuIjIaBFJF5HlItLZZ11Jbv51IpLk\nM54oImlumdHiTs8p6jmMCZUvVu/krx/9yFVtG/Jwz3OD9rz5eWfVoqPoN34h363fHbTnNqYsSrIl\nkwP8TlXPA7oBI0WkLTAK+FxV44HP3c8A1wDx7jYUGAPehgE8DnQFLgAe92kaY9y8+cv1dONFPYcx\nQbdq+wHufWspbRvX5KV+CVQK8ndY8vPOmtSpxqDJyXyywvLOTPgrtsmo6nZVXeKmDwKrgCZAL2Cq\nm20q0NtN9wKmqdcioLaINAKuBhao6l5V3QcsAHq6x2qq6kL1fs15WoF1FfYcxgTVroPHGDIlmTOq\nVmbiwC7ExoTmK2Zn1qrK7GHdadekJnfPSGV2suWdmfB2WsdkRKQl0AlYDDRU1e3gbURAAzdbE8D3\nNz/DjZ1qPKOQcU7xHMYEjTf0MpV9R7KZlNSFM2tVDWk9J+WdzV3O+K/Xh7QeY06lxE1GRM4A5gIP\nqOqBU81ayJiWYrzERGSoiKSISEpmZubpLGrMKeXlKb+b/QPLM/bzUr8E2jcpPvQyGGJjKjMpqQvX\ndWjE3z5ezTPzLO/MhKcSNRkRicbbYGao6rtueKfb1YW73+XGM4BmPos3BbYVM960kPFTPcdJVHW8\nqnpU1RMXF1eSl2RMibz42Vo+StvOqJ7ncnW7M0NdzkliKlfi5X6duL1rc8Z+tZ4/vptGbp41GhNe\nSnJ2mQCTgFWq+k+fhz4E8s8QSwI+8Bkf6M4y6wZkuV1d84GrRKSOO+B/FTDfPXZQRLq55xpYYF2F\nPYcxAffukgxe+SKdWz3NGHrx6YdeBkNUJeGvvdtz32XnMDN5CyNnLOFYdm6oyzLmZyXZkrkQGABc\nJiLL3O1a4BngShFZB1zpfgb4GNgApAMTgLsBVHUv8BSQ7G5PujGAEcBEt8x6YJ4bL+o5jAmo5E17\nGTU3je5n1eOp3u1LHXoZDCLCQ1e14c/XteWTlZZ3ZsKLRNp+XI/HoykpKaEuw5RjP+05TO/XvqVO\nbAzv3t2D2rH+yyQLtHeXZPD7Octp17gmU+68gLp+zFMzkU1EUlXV4+/12jf+jfGRdTSbwVOSUWDS\noC7lqsEA3NjZm3e2xvLOTJiwJmOMk+1CLzfvPcLYOxJpVb96qEsqlYJ5Z+m7LO/MhI41GWPwhl4+\n/uFKvknfzd/6nE+3s+qFuqQy6XpWPWYO8+ad3TJuIcsz9oe6JFNBWZMxBpj0zUbeWryZEZecTV9P\ns+IXKAfaNa7FnOE9iI2Jov/4RXyXbnlnJvisyZgK77Mfd/L0x6vo2e5Mfn9Vm1CX41ctffPO3rC8\nMxN81mRMhbZyWxb3zVxK+8a1ePHW4IdeBkPDmpZ3ZkLHmoypsHYdOMZdU1OoVS2aiUkeqsVEhbqk\ngMnPO/tVfBx/mLuccV9Z3pkJDmsypkI6eiKXu6alkHU0m4lJHhrWDG3oZTDExlRm4kAP13VoxN/n\nrebv81ZZ3pkJuNDklRsTQnl5ykOzl5G2NYvxAzy0axweoZfBkJ93Vjs2mnFfbWD/4Wye7tOeylH2\n96YJDGsypsL5x6drmLdiB49eex5Xtm0Y6nKCLqqS8FSv9tStXoXRn68j62g2L/VLoGp05O4uNKFj\nf76YCuWdlC28/p/19L+gGXdd1CrU5YSMiPDQla15/HrLOzOBZU3GVBiLN+zhkffSuPCcejzZK7xD\nL4Plzgtb8eKtHVm8cS+3TVjEnkPHQ12SiTDWZEyFsGn3YYZNT6VZ3Vhevy2RaDsG8bM+nZoyfoDL\nOxu3kK2Wd2b8yP6nmYiXdcQbeinAG4O6UCs2OtQlhZ3Lz2vIm0O6kml5Z8bPrMmYiJadm8eIGals\n2ecNvWxRr3yGXgbDBa3qMnNYN7Jzlb5jv+OHLZZ3ZsrOmoyJWKrKY++v4Lv1e3jmxg50Leehl8Hg\nzTvrTvUqlbltwiK+tbwzU0bWZEzEmvjfjd5LEl96NjclNg11OeVGft5Z0zqx3PlGMp+s2B7qkkw5\nZk3GRKRPV+7gb/NWce35Z/K7KyMr9DIYGtasyqxh3WjfpCZ3z1jCrOTNoS7JlFPFNhkRmSwiu0Rk\nhc/YLBFZ5m6bRGSZG28pIkd9Hhvrs0yiiKSJSLqIjBZ3/qiI1BWRBSKyzt3XcePi5ksXkeUi0tn/\nL99EohVbs7h/5jI6NKnFC30jM/QyGGrHxjD9rq5cFB/Hw3PTGGt5Z6YUSrIlMwXo6TugqreqaoKq\nJgBzgXd9Hl6f/5iqDvcZHwMMBeLdLX+do4DPVTUe+Nz9DHCNz7xD3fLGnNKOLG/oZZ3YaCYMjOzQ\ny2CIjanMhIEeru/YmGfmrebvH1vemTk9xTYZVf0a2FvYY25r5Bbg7VOtQ0QaATVVdaF6f0OnAb3d\nw72AqW56aoHxaeq1CKjt1mNMoY6cyOGuackcPJbNxKQuNKgAoZfBEFO5Ei/fmsCAbi0Y9/UGHp67\nnJzcvFCXZcqJsh6TuQjYqarrfMZaichSEflKRC5yY02ADJ95MtwYQENV3Q7g7hv4LLOliGVOIiJD\nRSRFRFIyMzPL9opMuZSXpzw4axk/bjvA6P6daNu4ZqhLiiiVKglP9mrHfZfHMzslg5FvLeFYdm6o\nyzLlQFmbTH9O3orZDjRX1U7AQ8BbIlITKGyneHHb3CVeRlXHq6pHVT1xcXElKNtEmufmr2H+yp08\n+pu2XH5exQu9DAbfvLP5K3dy5xverUZjTqXUTUZEKgM3ArPyx1T1uKrucdOpwHqgNd6tEN9zSJsC\n29z0zvzdYO5+lxvPAJoVsYwxP5udsoWxX63n9q7NGXxhy1CXE/HuvLAVL92awPeb9nLbhMWWd2ZO\nqSxbMlcAq1X1591gIhInIlFu+iy8B+03uN1gB0WkmzuOMxD4wC32IZDkppMKjA90Z5l1A7Lyd6sZ\nk2/h+j088m4aF8XX54kb2lnoZZD07tSECQMTWbvT8s7MqZXkFOa3gYVAGxHJEJEh7qF+/O8B/4uB\n5SLyAzAHGK6q+ScNjAAmAul4t3DmufFngCtFZB1wpfsZ4GNgg5t/AnD36b88E8k27j7M8OmptKxf\nnVdv62yhl0F22bkNmX5XVzIP5uedHQx1SSYMSaSdjujxeDQlJSXUZZgA23/kBH1e/46so9m8f/eF\nNK8XG+qSKqwftx1g4OTvyc3LY8qdF9CxWe1Ql2RKQURSVdXj7/Xan36m3DmRk8fw6als3XeU8QMS\nrcGEWNvGNZk7ojtnVLW8M/O/rMmYckVV+dP7aSzasJdnbz4fT8u6oS7JAC3qVWfOcMs7M//Lmowp\nV8Z9vYHZKRnce9k59OlkoZfhpGHNqswe1p3zm9bi7hlLmPm95Z0ZazKmHPlkxQ6e/WQ1v+nQiAev\naB3qckwhasVG8+aQC7goPo5R76Yx5j+Wd1bRWZMx5cKKrVk8OGsZHZvW5oW+HS30Mozl553d0LEx\nz36ymr9Z3lmFVjnUBRhTnB1ZxxgyNZm61WMYPzCRqtEWehnuYipX4qVbE6gdG834rzew7/AJ/n7j\n+VS208wrHGsyJqwdPp7DkKnJHDqWw5wRPWhQw0Ivy4tKlYS/3NCOOrExvPz5OrKOZjO6fyf7I6GC\nsT8rTNjKzVMemLWMVdsP8OptnTmvkYVeljciwoNXtuaJ69vy6Y+Wd1YRWZMxYeu5T1az4MedPHZd\nWy49t0HxC5iwNcjlnSVb3lmFY03GhKWZ329m3NcbGNCtBYN6tAx1OcYPvHlnHtbtOkjfsZZ3VlFY\nkzFh57v03fzp/RVcFF+fx69va6GXEeTScxvw5pCuZB6yvLOKwpqMCSvrMw8xfHoqrepX57XbO9vZ\nSBGoS8u6zB7Wnexcpe/YhSzbsj/UJZkAsv/BJmzsO3yCwVOSiY6qxORBXahZNTrUJZkAOa/RyXln\n36yzvLNIZU3GhIUTOXkMm57K9qxjjB+YSLO6FnoZ6VrUq87c4T1oXjeWwVOSmZdmeWeRyJqMCTlV\n5ZH30vh+416ev7kDiS0s9LKiaFCzKrOGevPORr61hLct7yziWJMxITfmq/XMSc3g/svj6ZXQJNTl\nmCCrFRvN9CFdubh1HH98N43X/5NuMTQRxJqMCal5adt57pM1XN+xMQ9cER/qckyIVIuJYsJAD70S\nGvPcJ2v4+7zV1mgiREkuvzxZRHaJyAqfsSdEZKuILHO3a30e+6OIpIvIGhG52me8pxtLF5FRPuOt\nRGSxiKwTkVkiEuPGq7if093jLf31ok14WJ6xnwdnL6NT89o8f3MHO1W5gouOqsSLtySQ1L0F47/e\nwB/mLCcnNy/UZZkyKsmWzBSgZyHjL6pqgrt9DCAibYF+QDu3zOsiEiUiUcBrwDVAW6C/mxfgWbeu\neGAfMMSNDwH2qeo5wItuPhMhtu0/ypCpKdSrXoXxAzyWZ2UAb97ZEze044Er4nknNYMRM5ZwLDs3\n1GWZMii2yajq18DeEq6vFzBTVY+r6kYgHbjA3dJVdYOqngBmAr3E+6frZcAct/xUoLfPuqa66TnA\n5WJ/6kaEw8dzuGtqCkdP5DJ5UBfialQJdUkmjIgID1zRmr/c0I4FP+5k0BvfW95ZOVaWYzL3iMhy\ntzutjhtrAmzxmSfDjRU1Xg/Yr6o5BcZPWpd7PMvNb8qx3Dzl/plLWb3jAK/e1ok2Z9YIdUkmTCX1\naMnL/RJI2bSP/hMWsdvyzsql0jaZMcDZQAKwHXjBjRe2paGlGD/Vuv6HiAwVkRQRScnMzDxV3SbE\n/v7xKj5btYvHr2/HJW0s9NKcWq8Eb95Z+q5D3DJ2IRn7joS6JHOaStVkVHWnquaqah4wAe/uMPBu\niTTzmbUpsO0U47uB2iJSucD4Setyj9eiiN12qjpeVT2q6omLiyvNSzJB8NbizUz8ZiNJ3VuQZKGX\npoQuPbcB04d0Zfeh49w8ZiHrdlreWXlSqiYjIo18fuwD5J959iHQz50Z1gqIB74HkoF4dyZZDN6T\nAz5U7zmKXwI3u+WTgA981pXkpm8GvlA7p7Hc+mbdbh77YAWXtInjsevaFr+AMT48Lesya1h3clXp\nO87yzsqTkpzC/DawEGgjIhkiMgR4TkTSRGQ5cCnwIICqrgRmAz8CnwAj3RZPDnAPMB9YBcx28wI8\nDDwkIul4j7lMcuOTgHpu/CHg59OeTfmSvusQI2akck7cGbzSv5OFXppSOa9RTeYM707NqtGWd1aO\nSKRtHHg8Hk1JSQl1GcbZe/gEvV/7liMncnjv7gstk8yU2a4Dxxg4+XvWZx7i5X6duPb8RsUvZIol\nIqmq6vH3eu1PShMwx3NyGfZmCjsOHGPcAI81GOMX+XlnHZvWZuRbS3hrseWdhTNrMiYgVJU/zk0j\nedM+/tG3I4kt6hS/kDElVCs2mjeHdOWS1nE88l4ar31peWfhypqMCYjX/7Oed5du5cErWnNDx8ah\nLsdEoGoxUYx3eWfPz1/D3z5eZY0mDFUufhZjTs9Hy7fz/Pw19E5ozH2XnxPqckwEy887q10tmgn/\n3ci+I9k8c+P5dnJJGLEmY/xq2Zb9PDR7GYkt6vDMTRZ6aQIvP++sbvUqvPjZWrKOZvNK/06Whxcm\nrN0bv9m6/yh3TU0hrkYVxg1ItP/kJmhEhPuviOfJXu34bNVOkiZ/zwHLOwsL1mSMXxw6nsOQKckc\nz87ljUFdqH+GhV6a4BvYvSUv3ZpA6k/76D/e8s7CgTUZU2a5ecp9by9l3a5DvHZ7Z+IbWuilCZ1e\nCU2YkORhfeYh+lreWchZkzFl9vRHq/hi9S6euKEdF7e27DgTepe28ead7bG8s5CzJmPKZPqin5j8\n7UYG9WjJgG4tQl2OMT8rmHe2dPO+UJdUIVmTMaX29dpMHv9wJZda6KUJU+c1qsnc4T2oWTWa2ycu\n5r/r7FIgwWZNxpTKup0HGTljCfENzuCV2zoTVclOVTbhqXm9WOaM6E7zurEMnpLMR8u3h7qkCsWa\njDltew4dZ/DUZKpERzFpUBfOqGJftzLhrUGNqswa1p2EZrW55+0lzFj8U6hLqjCsyZjT4g29TGXX\ngeNMGJhIk9rVQl2SMSVSq1o00wZ35dI2DXj0vRWWdxYk1mRMiakqo+amkfLTPl64pSOdmlvopSlf\nqsVEMW5AIr1d3tnTH60iL88aTSDZfg5TYq98kc57S7fyuytbc10HC7005VN0VCX+eUsCtWNjmPiN\nN+/s2Zss7yxQrMmYEvnXD9v454K13NipCfdcZqGXpnyrVEl4/Pq21K0ewz8XePPOXr3N8s4CoSSX\nX54sIrtEZIXP2PMislpElovIeyJS2423FJGjIrLM3cb6LJPoLtmcLiKjxSUnikhdEVkgIuvcfR03\nLm6+dPc8nf3/8k1JLN28j/975we6tKzD328630IvTUQQEe67PJ6nerXj89WWdxYoJdk+nAL0LDC2\nAGivqh2AtcAffR5br6oJ7jbcZ3wMMBSId7f8dY4CPlfVeOBz9zPANT7zDnXLmyDL2HeE305LoWHN\nqowb4KFKZftLz0SWAZZ3FlDFNhlV/RrYW2DsU1XNcT8uApqeah0i0gioqaoL1Xs6xzSgt3u4FzDV\nTU8tMD5NvRYBtd16TJAcPJbNkCkpHM/JY/IgD3Wrx4S6JGMColdCEyb65J1t2Wt5Z/7ijyNdg4F5\nPj+3EpGlIvKViFzkxpoAGT7zZLgxgIaquh3A3TfwWWZLEcuYAMvJzePet5eSnnmIMbcnck4DC700\nke2SNg2YcZc376zv2IWstbwzvyhTkxGRR4EcYIYb2g40V9VOwEPAWyJSEyhsJ35x5w2WeBkRGSoi\nKSKSkplpsRH+8NePVvGfNZk82asdv4qvH+pyjAmKxBZ1mT28O3mq3GJ5Z35R6iYjIknAdcDtbhcY\nqnpcVfe46VRgPdAa71aI7y61psA2N70zfzeYu9/lxjOAZkUscxJVHa+qHlX1xMVZCnBZvblwE1O+\n28SQX7Xi9q4WemkqlnPPrMmc4T2oVc2bd/b1WvvDtSxK1WREpCfwMHCDqh7xGY8TkSg3fRbeg/Yb\n3G6wgyLSzZ1VNhD4wC32IZDkppMKjA90Z5l1A7Lyd6uZwPlqbSZP/OtHLj+3AY9ce16oyzEmJJrX\ni+Wd4d1pUa86Q6Ym8+/lhf59a0qgJKcwvw0sBNqISIaIDAFeBWoACwqcqnwxsFxEfgDmAMNVNf+k\ngRHARCAd7xZO/nGcZ4ArRWQdcKX7GeBjYIObfwJwd5leqSnW2p0HuceFXr7cv5OFXpoKrUGNqswc\n2o2EZrW59+2llndWShJp2T0ej0dTUlJCXUa5s/vQcXq/9i3Hc/L4YOSFNLZMMmMAOHoil5FvLeGL\n1bv4/dVtuPuSsyPyu2IikqqqHn+v13IUDMeycxk6LYXdh44zcaDHGowxPvLzzvp0asLz89fwV8s7\nOy0WK1PBqSp/mLOcJZv38/rtnenYrHaoSzIm7ERHVeKFvh2pVS2aSd9sZN+REzx7UweiLe+sWNZk\nKriXP1/Hhz9s4/dXt+Ha8+27rsYUpWDe2YGj2bx6W2fLOyuGteEK7INlW3nps3Xc1Lkpd19ydqjL\nMSbsnZx3touBlndWLGsyFVTqT3v5/ZzlXNCyLn+7sX1EHsg0JlAGdG/Jy/06seSnffQbt4jMg5Z3\nVhRrMhXQlr1HGDotlUa1qjJ2QKKFXhpTCjd0bMzEJA8bdx+m79jvLO+sCNZkKpgDx7IZMjWZ7Nw8\nJg/qYqGXxpTBJW0aMP2uruw7ks3NY7+zvLNCWJOpQHJy87jnraVsyDzMmDsSOTvujFCXZEy5l9ii\nDrOHdUcV+o5dyBLLOzuJNZkK5Ml//8jXazN5qnd7LjzHQi+N8Zc2Z9Zg7oge1I6N5vYJi/nK8s5+\nZk2mgpj63SamLfyJ317Uiv4XNA91OcZEnGZ1Y5kzvAct61fnrqnJ/OsHyzsDazIVwpdrdvGXf63k\nivMaMuoaC700JlDialT5Oe/svplLmb7I8s6syUS4NTsOcu9bSzn3zJq83C/BQi+NCbBa1aKZNrgr\nl7VpwJ/eX8GrX6wj0jIiT4c1mQiWefA4g6ckExsTxaRBHqpXsYAHY4KhWkwUY13e2T8+XctT/664\neWf2qROhjmXn8ttpKew5fJx3hvWgUS0LvTQmmPLzzmrHRjP5243sP3KCZ2+ueHln1mQikKryf+/8\nwLIt+xl7R2fOb1or1CUZUyFVqiT8+bq21I2N4YUFazlwrOLlnVWsllpBvPjZOv69fDsP9zyXnu0t\n9NKYUBIR7r08nqd6t/fmnU2qWHln1mQizPtLtzL683X0TWzK8F+fFepyjDHOgG4tGN2vE0u3VKy8\nsxI1GRGZLCK7RGSFz1hdEVkgIuvcfR03LiIyWkTSRWS5iHT2WSbJzb9ORJJ8xhNFJM0tM1pcWmNR\nz2EKl7JpL3+Ys5yurerydJ/zLfTSmDBzfcfGTEzqUqHyzkq6JTMF6FlgbBTwuarGA5+7nwGuAeLd\nbSgwBrwNA3gc6ApcADzu0zTGuHnzl+tZzHOYAjbvOcLQN1NpUqcaY+9IJKaybaQaE45+3TrupLyz\nNTsiO++sRJ9Eqvo1sLfAcC9gqpueCvT2GZ+mXouA2iLSCLgaWKCqe1V1H7AA6Okeq6mqC9V7Mvm0\nAusq7DmMjwPHshk8NZncPGVSkoc6FnppTFjzzTu7ZdxCUn+K3Lyzsvy521BVtwO4+wZuvAmwxWe+\nDDd2qvGMQsZP9RzGycnNY+SMJWzafZgxd3TmLAu9NKZcyM87qxMbzR0TIzfvLBD7VAo7EKClGC/5\nE4oMFZEUEUnJzIzMf6jCqCpP/Gsl/123m6f7tKfH2RZ6aUx50qxuLO9EeN5ZWZrMTrerC3e/y41n\nAM185muh9GwdAAAVWElEQVQKbCtmvGkh46d6jpOo6nhV9aiqJy4urgwvqXx549tNTF+0mWEXn8Wt\nXSz00pjyKK5GFWYN60anZnW4b+ZS3oywvLOyNJkPgfwzxJKAD3zGB7qzzLoBWW5X13zgKhGp4w74\nXwXMd48dFJFu7qyygQXWVdhzVHhfrN7JXz/6kavaNuThnueGuhxjTBnUrBrNtCEXcPm5DXjs/RW8\n8nnk5J2V9BTmt4GFQBsRyRCRIcAzwJUisg640v0M8DGwAUgHJgB3A6jqXuApINndnnRjACOAiW6Z\n9cA8N17Uc1Roq7Yf4N63ltK2cU1e6pdAJQu9NKbcqxodxZg7ErmxUxNeWLCWJ//9Y0TknUmkdMt8\nHo9HU1JSQl1GwOw6eIzer35LriofjPwVZ9aqGuqSjDF+lJen/PWjVUz+diN9OjXhuSDlnYlIqqp6\n/L1eyy4rR7yhl6nsO5LNO8O7W4MxJgJVqiQ8dt151K0ezT8+XcuBo9m8dnv5zTuzb+yVE3l5yu9m\n/8DyjP281C+B9k0s9NKYSCUi3HNZPH/t3Z4v1njzzrKOls+8M2sy5cQ/F6zlo7TtjOp5Lle3OzPU\n5RhjguCObi14pb/LOxu/iF0Hj4W6pNNmTaYceHdJBq9+mc6tnmYMvdhCL42pSK7r4M0727T7MH3H\nLix3eWfWZMJc8qa9jJqbRvez6vFU7/YWemlMBfTr1nHM+G1X9h/J5qYx5SvvzJpMGPtpz2GGTkuh\nqYVeGlPhdW5eh3eGd0cE+o79rtzkndmnVpjKOprN4CnJKDBpUBdqxUaHuiRjTIi1bliDOcN7ULd6\nTLnJO7MmE4ayc/O4e0Yqm/ceYewdibSqXz3UJRljwkR+3lkrl3f2YZjnnVmTCTOqyp8/WMm36Xv4\nW5/z6XZWvVCXZIwJM3E1qjBzWDc6Na/D/WGed2ZNJsxM+mYjb3+/mRGXnE1fT7PiFzDGVEg1q0Yz\nbfAveWejwzTvzJpMGPnsx508/fEqerY7k99f1SbU5RhjwlzV6CjG3pHIjZ2b8M8Fa/nLv8Iv78xi\nZcLEym1Z3DdzKe0b1+LFWy300hhTMpWjKvGPmztSu1oMk7/dSNbR7KDlnZWENZkwsOvAMe6amkKt\natFMTPJQLaZ8ZhQZY0IjP++s3hkxPD9/DVlHs3ntts5h8VkSHq2uAjt6Ipe7pqWQdTSbiUkeGta0\n0EtjzOkTEUZeeg5P92nPl2t2MXDy4rDIO7MmE0J5ecpDs5eRtjWL0f060a6xhV4aY8rm9q7evLNl\nW/aHRd6ZNZkQ+sena5i3YgePXnseV7RtGOpyjDER4roOjZkUJnln1mRC5J2ULbz+n/X0v6AZQ37V\nKtTlGGMizMUF8s5W7zgQkjqsyYTA4g17eOS9NC48px5P9rLQS2NMYPjmnd0ydiGpP+0tfiE/K3WT\nEZE2IrLM53ZARB4QkSdEZKvP+LU+y/xRRNJFZI2IXO0z3tONpYvIKJ/xViKyWETWicgsEYkp/UsN\nD5t2H2bY9FSa1Y3l9dsSw+Y0Q2NMZMrPO6t3RhVun7iY/6zZFdTnL/UnnKquUdUEVU0AEoEjwHvu\n4RfzH1PVjwFEpC3QD2gH9AReF5EoEYkCXgOuAdoC/d28AM+6dcUD+4Ahpa03HGQd8YZeCvCGhV4a\nY4KkWd1YZg/rztlxZ3DX1BQ+WLY1aM/trz+jLwfWq+qpAnR6ATNV9biqbgTSgQvcLV1VN6jqCWAm\n0Eu8+5AuA+a45acCvf1Ub9Bl5+YxYkYqW/YdYdwADy3qWeilMSZ44mpU4e2h3ejcog4PzFrGmws3\nBeV5/dVk+gFv+/x8j4gsF5HJIlLHjTUBtvjMk+HGihqvB+xX1ZwC4/9DRIaKSIqIpGRmhl/0tary\n2Psr+G79Hp65sQMXtKob6pKMMRXQL3lnDXnsg5W8/Fng887K3GTccZIbgHfc0BjgbCAB2A68kD9r\nIYtrKcb/d1B1vKp6VNUTFxd3GtUHx8T/bmRm8hZGXno2NyU2DXU5xpgKzJt31pmbOjflxc8Cn3fm\nj1iZa4AlqroTIP8eQEQmAP92P2YAvrHCTYH8CyEUNr4bqC0ild3WjO/85canK3fwt3mruPb8M/nd\nlRZ6aYwJvcpRlXj+5g7Ujo1m0jcb2X/kRMCeyx+7y/rjs6tMRBr5PNYHWOGmPwT6iUgVEWkFxAPf\nA8lAvDuTLAbvrrcP1bsN9yVws1s+CfjAD/UGzYqtWdw/cxkdmtTihb4WemmMCR+VKgl/+s15/P7q\nNry/LHB/v5dpS0ZEYoErgWE+w8+JSALeXVub8h9T1ZUiMhv4EcgBRqpqrlvPPcB8IAqYrKor3boe\nBmaKyF+BpcCkstQbTDuyvKGXdWKjmTDQQi+NMeEnP++sbvUYbns2QM8Rjhe5KQuPx6MpKSkhreHI\niRxuGbeQjZmHeWd4D9o2rhnSeowxpjgikqqqHn+v16L+/SwvT3lw1jJ+3HaACQM91mCMMRWafd3c\nz56bv4b5K3fy6G/acvl5FnppjKnYrMn40eyULYz9aj23d23O4AtbhrocY4wJOWsyfrJw/R4eeTeN\ni+Lr88QN7Sz00hhjsCbjFxsyDzF8eiot61fn1ds6W+ilMcY49mlYRvuPnGDI1BSiKgmTk7pQq5qF\nXhpjTD5rMmVwIieP4dNT2brvKOMHJNK8XmyoSzLGmLBipzCXkqryp/fTWLRhLy/e2hFPSwu9NMaY\ngmxLppTGfb2B2SkZ3HvZOfTpZKGXxhhTGGsypfDJih08+8lqftOhEQ9e0TrU5RhjTNiyJnOa0jKy\neGDWUjo2rc0LfTta6KUxxpyCNZnTsCPrGHdNS6Ze9SpMGOiharSFXhpjzKlYkymhw8dzGDI1mUPH\ncpg0yENcjSqhLskYY8KenV1WArl5ygOzlrFq+wEmJXXh3DMt9NIYY0rCtmRK4NlPVrPgx508dl1b\nLj23QajLMcaYcsOaTDFmfr+Z8V9vYEC3Fgzq0TLU5RhjTLliTeYUvkvfzZ/eX8HFreN4/Pq2Fnpp\njDGnqcxNRkQ2iUiaiCwTkRQ3VldEFojIOndfx42LiIwWkXQRWS4inX3Wk+TmXyciST7jiW796W7Z\noHzSr3ehl63qV+fV2zpR2UIvjTHmtPnrk/NSVU3wuXTnKOBzVY0HPnc/A1wDxLvbUGAMeJsS8DjQ\nFbgAeDy/Mbl5hvos19NPNRdp3+ETDJ6STHRUJSYP6kLNqhZ6aYwxpRGoP897AVPd9FSgt8/4NPVa\nBNQWkUbA1cACVd2rqvuABUBP91hNVV2oqgpM81lXQJzIyWPY9FS2Zx1j/MBEmtW10EtjjCktfzQZ\nBT4VkVQRGerGGqrqdgB3n39KVhNgi8+yGW7sVOMZhYwHhKryyHtpfL9xL8/f3IHEFhZ6aYwxZeGP\n78lcqKrbRKQBsEBEVp9i3sKOp2gpxk9eqbe5DQVo3rx58RUXYcxX65mTmsH9l8fTKyFgvcwYYyqM\nMm/JqOo2d78LeA/vMZWdblcX7n6Xmz0DaOazeFNgWzHjTQsZL1jDeFX1qKonLi6uVK9jXtp2nvtk\nDTd0bMwDV8SXah3GGGNOVqYmIyLVRaRG/jRwFbAC+BDIP0MsCfjATX8IDHRnmXUDstzutPnAVSJS\nxx3wvwqY7x47KCLd3FllA33W5TfLM/bz4OxldGpem+du7mCnKhtjjJ+UdXdZQ+A996FcGXhLVT8R\nkWRgtogMATYDfd38HwPXAunAEeBOAFXdKyJPAcluvidVda+bHgFMAaoB89zNb7btP8qQqSnUq16F\n8QMs9NIYY/xJvCdtRQ6Px6MpKSklmvfw8Rz6jl3I5r1HmDuiB23OrBHg6owxJjyJSKrP11D8psJ+\nwzA3T7l/5lJW7zjAq7d1sgZjjDEBUGFTmP/+8So+W7WLJ3u145I2FnppjDGBUCG3ZN5avJmJ32wk\nqXsLBnZvGepyjDEmYlW4JvPNut089sEKLmkTx2PXtQ11OcYYE9EqVJNJ33WIETNSOSfuDF7pb6GX\nxhgTaBXmU3avC72sUrkSE5M81LDQS2OMCbgKceD/eE4uw95MYceBY7z9224WemmMMUES8Vsyqsof\n56aRvGkf/+jbkcQWdYpfyBhjjF9EfJN5/T/reXfpVh68ojU3dGwc6nKMMaZCiegm89Hy7Tw/fw29\nExpz3+XnhLocY4ypcCK2ySzbsp+HZi8jsUUdnrnJQi+NMSYUIrLJbN1/lLumphBXowrjBiRa6KUx\nxoRIxJ1dlqfKkCnJHM/O5e3fdqX+GVVCXZIxxlRYEddkNu89QtauQ7wxqAvxDS300hhjQinimszB\nYzm8eEM7Lm5duitkGmOM8Z+IOyZT/4wqDOjWItRlGGOMIQKbTKNaVUNdgjHGGKfUTUZEmonIlyKy\nSkRWisj9bvwJEdkqIsvc7VqfZf4oIukiskZErvYZ7+nG0kVklM94KxFZLCLrRGSWiMSUtl5jjDHB\nV5YtmRzgd6p6HtANGCki+dn5L6pqgrt9DOAe6we0A3oCr4tIlIhEAa8B1wBtgf4+63nWrSse2AcM\nKUO9xhhjgqzUTUZVt6vqEjd9EFgFNDnFIr2Amap6XFU3AunABe6WrqobVPUEMBPoJd5vT14GzHHL\nTwV6l7ZeY4wxweeXYzIi0hLoBCx2Q/eIyHIRmSwi+YmUTYAtPotluLGixusB+1U1p8C4McaYcqLM\nTUZEzgDmAg+o6gFgDHA2kABsB17In7WQxbUU44XVMFREUkQkJTMz8zRfgTHGmEApU5MRkWi8DWaG\nqr4LoKo7VTVXVfOACXh3h4F3S6SZz+JNgW2nGN8N1BaRygXG/4eqjldVj6p64uLs+zHGGBMuynJ2\nmQCTgFWq+k+f8UY+s/UBVrjpD4F+IlJFRFoB8cD3QDIQ784ki8F7csCHqqrAl8DNbvkk4IPS1muM\nMSb4yvKN/wuBAUCaiCxzY4/gPTssAe+urU3AMABVXSkis4Ef8Z6ZNlJVcwFE5B5gPhAFTFbVlW59\nDwMzReSvwFK8Tc0YY0w5Id4NhsghIgeBNaGuowTq490lGO6sTv8pDzWC1elv5aXONqrq98DHiMsu\nA9aoqifURRRHRFKsTv8pD3WWhxrB6vS38lRnINYbcbEyxhhjwoc1GWOMMQETiU1mfKgLKCGr07/K\nQ53loUawOv2tQtcZcQf+jTHGhI9I3JIxxhgTJiKqyRR1yYAgPXfAL33gx1o3iUiaqyfFjdUVkQXu\nsgoL8jPnxGu0q2W5iHT2WU+Sm3+diCT5ucY2Pu/ZMhE5ICIPhMP76TL5donICp8xv71/IpLo/n3S\n3bKFRSyVts7nRWS1q+U9EantxluKyFGf93VscfUU9Zr9VGdYXTKkiBpn+dS3Sdz3BUP8Xhb1ORS6\n309VjYgb3i9yrgfOAmKAH4C2QXz+RkBnN10DWIv30gVPAP9XyPxtXY1VgFau9qhgvA68X5KtX2Ds\nOWCUmx4FPOumrwXm4c2S6wYsduN1gQ3uvo6brhPAf9sdQItweD+Bi4HOwIpAvH94kzC6u2XmAdf4\nsc6rgMpu+lmfOlv6zldgPYXWU9Rr9lOdfvt3BmYD/dz0WGCEP2os8PgLwJ/D4L0s6nMoZL+fkbQl\nU+glA4L15BrgSx8Etvqf65nqpn0vq9ALmKZei/DmyTUCrgYWqOpeVd0HLMB7naBAuBxYr6o/nWKe\noL2fqvo1sLeQ5y/z++ceq6mqC9X7P3oapbzERWF1quqn+kuy+SK8mYBFKqaeol5zmes8hZBcMuRU\nNbrnuAV4+1TrCNJ7WdTnUMh+PyOpyRR1yYCgk8Bc+sCfFPhURFJFZKgba6iq28H7iwo0CIM68/Xj\n5P/A4fZ+gv/evyZuOtD1AgzG+5dovlYislREvhKRi9zYqeop6jX7S3m5ZMhFwE5VXeczFvL3ssDn\nUMh+PyOpyZT40gABLSJwlz7wpwtVtTPeq5GOFJGLTzFvKOvE7T+/AXjHDYXj+3kqAbvERVmIyKN4\nMwRnuKHtQHNV7QQ8BLwlIjWDVU8hgn7JkDLoz8l/BIX8vSzkc6jIWYuoyW/vZyQ1maIuGRA0EthL\nH/iNqm5z97uA91xNO92mcP5m/a5Q1+lcAyxR1Z2u5rB7Px1/vX8ZnLwLy+/1uoO41wG3u10euN1P\ne9x0Kt7jG62Lqaeo11xmfvx3LvElQ0rDrfdGYJZP7SF9Lwv7HDrF+gP/+1mag0vheMObw7YB78HA\n/AN/7YL4/IJ3/+RLBcYb+Uw/iHd/MkA7Tj6AuQHvwcuAvg6gOlDDZ/o7vMdSnufkA4PPuenfcPKB\nwe/1lwODG/EeFKzjpusG4H2dCdwZbu8nBQ7u+vP9w3v5i278cmD1Wj/W2RNvEnpcgfnigCg3fRaw\ntbh6inrNfqrTb//OeLeCfQ/83+2PGn3ez6/C5b2k6M+hkP1++vUDIdQ3vGdKrMX7l8OjQX7uX+Hd\nbFwOLHO3a4E3gTQ3/mGB/zyPulrX4HOGRiBfh/ul/8HdVuavH+++68+Bde4+/xdKgNdcLWmAx2dd\ng/EeeE3HpxH4sdZYYA9Qy2cs5O8n3l0j24FsvH/ZDfHn+wd48F6HaT3wKu5L036qMx3vvvb839Gx\nbt6b3O/DD8AS4Pri6inqNfupTr/9O7vf+e/da38HqOKPGt34FGB4gXlD+V4W9TkUst9P+8a/McaY\ngImkYzLGGGPCjDUZY4wxAWNNxhhjTMBYkzHGGBMw1mSMMcYEjDUZY4JARKaIyM2hrsOYYLMmY4wx\nJmCsyRhTSiJSXUQ+EpEfRGSFiNwqIn8WkWT38/jCrrXhrsfxlQsone8T93GfiPzoQiFnBv8VGeN/\nlYufxRhThJ7ANlX9DYCI1MIbj/6k+/lNvBlh/8pfwOVKvQL0UtVMEbkVeBrvt6tHAa1U9bi4i4kZ\nU97ZlowxpZcGXCEiz4rIRaqaBVwq3qswpuG9jkm7Asu0AdoDC8R7JcU/8Uvg4HJghojcgTch2Zhy\nz7ZkjCklVV0rIol4s6H+LiKfAiPx5j9tEZEngKoFFhNgpap2L2SVv8F7BcYbgMdEpJ3+ch0UY8ol\n25IxppREpDFwRFWnA//Ae3legN3ueh6FnU22BogTke5uHdEi0k5EKgHNVPVL4A9AbeCMgL8IYwLM\ntmSMKb3zgedFJA9vOu8IvJeiTQM24Y1EP4mqnnCnMo92x3AqAy/hTQ+e7sYEeFFV9wflVRgTQJbC\nbIwxJmBsd5kxxpiAsSZjjDEmYKzJGGOMCRhrMsYYYwLGmowxxpiAsSZjjDEmYKzJGGOMCRhrMsYY\nYwLm/wFs+GhAV4F94AAAAABJRU5ErkJggg==\n", + "http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.stack.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.unstack.html", + "http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html", + "http://pandas.pydata.org/pandas-docs/stable/reshaping.html", + "http://pandas.pydata.org/pandas-docs/version/0.18.0/generated/pandas.MultiIndex.droplevel.html", + "http://pandas.pydata.org/pandas-docs/version/0.19.0/visualization.html", + "naucse:page?lesson=intro/notebook", + "naucse:page?lesson=intro/numpy", + "naucse:static?filename=actors.csv", + "naucse:static?filename=spouses.csv" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pandas/index.ipynb", @@ -648,7 +1383,108 @@ "content": { "path": "pyqt/index.html" }, + "ids": [ + "atributy", + "gui_v_pythonu_pyqt5", + "instalace", + "jmena_a_dokumentace", + "klikani_do_gridu", + "menu_a_modalni_dialog", + "modelview", + "moduly_qt", + "numpy", + "o_qt_pyqt_a_pyside", + "obrazky", + "prvni_aplikace", + "pyqt5", + "qlistwidget_-_paleta", + "qt5_designer", + "qt_designer", + "skladani_gui", + "smycka_udalosti_signaly_a_sloty", + "specifika_pyqt", + "sprava_pameti", + "tazeni_mysi", + "trida_pro_gui_aplikace", + "vice_tlacitek_mysi", + "vlastni_widget_-_grid" + ], "license": "cc-by-sa-40", + "links": [ + "#atributy", + "#gui_v_pythonu_pyqt5", + "#instalace", + "#jmena_a_dokumentace", + "#klikani_do_gridu", + "#menu_a_modalni_dialog", + "#modelview", + "#moduly_qt", + "#numpy", + "#o_qt_pyqt_a_pyside", + "#obrazky", + "#prvni_aplikace", + "#pyqt5", + "#qlistwidget_-_paleta", + "#qt5_designer", + "#qt_designer", + "#skladani_gui", + "#smycka_udalosti_signaly_a_sloty", + "#specifika_pyqt", + "#sprava_pameti", + "#tazeni_mysi", + "#trida_pro_gui_aplikace", + "#vice_tlacitek_mysi", + "#vlastni_widget_-_grid", + "http://doc.qt.io/qt-5/layout.html#horizontal-vertical-grid-and-form-layouts", + "http://doc.qt.io/qt-5/model-view-programming.html", + "http://doc.qt.io/qt-5/qcombobox.html#activated", + "http://doc.qt.io/qt-5/qfiledialog.html#getOpenFileName", + "http://doc.qt.io/qt-5/qfiledialog.html#getSaveFileName", + "http://doc.qt.io/qt-5/qmessagebox.html#about", + "http://doc.qt.io/qt-5/qmessagebox.html#critical", + "http://doc.qt.io/qt-5/qobject.html", + "http://doc.qt.io/qt-5/qpainter.html", + "http://doc.qt.io/qt-5/qrect.html", + "http://doc.qt.io/qt-5/qt.html#ItemDataRole-enum", + "http://doc.qt.io/qt-5/qtcore-index.html", + "http://doc.qt.io/qt-5/qtgui-index.html", + "http://doc.qt.io/qt-5/qtmodules.html", + "http://doc.qt.io/qt-5/qtmultimedia-index.html", + "http://doc.qt.io/qt-5/qtnetwork-index.html", + "http://doc.qt.io/qt-5/qtsql-index.html", + "http://doc.qt.io/qt-5/qtsvg-index.html", + "http://doc.qt.io/qt-5/qtwidgets-index.html", + "http://doc.qt.io/qt-5/qtxml-index.html", + "http://doc.qt.io/qt-5/qwidget.html", + "http://doc.qt.io/qt-5/qwidget.html#keyPressEvent", + "http://doc.qt.io/qt-5/qwidget.html#mousePressEvent", + "http://doc.qt.io/qt-5/qwidget.html#paintEvent", + "http://kenney.nl/", + "http://opengameart.org/users/kenney", + "http://pyqt.sourceforge.net/Docs/PyQt5/designer.html#the-uic-module", + "http://pyqt.sourceforge.net/Docs/PyQt5/index.html", + "http://pyqt.sourceforge.net/Docs/PyQt5/installation.html#building-and-installing-from-source", + "https://doc.qt.io/qt-5/gallery.html", + "https://github.com/cvut/MI-PYT/issues/57", + "https://github.com/pyvec/naucse.python.cz/tree/master/lessons/intro/pyqt/static/pics", + "https://pypi.org/project/PyQt5/", + "https://pypi.org/project/bresenham/", + "https://pypi.python.org/pypi/pyqt5-tools", + "https://riverbankcomputing.com/software/pyqt", + "https://wiki.qt.io/PySide", + "https://www.gnu.org/licenses/gpl-3.0.en.html", + "https://www.google.cz/search?q=game+boy+overworld+map&tbm=isch", + "https://www.qt.io/", + "https://www.qt.io/download-open-source/#section-2", + "https://www.riverbankcomputing.com/software/pyqt/download5", + "https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qobject.html", + "https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtwidgets/qabstractbutton.html", + "naucse:page?lesson=intro/cython", + "naucse:page?lesson=intro/numpy", + "naucse:static?filename=basic-screenshot.png", + "naucse:static?filename=pics/grass.svg", + "naucse:static?filename=pics/wall.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pyqt/index.md", @@ -775,8 +1611,31 @@ "content": { "path": "requests/index.html" }, + "ids": [ + "chrante_sve_tokeny", + "github_api", + "pouziti_session", + "requests" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#chrante_sve_tokeny", + "#github_api", + "#pouziti_session", + "#requests", + "http://docs.python-requests.org/en/master/user/advanced/#session-objects", + "http://docs.python-requests.org/en/master/user/quickstart/", + "http://httpbin.org", + "https://cs.wikipedia.org/wiki/Basic_access_authentication", + "https://developer.github.com/v3", + "https://developer.github.com/v3/", + "https://docs.python.org/3/library/configparser.html", + "https://docs.python.org/3/library/urllib.request.html#module-urllib.request", + "https://github.com/settings/tokens", + "https://requests.readthedocs.io/en/master/", + "naucse:page?lesson=fast-track/http" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/requests/index.md", @@ -800,7 +1659,85 @@ "content": { "path": "testing/index.1.html" }, + "ids": [ + "castecne_upravene_objekty_tridy_moduly_stubs", + "citlive_udaje", + "falesne_objekty_fakes", + "fixtures", + "integrace_s_pytestem", + "kam_dat_testy", + "komprimovane_citlive_udaje", + "ktere_http_pozadavky_jsou_stejne", + "kviz", + "ocekavani_mocks_spies", + "parametricke_testy", + "podvadeni", + "pytest", + "spousteni_testu_pomoci_codesetuppy_testcode", + "testovani", + "testovani_aplikaci_v_clicku", + "testovani_aplikaci_ve_flasku", + "testovani_http_komunikace_betamax", + "travis_ci", + "varovani" + ], "license": "cc-by-sa-40", + "links": [ + "#castecne_upravene_objekty_tridy_moduly_stubs", + "#citlive_udaje", + "#falesne_objekty_fakes", + "#fixtures", + "#integrace_s_pytestem", + "#kam_dat_testy", + "#komprimovane_citlive_udaje", + "#ktere_http_pozadavky_jsou_stejne", + "#kviz", + "#ocekavani_mocks_spies", + "#parametricke_testy", + "#podvadeni", + "#pytest", + "#spousteni_testu_pomoci_codesetuppy_testcode", + "#testovani", + "#testovani_aplikaci_v_clicku", + "#testovani_aplikaci_ve_flasku", + "#testovani_http_komunikace_betamax", + "#travis_ci", + "#varovani", + "http://betamax.readthedocs.io/en/latest/implementation_details.html#gzip-content-encoding", + "http://betamax.readthedocs.io/en/latest/matchers.html", + "http://blog.horejsek.com/matka-moudrosti-jak-testovat", + "http://click.pocoo.org/6/testing/", + "http://doc.pytest.org/en/latest/example/index.html", + "http://doc.pytest.org/en/latest/fixture.html", + "http://doc.pytest.org/en/latest/goodpractices.html#choosing-a-test-layout-import-rules", + "http://doc.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runner", + "http://doc.pytest.org/en/latest/parametrize.html", + "http://doc.pytest.org/en/latest/plugins.html", + "http://doc.pytest.org/en/latest/writing_plugins.html#conftest-py-local-per-directory-plugins", + "http://docs.pytest.org/en/latest/getting-started.html", + "http://flask.pocoo.org/docs/1.0/api/#flask.Response", + "http://flask.pocoo.org/docs/1.0/testing/", + "http://flexmock.readthedocs.io/en/latest/start/#creating-and-checking-expectations", + "http://pytest.org/", + "https://betamax.readthedocs.io/", + "https://betamax.readthedocs.io/en/latest/configuring.html#filtering-sensitive-data", + "https://cz.pycon.org/", + "https://docs.pytest.org/en/latest/monkeypatch.html", + "https://docs.travis-ci.com/user/languages/python/", + "https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens", + "https://flexmock.readthedocs.io/", + "https://github.com/PyConPL/Book/blob/master/2017/workshops/pytest_parametric_tests/text.md", + "https://travis-ci.com/", + "https://travis-ci.com/profile", + "https://travis-ci.org/", + "https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", + "https://www.youtube.com/watch?v=-nJ-ZW_LP7s", + "https://www.youtube.com/watch?v=iFqF5IaWfy0", + "naucse:page?lesson=beginners/testing", + "naucse:page?lesson=intro/click", + "naucse:page?lesson=intro/distribution", + "naucse:page?lesson=intro/requests" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/testing/index.md", diff --git a/mi-pyt/cython/index.html b/mi-pyt/cython/index.html index 4cb9c7e4..3b1f7797 100644 --- a/mi-pyt/cython/index.html +++ b/mi-pyt/cython/index.html @@ -1,6 +1,6 @@

        Dnes budeme potřebovat do virtuálního prostředí nainstalovat tyto knihovny:

        -
        $ python -m pip install --upgrade pip
        -$ python -m pip install notebook numpy cython pytest pytest-profiling
        +
        $ python -m pip install --upgrade pip
        +$ python -m pip install notebook numpy cython pytest pytest-profiling
         

        Také je potřeba nainstalovat překladač jazyka C a hlavičkové soubory Pythonu:

          @@ -11,7 +11,7 @@

        C API -# +#

        Mluvíme-li o „Pythonu“, máme často na mysli jak jazyk samotný, tak i interpret, program, který programy v tomto jazyce umí spouštět. @@ -33,7 +33,7 @@

        C API

        Někdy to ale je potřeba, a dnešní přednáška bude specifická pro CPython a přímé využití jeho API pro jazyk C.

        Rychlost -# +#

        Častý důvod proč sáhnout k C API je rychlost: CPython je celkem pomalý. Tradiční metoda optimalizace je zjistit, které části jsou kritické, a přepsat @@ -44,16 +44,16 @@

        Rychlost První krok k tomu je vždy zkontrolovat, co zabírá více času, než by mělo. K tomu se dá použít nástroj profile ze standardní knihovny, který vypíše tabulku počtu volání jednotlivých funkcí a času v nich stráveného:

        -
        $ python -m profile -s cumtime program.py
        +
        $ python -m profile -s cumtime program.py
         

        Profilovat běh pytest testů se dá jednoduše pomocí modulu pytest-profiling:

        -
        $ python -m pip install pytest-profiling
        -$ python -m pytest --profile
        +
        $ python -m pip install pytest-profiling
        +$ python -m pytest --profile
         

        Když máme představu o tom, co nás brzdí, můžeme začít přepisovat do C způsoby popsanými níže.

        Jiná možnost, jak program zrychlit, je ho pustit, tak jak je, pod interpretem PyPy, který obsahuje optimalizovaný překladač. To je ale jiná kapitola.

        Externí knihovny -# +#

        Druhý důvod, proč programátoři používají C API, je použití knihoven, které mají rozhraní pro C. @@ -63,14 +63,14 @@

        Externí knihovny ctypes, ale v dnešní době je dobré místo toho použít CFFI, knihovnu která funguje i s PyPy (a teoreticky jinými implementacemi).

        CPython -# +#

        Třetí důvod, proč použít C API, je práce s CPythonem samotným. Když člověk zabředne do složitého problému, může na CPython pustit C debugger jako gdb nebo Valgrind, prozkoumat potíže na nižší úrovni a zjistit, kde přesně se chyba nachází.

        Modul v C -# +#

        Pojďme začít příkladem. Vytvořte si následující soubor, který implementuje rozšíření @@ -78,52 +78,52 @@

        Modul v C

        (Nebudeme chtít, abyste podobný kód uměli napsat, ale měli byste být schopní porozumět tomu, co dělá.)

        demo.c:

        -
        #include <Python.h>
        +
        #include <Python.h>
         
        -PyDoc_STRVAR(
        +PyDoc_STRVAR(
             mod_docstring, 
        -    "Demo extension module with a Python wrapper for the system(3) function");
        -
        -static PyObject *demo_system(PyObject *self, PyObject *args){
        -    const char *command;
        -    int retval;
        -
        -    /* Parse the given arguments: expect one string, convert to char* */
        -    if (!PyArg_ParseTuple(args, "s", &command)) {
        -        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
        -        return NULL;
        -    }
        -
        -    /* Call the C function */
        -    retval = system(command);
        -
        -    /* Return result as Python int (error handling built in) */
        -    return PyLong_FromLong(retval);
        -}
        -
        -/* List of all methods in the module */
        -static PyMethodDef DemoMethods[] = {
        -    {"system",  demo_system, METH_VARARGS,
        -            PyDoc_STR("Execute a shell command.")},
        -    {NULL, NULL, 0, NULL}        /* Sentinel */
        -};
        -
        -/* Module specification */
        -static struct PyModuleDef demo_module = {
        -   PyModuleDef_HEAD_INIT,
        -   "demo",          /* name of module */
        -   mod_docstring,   /* dosctring (may be NULL) */
        -   0,               /* size of per-interpreter state of the module */
        -   DemoMethods,     /* list of methods */
        -};
        -
        -
        -/* Module entrypoint */
        -PyMODINIT_FUNC
        -PyInit_demo(void)
        -{
        -    return PyModuleDef_Init(&demo_module);
        -}
        +    "Demo extension module with a Python wrapper for the system(3) function");
        +
        +static PyObject *demo_system(PyObject *self, PyObject *args){
        +    const char *command;
        +    int retval;
        +
        +    /* Parse the given arguments: expect one string, convert to char* */
        +    if (!PyArg_ParseTuple(args, "s", &command)) {
        +        /* Error handling: if PyArg_ParseTuple returns zero, return NULL */
        +        return NULL;
        +    }
        +
        +    /* Call the C function */
        +    retval = system(command);
        +
        +    /* Return result as Python int (error handling built in) */
        +    return PyLong_FromLong(retval);
        +}
        +
        +/* List of all methods in the module */
        +static PyMethodDef DemoMethods[] = {
        +    {"system",  demo_system, METH_VARARGS,
        +            PyDoc_STR("Execute a shell command.")},
        +    {NULL, NULL, 0, NULL}        /* Sentinel */
        +};
        +
        +/* Module specification */
        +static struct PyModuleDef demo_module = {
        +   PyModuleDef_HEAD_INIT,
        +   "demo",          /* name of module */
        +   mod_docstring,   /* dosctring (may be NULL) */
        +   0,               /* size of per-interpreter state of the module */
        +   DemoMethods,     /* list of methods */
        +};
        +
        +
        +/* Module entrypoint */
        +PyMODINIT_FUNC
        +PyInit_demo(void)
        +{
        +    return PyModuleDef_Init(&demo_module);
        +}
         

        Z tohoto souboru by měla být patrná struktura podobných rozšíření: máme funkci (demo_system), která převádí objekty Pythonu na datové typy C, volá samotnou funkci a výsledek převádí zpět na pythonní @@ -142,7 +142,7 @@

        Modul v C Až bude Python tento modul importovat, najde tuto funkci podle jména, spustí ji a podle vrácené struktury typu PyModuleDef vytvoří pythonní objekt s modulem.

        Překlad -# +#

        Abychom mohli takovýto modul naimportovat, musíme ho nejdřív přeložit a sestavit z něj sdílenou knihovnu – soubor .so (nebo .dll) – s názvem modulu: @@ -194,17 +194,17 @@

        Překlad

        Příkaz python setup.py develop bude fungovat jako dřív (používá build_ext --inplace), jen je opět potřeba příkaz po každé změně znovu spustit.

        PyObject -# +#

        Podívejme se teď na základní mechanismy interpretu CPython.

        Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject (dokumentace, definice). Skládá se ze dvou prvků:

        -
        typedef struct _object {
        -    Py_ssize_t ob_refcnt;
        -    struct _typeobject *ob_type;
        -} PyObject;
        +
        typedef struct _object {
        +    Py_ssize_t ob_refcnt;
        +    struct _typeobject *ob_type;
        +} PyObject;
         

        První je počet referencí (reference count), který se dá popsat jako počet míst, ze kterých je možné k tomuto objektu přistoupit. Když objekt uložíme do proměnné nebo do seznamu, zvýší se počet referencí o 1. @@ -218,10 +218,10 @@

        PyObject

        Struktura PyObject slouží jako hlavička, za kterou pak následují data interpretovaná podle typu daného objektu. Například pythonní objekt typu float vypadá následovně:

        -
        typedef struct {
        -    PyObject ob_base;
        -    double ob_fval;
        -} PyFloatObject;
        +
        typedef struct {
        +    PyObject ob_base;
        +    double ob_fval;
        +} PyFloatObject;
         

        ...tedy struktura PyObject, za kterou je v paměti číselná hodnota.

        Seznamy obsahují za hlavičkou např. velikost a (ukazatel na) pole ukazatelů na jednotlivé prvky. @@ -231,7 +231,7 @@

        PyObject

        To základní, co potřebujeme vědět, je, že na úrovni C je každý pythonní objekt reprezentován jako struktura počtu referencí, ukazatele na typ a dat specifických pro daný typ.

        Reference counting -# +#

        Tak jako v C je důležité správně alokovat a dealokovat paměť, při tvorbě rozšíření do CPythonu je třeba správně pracovat s referencemi: ke každému Py_INCREF (přičtení 1 k počtu referencí) @@ -251,7 +251,7 @@

        Reference counting o zavolání Py_DECREF. Vrácením výsledku tuto zodpovědnost ale předáváme na funkci, která volá tu naši.

        Hodnoty a výjimky -# +#

        Další konvence, kterou většina funkcí v C API dodržuje, je způsob vracení výjimek.

        Funkce, které vrací pythonní objekty, na úrovni C vrací PyObject*. @@ -265,7 +265,7 @@

        Hodnoty a výjimky Vzhledem k tomu, že její výsledek rovnou vracíme, není potřeba úspěch kontrolovat – vrátíme buď správnou hodnotu nebo NULL se zaznamenanou výjimkou.

        GIL -# +#

        Poslední omezení, kterého si autor rozšíření musí být vědom, je Global Interpreter Lock. Stručně řečeno, s objekty PyObject* může pracovat pouze jedno vlákno. @@ -278,7 +278,7 @@

        GIL Například čtení ze souboru nebo sítě ostatní vlákna neblokuje. Stejně tak maticové operace v NumPy typicky nedrží GIL zatímco počítají na úrovni C nebo Fortranu.

        Cython -# +#

        Teď, když víme jak to všechno funguje, se můžeme podívat na způsob, jak rozšíření psát jednoduše. @@ -288,9 +288,9 @@

        Cython

        Jeden takový jazyk je Cython (neplést s CPython).

        Cython je jazyk podobný Pythonu, který ale lze přeložit na C a dále optimalizovat.

        Cython si nainstalujte pomocí příkazu:

        -
        $ python -m pip install cython
        +
        $ python -m pip install cython
         

        Kompilace Pythonu -# +#

        Když chceme převést modul z Pythonu do Cythonu, nejjednodušší začátek je přejmenovat soubor .py na .pyx, aby bylo jasné, že jde o jiný jazyk, který nepůjde naimportovat přímo.

        @@ -358,7 +358,7 @@

        Cython Tento problém aktuálně řeší PyPA (správci pip a setuptools).

        Instalace z archivů wheel by měla být bezproblémová.

        Anotace -# +#

        Kód, který takto vznikne, není o moc rychlejší než původní Python. Je to tím, že sekvence příkazů ve funkci je sice převedená do C a přeložená do strojového kódu, @@ -366,7 +366,7 @@

        Anotace číslo z matice zkonstruovat pythonní objekt, vyhledat implementaci sčítání pro dvě celá čísla, a výsledek převést zpět na int64 a uložit do matice.

        Na situaci se můžeme podívat pomocí přepínače --annotate:

        -
        $ cython -3 --annotate matmul.pyx
        +
        $ cython -3 --annotate matmul.pyx
         

        To vygeneruje soubor matmul.html, kde jsou potencionálně pomalé operace vysvíceny žlutě. Ke každému řádku se navíc dá kliknutím ukázat odpovídající kód v C (který bývá docela složitý, protože řeší věci jako zpětnou kompatibilitu a ošetřování chyb, a navíc používá hodně pomocných @@ -376,7 +376,7 @@

        Anotace vyhnout. Nejjednodušší způsob, jak toho docílit, je doplnění statických informací o typech.

        Doplnění typů -# +#

        Začneme u funkce intmul, kde doplníme informaci o tom, že parametry a a b a proměnná result jsou typu int. @@ -400,7 +400,7 @@

        Doplnění typů Bohužel ale toto zrychlení pocítíme, jen když takovou funkci zavoláme z jiné funkce napsané v Cythonu.

        Tři typy funkcí -# +#

        Funkce jdou deklarovat třemi způsoby:

          @@ -409,7 +409,7 @@

          Tři typy funkcí
        • cpdef <type> func(...): je funkce, která se z Cythonu volá rychle, ale jde volat i z Pythonu (ve skutečnosti Cython vytvoří dva druhy této funkce).

        Třídy -# +#

        Cython umožňuje vytvářet tzv. built-in třídy: stejný druh tříd jako je např. str nebo int. @@ -441,7 +441,7 @@

        Třídy return self.foo

        Více o definici tříd najdete v dokumentaci Cythonu.

        Používání NumPy -# +#

        Pro funkci matmul můžeme nadefinovat číselné proměnné (n, m, p, i, j, k, x, y) jako int, ale tím si moc nepomůžeme: většinu času program stráví vybíráním a ukládáním hodnot @@ -475,7 +475,7 @@

        Používání NumPy tohoto řádku. Obě operace probíhají na úrovni Pythonu a proto budou pomalejší a při použití --annotate bude řádek s takovou operací označen žlutě.

        Direktivy -# +#

        Anotací typů matic se naše demo maticového násobení dostalo skoro na úroveň C, ale ne úplně: řádky, které pracují s maticemi, jsou ve výstupu --annotate @@ -509,7 +509,7 @@

        Používání NumPy Opak je with cython.gil:, kterým zámek zase zamkneme – například když potřebujeme vyhodit výjimku.

        Struktury, ukazatele a dynamická alokace -# +#

        Přestože v Cythonu můžete používat pythonní n-tice, slovníky, seznamy a další podobné nehomogenní typy, jejich použití je pomalé, protože vždy pracují @@ -577,7 +577,7 @@

        Struktury, ukazatele a dynamick 'y':0.0, 'z':-0.75}

        Použití knihoven z C -# +#

        Pro použití C knihoven z Pythonu je lepší použít CFFI. Ale když už píšete kód v Cythonu @@ -602,7 +602,7 @@

        Struktury, ukazatele a dynamick srand(time(NULL)) print(rand())

        Zkratky: pyximport a %%cython -# +#

        Pro interaktivní práci v Jupyter Notebook má Cython vlastní „magii“. Na začátku Notebooku můžeme zadat:

        @@ -623,7 +623,7 @@

        Struktury, ukazatele a dynamick import matmul

        Video -# +#

        Před nedávnem měl Miro na Středisku unixových technologií nahrávanou ukázku přepsání úlohy ruksaku z předmětu MI-PAA z Pythonu do Cythonu (včetně nepříjemného záseku a live diff --git a/mi-pyt/deployment/index.html b/mi-pyt/deployment/index.html index 9c8310cf..4ebf0225 100644 --- a/mi-pyt/deployment/index.html +++ b/mi-pyt/deployment/index.html @@ -1,12 +1,12 @@

        Deployment webových aplikací -# +#

        Aplikace napsaná v Pythonu běží na našem počítači, ale jak ji dostat do Internetu? Existují různé možnosti, jednou z nich je nasadit ji do cloudu.

        Nemáte ještě webovou aplikaci? Můžete vyzkoušet framework Flask.

        WSGI -# +#

        Nasazování webových aplikací v Pythnu se opírá o WSGI, což je standardní pythonní rozhraní pro komunikaci diff --git a/mi-pyt/deployment/pythonanywhere.html b/mi-pyt/deployment/pythonanywhere.html index bf2274f5..5644dd1a 100644 --- a/mi-pyt/deployment/pythonanywhere.html +++ b/mi-pyt/deployment/pythonanywhere.html @@ -1,5 +1,5 @@

        Deployment webových aplikací na PythonAnywhere -# +#

        PythonAnywhere je pro limitované použití zdarma.

        K posílání kódu na produkční prostředí budeme používat Git. @@ -14,9 +14,9 @@

        Deployment webových apl tak je ve webové konzoli potřeba použít jiný příkaz na vytvoření virtuální prostředí, než jste z toho kurzu zvyklí. Napište příkazy takto (bez úvodního $):

        -
        $ virtualenv --python=python3.7 __venv__
        -$ . __venv__/bin/activate
        -$ python -m pip install flask
        +
        $ virtualenv --python=python3.7 __venv__
        +$ . __venv__/bin/activate
        +$ python -m pip install flask
         

        Pokud máte na PythonAnywhere starší účet, možná tam Python 3.7 nenajdete. Můžete použít Python 3.6, nemělo by to vadit, protože tento návod je koncipován tak, aby s touto verzí také fungoval. @@ -26,12 +26,12 @@

        Deployment webových apl S veřejným repozitářem je to jednodušší – stačí ho naklonovat „anonymně” (git clone https://github.com/<github-username>/<github-repo>). Pokud ale používáme privátní repozitář, bude potřeba si vygenerovat SSH klíč:

        -
        $ ssh-keygen  # (zeptá se na hesla ke klíči)
        -$ cat ~/.ssh/id_rsa.pub
        +
        $ ssh-keygen  # (zeptá se na hesla ke klíči)
        +$ cat ~/.ssh/id_rsa.pub
         

        Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním nastavení v sekci "SSH and GPG Keys". Pak můžete klonovat přes SSH:

        -
        $ git clone git@github.com:<github-username>/<github-repo>.git
        +
        $ git clone git@github.com:<github-username>/<github-repo>.git
         

        Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

        Přejděte na stránkách PythonAnywhere do Dashboard do záložky Web, a vytvořte novou aplikaci. @@ -59,7 +59,7 @@

        Deployment webových apl a na adrese <uživatelské-jméno>.pythonanywhere.com si ji můžete prohlédnout.

        Deployment soukromých údajů -# +#

        Protože vaše hesla, tajné klíče apod. nejsou v repozitáři, je nutné je předat aplikaci zvlášť. @@ -75,7 +75,7 @@

        Deployment soukromých údajů GitHub povoluje všem vytvořit si jeden účet pro automatické operace, ale takový účet musí mít napsané v popisu, že je robot.

        Aktualizace -# +#

        Když nahrajeme nový kód na GitHub, je vždy potřeba provést na PythonAnywhere v konzoli git pull a pak v záložce Web aplikaci restartovat.

        diff --git a/mi-pyt/distribution/index.html b/mi-pyt/distribution/index.html index 96ed1e22..3ecbfc69 100644 --- a/mi-pyt/distribution/index.html +++ b/mi-pyt/distribution/index.html @@ -1,5 +1,5 @@

        Moduly -# +#

        Zatím jsme tvořili programy v Pythonu tak nějak na divoko, tedy v jednom nebo více souborech bez nějakého zvláštního řádu. V této lekci se podíváme na @@ -22,7 +22,7 @@

        Moduly

        Později se podíváme na elegantnější způsob jak to zařídit; teď se vraťme zpět k balíčkování.

        Slovníček pojmů -# +#

        Než se pustíme do samotného výkladu, zavedeme některé pojmy tak, aby mezi nimi nedošlo v textu záměně. @@ -37,7 +37,7 @@

        Slovníček pojmů
      • projekt (Project) je knihovna, framework, skript, plugin, aplikace apod. (či jejich kombinace), které balíme do balíčků.
      • setup.py -# +#

        Základním stavebním kamenem Python balíčku je soubor setup.py, který obsahuje všechna potřebná metadata ve volání funkce setup() z modulu @@ -60,35 +60,35 @@

        setup.py (tedy stejně jako modul). Je to dobrá konvence, ale není to technicky nutné.

        Balíček můžeme zkusit nainstalovat do virtuálního prostředí:

        -
        $ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
        -$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
        -(__venv__)$ python setup.py install
        +
        $ python3.7 -m venv __venv__     # (nebo jinak -- podle vašeho OS)
        +$ . __venv__/bin/activate        # (nebo jinak -- podle vašeho OS)
        +(__venv__)$ python setup.py install
         ...
         (__venv__)$ python
         >>> import isholiday
         >>> 
        -(__venv__)$ python -m pip freeze
        +(__venv__)$ python -m pip freeze
         isholiday==0.1
         

        Souboru setup.py rozumí i nástroj pip, takže můžete použít ten:

        -
        (__venv__)$ python -m pip install .
        +
        (__venv__)$ python -m pip install .
         

        Mezi výše uvedenými příkazy existují rozdíly, ale pro základní použití se výsledek neliší.

        Alternativně můžete použít příkaz develop (nebo pip install --editable), který balíček nainstaluje tak, že změny v souborech se projeví rovnou (není třeba po každé změněně instalovat znovu).

        Přes setup.py můžeme dělat i jiné věci, než jen instalovat, například vytvořit archiv, zdrojový balíček:

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         ...
         warning: sdist: standard file not found: should have one of README, README.rst, README.txt
         ...
         

        Extra soubory do zdrojového balíčku -# +#

        Jak vidíte, setuptools si stěžuje, že náš projekt nemá README – soubor, do kterého se tradičně píšou základní informace o projektu. Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, tedy tam, kde byste jej nejspíš čekali.

        Czech public holiday checker...

        Poté spustíme setup.py sdist znovu:

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         

        V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam být i soubor README.

        Skvělé, pojďme vytvořit i další speciální soubor, LICENSE, který bude @@ -100,7 +100,7 @@

        setup.py

        V našem případě bude MANIFEST.in vypadat takto:

        include LICENSE

        Při dalším spuštění už setup.py přidá i soubor LICENSE. To můžete zkontrolovat i ve výsledném archivu.

        -
        (__venv__)$ python setup.py sdist
        +
        (__venv__)$ python setup.py sdist
         ...
         hard linking LICENSE -> isholiday-0.1
         hard linking MANIFEST.in -> isholiday-0.1
        @@ -109,16 +109,16 @@ 

        setup.py

        Hotový balíček pak můžete nainstalovat pomocí nástroje pip. Doporučuji to dělat v jiném virtuálním prostředí – v aktuálním už ho máte nainstalovaný.

        -
        # v jiné konzoli, v jiném adresáři
        -$ python3 -m venv __venv2__
        -$ . __venv2__/bin/activate
        -(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
        +
        # v jiné konzoli, v jiném adresáři
        +$ python3 -m venv __venv2__
        +$ . __venv2__/bin/activate
        +(__venv2__)$ python -m pip install cesta/k/projektu/dist/isholiday-0.1.tar.gz
         Processing cesta/k/projektu/dist/isholiday-0.1.tar.gz
         Installing collected packages: isholiday
           Running setup.py install for isholiday ... done
         Successfully installed isholiday-0.1
         

        Více argumentů pro setup() -# +#

        Na chvíli se vrátíme k volání funkce setup() a přidáme co nejvíc dalších položek. @@ -167,7 +167,7 @@

        setup.py což komplikuje práci s datovými soubory (např. templates pro Flask). Je proto lepší zip_safe=False uvést.

        Více souborů s Python kódem -# +#

        Doteď jsme vytvářeli balíček jen s modulem ve formě jednoho zdrojového souboru isholiday.py. Co ale dělat, pokud je náš projekt větší a obsahuje souborů více? @@ -193,19 +193,19 @@

        Více souborů s Python kódem

        Soubor __init__.py jednak značí, že adresář isholiday je importovatelný modul, a také obsahuje kód, který se spustí při importu modulu isholiday.

        Musíme ještě mírně upravit setup.py – místo py_modules použijeme packages:

        -
        diff --git a/setup.py b/setup.py
        -index 3a69792..6b453ab 100644
        ---- a/setup.py
        -+++ b/setup.py
        -@@ -11,7 +11,7 @@ setup(
        -     keywords='holiday,dates',
        -     license='Public Domain',
        -     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
        --    py_modules=['isholiday'],
        -+    packages=['isholiday'],
        -     classifiers=[
        -         'Intended Audience :: Developers',
        -         'License :: Public Domain',
        +
        diff --git a/setup.py b/setup.py
        +index 3a69792..6b453ab 100644
        +--- a/setup.py
        ++++ b/setup.py
        +@@ -11,7 +11,7 @@ setup(
        +     keywords='holiday,dates',
        +     license='Public Domain',
        +     url='https://gist.github.com/oskar456/e91ef3ff77476b0dbc4ac19875d0555e',
        +-    py_modules=['isholiday'],
        ++    packages=['isholiday'],
        +     classifiers=[
        +         'Intended Audience :: Developers',
        +         'License :: Public Domain',
         

        Případně, což je ještě lepší, můžeme použít find_packages():

        from setuptools import setup, find_packages
         
        @@ -240,11 +240,11 @@ 

        Více souborů s Python kódem protože znepřehledňuje kód, to ale neznamená, že to musíme uživatelům naší knihovny znepříjemňovat (např. pro interaktivní režim).

        Spouštění modulu -# +#

        Pokusíme-li se teď program spustit pomocí python -m isholiday, narazíme na problém: na rozdíl od souboru se složka s kódem takto spustit nedá:

        -
        $ python -m isholiday
        +
        $ python -m isholiday
         python: No module named isholiday.__main__; 'isholiday' is a package and cannot be directly executed
         

        Namísto spuštění souboru (typicky s blokem if __name__ == '__main__':) totiž Python v tomto případě hledá soubor pojmenovaný __main__.py a spustí ten.

        @@ -259,7 +259,7 @@

        Více souborů s Python kódem Bude to fungovat i tehdy, když vytvoříte balíček (python setup.py sdist) a nainstalujete ho v jiném virtuálním prostředí.

        Programy pro příkazovou řádku -# +#

        Pokud chcete, aby váš modul umožňoval spouštění přímo z příkazové řádky, bez python -m, měli byste použít entrypoints. @@ -277,16 +277,16 @@

        Programy pro příkazovou řádku funkce může být v modulu definovaná nebo importovaná.

        Skript bude možné použít, je-li aktivní prostředí, kde je nainstalován, jen zadáním jména entrypointu:

        -
        (__venv__)$ python setup.py sdist
        -
        # v jiné konzoli, v jiném virtuálním prostředí
        -(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
        +
        (__venv__)$ python setup.py sdist
        +
        # v jiné konzoli, v jiném virtuálním prostředí
        +(__venv2__)$ python -m pip install --upgrade cesta/k/projektu/dist/isholiday-0.1.tar.gz
         (__venv2__)$ isholiday_demo
         ...
         Mon Mar 28 00:00:00 2016 True
         Tue Mar 28 00:00:00 2017 False
         Fri Apr 14 00:00:00 2017 True
         

        Specifikace závislostí -# +#

        Balíčky na PyPI mohou záviset na dalších balíčkách. V případě isholiday to potřeba není, ale v úlohách z minulých cvičení ano.

        @@ -299,7 +299,7 @@

        Programy pro příkazovou řádku install_requires=['Flask', 'click>=6'], )

        Soubor requirements.txt -# +#

        Kromě závislostí v setup.py se u pythonních projektů často setkáme se souborem requirements.txt, který obsahuje přesné verze všech závislostí, včetně @@ -315,7 +315,7 @@

        Programy pro příkazovou řádku My ho používat nebudeme, vystačíme si s volnější specifikací závislostí v setup.py.

        Nahrání na PyPI -# +#

        Balíček jde zaregistrovat a nahrát na PyPI. Původně k tomu sloužily příkazy setup.py register a upload, ale tyto příkazy používaly HTTP, což není @@ -325,26 +325,26 @@

        Nahrání na PyPI účet na PyPI, účet na testovací PyPI a vytvořit konfigurační soubor ~/.pypirc:

        -
        [distutils]
        -index-servers=
        -    pypi
        -    testpypi
        +
        [distutils]
        +index-servers=
        +    pypi
        +    testpypi
         
        -[pypi]
        -username = <your user name goes here>
        -password = <your password goes here>
        +[pypi]
        +username = <your user name goes here>
        +password = <your password goes here>
         
        -[testpypi]
        -repository = https://test.pypi.org/legacy/
        -username = <your user name goes here>
        -password = <your password goes here>
        +[testpypi]
        +repository = https://test.pypi.org/legacy/
        +username = <your user name goes here>
        +password = <your password goes here>
         

        Hesla můžete vynechat, pokud je budete chtít pokaždé zadávat.

        Používáte-li Windows, je potřeba nastavit proměnnou prostředí HOME na adresář se souborem .pypirc, např:

        > set HOME=C:\cesta\k\nastaveni
         

        Registrace projektu a nahrání na testovací PyPI se provádí pomocí příkazu upload: ten projekt zaregistrueje (pokud to jde) a nahraje samotný balíček:

        -
        (__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
        +
        (__venv__)$ twine upload -r testpypi dist/isholiday-0.1.tar.gz
         Uploading distributions to https://test.pypi.org/legacy/
         Uploading isholiday-0.1.tar.gz
         [================================] 8379/8379 - 00:00:02
        @@ -358,18 +358,18 @@ 

        Nahrání na PyPI Zabírat jména na opravdové PyPI jen tak není hezké vůči ostatním Pythonistům; registrujte tedy prosím jen balíčky, které budou nějak pro ostatní užitečné.

        Instalace pomocí pip -# +#

        Projekt nahraný na PyPI by mělo jít nainstalovat pomocí pipu. V případě použití ostré verze PyPI stačí k instalaci zadat název balíčku:

        -
        (__venv__)$ python -m pip install <název_balíčku>
        +
        (__venv__)$ python -m pip install <název_balíčku>
         

        Pokud však použijeme testovací PyPI, je nutné pipu říct, aby balíček hledal tam. Postup uvedený v dokumentaci není v tomto případě nejvhodnější, protože z testovací PyPI vezme jak náš balíček, tak i případné závislosti, které mohou být zastaralé, rozbité či jinak škodlivé.

        Lepší by bylo, kdyby pip nainstaloval závislosti z ostré PyPI a na testovací hledal jen náš projekt. Toho se dá docílit přepínačem --extra-index-url.

        -
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
        +
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>
         

        V tomto případě pip nejdřív prohledá ostrou PyPI, a pokud nenajde požadovaný balíček, použije testovací PyPI. Zde je potřeba dávat pozor na název projektu, protože případné konflikty mezi ostrou a testovací PyPI se nekontrolují. @@ -377,15 +377,15 @@

        Instalace pomocí pip stejným názvem, nainstaluje se ten z ostré verze.

        V případě, že tento problém nastane, je možné ho částečně obejít specifikací verze instalovaného balíčku:

        -
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
        +
        (__venv__)$ python -m pip install --extra-index-url https://test.pypi.org/pypi <název_balíčku>==0.3
         

        Pokud u duplicitního projektu na ostré PyPI neexistuje požadovaná verze, nainstaluje se náš balíček z testovací PyPI.

        Jiná možnost je zadat přímo cestu k archivu s balíčkem místo jeho názvu. Zde pak na umístění balíčku ani verzi nezáleží:

        -
        (__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
        +
        (__venv__)$ python -m pip install https://test-files.pythonhosted.org/packages/.../<název_balíčku>-0.3.tar.gz
         

        Odkaz na archiv se dá najít na informační stránce o našem projektu na PyPI.

        Datové soubory -# +#

        Některé moduly kromě samotného kódu potřebují i datové soubory. Například aplikace ve Flasku potřebují templates. @@ -397,7 +397,7 @@

        Datové soubory )

        Další informace jsou odkázané v dokumentaci.

        Wheel: Binární balíčky -# +#

        Zatím jsme se zabývali jen zdrojovými balíčky (sdist). Existují ale i balíčky „zkompilované” – binární (bdist). @@ -405,7 +405,7 @@

        Wheel: Binární balíčky Binární balíček se místo toho jen rozbalí na patřičné místo.

        Z historických důvodů existuje několik různých druhů binárních distribucí, v současné době je ale důležitá pouze možnost bdist_wheel:

        -
        (__venv__)$ python setup.py bdist_wheel
        +
        (__venv__)$ python setup.py bdist_wheel
         

        Výsledek je v souboru dist/*.whl.

        Pokud vám příkaz nefunguje, nainstalujte balík wheel.

        Obsah binárního balíčku typu wheel můžete prozkoumat, je to obyčejný ZIP.

        @@ -423,12 +423,12 @@

        Wheel: Binární balíčky
      • wheel se rychleji instaluje.
      • Proces vydání složitějšího softwaru pak může vypadat takto:

        -
        (__venv__)$ rm dist/*
        -(__venv__)$ python setup.py sdist bdist_wheel
        +
        (__venv__)$ rm dist/*
        +(__venv__)$ python setup.py sdist bdist_wheel
         [... kontrola vytvořených balíčků v „čistém“ virtualenvu ...]
        -(__venv__)$ python -m twine upload dist/*
        +(__venv__)$ python -m twine upload dist/*
         

        Další -# +#

        K balíčkování existuje obsáhlá dokumentace. Budete-li chtít dělat něco, co v tomto kurzu není, podívejte se tam!

        \ No newline at end of file diff --git a/mi-pyt/docs/index.html b/mi-pyt/docs/index.html index d7951b06..c64dc311 100644 --- a/mi-pyt/docs/index.html +++ b/mi-pyt/docs/index.html @@ -1,11 +1,11 @@

        Dokumentace -# +#

        Jednou ze zásadních součástí každého kvalitního Python projektu je dokumentace. Protože chceme, abyste vytvářeli kvalitní projekty, podíváme se tedy i na dokumentaci.

        Sphinx -# +#

        Nejpoužívanějším nástrojem na vytváření dokumentace Python projektů je Sphinx. Když jste se dívali do dokumentace Flasku, requests, clicku, flexmocku, pytestu, @@ -54,13 +54,13 @@

        Sphinx dokumentace sestavit do HTML.

        Sphinx umí generovat dokumentaci ve více formátech (LaTeX, manuálové stránky atd.), pro nás bude podstatné především HTML.

        -
        (__venv__) $ make html
        +
        (__venv__) $ make html
         ...
         The HTML pages are in _build/html.
         

        Ve zmíněné složce byste měli najít index.html, ten si můžete prohlédnout v prohlížeči.

        Textový obsah v dokumentaci -# +#

        Text dokumentace začíná v souboru index.rst a píše se ve značkovacím formátu reStructuredText neboli rst. @@ -104,7 +104,7 @@

        Textový obsah v dokumentaci
        It refers to the section itself, see :ref:`my-reference-label`.
         It could refer to a different section as well :)
         

        Co do dokumentace psát -# +#

        Teď, když víte jak něco napsat, pojďme si povědět co vlastně psát. K čemu dokumentace vlastně je?

        @@ -141,7 +141,7 @@

        Textový obsah v dokumentaci
      • podrobný návod jak přispívat.
      • Nastavení a rozšíření -# +#

        Průvodce sphinx-quickstart generuje soubor s nastavením, conf.py, ve kterém můžete měnit nastavení Sphinxu a jeho rozšíření, včetně detailů @@ -155,7 +155,7 @@

        Nastavení a rozšíření 'sphinx.ext.intersphinx', ]

        doctest -# +#

        doctest je modul ze standardní knihovny, který najde v dokumentaci bloky kódu a otestuje, jestli odpovídají ukázanému výstupu. @@ -178,34 +178,34 @@

        Nastavení a rozšíření
        foo
         

        K tomu všemu složí několik direktiv:

        .. testsetup:: -# +#

        Direktiva pro potřebný kód, který se musí provést, aby příklad fungoval, ale nebude v dokumentaci zobrazen (např. kód pro vytvoření falešného objektu, import...).

        .. testcleanup:: -# +#

        Podobná direktiva jako .. testsetup:: provedená po skončení testů. V dokumentaci nebude kód zobrazen.

        .. doctest:: -# +#

        Test s interaktivní konzolí. V dokumentaci bude zobrazen, pokud nepoužijete flag :hide:.

        .. testcode:: -# +#

        Kód testu bez interaktivní konzole, co chcete kontrolovat, musíte dát na standardní výstup. V dokumentaci bude zobrazen, pokud nepoužijete flag :hide:.

        .. testoutput:: -# +#

        Výstup posledního testcode bloku. V dokumentaci bude kód zobrazen, pokud nepoužijete flag :hide:.

        Kompletní příklad -# +#

        Zde můžete vidět výše zmíněné direktivy použité dohromady. Jedná se o umělý příklad, kdy použitou třídu připravíme v direktivě testsetup. @@ -264,7 +264,7 @@

        Kompletní příklad parrot.die()

        Testy se také dají např. zařazovat do skupin. Více najdete v dokumentaci.

        -
        (__venv__) $ make doctest
        +
        (__venv__) $ make doctest
         ...
         Document: intro
         ---------------
        @@ -287,7 +287,7 @@ 

        Kompletní příklad 0 failures in cleanup code ...

        Import z vlastního kódu -# +#

        Pokud nemáte nainstalovaný vlastní balíček a budete z něj chtít v doctestu importovat, pravděpodobně dostanete ImportError. @@ -305,7 +305,7 @@

        Kompletní příklad import sys sys.path.insert(0, os.path.abspath('..'))

        Travis CI -# +#

        Neexistuje zatím unifikovaný způsob, jak specifikovat závislosti pro sestavení dokumentace. Proto, pokud chcete mít nějaký jednoduchý způsob, jak pouštět @@ -315,15 +315,15 @@

        Kompletní příklad (většinou pouze sphinx), nebo všechny závislosti, aby šel použít soubor samostatně.

        Poté na Travisu můžete udělat něco jako:

        -
        language: python
        -python:
        -- '3.7'
        -install:
        -- python setup.py install
        -- pip install -r docs/requirements.txt
        -script:
        -- python setup.py test --addopts -v
        -- cd docs && make doctest
        +
        language: python
        +python:
        +- '3.7'
        +install:
        +- python setup.py install
        +- pip install -r docs/requirements.txt
        +script:
        +- python setup.py test --addopts -v
        +- cd docs && make doctest
         

        Chcete-li jít s dobou, můžete vyzkoušet strukturovaný způsob závislostí pro vývoj pomocí extras. Aktuálně pro to neexistuje standard, ale vypadá to, že následující způsob je nejlepší kandidát na @@ -336,7 +336,7 @@

        Kompletní příklad jméno extras v hranatých závorkách):

        install:
         - python -m pip install .[dev]

        autodoc -# +#

        Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, které průvodce přidává automaticky.

        @@ -355,13 +355,13 @@

        Kompletní příklad můžete použít i jiné direktivy.

        Pro vygenerování hezké struktury si můžete pomoci příkazem sphinx-apidoc:

        -
        (__venv__) $ sphinx-apidoc -o docs mymodule
        +
        (__venv__) $ sphinx-apidoc -o docs mymodule
         

        V dokumentačních řetězcích samozřejmě můžete použít reStructuredText a je to dokonce žádoucí.

        Zde je ukázka z betamaxu (Copyright 2013 Ian Cordasco):

        class Betamax:
         
        -    """This object contains the main API of the request-vcr library.
        +    """This object contains the main API of the request-vcr library.
         
             This object is entirely a context manager so all you have to do is:
         
        @@ -399,7 +399,7 @@ 

        Kompletní příklad

        Existují různé způsoby, jak dokumentovat argumenty, návratové hodnoty apod. Zvídavým studentům doporučujeme podívat se na rozšíření Napoleon.

        Odkazy na třídy a moduly -# +#

        Máte-li zdokumentovaný modul, funkci, třídu, metodu apod., je možné na ni odkázat pomocí konstrukce :mod:, :func:, :class:, :meth: a dalších @@ -410,13 +410,13 @@

        Odkazy na třídy a moduly

        Všechny zdokumentované objekty se automaticky přidávají do rejstříku. Chcete-li do rejstříku přidat něco navíc, použijte direktivu index.

        README.rst -# +#

        Když už se stejně zabýváme reStructuredTextem, je dobré váš README přepsat nebo převést do stejného formátu. Na PyPI pak bude váš projekt vypadat lépe.

        Při přejmenování na README.rst dejte pozor na patřičné změny v setup.py.

        Read the Docs -# +#

        Pokud svůj repositář na GitHubu změníte na veřejný, můžete využít službu Read the Docs k hostování dokumentace ve Sphinxu. diff --git a/mi-pyt/flask/index.html b/mi-pyt/flask/index.html index 1eb018e4..75905d00 100644 --- a/mi-pyt/flask/index.html +++ b/mi-pyt/flask/index.html @@ -1,5 +1,5 @@

        Webové aplikace: Flask -# +#

        Python je víceúčelový jazyk. Na minulém cvičení jsme tvořili aplikace pro příkazovou řádku, @@ -9,13 +9,13 @@

        Webové aplikace: Flask

        Pro naše účely použijeme Flask, protože je nejrychlejší na pochopení a nevyžaduje striktně použití MVC paradigmatu.

        Flask -# +#

        Flask opět můžete nainstalovat do virtualenvu, nejlépe použít projekt z minulého cvičení:

        -
        $ cd project
        -$ . __venv__/bin/activate 
        -(__venv__) $ python -m pip install Flask
        +
        $ cd project
        +$ . __venv__/bin/activate 
        +(__venv__) $ python -m pip install Flask
         

        Základní použití Flasku je poměrně primitivní. Do souboru hello.py napište:

        from flask import Flask
        @@ -26,9 +26,9 @@ 

        Flask return 'MI-PYT je nejlepší předmět na FITu!'

        Pak aplikaci spusťte pomocí následujících příkazů. (Na Windows použijte místo export příkaz set.)

        -
        (__venv__) $ export FLASK_APP=hello.py
        -(__venv__) $ export FLASK_DEBUG=1
        -(__venv__) $ flask run
        +
        (__venv__) $ export FLASK_APP=hello.py
        +(__venv__) $ export FLASK_DEBUG=1
        +(__venv__) $ flask run
          * Serving Flask app "hello"
          * Forcing debug mode on
          * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
        @@ -58,7 +58,7 @@ 

        Flask return 'Hello, World'

        Na adrese http://127.0.0.1:5000/hello/ pak uvidíte druhou stránku.

        Ladící režim -# +#

        Proměnná FLASK_DEBUG říká, že se aplikace má spustit v ladícím režimu: je zapnutý příjemnější výpis chyb a aplikace se automaticky restartuje @@ -73,7 +73,7 @@

        Ladící režim Navíc aplikaci zpomaluje. Používejte ho proto pouze na svém počítači.

        Dynamické routy -# +#

        Když vytváříte dynamický web, ne vždy můžete všechna URL znát dopředu. Budete například chtít zobrazit informace o uživatelích na adresách @@ -102,7 +102,7 @@

        Dynamické routy def hello(name='world'): return 'Hello, {}!'.format(name)

        Získání URL -# +#

        Opačným způsobem jak k routám přistupovat je, když potřebujete získat URL nějaké stránky, například protože potřebujete zobrazit odkaz. @@ -129,7 +129,7 @@

        Dynamické routy Generování URL vám také může zjednodušit nasazení statické verze stránek.

        Pro URL v rámci vašich stránek proto doporučujeme url_for používat důsledně.

        Šablony -# +#

        Zatím jsou naše webové stránky poměrně nudné: obsahují jen prostý text, nepoužívají HTML.

        @@ -182,7 +182,7 @@

        Šablony (Jiné funkce známé z Pythonu ale použít nejdou – ač jsou podobné, je Jinja2 jiný jazyk než Python.)

        Filtry -# +#

        Není úplně elegantní vzít nějaká data (např. tweety z Twitter API) a ještě před předáním šabloně do nich cpát svoje úpravy (např. převod na HTML). @@ -194,7 +194,7 @@

        Filtry @app.template_filter('time') def convert_time(text): - """Convert the time format to a different one""" + """Convert the time format to a different one""" dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y') return dt.strftime('%c') @@ -208,7 +208,7 @@

        Filtry
        {{ created_at|time }}
         

        Pokud potřebujete velmi obecný filtr, je vhodné se podívat do seznamu těch vestavěných.

        Escaping -# +#

        V textu, který se vkládá do šablon, jsou automaticky nahrazeny znaky, které mají v HTML speciální význam. @@ -233,7 +233,7 @@

        Escaping @app.template_filter('time') def convert_time(text): - """Convert the time format to a different one""" + """Convert the time format to a different one""" dt = datetime.strptime(text, '%a %b %d %H:%M:%S %z %Y') result = dt.strftime('<strong>%c</strong>') return jinja2.Markup(result) @@ -241,7 +241,7 @@

        Escaping (ani nikdo mnohem chytřejší než vy) nemohl na vaší stránce provést něco nekalého.

        Statické soubory -# +#

        Pokud budete potřebovat nějaké statické soubory (např. styly CSS nebo obrázky), dejte je do adresáře static vedle souboru s kódem @@ -250,7 +250,7 @@

        Statické soubory

        V šabloně pak například:

        <link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
         

        Logování -# +#

        Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného @@ -280,7 +280,7 @@

        Statické soubory (navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody setLevel, viz dokumentace modulu logging.

        Větší Flask aplikace -# +#

        Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet @@ -292,7 +292,7 @@

        Větší Flask aplikace

        Následující sekce popisují některé zajímavé techniky, které se mohou u větších a složitějších aplikací hodit.

        create_app factory -# +#

        Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí funkce, tzv. application_factory, @@ -310,7 +310,7 @@

        create_app factory return app

        Blueprint moduly -# +#

        Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky @@ -347,7 +347,7 @@

        create_app factory

        V případě použití url_for je třeba cesty z blueprintu namespacovat, např.:

        url_for('auth.login')
         

        Vlastní podtřída Flask -# +#

        Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které @@ -385,7 +385,7 @@

        create_app factory def greetings_number(): return str(current_app.greetings)

        A další -# +#

        Flask umí i další věci – například zpracování formulářů, chybové stránky nebo přesměrování. Také existuje i řada rozšíření, diff --git a/mi-pyt/generators/index.html b/mi-pyt/generators/index.html index fa4c2e64..13adebe9 100644 --- a/mi-pyt/generators/index.html +++ b/mi-pyt/generators/index.html @@ -1,11 +1,11 @@

        Generátory -# +#

        Dnes si popíšeme, jak v Pythonu fungují generátory, tedy funkce s příkazem yield. Někteří z vás možná už nějaký jednoduchý generátor napsali, ale pojďme si je vysvětlit od úplného začátku: od toho, jak se v Pythonu iteruje.

        Iterace -# +#

        Když je v Pythonu potřeba iterovat (např. příkazem for) přes nějakou kolekci (seznam, řetězec, soubor, …), použije se iterační protokol, @@ -26,11 +26,11 @@

        Iterace 3 >>> next(it) Traceback (most recent call last): - ... + ... StopIteration >>> next(it) Traceback (most recent call last): - ... + ... StopIteration

        Cyklus for x in collection: ... tedy dělá něco jako:

        iterator = iter(collection)
        @@ -53,14 +53,14 @@ 

        Iterace

        Iterátory ale můžou být i „větší“: třeba otevřený soubor je iterátor, z něhož next() načítá jednotlivé řádky.

        Generátory -# +#

        Asi nejzajímavější druh iterátoru je tzv. generátor: funkce, která umí postupně dávat k dispozici hodnoty. Definuje se pomocí klíčového slova yield: každá funkce, která obsahuje yield, je generátorová funkce (angl. generator function).

        def generate2():
        -    """generates 2 numbers"""
        +    """generates 2 numbers"""
             print('A')
             yield 0
             print('B')
        @@ -83,10 +83,10 @@ 

        Generátory >>> next(it) C Traceback (most recent call last): - ... + ... StopIteration

        Další použití generátorů -# +#

        Vlastnost přerušit provádění funkce je velice užitečná nejen pro vytváření sekvencí, ale má celou řadu dalších užití. @@ -108,14 +108,14 @@

        Generátory Můžeme si představit, že místo yield se „doplní“ obsah bloku with. Funkce se tam na chvíli zastaví a může se tedy provádět něco jiného.

        Vracení hodnot z generátorů -# +#

        V rámci generátorové funkce můžeme použít i return, který funkci ukončí. Vrácená hodnota se však při normální iteraci (např. ve for) nepoužije. Objeví se pouze jako hodnota výjimky StopIteration, která signalizuje konec iterace:

        def generator(a, b):
        -    """Yield two numbers and return their sum"""
        +    """Yield two numbers and return their sum"""
             yield a
             yield b
             return a + b
        @@ -129,7 +129,7 @@ 

        Vracení hodnot z generátorů File "<stdin>", line 1, in <module> StopIteration: 5

        Obousměrná komunikace -# +#

        Oproti normálním iterátorům, které hodnoty jen poskytují, mají generátory metodu send(), kterou je možné posílat hodnoty do běžícího generátoru. @@ -182,7 +182,7 @@

        Vracení hodnot z generátorů RuntimeError: generator ignored GeneratorExit 0

        Delegace na podgenerátor – yield from -# +#

        Máme následující generátor:

        def dance():
        diff --git a/mi-pyt/git-collaboration-2in1/index.html b/mi-pyt/git-collaboration-2in1/index.html
        index d827e609..6830dfc9 100644
        --- a/mi-pyt/git-collaboration-2in1/index.html
        +++ b/mi-pyt/git-collaboration-2in1/index.html
        @@ -1,5 +1,5 @@
         

        Spolupráce a Git -# +#

        „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat @@ -15,7 +15,7 @@

        Spolupráce a Git Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

        Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

        Git a GitHub -# +#

        Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. Takové složce s kódem říkáme repozitář. @@ -42,7 +42,7 @@

        Git a GitHub A třetí kopii repozitáře máte u sebe na počítači.

        Git workflow

        Práce s lokálním repozitářem -# +#

        Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, @@ -56,13 +56,13 @@

        Práce s lokálním repozitářem

        Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

        Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

        -
        $ git clone https://github.com/asgeirrr/prezencka
        +
        $ git clone https://github.com/asgeirrr/prezencka
         

        V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

        Stav repozitáře (git status) -# +#

        Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         nothing to commit, working tree clean
        @@ -73,7 +73,7 @@ 

        Stav repozitáře (git status<
      • Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.
      • První revize (git commit) -# +#

        Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. @@ -81,7 +81,7 @@

        První revize (git commit)

        Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt a do něj napište svoje současné povolání nebo cokoliv jiného. Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Untracked files:
        @@ -91,9 +91,9 @@ 

        První revize (git commit) nothing added to commit but untracked files present (use "git add" to track)

        U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

        -
        $ git add magdalena_rettigova.txt
        +
        $ git add magdalena_rettigova.txt
         

        a znovu zkontrolujte stav repozitáře:

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is up-to-date with 'origin/master'.
         Changes to be committed:
        @@ -101,13 +101,13 @@ 

        První revize (git commit) new file: magdalena_rettigova.txt

        To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

        -
        $ git commit
        +
        $ git commit
         

        Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). Pak soubor uložíme a zavřeme editor.

        -
        $ git status
        +
        $ git status
         On branch master
         Your branch is ahead of 'origin/master' by 1 commit.
           (use "git push" to publish your local commits)
        @@ -115,12 +115,12 @@ 

        První revize (git commit)

        Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

        Git workflow

        Log (git log) -# +#

        Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, na které navazujeme.

        -
        $ git log
        +
        $ git log
         commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
         Author: Magdalena Dobromila <magdalena@rettigova.cz>
         Date:   Tue Mar 28 19:27:08 2017 +0200
        @@ -138,7 +138,7 @@ 

        Log (git log)

        V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

        Open-source a Free software -# +#

        Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. @@ -188,11 +188,11 @@

        Open-source a Free software Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

        Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

        Spolupráce na projektu -# +#

        Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

        Posílání změn (git push) -# +#

        Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. @@ -205,26 +205,26 @@

        Posílání změn (git push

        A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         

        Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

        Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje nebo svým uživatelským jménem na GitHubu, aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

        -
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
        +
        $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
         

        Zkontrolujme, že se nám to povedlo:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
         origin  https://github.com/asgeirrr/prezencka (push)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
         tvojejmeno  https://github.com/tvojejmeno/prezencka (push)
         

        Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

        -
        $ git push tvojejmeno master
        +
        $ git push tvojejmeno master
         

        což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

        Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

        Žádost o začlenění (pull request) -# +#

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

        @@ -237,10 +237,10 @@

        Žádost o začlenění (pull request)

        Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

        Aktualizace (git pull) -# +#

        Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

        -
        $ git pull origin master
        +
        $ git pull origin master
         

        stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

        Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. diff --git a/mi-pyt/http/index.html b/mi-pyt/http/index.html index e19ef51e..98df17b0 100644 --- a/mi-pyt/http/index.html +++ b/mi-pyt/http/index.html @@ -1,5 +1,5 @@

        HTTP – Jak funguje Internet -# +#

        Než začneme pracovat s internetem – ať už tvorbou vlastních stránek, nebo komunikací s existujícími službami, pojďme si přiblížit, co vlastně ten @@ -29,7 +29,7 @@

        HTTP – Jak funguje Internet Každou webovou stránku spravuje takový server.

        Webové adresy -# +#

        Jak taková komunikace vypadá si ukážeme na příkladu – co se stane, když do prohlížeče zadám tuhle adresu:

        @@ -58,7 +58,7 @@

        Webové adresy

        U jednodušších stránek to může být přímo jméno souboru, který má server uložený na disku – proto spousta adres na Webu končí příponou .html.

        Požadavek a odpověď -# +#

        K získání požadované stránky prohlížeč vytvoří požadavek (angl. request) – zprávu „Pošli mi prosím stránku /lessons/fast-track/http/“ – a pošle ho @@ -113,7 +113,7 @@

        Požadavek a odpověď

        Hlavičky jsou ukončené volným řádkem, po kterém následuje samotný obsah odpovědi ve zmíněném jazyce HTML.

        HTTP Metody -# +#

        Komunikace ukázaná výše používala metodu GET, která slouží ke čtení informací. diff --git a/mi-pyt/install/index.1.html b/mi-pyt/install/index.1.html index b7443651..f316462a 100644 --- a/mi-pyt/install/index.1.html +++ b/mi-pyt/install/index.1.html @@ -23,35 +23,35 @@ v příslušné lekci pro začátečníky. Modul venv je součást standardní knihovny.

        Unix (Linux, macOS) -# +#

        Zkontroluj, že máš modul ensurepip:

        -
        $ python3.7 -m ensurepip --version
        +
        $ python3.7 -m ensurepip --version
         pip 18.0 (nebo i jiná verze)
         

        Jestli ne, postupuj podle lekce pro začátečníky – jsou tam podrobnější instrukce. Jinak použij:

        -
        $ mkdir project
        -$ cd project
        -$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
        -$ . __venv__/bin/activate  # aktivace
        -(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
        -(__venv__)$ ...  # práce "uvnitř"
        -(__venv__)$ deactivate  # vypnutí virtualenvu
        +
        $ mkdir project
        +$ cd project
        +$ python3.7 -m venv __venv__  # vytvoření virtualenvu -- použij Python 3 dle systému
        +$ . __venv__/bin/activate  # aktivace
        +(__venv__)$ python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
        +(__venv__)$ ...  # práce "uvnitř"
        +(__venv__)$ deactivate  # vypnutí virtualenvu
         

        V tomto kurzu lze případně využít i Python 3.6. Pokud máš 3.5 nebo ještě nižší, doporučujeme aktualizovat.

        Windows -# +#

        -
        > mkdir project
        -> cd project
        -> py -3 -m venv __venv__
        +
        > mkdir project
        +> cd project
        +> py -3 -m venv __venv__
         > __venv__\Scripts\activate
         (__venv__)> python -m pip install requests  # příkaz na instalaci balíčků puštěný ve virtualenvu
         (__venv__)> ...  # práce "uvnitř"
         (__venv__)> deactivate  # vypnutí virtualenvu
         

        Poznámky -# +#

        Příkaz . __venv__/bin/activate budeš muset zadat vždy, než začneš na projektu pracovat.

        diff --git a/mi-pyt/install/index.html b/mi-pyt/install/index.html index ff966cda..c238b86c 100644 --- a/mi-pyt/install/index.html +++ b/mi-pyt/install/index.html @@ -1,5 +1,5 @@

        Instalace Pythonu -# +#

        V této sekci nainstalujeme Python.

        To se na každém druhu operačního systému dělá trošku jinak. diff --git a/mi-pyt/install/linux.html b/mi-pyt/install/linux.html index 8714817f..46ec84cf 100644 --- a/mi-pyt/install/linux.html +++ b/mi-pyt/install/linux.html @@ -1,16 +1,16 @@

        Instalace Pythonu na Linux -# +#

        Nainstalovat Pyhon na Linux je většinou jednoduché. Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, tak jsou tyhle instrukce trochu delší. Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

        Instalace Pythonu 3 -# +#

        Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť v příkazové řádce příkaz:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Přejdi na další sekci, kontrolu tkinter.

        @@ -20,42 +20,42 @@

        Instalace Pythonu 3 doinstaluj Python. Konkrétní příkaz záleží na distribuci:

          -
        • Fedora:
          $ sudo dnf install python3
          +
        • Fedora:
          $ sudo dnf install python3
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3
          +
        • Ubuntu:
          $ sudo apt-get install python3
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        Kontrola Tkinter -# +#

        Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti Pythonu. Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) často musíme nainstalovat zvlášť. Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

        -
        $ python3 -m tkinter
        +
        $ python3 -m tkinter
         

        Objeví-li se okýnko, je všechno v pořádku. Zavři ho a přejdi na doinstalování virtualenv.

        Jestli ne, modul tkinter ještě nainstaluj:

          -
        • Fedora:
          $ sudo dnf install python3-tkinter
          +
        • Fedora:
          $ sudo dnf install python3-tkinter
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3-tk
          +
        • Ubuntu:
          $ sudo apt-get install python3-tk
           

        Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

        Doinstalování Virtualenv -# +#

        Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu vyřadily). Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

        Spusť v příkazové řádce příkaz:

        -
        $ python3 -m ensurepip --version
        +
        $ python3 -m ensurepip --version
         

        Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. Zbytek této sekce můžeš přeskočit!

        Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat @@ -63,7 +63,7 @@

        Doinstalování Virtualenv
          -
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
          +
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        diff --git a/mi-pyt/install/macos.html b/mi-pyt/install/macos.html index 0e3c99dc..428a02ef 100644 --- a/mi-pyt/install/macos.html +++ b/mi-pyt/install/macos.html @@ -1,15 +1,15 @@

        Instalace Pythonu pro macOS -# +#

        Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje instalaci aplikací a knihoven, které budeme potřebovat pro programování. Jak na to?

        Spusť v příkazové řádce příkaz:

        -
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        +
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         

        Pak zadej následující příkaz a Python bude nainstalovaný:

        -
        $ brew install python3
        +
        $ brew install python3
         

        Zkontroluj si, že máš verzi 3.6 nebo vyšší:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Jinak je něco špatně; diff --git a/mi-pyt/install/windows.html b/mi-pyt/install/windows.html index c75117a7..99135c9e 100644 --- a/mi-pyt/install/windows.html +++ b/mi-pyt/install/windows.html @@ -1,8 +1,8 @@

        Instalace Pythonu pro Windows -# +#

        Zjisti, jestli už máš Python nainstalovaný -# +#

        Otevři si příkazovou řádku (pokud nevíš o co jde, přečti si o ní tady).

        Napiš python a zmáčkni na klávesnici Enter. @@ -25,7 +25,7 @@

        Zjisti, jestli už máš Pyth

        Stažení -# +#

        • Běž na stahovací stránku
        • @@ -37,7 +37,7 @@

          Stažení Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

          Screenshot zjišťování verze systému

        Instalace -# +#

        Stažený instalátor spusť.

        Na začátku instalace zaškrtni:

        diff --git a/mi-pyt/magic/index.html b/mi-pyt/magic/index.html index 83325eec..34222ed6 100644 --- a/mi-pyt/magic/index.html +++ b/mi-pyt/magic/index.html @@ -1,5 +1,5 @@

        Magie -# +#

        Co z Pythonu dělá tak užitečný jazyk? Z velké části je to zaměření na čitelnost kódu. Pythonu se někdy říká „spustitelný pseudokód“: syntaxe je inspirovaná zápisem abstraktních algoritmů v matematice, používá se málo speciálních znaků jako $, <<, &&, ?. @@ -13,7 +13,7 @@

        Magie

        Na jiný důvod, proč použít méně pochopitelné techniky, narazíme při psaní knihoven a frameworků. To je kód, který používá hodně programátorů – a často jsou to programátoři s méně zkušenostmi, než mají autoři knihovny. Tady proto bývá dobré občas použít nějakou tu magii – znepřehlednit kód knihovny, aby kód který knihovnu používá, mohl být přehlednější.

        Typický příklad jsou dekorátory ve Flasku. Napsat dekorátor není úplně triviální, ale velice to zjednodušuje práci všem, co ve Flasku píšou web. Konstrukce @app.route je pro většinu lidí magická – nevíme přesně, co to dělá, ale to nám nebrání ji použít.

        Velká moc a velká zodpovědnost -# +#

        Druhý možný význam slova magie je něco, co neodpovídá „normálnímu“ chování podobných věcí.

        Jazyk Python standardizuje syntaxi relativně malého počtu operací (operátory, volání funkcí, atributy, ...), způsobů řízení toku programu (cykly, with, ...) a strukturování kódu (moduly, def, class). @@ -26,7 +26,7 @@

        Velká moc a velká zodpovědnost

        Následující principy (kromě jiných) je proto dobré při psaní knihoven používat jen po pečlivém zvážení, jestli by to nešlo i bez magie.

        * Taková třída dokonce existuje ve standardní knihovně.

        Speciální metody -# +#

        Základní způsob, jak přizpůsobit chování objektů, jsou speciální metody. Asi už víte, že všechny atributy, které začínají a končí dvojitým podtržítkem, jsou rezervované pro samotný Python, který je používá podle svých pravidel – například danou metodu volá, když je potřeba sečíst dvě čísla.

        @@ -62,7 +62,7 @@

        Speciální metody

        Předefinování hierarchie dědičnosti: __instancecheck__, __subclasscheck__.

        Dekorátory -# +#

        Další věc, na kterou se podíváme, jsou dekorátory – způsob, jak si přizpůsobovat funkce.

        @@ -129,7 +129,7 @@

        Dekorátory @to_floats def add(a, b): - """Adds two numbers""" + """Adds two numbers""" return a + b print(add(1, '2')) @@ -215,7 +215,7 @@

        Dekorátory Dekorátor dostane třídu jako první argument a třída se nahradí tím, co dekorátor vrátí.

        Deskriptory -# +#

        Jeden z nejmagičtějších operátorů v Pythonu je ., tečka. Je magický v obou významech – většina lidí ho používá, ačkoli nemá tušení, co přesně dělá, a dá se předefinovat tolika různými způsoby, že to vydá na celou přednášku.

        @@ -274,14 +274,14 @@

        Deskriptory
        # (Omluvte prosím češtinu v kódu)
         
         class Descriptor2D:
        -    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
        +    """Popisuje atribut, který kombinuje dva jiné atributy do dvojice"""
         
             def __init__(self, name1, name2):
                 self.name1 = name1
                 self.name2 = name2
         
             def __get__(self, instance, cls=None):
        -        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
        +        """Volá se, když je třeba načíst atribut dané `instance` na dané třídě `cls`.
                 """
         
                 if instance is not None:
        @@ -395,7 +395,7 @@ 

        Deskriptory print(vect.length)

        Kompletní implementace je např. ve frameworku Pyramid jako pyramid.decorator.reify.

        Konstruktor -# +#

        Třídy v Pythonu můžou mít konstruktor – funkci, která se zavolá, aby vytvořila objekt daného typu. @@ -428,7 +428,7 @@

        Konstruktor print(Point(3, 4))

        Metatřídy -# +#

        Poslední věc, na kterou se podíváme, jsou metatřídy.

        Začneme zlehka: pokud při definici třídy zadáme nějakou funkci jako pojmenovaný @@ -557,7 +557,7 @@

        Konstruktor nebo SQLAlchemy), kdy chceme, aby pořadí sloupců tabulky odpovídalo tomu, jak jsou sloupce/atributy nadefinovány ve třídě.

        A další -# +#

        Další (bohužel?) oblíbený trik je vnuknutí magických schopností modulu.

        Naimportované moduly Python ukládá do slovníku sys.modules, aby při dalším @@ -588,7 +588,7 @@

        A další print(ANSWER)

        Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

        Úkol -# +#

        Úkol není!

        Budete-li chtít některé techniky z této lekce ve svém kódu (včetně semestrálky) použít, zamyslete se, jestli se problém nedá vyřešit jednodušeji, čitelněji, přehledněji, udržovatelněji. diff --git a/mi-pyt/micropython/index.html b/mi-pyt/micropython/index.html index 8c8b4620..431daba9 100644 --- a/mi-pyt/micropython/index.html +++ b/mi-pyt/micropython/index.html @@ -1,5 +1,5 @@

        MicroPython (na ESP8266/NodeMCU) -# +#

        (Tato lekce bohužel, na rozdíl od předchozích, nejde jen tak vyzkoušet z domu – je potřeba speciální hardware.)

        Dnes si ukážeme, jak lze Python použít na malých/vestavěných zařízeních.

        @@ -14,14 +14,14 @@

        MicroPython (na ESP8266/NodeMCU)

        Přichystejte si MicroUSB kabel. Pokud nemáte vlastní, několik jich můžeme zapůjčit.

        Obsah lekce vychází z tutoriálů pro PyLadies (a, b), na které se můžete podívat, pokud tu bude něco vysvětleno příliš rychle.

        Popis desky -# +#

        V posledních letech se dá za relativně málo peněz pořídit počítač dost „velký” na to, aby se na něm dal spustit MicroPython – speciální implementace Pythonu pro prostředí s omezenou pamětí. NodeMCU, které budeme používat my, obsahuje čip ESP8266, čip navržený jako ovladač WiFi k vestavěným systémům (např. k Arduinu). Kromě samotného čipu a flash paměti, které se skrývají v oplechované krabičce, je na desce převodník napětí z 5 V (USB) na 3,3 V a datový převodník z USB na sériový protokol a jednotlivé piny procesoru jsou vyvedeny na „nožičky” desky.

        V paměti je už nahraný firmware MicroPython; pojďme se k němu připojit.

        Drivery a připojení -# +#

        Postup připojení je jiný pro každý systém:

          @@ -38,7 +38,7 @@

          Drivery a připojení

          Kdyby byly pro Windows či Mac potřeba ovladače, dají se najít na stránkách výrobce.

          Po připojení stiskněte tlačítko RST na desce. Měla by se objevit hlavička a nakonec známý pythonní prompt >>>.

          MicroPython -# +#

          Implementace MicroPython se chová téměř stejně jako CPython. Vyzkoušejte si ale některé rozdíly (porovnejte výstup MicroPythonu a Pythonu 3 na počítači):

          >>> print
          @@ -53,7 +53,7 @@ 

          MicroPython >>> urandom(1)[0] 61

          Vstup a výstup -# +#

          Co má MicroPython navíc je přístup k hardwaru. Zkusme zjistit hodnotu pinu 0, který je na NodeMCU normálně HIGH (3,3 V) a je spojen se zemí přes tlačítko FLASH.

          @@ -72,7 +72,7 @@

          MicroPython Odpovídající si označení lze zjistit z taháku.

          Zkuste zajistit, aby dioda svítila, právě pokud je stisknuté tlačítko FLASH.

          Ovládání konzole -# +#

          Pravděpodobně jste si všimli, že konzole MicroPythonu automaticky odsazuje. To je pro malé programy pohodlné, ale umí to i znepříjemnit život – hlavně když chceme kód do konzole vložit.

          @@ -80,16 +80,16 @@

          Ovládání konzole Aktivuje se pomocí Ctrl+E a ukončuje se pomocí Ctrl+D.

          Existuje ale i nástroj jménem ampy, který umožňuje pustit předpřipravený skript. Instaluje se jako adafruit-ampy:

          -
          $ python -m pip install adafruit-ampy
          +
          $ python -m pip install adafruit-ampy
           

          Po nainstalování vypněte existující připojení k desce (picocom/screen/PuTTY), napište skript a spusťte ho pomocí příkazu run:

          -
          $ ampy -p PORT run script.py
          +
          $ ampy -p PORT run script.py
           

          Kde PORT je stejný port jako výše – např. /dev/ttyUSB0 na Linuxu, COM3 na Windows. Pro více informací můžete nepřekvapivě použít příkaz ampy --help.

          Od teď doporučuji psát kód vedle do editoru a spouštět jej pomocí ampy run.

          Zkuste pomocí funkce time.sleep (která v MicroPythonu k dispozici je) diodou blikat v pravidelných intervalech.

          Blikání -# +#

          Na pravidelné blikání, technicky řečeno pulzně-šířkovou modulaci (angl. Pulse Width Modulation) má MicroPython třídu PWM, které se dá nastavit frekvence (freq) v Hz a střída (duty) od 0 do 1024:

          @@ -102,7 +102,7 @@

          Blikání LED (střída určuje intenzitu světla), bzučáků (frekvence určuje výšku tónu), servomotorků (délka signálu určuje úhel otočení), atd.

          LED pásek WS2812 -# +#

          Na destičku se dá připojit spousta různých komponent. Jen je vždy potřeba ověřit v dokumentaci, že existuje knihovna pro daný protokol na MicroPython pro ESP8266. Časté protokoly jsou I2C, OneWire, či SPI.

          @@ -126,20 +126,20 @@

          LED pásek WS2812 np.write()

          Co znamenají čísla 0 a 255 na posledním řádku, jistě zjistíte experimentálně.

          Flashování -# +#

          Na našich destičkách je MicroPython už nahraný, ale kdybyste si koupili vlastní NodeMCU nebo chtěli firmware aktualizovat, budete ho potřebovat umět nahrát.

          K tomu je potřeba nástroj esptool, který se dá nainstalovat pomocí:

          -
          $ python -m pip install esptool
          +
          $ python -m pip install esptool
           

          Po instalaci esptool si stáhněte nejnovější stabilní firmware pro ESP8266 z micropython.org/download a zadejte:

          -
          $ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
          +
          $ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0 esp8266-20161110-v1.8.6.bin
           

          Hodnotu pro --port opět doplňte podle svého systému – např. /dev/tty.wchusbserial1420 na Macu, COM3 na Windows.

          Destiček s čipem ESP8266 se vyrábí celá řada různých typů a některé mohou potřebovat odlišné nastavení při flashování. Popis všech možností nastavení je k nalezení v dokumentaci k esptool.

          Je-li na desce nahraný MicroPython, tento příkaz by měl fungovat. U jiného firmware, (případně u poškozeného MicroPythonu), je potřeba při zapojování destičky do USB držet tlačítko FLASH.

          Souborový systém -# +#

          MicroPython pro ESP8266 obsahuje souborový systém nad flash pamětí, se kterým pracují standardní pythonní funkce jako open a os.listdir. @@ -148,9 +148,9 @@

          Souborový systém zařízení. Není ho pak potřeba připojovat k počítači – stačí powerbanka nebo 3,3V zdroj.

          Pro nahrání souborů do zařízení můžete použít příkaz ampy put:

          -
          $ ampy -p PORT put main.py
          +
          $ ampy -p PORT put main.py
           

          WebREPL -# +#

          ESP8266 byl původně navržen i jako čip pro WiFi a i s MicroPythonem se umí připojit k síti. Dokonce se přes WiFi dá i ovládat.

          @@ -188,7 +188,7 @@

          Souborový systém Měli byste dostat konzoli, jako přes USB. Pomocí WebREPL lze nejen zadávat interaktivní příkazy, ale i nahrávat soubory.

          Komunikace -# +#

          Pro komunikaci po síti můžete použít nízkoúrovňovou knihovnu socket, nebo protokol pro „internet of things“ (jako MQTT), ale diff --git a/mi-pyt/notebook/index.html b/mi-pyt/notebook/index.html index 268f9e59..7a0b01d4 100644 --- a/mi-pyt/notebook/index.html +++ b/mi-pyt/notebook/index.html @@ -2,7 +2,7 @@

          Jupyter Notebook -# +#

          Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

          Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -10,14 +10,14 @@

          Jupyter Notebook

          Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

          Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

          -
          $ python -m pip install --upgrade pip wheel
          -$ python -m pip install notebook
          +
          $ python -m pip install --upgrade pip wheel
          +$ python -m pip install notebook
           

          Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

          Nainstalovaný Notebook pusťte pomocí:

          -
          $ python -m notebook
          +
          $ python -m notebook
           

          V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

          Jak na Notebook -# +#

          Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

          Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

          @@ -116,5 +116,5 @@

          Jak na Notebook

          - + diff --git a/mi-pyt/numpy/index.html b/mi-pyt/numpy/index.html index 17fdf0c6..46cd5a2b 100644 --- a/mi-pyt/numpy/index.html +++ b/mi-pyt/numpy/index.html @@ -2,8 +2,8 @@

          Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky:

          -
          $ python -m pip install --upgrade pip
          -$ python -m pip install notebook numpy scipy imageio matplotlib pillow
          +
          $ python -m pip install --upgrade pip
          +$ python -m pip install notebook numpy scipy imageio matplotlib pillow
           
          @@ -32,7 +32,7 @@

          NumPy -# +#

          @@ -44,7 +44,7 @@

          NumPy

          Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

          Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

          Nejednoznačnost a zkratky -# +#

          Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. Na obojí se používají podobné nástroje. @@ -232,7 +232,7 @@

          Nejednoznačnost a zkratky

          Základní operace -# +#

          @@ -591,7 +591,7 @@

          Základní operace

          Indexování -# +#

          @@ -1251,7 +1251,7 @@

          Indexování

          Broadcasting a změny -# +#

          @@ -1719,7 +1719,7 @@

          Broadcasting a změny
          try:
               array /= 2
           except Exception as e:
          -    print("Chyba!!", type(e), e)
          +    print("Chyba!!", type(e), e)
           

        @@ -1749,7 +1749,7 @@

        Broadcasting a změny

        Tvoření matic, část 2 -# +#

        @@ -1953,7 +1953,7 @@

        Tvoření matic, část 2
        In [48]:
        -
        int_zeros = numpy.zeros((4, 4), dtype='int8')
        +
        int_zeros = numpy.zeros((4, 4), dtype='int8')
         print(int_zeros.dtype)
         int_zeros
         
        @@ -2123,7 +2123,7 @@

        Tvoření matic, část 2

        Reshape -# +#

        @@ -2421,7 +2421,7 @@

        Reshape

        Datové typy -# +#

        @@ -2544,7 +2544,7 @@

        Datové typy
        In [62]:
        -
        numpy.array([0, 1.3, "foobar"], dtype=object)
        +
        numpy.array([0, 1.3, "foobar"], dtype=object)
         
        @@ -2584,7 +2584,7 @@

        Datové typy
        In [63]:
        -
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
        +
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
         
        @@ -2624,7 +2624,7 @@

        Datové typy
        In [64]:
        -
        numpy.zeros(4, dtype='<I')
        +
        numpy.zeros(4, dtype='<I')
         
        @@ -2664,7 +2664,7 @@

        Datové typy
        In [65]:
        -
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
        +
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
         
        @@ -2697,7 +2697,7 @@

        Datové typy
        In [66]:
        -
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
        +
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
         
        @@ -2737,8 +2737,8 @@

        Datové typy
        In [67]:
        -
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
        -numpy.array([(1, 2, 'abc')] * 4, record_type)
        +
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
        +numpy.array([(1, 2, 'abc')] * 4, record_type)
         
        @@ -2771,7 +2771,7 @@

        Datové typy

        Maticové násobení -# +#

        @@ -2857,7 +2857,7 @@

        Maticové násobení

        Booleovské hodnoty polí -# +#

        @@ -2878,7 +2878,7 @@

        Booleovské hodnoty polí if numpy.eye(3): pass except ValueError as e: - print("Chyba!", type(e), e) + print("Chyba!", type(e), e)

        @@ -2917,11 +2917,11 @@

        Booleovské hodnoty polí
        if numpy.eye(3).any():
        -    print('Alespoň jeden prvek je nenulový')
        +    print('Alespoň jeden prvek je nenulový')
         if numpy.eye(3).all():
        -    print('Všechny prvky jsou nenulové')
        +    print('Všechny prvky jsou nenulové')
         if numpy.eye(3).size:
        -    print('Pole obsahuje nějaké prvky')
        +    print('Pole obsahuje nějaké prvky')
         
        @@ -2961,9 +2961,9 @@

        Booleovské hodnoty polí
        if numpy.ones((1, 1, 1, 1)):
        -    print('Ano')
        +    print('Ano')
         if numpy.zeros((1, 1, 1, 1)):
        -    print('Ne')
        +    print('Ne')
         
        @@ -2995,7 +2995,7 @@

        Booleovské hodnoty polí
        if numpy.ones((0, 0)):
        -    print('Ano')
        +    print('Ano')
         
        @@ -3025,7 +3025,7 @@

        Booleovské hodnoty polí

        Další operace -# +#

        @@ -3118,7 +3118,7 @@

        Další operace

        Příklady použití -# +#

        @@ -3134,7 +3134,7 @@

        Příklady použití

        Matematika a grafy -# +#

        @@ -3155,7 +3155,7 @@

        Matematika a grafy
        from matplotlib import pyplot
         
        -# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
        +# Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
         %matplotlib inline
         
        @@ -3293,9 +3293,9 @@

        Matematika a grafy from mpl_toolkits.mplot3d import Axes3D fig = pyplot.figure() -axes = fig.gca(projection='3d') +axes = fig.gca(projection='3d') -surf = axes.plot_surface(x, y, z, cmap='viridis') +surf = axes.plot_surface(x, y, z, cmap='viridis')

        @@ -3329,7 +3329,7 @@

        Matematika a grafy

        Obrázky -# +#

        @@ -3351,7 +3351,7 @@

        Obrázky
        import imageio
        -img = imageio.imread('static/python.jpg')
        +img = imageio.imread('static/python.jpg')
         img
         
        @@ -3545,7 +3545,7 @@

        Obrázky
        blue_channel = img[..., -1]
        -pyplot.imshow(blue_channel, cmap='gray')
        +pyplot.imshow(blue_channel, cmap='gray')
         
        @@ -3601,7 +3601,7 @@

        Obrázky
        In [83]:
        -
        secret = imageio.imread('static/secret.png', pilmode='L')
        +
        secret = imageio.imread('static/secret.png', pilmode='L')
         
         img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
         
        @@ -3678,7 +3678,7 @@

        Obrázky
        In [85]:
        -
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
        +
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
         
        @@ -3733,7 +3733,7 @@

        Obrázky
        In [86]:
        -
        imageio.imsave('python.png', img)
        +
        imageio.imsave('python.png', img)
         
        @@ -3745,7 +3745,7 @@

        Obrázky

        Zvuk -# +#

        @@ -3763,7 +3763,7 @@

        Zvuk
        import scipy.io.wavfile
        -sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
        +sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
         print(sample_rate)
         sound
         
        @@ -3880,7 +3880,7 @@

        Zvuk
        from IPython.display import Audio
         Audio(data=channel, rate=sample_rate)
        -print('(Zkuste si to sami; tento print vymažte)')
        +print('(Zkuste si to sami; tento print vymažte)')
         
        @@ -4013,7 +4013,7 @@

        Zvuk
        spectrum = numpy.fft.fft(segment)
         freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
        -pyplot.xlabel('Frekvence (Hz)')
        +pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs, numpy.abs(spectrum))
         
        @@ -4069,7 +4069,7 @@

        Zvuk
        In [93]:
        -
        pyplot.xlabel('Frekvence (Hz)')
        +
        pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
         
        @@ -4201,5 +4201,5 @@

        Zvuk

        - + diff --git a/mi-pyt/pandas/index.html b/mi-pyt/pandas/index.html index e80a8135..960dd862 100644 --- a/mi-pyt/pandas/index.html +++ b/mi-pyt/pandas/index.html @@ -3,8 +3,8 @@

        Na dnešní lekci si do virtuálního prostředí nainstalujte následující balíčky. Můžete použít prostředí z lekce o NumPy.

        -
        $ python -m pip install --upgrade pip
        -$ python -m pip install notebook pandas matplotlib
        +
        $ python -m pip install --upgrade pip
        +$ python -m pip install notebook pandas matplotlib
         

        Pro případ, že by vaše verze pip-u neuměla wheels nebo na PyPI nebyly příslušné wheel balíčky, je dobré mít na systému nainstalovaný překladač C a Fortranu (např. gcc, gcc-gfortran) a hlavičkové soubory Pythonu (např. python3-devel). Jestli je ale nemáte, zkuste instalaci přímo – wheels pro většinu operačních systémů existují – a až kdyby to nefungovalo, instalujte překladače a hlavičky.

        Mezitím co se instaluje, stáhněte si do adresáře static potřebné soubory: actors.csv a @@ -18,14 +18,14 @@

        Analýza dat v Pythonu -# +#

        Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

        Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

        Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

        Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

        Proces analýzy dat -# +#

        Práce datového analytika se většinou drží následujícího postupu:

          @@ -46,7 +46,7 @@

          Proces analýzy dat

        Pandas -# +#

        Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

        @@ -76,7 +76,7 @@

        Pandas

        Tabulky -# +#

        @@ -101,7 +101,7 @@

        Tabulky
        In [2]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -202,8 +202,8 @@

        Tabulky
        items = pandas.DataFrame([
        -    ["Book", 123],
        -    ["Computer", 2185],
        +    ["Book", 123],
        +    ["Computer", 2185],
         ])
         items
         
        @@ -278,8 +278,8 @@

        Tabulky
        items = pandas.DataFrame([
        -    {"name": "Book", "price": 123},
        -    {"name": "Computer", "price": 2185},
        +    {"name": "Book", "price": 123},
        +    {"name": "Computer", "price": 2185},
         ])
         items
         
        @@ -452,7 +452,7 @@

        Tabulky

        Sloupce -# +#

        @@ -469,7 +469,7 @@

        Sloupce
        In [7]:
        -
        birth_years = actors['birth']
        +
        birth_years = actors['birth']
         birth_years
         
        @@ -821,7 +821,7 @@

        Sloupce
        In [16]:
        -
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
        +
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
         
        @@ -867,7 +867,7 @@

        Sloupce
        In [17]:
        -
        actors['name'].str.upper()
        +
        actors['name'].str.upper()
         
        @@ -1083,11 +1083,11 @@

        Sloupce
        In [22]:
        -
        print('Součet: ', birth_years.sum())
        -print('Průměr: ', birth_years.mean())
        -print('Medián: ', birth_years.median())
        -print('Počet unikátních hodnot: ', birth_years.nunique())
        -print('Koeficient špičatosti: ', birth_years.kurtosis())
        +
        print('Součet: ', birth_years.sum())
        +print('Průměr: ', birth_years.mean())
        +print('Medián: ', birth_years.median())
        +print('Počet unikátních hodnot: ', birth_years.nunique())
        +print('Koeficient špičatosti: ', birth_years.kurtosis())
         
        @@ -1129,7 +1129,7 @@

        Sloupce
        In [23]:
        -
        actors['name'].apply(lambda x: ''.join(reversed(x)))
        +
        actors['name'].apply(lambda x: ''.join(reversed(x)))
         
        @@ -1168,7 +1168,7 @@

        Sloupce
        In [24]:
        -
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
        +
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
         
        @@ -1206,7 +1206,7 @@

        Sloupce

        Tabulky a vybírání prvků -# +#

        @@ -1223,7 +1223,7 @@

        Tabulky a vybírání prvků
        In [25]:
        -
        actors['name']  # Jméno sloupce
        +
        actors['name']  # Jméno sloupce
         
        @@ -1342,7 +1342,7 @@

        Tabulky a vybírání prvků
        In [27]:
        -
        actors[['name', 'alive']]  # Seznam sloupců
        +
        actors[['name', 'alive']]  # Seznam sloupců
         
        @@ -1435,7 +1435,7 @@

        Tabulky a vybírání prvků

        Indexer loc -# +#

        @@ -1594,7 +1594,7 @@

        Indexer loc
        In [30]:
        -
        actors.loc[2, 'birth']
        +
        actors.loc[2, 'birth']
         
        @@ -1634,7 +1634,7 @@

        Indexer loc
        In [31]:
        -
        actors.loc[2:4, 'birth':'alive']
        +
        actors.loc[2:4, 'birth':'alive']
         
        @@ -1711,7 +1711,7 @@

        Indexer loc
        In [32]:
        -
        actors.loc[2:4, 'name']
        +
        actors.loc[2:4, 'name']
         
        @@ -1747,7 +1747,7 @@

        Indexer loc
        In [33]:
        -
        actors.loc[2:4, 'name':'name']
        +
        actors.loc[2:4, 'name':'name']
         
        @@ -1820,7 +1820,7 @@

        Indexer loc
        In [34]:
        -
        actors.loc[:, 'alive']
        +
        actors.loc[:, 'alive']
         
        @@ -1866,7 +1866,7 @@

        Indexer loc
        In [35]:
        -
        actors.loc[:, ['name', 'alive']]
        +
        actors.loc[:, ['name', 'alive']]
         
        @@ -2030,7 +2030,7 @@

        Indexer loc

        Indexer iloc -# +#

        @@ -2378,7 +2378,7 @@

        Indexer iloc
        In [42]:
        -
        actors.iloc[-1].loc['name']
        +
        actors.iloc[-1].loc['name']
         
        @@ -2410,7 +2410,7 @@

        Indexer iloc

        Indexy -# +#

        @@ -2428,7 +2428,7 @@

        Indexy
        In [43]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -2601,7 +2601,7 @@

        Indexy
        In [46]:
        -
        actors.index = actors['name']
        +
        actors.index = actors['name']
         actors
         
        @@ -2839,7 +2839,7 @@

        Indexy
        In [49]:
        -
        actors.loc[['Eric', 'Graham']]
        +
        actors.loc[['Eric', 'Graham']]
         
        @@ -2920,7 +2920,7 @@

        Indexy
        In [50]:
        -
        actors.loc['Terry']
        +
        actors.loc['Terry']
         
        @@ -3002,7 +3002,7 @@

        Indexy
        In [51]:
        -
        indexed_actors = actors.set_index(['name', 'birth'])
        +
        indexed_actors = actors.set_index(['name', 'birth'])
         indexed_actors
         
        @@ -3141,7 +3141,7 @@

        Indexy
        In [53]:
        -
        indexed_actors.loc['Terry']
        +
        indexed_actors.loc['Terry']
         
        @@ -3207,7 +3207,7 @@

        Indexy
        In [54]:
        -
        indexed_actors.loc['Terry'].loc[1940]
        +
        indexed_actors.loc['Terry'].loc[1940]
         
        @@ -3241,7 +3241,7 @@

        Indexy
        In [55]:
        -
        indexed_actors.loc[('Terry', 1942)]
        +
        indexed_actors.loc[('Terry', 1942)]
         
        @@ -3371,8 +3371,8 @@

        Indexy
        In [57]:
        -
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
        -                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
        +
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
        +                           index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
         last_names
         
        @@ -3409,7 +3409,7 @@

        Indexy
        In [58]:
        -
        indexed_actors['last_name'] = last_names
        +
        indexed_actors['last_name'] = last_names
         indexed_actors
         
        @@ -3506,7 +3506,7 @@

        Indexy

        NaN neboli NULL či N/A -# +#

        @@ -3523,7 +3523,7 @@

        NaN neboli NULL či N/A
        In [59]:
        -
        '(' + indexed_actors['last_name'] + ')'
        +
        '(' + indexed_actors['last_name'] + ')'
         
        @@ -3570,7 +3570,7 @@

        NaN neboli NULL či N/A
        In [60]:
        -
        indexed_actors['last_name'].isnull()
        +
        indexed_actors['last_name'].isnull()
         
        @@ -3617,7 +3617,7 @@

        NaN neboli NULL či N/A
        In [61]:
        -
        indexed_actors.fillna('')
        +
        indexed_actors.fillna('')
         
        @@ -3800,7 +3800,7 @@

        NaN neboli NULL či N/A

        Merge -# +#

        Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

        @@ -3811,7 +3811,7 @@

        Merge
        In [63]:
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        @@ -3904,7 +3904,7 @@

        Merge
        In [64]:
        -
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
        +
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
         spouses
         
        @@ -4168,7 +4168,7 @@

        Merge

        Přesýpání dat -# +#

        @@ -4190,9 +4190,9 @@

        Přesýpání dat import random random.seed(0) -months = pandas.date_range('2015-01', '2016-12', freq='M') -categories = ['Electronics', 'Power Tools', 'Clothing'] -data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)} +months = pandas.date_range('2015-01', '2016-12', freq='M') +categories = ['Electronics', 'Power Tools', 'Clothing'] +data = pandas.DataFrame([{'month': a, 'category': b, 'sales': random.randint(-1000, 10000)} for a, b in itertools.product(months, categories) if random.randrange(20) > 0])

        @@ -4335,7 +4335,7 @@

        Přesýpání dat
        In [69]:
        -
        data['sales'].describe()
        +
        data['sales'].describe()
         
        @@ -4383,7 +4383,7 @@

        Přesýpání dat
        In [70]:
        -
        indexed = data.set_index(['category', 'month'])
        +
        indexed = data.set_index(['category', 'month'])
         indexed.head()
         
        @@ -4477,7 +4477,7 @@

        Přesýpání dat
        In [71]:
        -
        unstacked = indexed.unstack('month')
        +
        unstacked = indexed.unstack('month')
         unstacked
         
        @@ -4839,7 +4839,7 @@

        Přesýpání dat
        In [73]:
        -
        unstacked.loc['Electronics'].sum()
        +
        unstacked.loc['Electronics'].sum()
         
        @@ -4879,7 +4879,7 @@

        Přesýpání dat
        In [74]:
        -
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
        +
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
         
        @@ -4960,7 +4960,7 @@

        Přesýpání dat
        In [75]:
        -
        unstacked.loc['Clothing']
        +
        unstacked.loc['Clothing']
         
        @@ -5023,7 +5023,7 @@

        Přesýpání dat

        Grafy -# +#

        @@ -5064,7 +5064,7 @@

        Grafy
        In [77]:
        -
        unstacked.loc['Clothing'].dropna().plot()
        +
        unstacked.loc['Clothing'].dropna().plot()
         
        @@ -5888,7 +5888,7 @@

        Grafy
        # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
        -unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
        +unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
         
        @@ -6048,7 +6048,7 @@

        Grafy

        Groupby -# +#

        Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

        @@ -6152,7 +6152,7 @@

        Groupby
        In [81]:
        -
        data.groupby('category')
        +
        data.groupby('category')
         
        @@ -6192,7 +6192,7 @@

        Groupby
        In [82]:
        -
        data.groupby('category').sum()
        +
        data.groupby('category').sum()
         
        @@ -6269,7 +6269,7 @@

        Groupby
        In [83]:
        -
        data.groupby('category').count()
        +
        data.groupby('category').count()
         
        @@ -6351,7 +6351,7 @@

        Groupby
        In [84]:
        -
        data.groupby(['category', 'month']).sum().head()
        +
        data.groupby(['category', 'month']).sum().head()
         
        @@ -6439,7 +6439,7 @@

        Groupby
        In [85]:
        -
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
        +
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
         
        @@ -6535,7 +6535,7 @@

        Groupby
        In [86]:
        -
        g = data.groupby('month')
        +
        g = data.groupby('month')
         g.describe()
         
        @@ -6873,8 +6873,8 @@

        Groupby
        bin_size = 10000
        -by_month = data.groupby('month').sum()
        -by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
        +by_month = data.groupby('month').sum()
        +by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
         by_thousands
         
        @@ -6954,7 +6954,7 @@

        Groupby
        In [88]:
        -
        by_thousands[('sales', 'sum')].plot()
        +
        by_thousands[('sales', 'sum')].plot()
         
        @@ -7238,5 +7238,5 @@

        Groupby

        - + diff --git a/mi-pyt/pyqt/index.html b/mi-pyt/pyqt/index.html index 7b0d76d7..1238638c 100644 --- a/mi-pyt/pyqt/index.html +++ b/mi-pyt/pyqt/index.html @@ -1,46 +1,46 @@

        GUI v Pythonu: PyQt5 -# +#

        Způsobů, jak dělat v Pythonu aplikace s GUI, je mnoho. Dá se použít zabudovaný, ale ošklivý Tkinter, nebo nějaký externí framework.

        V tomto cvičení budeme používat framework Qt, protože je multiplatformní, používá se i v jiných oblastech, než je Python, je dostatečně robustní a dá se na většinu systémů nainstalovat bez větších problémů.

        Pomocí aplikace Qt Designer se dá navíc základní kostra GUI poměrně jednoduše naklikat, takže není nutné psát layout aplikace v kódu.

        Instalace -# +#

        Na tomto cvičení budete potřebovat balíček PyQt5 a aplikaci Qt5 Designer. Pokud budete používat svůj počítač, prosíme vás o instalaci již předem, na cvičení toho bude opravdu hodně a nemůžeme si dovolit plýtvat časem.

        PyQt5 -# +#

        Pokud máte Python alespoň 3.5 a jednu z platforem, pro které je připraven wheel na PyPI, stačí udělat:

        -
        (__venv__) $ python -m pip install --upgrade pip
        -(__venv__) $ python -m pip install PyQt5
        +
        (__venv__) $ python -m pip install --upgrade pip
        +(__venv__) $ python -m pip install PyQt5
         

        Pro starší verzi Pythonu nebo 32bitový Linux to ale nebude fungovat. V takovém případě můžete PyQt5 zkusit najít v balíčkovacím systému vaší distribuce (např. balíček python3-qt5 ve Fedoře nebo python3-pyqt5 v Debianu). Virtualenv pak může vytvořit s přepínačem --system-site-packages, který zajistí, že i z virtualenvu uvidíte PyQt5 nainstalované z distribučního balíčku.

        -
        $ python3 -m venv --system-site-packages __venv__
        +
        $ python3 -m venv --system-site-packages __venv__
         

        Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů (návod).

        První aplikace níže by vám měla fungovat.

        Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

        Qt5 Designer -# +#

        Na Linuxu najdete Qt5 Designer v balíčkách, třeba qt5-designer na Fedoře nebo qttools5-dev-tools na Debianu.

        Na Windows (i na Macu) si můžete stáhnout instalátor Qt 5, který (doufáme) nainstaluje i Designer.

        Pokud používáte na Macu homebrew, můžete to udělat i takto:

        -
        $ brew install qt5
        -$ brew linkapps qt5
        +
        $ brew install qt5
        +$ brew linkapps qt5
         

        Existují i Python wheely pyqt5-tools pro Windows obsahující Qt5 Designer. Ten je pak potřeba pro spuštění dohledat v nainstalované lokaci.

        NumPy -# +#

        Do virtuálního prostředí s PyQt5 si nainstalujte i NumPy:

        -
        $ python -m pip install numpy
        +
        $ python -m pip install numpy
         

        První aplikace -# +#

        Napište si první aplikaci, ať vidíte, jak kód v PyQt vypadá. Detaily toho, jak to funguje, si ukážeme později.

        @@ -56,7 +56,7 @@

        NumPy app.exec()

        O Qt, PyQt a PySide -# +#

        Qt je aplikační framework napsaný v C++, který zjednodušuje psaní multiplatformních aplikací (od počítačů s Linuxem, Mac OS či Windows po různá vestavěná zařízení).

        PyQt je knihovna, která umožňuje použít Qt z Pythonu. @@ -64,7 +64,7 @@

        NumPy Tedy: kdokoliv, kdo dostane kopii programu, musí mít možnost dostat odpovídající zdrojový kód a má možnost tento kód dál šířit pod stejnou licencí.

        Pokud by se vám tato licence nelíbila, je možnost použít PySide, které má permisivnější licenci a téměř stejné API jako PyQt, ale není tak stabilní.

        Moduly Qt -# +#

        Qt je rozděleno na několik tzv. modulů. Pro grafická uživatelská rozhraní (GUI), kterými se budeme zabývat, použijeme hlavně QtGui a QtWidgets.

        @@ -73,12 +73,12 @@

        Moduly Qt

        Další moduly jsou nadstavby od vykreslování SVG nebo práci s multimédii (které se můžou hodit) po třeba práci s SQL a XML nebo síťovou komunikaci, kde je pro Python pohodlnější použít jiné knihovny.

        Specifika PyQt -# +#

        Ačkoli se Qt dá použít z Pythonu, bohužel zjistíte, že ne všechno funguje a vypadá tak, jako kdyby to byla knihovna od základů napsaná pro Python. Tady jsou některé zvláštnosti, na které se můžete připravit.

        Jména a dokumentace -# +#

        Qt pojmenovává funkce, metody a atributy konvencí camelCase, místo pythonistického snake_case. PyQt tuto konvenci nemění: je užitečnější používat identická jména, a kromě toho knihovna PyQt vznikla ještě před PEP 8.

        @@ -90,13 +90,13 @@

        Jména a dokumentace

        Rozdíly mezi C a pythonní verzí jsou většinou intuitivní (např. None místo NULL), ale jsou popsány v dokumentaci PyQt.

        Atributy -# +#

        Qt zásadně používá pro přístup k atributům objektů funkce. Funkce pro čtení se typicky jmenuje podle atributu, funkce pro nastavení má předponu set. Namísto pythonního c = obj.color a obj.color = ... tedy použijeme c = obj.color() a obj.setColor(...).

        Správa paměti -# +#

        Python a C++/Qt mají, bohužel, rozdílný přístup ke správě paměti. Python používá reference counting a garbage collection. @@ -113,7 +113,7 @@

        Správa paměti a CPython C API (z minula) vám v tom pomůžou. Doporučujeme dělat malé commity a psát jednoduchý kód.

        Smyčka událostí, signály a sloty -# +#

        Qt funguje na principu smyčky událostí (event loop). Metoda QApplication.exec obsahuje v podstatě nekonečnou smyčku, která čeká na externí události (klik myši, @@ -153,7 +153,7 @@

        Smyčka událostí, signály a sloty app.exec()

        Skládání GUI -# +#

        Základní způsob, jak v Qt vytvářet grafické rozhraní, je skládání funkčních prvků (widgets) do hierarchie oken, skupin a panelů.

        @@ -197,7 +197,7 @@

        Smyčka událostí, signály a sloty programy stačí „poskládat“ z nich a napojit je na logiku. Pro složitější programy jsou pak možnosti, jak si widgety přizpůsobit.

        Qt Designer -# +#

        Na tomto cvičení si připravíme aplikaci pro editaci dlaždicových map (tile maps) – obrázků složených z omezené nabídky čtverečků („dlaždic“), @@ -251,7 +251,7 @@

        Qt Designer main()

        Vlastní widget - Grid -# +#

        Qt neobsahuje předpřipravený widget na dlaždicové mapy. Musíme si tedy vyrobit vlastní.

        Mapu budeme reprezentovat jako NumPy matici (viz lekce o NumPy). @@ -351,7 +351,7 @@

        Qt Designer painter.fillRect(rect, QtGui.QBrush(color))

        Nyní by již mapa měla být v okně vidět barevně.

        Obrázky -# +#

        Protože barvičky jsou příliš nudné, přidáme do mapového widgetu obrázky.

        Veškerou, ke cvičení i k úkolu potřebnou, grafiku najdete na GitHubu. @@ -382,7 +382,7 @@

        Obrázky if self.array[row, column] < 0: SVG_WALL.render(painter, rect)

        Model/View -# +#

        Nyní trochu odbočíme a povíme si krátce o dalším podsystému Qt: o modelech.

        Qt obsahuje framework, který mapuje informace do podoby tabulek, seznamů nebo obecných stromů. @@ -399,7 +399,7 @@

        Obrázky Tyto modely je složitější napojit na existující aplikační logiku, ale pro většinu účelů postačí.

        O obecných modelech si můžete přečíst v dokumentaci.

        QListWidget - Paleta -# +#

        Jeden z widgetů se zabudovaným modelem je QListWidget, který umí spravovat a zobrazovat nějaký seznam. @@ -429,7 +429,7 @@

        QListWidget - Paleta ... def item_activated(): - """Tato funkce se zavolá, když uživatel zvolí položku""" + """Tato funkce se zavolá, když uživatel zvolí položku""" # Položek může obecně být vybráno víc, ale v našem seznamu je to # zakázáno (v Designeru selectionMode=SingleSelection). @@ -463,7 +463,7 @@

        QListWidget - Paleta for item in palette.selectedItems(): grid.selected = item.data(VALUE_ROLE)

        Klikání do gridu -# +#

        Nyní nezbývá nic jiného, než pomocí klikání nanášet zvolené dílky do mapy. K tomu opět použijeme událost, tentokrát událost kliknutí, tedy mousePressEvent.

        @@ -488,7 +488,7 @@

        QListWidget - Paleta
        # Za přidáním položek do palety a napojení signálu
         palette.setCurrentRow(1)
         

        Více tlačítek myši -# +#

        Můžete si vyzkoušet, že se mapa mění při použití jakéhokoliv tlačítka myši. Je to proto, že mousePressEvent se stane, kdykoli na widgetu stiskneme libovolné tlačítko. @@ -502,7 +502,7 @@

        QListWidget - Paleta
                    elif event.button() == QtCore.Qt.RightButton:
                         self.array[row, column] = 0
         

        Tažení myši -# +#

        Pro splnění úkolu bude stačit objekty mazat a klást pomocí klikání na jednotlivá políčka. Pokud však chcete poskytnout uživateli větší komfort, prozkoumejte další události @@ -513,7 +513,7 @@

        QListWidget - Paleta jen jednu poslední. Jednotlivé body můžete spojit čárou pomocí knihovny bresenham.)

        Naše aplikace bude umět vytvořit novou, prázdnou mapu. Ukážeme si, jak vytvořit modální dialog pro volby (šířka a výška nové mapy). @@ -597,7 +597,7 @@

        Třída pro GUI aplikace -# +#

        Funkce main se nám pomalu rozrůstá a další funkce, které volá, musí být buď definované v ní (jako item_activated) nebo musí brát relativně hodně argumentů (jako new_dialog). diff --git a/mi-pyt/requests/index.html b/mi-pyt/requests/index.html index e2ad18b4..5c8180a9 100644 --- a/mi-pyt/requests/index.html +++ b/mi-pyt/requests/index.html @@ -1,5 +1,5 @@

        Requests -# +#

        Knihoven pro HTTP klienty (tedy “programy, které stahují webové stránky“) je celá řada. @@ -16,7 +16,7 @@

        Requests client interface. Zaměříme se tedy na Requests hned od začátku.

        Knihovna Requests se instaluje standardním způsobem:

        -
        $ python -m pip install requests
        +
        $ python -m pip install requests
         

        Budeme předpokládat, že znáte alespoň základy HTTP protokolu, a vrhneme se rovnou na příklad.

        Pokud základy neznáte, můžete se podívat na @@ -44,7 +44,7 @@

        Requests Pokud na GitHub používáte dvoufaktorovou autentizaci, příklad nebude fungovat.

        Příklady použití pro další HTTP metody najdete v dokumentaci.

        Použití session -# +#

        Hlavně v budoucnu se nám bude hodit použití tzv. session.

        @@ -66,7 +66,7 @@

        Použití session >>> r.json() {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Cookie': 'mipyt=best', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.19.1', 'X-Test': 'true', 'X-Test2': 'true'}}

        GitHub API -# +#

        Podíváme se teď, podobně jako v úvodním příkladu, na GitHub API, které má poměrně jednoduchou autentizaci (od GitHubu přímo @@ -131,13 +131,13 @@

        Použití session My ale věříme, že ji odebrat nechcete :)

        Dokumentace ke GitHub API.

        Chraňte své tokeny -# +#

        Když ukládáte skript do gitu, mějte na paměti, že tokeny a klíče do něj nikdy nepatří. Můžete je uložit do konfiguračního souboru, který bude gitem ignorován, například takhle:

        -
        [github]
        -token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
        +
        [github]
        +token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
         

        A následně konfiguraci načtete pomocí modulu configparser:

        >>> import configparser
        diff --git a/mi-pyt/testing/index.1.html b/mi-pyt/testing/index.1.html
        index 68605d62..e60305ce 100644
        --- a/mi-pyt/testing/index.1.html
        +++ b/mi-pyt/testing/index.1.html
        @@ -1,5 +1,5 @@
         

        Testování -# +#

        V tomto cvičení se budeme zabývat automatickým testováním kódu. Modul unittest ze standardní knihovny už byste měli znát, @@ -11,7 +11,7 @@

        Testování

        Pokud si chcete přečíst krátký text o tom, jak testovat, zkuste blogový zápisek Michala Hořejška.

        pytest -# +#

        Rovnou se podíváme na velmi oblíbený balíček pytest, který oproti standardnímu unittestu přináší mnoho výhod. Začneme jednoduchou ukázkou z modulu isholiday @@ -19,13 +19,13 @@

        pytest
        import isholiday
         
         def test_xmas_2016():
        -    """Test whether there is Christmas in 2016"""
        +    """Test whether there is Christmas in 2016"""
             holidays = isholiday.getholidays(2016)
             assert (24, 12) in holidays
         

        Test uložíme někam do projektu, třeba do souboru tests/test_holidays.py a nainstalujeme a spustíme pytest:

        -
        (__venv__) $ python -m pip install pytest
        -(__venv__) $ python -m pytest tests/test_holidays.py
        +
        (__venv__) $ python -m pip install pytest
        +(__venv__) $ python -m pytest tests/test_holidays.py
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
         rootdir: /tmp/tmp.etepchwQWh, inifile:
        @@ -58,7 +58,7 @@ 

        pytest

        Pytest upravuje chování assertu, což oceníte především, pokud test selže:

            ...
             assert (23, 12) in holidays
        -
        (__venv__) $ python -m pytest tests/test_holidays.py
        +
        (__venv__) $ python -m pytest tests/test_holidays.py
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
         rootdir: /tmp/tmp.etepchwQWh, inifile:
        @@ -89,7 +89,7 @@ 

        pytest f()

        Více o základním použití pytestu najdete v dokumentaci.

        Parametrické testy -# +#

        Jednou z vlastností pytestu, která často přichází vhod, jsou parametrické testy. Pokud bychom například chtěli otestovat, jestli je Štědrý den svátkem nejen @@ -103,7 +103,7 @@

        Parametrické testy @pytest.mark.parametrize('year', (2015, 2016, 2017, 2033, 2048)) def test_xmas(year): - """Test whether there is Christmas""" + """Test whether there is Christmas""" holidays = isholiday.getholidays(year) assert (24, 12) in holidays

        Zápis je určitým způsobem podobný knihovně click: funkce @@ -112,7 +112,7 @@

        Parametrické testy jakýkoliv objekt, přes který jde iterovat, tedy kromě v ukázce použité n-tice např. seznam, množinu, range, vlastní generátor...

        Pro podrobnější výpis výsledku testů můžete použít přepínač -v:

        -
        (__venv__) $ python -m pytest -v
        +
        (__venv__) $ python -m pytest -v
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 -- /tmp/tmp.etepchwQWh/__venv__/bin/python
         cachedir: .pytest_cache
        @@ -145,7 +145,7 @@ 

        Parametrické testy (2048, 7, 6)], ) def test_some_holidays(year, month, day): - """Test a few sample holidays""" + """Test a few sample holidays""" holidays = isholiday.getholidays(year) assert (day, month) in holidays

        Vždy je dobré pokusit se nějaký test rozbít v samotném kódu, který testujeme, @@ -193,7 +193,7 @@

        Parametrické testy tests/test_holidays.py:8: AssertionError ====================== 2 failed, 3 passed in 0.03 seconds ======================

        Fixtures -# +#

        Často se stává, že před samotným testem potřebujte spustit nějaký kus kódu, abyste získali to, co teprve chcete testovat. Příkladem může být například @@ -264,7 +264,7 @@

        Parametrické testy Hledáte-li příklady krok za krokem, zkuste příspěvek ze sborníku konference PyCon PL.

        „Podvádění“ -# +#

        Při psaní testů se občas hodí trochu podvádět. Například když nechceme, aby testy měly nějaký vedlejší účinek, když chceme testovat něco, co závisí na @@ -273,7 +273,7 @@

        „Podvádění“

        * mocking je jen jeden druh podvádění, ale obecně se dá tento název použít pro funkcionalitu knihoven, které mají v názvu mock :)

        Falešné objekty (fakes) -# +#

        Při testování často potřebujeme nějaký objekt, který má určité atributy a metody. Vytvářet si pro každý takový objekt třídu může být ubíjející:

        @@ -288,7 +288,7 @@

        Falešné objekty (fakes) model='MIG-21', fly=lambda: None)

        Částečně upravené objekty, třídy, moduly (stubs) -# +#

        Stejně tak můžete vzít i nějaký existující objekt nebo třídu a upravit jen část atributů nebo metod:

        @@ -314,14 +314,14 @@

        Falešné objekty (fakes) ... ['fake content']

        Očekávání (mocks, spies) -# +#

        Pomocí flexmocku můžete zároveň kontrolovat, že se vaší implementaci něco zavolalo, a to dvojím způsobem: buďto zároveň změníte výsledek funkce (mocks), nebo jen sledujete, jestli se zavolala (spies). (Příklady na odkazu.)

        Integrace s pytestem -# +#

        Dobrá mockovací knihovna se stará o to, aby platnost vašich změn byla omezená kontextem jedné funkce a tedy jednoho testu. Implementovat vlastní test double @@ -330,7 +330,7 @@

        Integrace s pytestem můžete využít zabudovanou pytest fixturu monkeypatch.

        Varování -# +#

        Podvádění při testech občas vypadá nevyhnutelně. Pokud například vaše funkce čte soubor /etc/passwd a vy chcete testovat, že se zachová správně, pokud @@ -348,7 +348,7 @@

        Varování z konference PyCon CZ 2017. V přednášce se věnuji různým způsobům podvádění při psaní testů.

        Testování HTTP komunikace: betamax -# +#

        Vaše programy často používají webová API. Při testování funkcionality API klientů se vynoří řada problémů:

        @@ -405,7 +405,7 @@

        Varování def client(betamax_session): return Client(session=betamax_session)

        Citlivé údaje -# +#

        Při práci s webovými API často létají vzduchem citlivé údaje jako tokeny apod.

        Vyvstávají dvě otázky:

        @@ -440,7 +440,7 @@

        Varování

        V každém případě je moudré před uložením do gitu zkontrolovat, že se v kazetách nenachází žádný citlivý údaj, a pokud tam je, přepsat kód tak, aby se tam nenacházel.

        Komprimované citlivé údaje -# +#

        Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní @@ -452,7 +452,7 @@

        Komprimované citlivé údaje nijak transformována, více viz Wikipedia a specifikace HTTP)

        Které HTTP požadavky jsou stejné? -# +#

        Podle čeho se vyhodnotí, že HTTP požadavek odpovídá nahrané interakci a má se pouze přehrát? Ve výchozím stavu podle HTTP metody a URL. @@ -465,7 +465,7 @@

        Komprimované citlivé údaje z konference PyCon CZ 2016. V přednášce se věnuji různým způsobům, jak testovat webové API klienty v Pythonu.

        Testování aplikací ve Flasku -# +#

        Pro testování aplikací ve Flasku se používá app.test_client():

        @@ -484,7 +484,7 @@

        Komprimované citlivé údaje Proto nelze použít přímo response.text; text dostaneme pomocí response.get_data(as_text=True).

        Testování aplikací v clicku -# +#

        Podobně funguje testování aplikací v clicku. Click obsahuje třídu CliRunner, která pomáhá s testováním:

        @@ -496,7 +496,7 @@

        Testování aplikací v clicku assert result.exit_code == 0 assert 'forced update' in result.output

        Kam dát testy? -# +#

        Dokumentace pytestu uvádí dvě možnosti, kam dát adresář s testy. Buď vedle adresáře s modulem:

        @@ -526,7 +526,7 @@

        Testování aplikací v clicku

        Případné soubory potřebné k testování bývá zvykem dávat do složky fixtures ve složce s testy.

        Spouštění testů pomocí setup.py test -# +#

        Standardně se testy v Pythonu nespouští pomocí python -m pytest, ale python setup.py test, což funguje i s jinými nástroji než je pytest. @@ -549,7 +549,7 @@

        Spouštění testů pomocí Na to uživatel spustí pytest samotný.

        Další informace jsou v dokumentaci pytestu.

        Travis CI -# +#

        Vaše testy nemusí běžet jen u vás na počítači, ale můžete je pouštět automaticky na službě Travis CI při každém pushnutí na GitHub.

        @@ -560,38 +560,38 @@

        Travis CI Pak opět vpravo nahoře zvolte Accounts a povolte Travis pro váš repozitář.

        Do repozitáře přidejte soubor .travis.yml:

        -
        language: python
        -python:
        -- '3.6'
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.6'
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Uvedený příklad je pro Python 3.6. Pro Python 3.7 je třeba nastavit novější verzi Ubuntu:

        -
        language: python
        -python:
        -- '3.7'
        -dist: xenial
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.7'
        +dist: xenial
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Verze Pythonu lze kombinovat:

        -
        language: python
        -python:
        -- '3.6'
        -- '3.7'
        -dist: xenial
        -install:
        -- python setup.py install
        -script:
        -- python setup.py test
        +
        language: python
        +python:
        +- '3.6'
        +- '3.7'
        +dist: xenial
        +install:
        +- python setup.py install
        +script:
        +- python setup.py test
         

        Po pushnutí by se na Travisu měl automaticky spustit test. Více informací o použití pro Python najdete v dokumentaci.

        Kvíz -# +#

        Co je špatně na této testovací sadě k funkci is_even()?

        def is_even(n):
        diff --git a/mi-pyt/testing/index.html b/mi-pyt/testing/index.html
        index f0c3baf6..5a99557a 100644
        --- a/mi-pyt/testing/index.html
        +++ b/mi-pyt/testing/index.html
        @@ -1,5 +1,5 @@
         

        Testování -# +#

        Programátorská práce nespočívá jen v tom, program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. @@ -18,7 +18,7 @@

        Testování Když v otestovaném kódu v budoucnu uděláš nějakou změnu, testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

        Instalace knihovny pytest -# +#

        Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. @@ -48,7 +48,7 @@

        Instalace knihovny pytest Dej si proto pozor a ve jménu pytest neudělej překlep!

        Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

        -

        (venv)$ python -m pip install pytest
        +
        (venv)$ python -m pip install pytest
         

        Co ten příkaz znamená?

        python -m pip zavolá Python s tím, že má pustit modul pip. Tento modul umí instalovat nebo @@ -67,7 +67,7 @@

        Instalace knihovny pytest Program se ale bez příkazu python může spustit v jiném Pythonu, než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

        Psaní testů -# +#

        Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst @@ -78,11 +78,11 @@

        Instalace knihovny pytest že jména jak souborů s testy tak samotných testovacích funkcí začínají na test_.

        def secti(a, b):
        -    """Vrátí součet dvou čísel"""
        +    """Vrátí součet dvou čísel"""
             return a + b
         
         def test_secti():
        -    """Otestuje funkci secti"""
        +    """Otestuje funkci secti"""
             assert secti(1, 2) == 3
         

        Co se v té testovací funkci děje?

        Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, @@ -94,14 +94,14 @@

        Instalace knihovny pytest V „normálním” kódu se assert může chovat trochu jinak než výše, ale do toho teď nebudeme zabředávat.

        Spouštění testů -# +#

        Testy se spouští zadáním příkazu python -m pytest -v následovaným názvem souboru s testy. Tedy v překladu: Pythone, pusť modul pytest, v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

        -
        $ python -m pytest -v test_secteni.py
        +
        $ python -m pytest -v test_secteni.py
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
         cachedir: .pytest_cache
        @@ -124,7 +124,7 @@ 

        Instalace knihovny pytest

        Zkus si změnit funkci secti (nebo její test) a podívat se, jak to vypadá když test „neprojde“.

        Testovací moduly -# +#

        Testy se většinou nepíšou přímo ke kódu, ale do souboru vedle. diff --git a/mi-pyt/venv-setup/index.html b/mi-pyt/venv-setup/index.html index 718d9497..d6e6a975 100644 --- a/mi-pyt/venv-setup/index.html +++ b/mi-pyt/venv-setup/index.html @@ -1,5 +1,5 @@

        Nastavení prostředí -# +#

        V této sekci si:

          @@ -8,7 +8,7 @@

          Nastavení prostředí
        • aktivuješ virtuální prostředí.

        Příprava adresáře -# +#

        Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů počítače jim záleží na tom, kde jsou ty soubory uložené.

        @@ -29,7 +29,7 @@

        Příprava adresáře Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

        Adresář pro každou lekci -# +#

        Nový adresář je zatím prázdný. To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější @@ -42,12 +42,12 @@

        Adresář pro každou lekci

        Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

        Přepnutí -# +#

        Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

        -
        $ cd naucse-python
        +
        $ cd naucse-python
         

        Pak zkontroluj, že jsi na správném místě:

        • Pomocí příkazu pwd (na Windows cd) zkontroluj, @@ -70,7 +70,7 @@

          Windows

          > <
            Directory of C:\Users\Helena\naucse-python
           05/08/2014 07:28 PM <DIR>  00
           

        Virtuální prostředí -# +#

        Teď si vytvoříš virtuální prostředí pro Python.

        Virtuální prostředí je něco, co zajistí že se všechny počítače budou @@ -90,12 +90,12 @@

        Windows

        > <
          příkazů.
          Bude je rychlejší vyzkoušet než popsat kdy je který správný,
          takže nejdřív zkus:

        -
         $ python3 -m venv venv
        +
         $ python3 -m venv venv
         

        A jestli dostaneš chybu No module named venv, zkus místo toho:

        -
         $ virtualenv -p python3 venv
        +
         $ virtualenv -p python3 venv
         
      • macOS:

        -
         $ python3 -m venv venv
        +
         $ python3 -m venv venv
         
      • Windows:

        Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících @@ -122,11 +122,11 @@

        Windows

        > <
         
      • V grafickém prohlížeči souborů to vypadá např. takto:

        (adresáře '00' a 'venv' vedle sebe)

        Aktivace virtuálního prostředí -# +#

        Nakonec virtuální prostředí aktivuj:

        -

        Unix

        $ source venv/bin/activate
        +                

        Unix

        $ source venv/bin/activate
         

        Windows

        > venv\Scripts\activate
         

        Jestli používáš příkazovou řádku ve Visual Studio Code, diff --git a/pyladies/and-or/index.html b/pyladies/and-or/index.html index f0c11d99..8b3c36b9 100644 --- a/pyladies/and-or/index.html +++ b/pyladies/and-or/index.html @@ -1,5 +1,5 @@

        Nebo anebo a -# +#

        Vzpomínáš na tabulku operátorů z lekce o Porovnávání? @@ -47,7 +47,7 @@

        Nebo anebo a A to moc smyslu nedává. (Kdy „platí“ celé číslo?)

        Šťastná/Bohatá -# +#

        Pro příklad použijeme and ve vylepšeném programu, který rozdává nejapné rady do života. diff --git a/pyladies/asteroids/index.html b/pyladies/asteroids/index.html index 3fd34f07..1bbd9eb5 100644 --- a/pyladies/asteroids/index.html +++ b/pyladies/asteroids/index.html @@ -1,5 +1,5 @@

        Hra typu Asteroids -# +#

        Dnes to všechno – třídy, grafiku, seznamy, a tak dále – spojíme dohromady do závěrečného projektu. @@ -18,7 +18,7 @@

        Hra typu Asteroids Kdyby se to stalo, prosím, ozvi se nám! Rádi ti s projektem pomůžeme.

        Vesmírná loď -# +#

        První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesnicí.

          @@ -143,7 +143,7 @@

          Hra typu Asteroids Čas to všechno dát do Gitu!

          Projdi si předchozí body, jestli máš opravdu všechno, a můžeš pokračovat dál!

          Asteroidy -# +#

          Přidej druhý typ vesmírného objektu: Asteroid.

            @@ -178,7 +178,7 @@

            Asteroidy

            Zase si projdi, jestli máš všechno hotové, a jdeme na další část!

            Kolize -# +#

            Naše asteroidy jsou zatím docela neškodné. Pojďme to změnit.

              @@ -216,14 +216,14 @@

              Kolize objekty které vyletí ven vrací na druhé straně, není úplně přímočaré, takže si příslušný kód pro teď jen zkopíruj:

              def distance(a, b, wrap_size):
              -    """Distance in one direction (x or y)"""
              +    """Distance in one direction (x or y)"""
                   result = abs(a - b)
                   if result > wrap_size / 2:
                       result = wrap_size - result
                   return result
               
               def overlaps(a, b):
              -    """Returns true iff two space objects overlap"""
              +    """Returns true iff two space objects overlap"""
                   distance_squared = (distance(a.x, b.x, window.width) ** 2 +
                                       distance(a.y, b.y, window.height) ** 2)
                   max_distance_squared = (a.radius + b.radius) ** 2
              @@ -243,7 +243,7 @@ 

              Kolize

              Povedlo se? Konečně se dá prohrát? Čas to všechno zkontrolovat, dát do Gitu a můžeme pokračovat!

              Útok -# +#

              Teď zkusíme asteroidy rozbíjet.

                @@ -277,7 +277,7 @@

                Útok

              Povedlo se? Dá se i vyhrát? Čas to všechno dát do Gitu!

              Dokončení a rozšíření -# +#

              Chceš-li ve hře pokračovat, tady jsou další nápady. Můžeš je dělat v jakémkoli pořadí – nebo si vymysli diff --git a/pyladies/basic-functions/index.html b/pyladies/basic-functions/index.html index de4e0fe9..df9120df 100644 --- a/pyladies/basic-functions/index.html +++ b/pyladies/basic-functions/index.html @@ -1,5 +1,5 @@

              Užitečné funkce -# +#

              Ukažme si pár základních funkcí, které Python nabízí.

              Tato kapitola ukazuje výběr z nástrojů, které jsou ti v Pythonu k dispozici. @@ -15,7 +15,7 @@

              Užitečné funkce Když narazíš na úkol, se kterým si nevíš rady, projdi si tahák a zamysli se, která z funkcí by se dala použít.

              Vstup a výstup -# +#

              Tyhle funkce už známe. print vypíše nepojmenované argumenty, oddělené mezerou. @@ -47,7 +47,7 @@

              Řešení

              Návratová hodnota funkce input je řetězec s odpovědí uživatele.

        Převádění typů -# +#

        Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? Tady nám pomůže skupina funkcí, které umí převádět čísla na řetězce a zpátky. @@ -71,7 +71,7 @@

        Řešení

        …a jak si poradit s chybou, která nastane, když použiješ špatnou hodnotu, si řekneme později.

        Převádění a input -# +#

        Převádění typů se často používá při načítání vstupu, třeba takto:

        cislo = int(input('Zadej číslo: '))
        @@ -86,7 +86,7 @@ 

        Převádění a input # ╰────────────┬────────────╯ cislo = 42

        Matematické funkce -# +#

        Matematika je občas potřeba, takže se pojďme podívat, jak v Pythonu pracovat s čísly.

        @@ -121,7 +121,7 @@

        Převádění a input math.py, bude se snažit importovat sin z něho místo z předpřipravené sady matematických funkcí.

        Náhoda -# +#

        Nakonec si ukážeme dvě funkce, které vrací náhodná čísla. Jsou užitečné třeba pro hry, ve kterých se hází kostkou nebo tahají @@ -150,7 +150,7 @@

        Převádění a input

        Pamatuj, když importuješ z modulu random, nesmí se tvůj soubor jmenovat random.py.

        A další -# +#

        Python dává k dispozici obrovské množství dalších funkcí a modulů, i když ne všem budeš ze začátku diff --git a/pyladies/basics/index.html b/pyladies/basics/index.html index ca513193..c4698f26 100644 --- a/pyladies/basics/index.html +++ b/pyladies/basics/index.html @@ -1,5 +1,5 @@

        Git -# +#

        Ať už programuješ nebo píšeš dokumenty, stává se, že vytvoříš několik verzí. @@ -29,13 +29,13 @@

        Git

        Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat že jde o příkaz.

        Instalace -# +#

        Popis instalace Gitu najdeš zde. Jestli jsi instalaci přeskočil/a, projdi si ji teď.

        Repozitář -# +#

        Každý projekt, který budeš verzovat, musí mít pro sebe vyhrazený adresář. @@ -62,7 +62,7 @@

        Repozitář A „nothing to commit” říká, že je adresář prázdný – nejsou tu žádné soubory k verzování.

        První revize -# +#

        Teď si zkus do Gitu něco přidat!

        Vytvoř soubor basnicka.txt a napiš do něj @@ -169,7 +169,7 @@

        První revize

        Tento příkaz nastaví aktuální terminál: když si otevřeš nové okno s příkazovou řádkou, bude ho potřeba zadat znovu.

        Druhá revize -# +#

        Udělej v básničce nějakou malou změnu – změň slovo, uprav interpunkci nebo přidej sloku. @@ -277,13 +277,13 @@

        První revize -Holka modrooká, nesedávej tam +Holka modrooká +Nesedávej tam

        Diagram -# +#

        Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládám tento diagram:

        Diagram revizí

        Log -# +#

        Teď, když máme za sebou první(ch) pár revizí, si ukážeme několik příkazů, které nám umožní se @@ -322,14 +322,14 @@

        Log napiš git show 5ff0b, kde místo 5ff0b uveď prvních několik čísel z označení revize.

        gitk -# +#

        Z příkazové řádky se dá vyčíst všechno potřebné, ale chce to trochu praxe. Někdy je přehlednější použít grafické „klikátko“ jménem gitk, které se dá spustit příkazem gitk --all:

        -
        $ gitk --all
        +
        $ gitk --all
         

        Tenhle program vypadá celkem šeredně (skoro jako by ho psali programátoři, které místo designu zajímá, co je @@ -338,7 +338,7 @@

        gitk udělej dalších pár revizí a koukni se na ně přes git log a gitk --all.

        Závěr -# +#

        A to je všechno, co z Gitu zatím budeš potřebovat. Vždycky, když uděláš git add soubor diff --git a/pyladies/branching/index.html b/pyladies/branching/index.html index 8be73081..15403799 100644 --- a/pyladies/branching/index.html +++ b/pyladies/branching/index.html @@ -1,5 +1,5 @@

        Větvení v Gitu -# +#

        Takže, Git už znáš! Teď to začne být trošičku složitější :)

        @@ -82,7 +82,7 @@

        Větvení v Gitu

        A až je některá větev hotová, může se začlenit zpátky do master. Podívejme se jak na to.

        Sloučení -# +#

        Nedávalo by smysl historii projektu rozdvojovat, kdyby pak jednotlivé větve nešly zase sloučit dohromady. diff --git a/pyladies/class/index.html b/pyladies/class/index.html index efd512c4..40358206 100644 --- a/pyladies/class/index.html +++ b/pyladies/class/index.html @@ -1,5 +1,5 @@

        Hodnoty a objekty -# +#

        Než se dnes začneme zabývat třídami, podíváme na objekty.

        @@ -28,7 +28,7 @@

        Hodnoty a objekty Funkce len ale funguje i na objektech, které s řetězci nemají nic společného.

        Třídy -# +#

        Data každého objektu jsou specifická pro konkrétní objekt ("abc" obsahuje jiné znaky než @@ -64,7 +64,7 @@

        Hodnoty a objekty

        Například <class 'int'> obsahuje všechno, co je společné všem celým číslům: že (a jak) se dají sčítat, jak takové číslo převést na řetězec, a tak dále.

        Tvoření objektů třídy -# +#

        Většinu tříd jde navíc v Pythonu zavolat, jako by to byly funkce, a vytvořit tak nový objekt dané třídy:

        @@ -88,7 +88,7 @@

        Tvoření objektů třídy Třída tedy většinou obsahuje nejen „popis“, jak se její objekty budou chovat, ale „umí“ takové objekty i vytvořit.

        Vlastní třídy -# +#

        A proč najednou tolik informací o třídách? Protože si zkusíme napsat třídu vlastní.

        @@ -137,7 +137,7 @@

        Vlastní třídy volání Kotatko() vytvoří nový objekt tvé třídy, který už můžeš použít.

        Mňau!

        Atributy -# +#

        Objekty vytvořené z „vlastních“ tříd mají funkčnost, kterou třídy jako str nedovolují: máš možnost si definovat vlastní @@ -167,7 +167,7 @@

        Atributy micka.zamnoukej = 12345 micka.zamnoukej()

        Parametr self -# +#

        Teď se na chvíli vraťme k metodám. Konkrétně k parametru self.

        Každá metoda má přístup ke konkrétnímu objektu, na @@ -206,7 +206,7 @@

        Atributy mourek.jmeno = 'Mourek' mourek.snez('ryba')

        Metoda __init__ -# +#

        Co se stane, když koťátku zapomeneš nastavit jméno? Metoda zamnoukej přestane fungovat:

        @@ -245,7 +245,7 @@

        Atributy
        mourek = Kotatko('Mourek')  # 'Mourek' je hodnota prvního argumentu pro __init__ (po self)
         micka = Kotatko(jmeno='Micka')  # 'Micka' je hodnota argumentu `jmeno`
         

        Metoda __str__ -# +#

        Podobných „opodtržítkovaných“ (speciálních) metod je víc. Třeba metodu __str__ Python zavolá, když je potřeba diff --git a/pyladies/cmdline/index.html b/pyladies/cmdline/index.html index 57530a9c..2d2fcbcb 100644 --- a/pyladies/cmdline/index.html +++ b/pyladies/cmdline/index.html @@ -1,5 +1,5 @@

        Příkazová řádka -# +#

        V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, které programátoři používají na zadávání textových příkazů.

        @@ -51,7 +51,7 @@

        Windows

        >
         Ctrl++ a
         Ctrl+- (příp. se Shift).

        První příkaz -# +#

        Začněme ale příkazem, který je všude stejný. Napiš whoami (z angl. who am I? – kdo jsem?) @@ -69,7 +69,7 @@

        Windows

        > <
         takže ho nepiš sám/sama! Zadej jen whoami a Enter.

        Stejně tak počítač sám vypíše přihlašovací jméno.

        Aktuální adresář -# +#

        Příkazová řádka pracuje vždy v nějakém adresáři neboli složce (angl. directory, folder). @@ -94,7 +94,7 @@

        Windows

        > <
         části uvedeno který adresář zrovna ukazují.
         Příkazová řádka umí soubory ukazovat taky – ale musíš si o to říct.

        Co v tom adresáři je? -# +#

        Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) ti vypíše co aktuální adresář obsahuje: všechny soubory, @@ -115,7 +115,7 @@

        Windows

        > <
         05/08/2014 07:28 PM <DIR>  Music
         
         

        Změna aktuálního adresáře -# +#

        Aktuální adresář se dá změnit pomocí příkazu cd (z angl. change directory – změnit adresář). @@ -127,11 +127,11 @@

        Windows

        > <
         

        Používáš-li Windows, cd už jsi používal/a – tento příkaz se chová různě podle toho, jestli něco napíšeš za něj nebo ne.

        -

        Unix

        $ cd Desktop
        +                

        Unix

        $ cd Desktop
         $ pwd
         /home/helena/Desktop
         
        -

        Windows

        > cd Desktop
        +                

        Windows

        > cd Desktop
         > cd
         C:\Users\helena\Desktop
         

        Poznámka pro Windows

        @@ -139,26 +139,26 @@

        Windows

        > <
         například D: místo C:, je potřeba kromě cd
         zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

        Vytvoření adresáře -# +#

        Co takhle si zkusit vytvořit adresář? To se dělá příkazem mkdir (z angl. make directory – vytvořit adresář). Za tento příkaz napiš jméno adresáře, který chceš vytvořit – v našem případě zkouska:

        -

        Unix

        $ mkdir zkouska
        +                

        Unix

        $ mkdir zkouska
         

        Windows

        > mkdir zkouska
         

        Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

        -

        Unix

        $ cd zkouska
        +                

        Unix

        $ cd zkouska
         

        Windows

        > cd zkouska
         

        Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

        V grafickém hledátku -# +#

        Často nebudeš pracovat jenom s příkazovou řádkou. Vyplatí se umět aktuální adresář z příkazové řádky otevřít i v jiných @@ -195,7 +195,7 @@

        Unix

        $ 
                         

        Windows

        > cd
         C:\Users\helena\Desktop\zkouska
         

        Kopírování z příkazové řádky -# +#

        Na Linuxu vyber text myší a pak buď:

          @@ -207,7 +207,7 @@

          Windows

          > <
           

          Na Windows v menu příkazové řádky (ikonce vlevo nahoře) vyber EditMark, text vyber myší a zkopíruj pomocí Enter.

          Otevření v prohlížeči souborů -# +#

          Na Linuxu záleží na programu, který používáš. Buď:

            @@ -226,7 +226,7 @@

            Otevření v prohlížeči souborů

            Teď se můžeš podívat na Plochu nebo do nějakého grafickém programu na prohlížení adresářů: zjistíš, že se adresář opravdu vytvořil.

            Vkládání do příkazové řádky -# +#

            Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. @@ -240,10 +240,10 @@

            Vkládání do příkazové řádky

            Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš ", např:

            -
            $ cd "můj super adresář"
            +
            $ cd "můj super adresář"
             

            Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

            Pozorování změn -# +#

            Vyzkoušej si, že se v řádce projeví i změny, které na počítači uděláš jiným způsobem.

            @@ -255,7 +255,7 @@

            Vkládání do příkazové řádky

            Na počítači máš jen jednu sadu souborů, se kterou umí manipulovat jak grafické programy tak příkazová řádka.

            O úroveň nahoru -# +#

            A poslední věc: jsi-li teď v adresáři Desktop/zkouska (nebo Plocha/zkouska, Desktop\zkouska atp.), jak se dostat zpátky do Desktop?

            @@ -267,17 +267,17 @@

            O úroveň nahoru

            Nadřazený adresář má speciální jméno .., dvě tečky. Přejdi do něj zadáním cd .. a pak se ujisti, že jsi opravdu v Desktop:

            -

            Unix

            $ cd ..
            +                

            Unix

            $ cd ..
             $ pwd
             /home/helena/Desktop
             
            -

            Windows

            > cd ..
            +                

            Windows

            > cd ..
             > cd
             C:\Users\helena\Desktop
             

            Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

            Konec -# +#

            Příkazů existuje samozřejmě daleko víc.

            Když se je naučíš, můžeš z příkazové řádky plnohodnotně ovládat @@ -298,7 +298,7 @@

            Konec
            $ exit
             

            A tím je úvod do příkazové řádky hotový.

            Přehled -# +#

            Tady je tabulka základních příkazů, se kterými si do začátku vystačíš:

        diff --git a/pyladies/collaboration/index.html b/pyladies/collaboration/index.html index cff52fc2..d15b81dd 100644 --- a/pyladies/collaboration/index.html +++ b/pyladies/collaboration/index.html @@ -1,5 +1,5 @@

        Spolupráce -# +#

        „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým.

        @@ -18,7 +18,7 @@

        Spolupráce naucse/prezencka. Nasdílej s účastníky příkaz na jeho naklonování (přes https).

        Open Source -# +#

        Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. @@ -102,7 +102,7 @@

        Spolupráce Zveřejňovat zdrojový kód se hodí už jen pro to, aby ti s ním mohli zkušenější programátoři snadněji pomáhat.

        GitHub -# +#

        Na Internetu existuje spousta stránek, kam se dají nahrávat gitové repozitáře s kódem – např. GitLab, @@ -114,11 +114,11 @@

        GitHub

        Jestli ještě nemáš uživatelský účet na github.com, jdi tam a založ si ho.

        Naklonování repozitáře (git clone) -# +#

        Pro začátek zkusíme práci s repozitářem, který už vytvořil někdo jiný. V příkazové řádce zadej příkaz, který ti oznámí kouč; něco jako

        -
        $ git clone https://github.com/naucse/prezencka
        +
        $ git clone https://github.com/naucse/prezencka
         

        Vytvoří se ti nový repozitář – adresář se jménem prezencka, ve kterém je nějaký soubor.

        Na URL (adresu), kterou jsi v tomhle příkladě @@ -142,7 +142,7 @@

        Naklonování repozi
      • nesdílej nic, co nemáš právo sdílet (např. texty moderních písní).
      • Vytvoření větve -# +#

        Pomocí git branch zjisti, na jaké jsi aktuálně větvi. Měla by to být větev master.

        @@ -151,10 +151,10 @@

        Vytvoření větve Proto když chceš do projektu přispět, jako první krok si pro svůj příspěvek udělej novou větev a přepni se do ní. Například pomocí:

        -
        $ git branch pridani-jmena
        -$ git checkout pridani-jmena
        +
        $ git branch pridani-jmena
        +$ git checkout pridani-jmena
         

        Posílání změn (git push) -# +#

        Teď se do projektu zapoj. Přidej soubor pojmenovaný podle tvého jména (nebo přezdívky) @@ -213,7 +213,7 @@

        Vytvoření větve a kam se dají posílat změny. Seznam těchhle adres ti ukáže příkaz git remote -v. Třeba:

        -
        $ git remote -v
        +
        $ git remote -v
         origin  https://github.com/naucse/prezencka (fetch)
         origin  https://github.com/naucse/prezencka (push)
         

        Tenhle výstup znamená, že pod zkratkou „origin” @@ -243,7 +243,7 @@

        Vytvoření větve https://github.com/tvojejmeno/prezencka v prohlížeči a ujisti se, že tam tvoje změny jsou.

        Žádost o začlenění (pull request) -# +#

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. @@ -276,7 +276,7 @@

        Žádost o začlenění < a pomocí git push tvojejmeno pridani-jmena pull request aktualizuj.

        Aktualizace (git pull) -# +#

        Když budou tvé změny – a změny od ostatních – začleněné, můžeš si aktualizovat lokální repozitář. (To je ten, @@ -295,7 +295,7 @@

        Aktualizace (git pu které většina programátorů dělá denně: udělání nějaké změny, odeslání kolegům na kontrolu a začlenění a stažení změn od ostatních.

        Hlášení chyb (issues) -# +#

        Občas nastane situace, kdy v nějakém projektu na GitHubu najdeš chybu, ale nemáš čas nebo @@ -311,7 +311,7 @@

        Hlášení chyb (issues

        README: Informace pro ostatní -# +#

        Pokud vytváříš projekt a chceš, aby do něj přispívali i ostatní, je potřeba aby věděli, co tvůj projekt dělá, k čemu se hodí, @@ -350,7 +350,7 @@

        Hlášení chyb (issues

        Licence -# +#

        Aby sdílení fungovalo i pro právní stránce, nestačí když nahraješ kus kódu na Internet. diff --git a/pyladies/comparisons/index.html b/pyladies/comparisons/index.html index cbfdc796..3f529682 100644 --- a/pyladies/comparisons/index.html +++ b/pyladies/comparisons/index.html @@ -1,5 +1,5 @@

        Porovnávání -# +#

        Pamatuješ si ještě, co je to operátor?

        V domácím projektu jsme si ukázali základní aritmetické operátory. @@ -75,7 +75,7 @@

        Porovnávání
        print(True)
         print(False)
         

        Podmínky -# +#

        Teď oprášíme program na výpočet obvodu a obsahu.

        Otevři si v editoru nový soubor. @@ -140,7 +140,7 @@

        Řešení

        takže když pak na jednom programu spolupracuje více lidí, musí se shodnout. No a na čtyřech mezerách se shodla většina Pythonního světa.

        Další podmíněné příkazy -# +#

        Někdy není else vůbec potřeba. V následujícím programu se nedělá nic navíc, pokud je číslo nenulové:

        @@ -168,7 +168,7 @@

        Řešení

        # Nenastala ani nedna ze situací výše – muselo to být záporné print('Pro návštěvy z budoucnosti bohužel nemáme nic v nabídce.')

        Zanořování -# +#

        Příkazy if se dají zanořovat (angl. nest). V odsazeném (podmíněném) bloku kódu může být další if s dalším odsazeným diff --git a/pyladies/course.json b/pyladies/course.json index c71dfde2..46035ae7 100644 --- a/pyladies/course.json +++ b/pyladies/course.json @@ -1,7 +1,7 @@ { "api_version": [ 0, - 3 + 4 ], "course": { "description": "Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba.", @@ -19,7 +19,17 @@ "content": { "path": "and-or/index.html" }, + "ids": [ + "emneboem_anebo_emaem", + "stastnabohata" + ], "license": "cc-by-sa-40", + "links": [ + "#emneboem_anebo_emaem", + "#stastnabohata", + "naucse:page?lesson=beginners/comparisons", + "naucse:page?lesson=beginners/exceptions" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/and-or/index.md", @@ -42,7 +52,31 @@ "content": { "path": "basic-functions/index.html" }, + "ids": [ + "a_dalsi", + "matematicke_funkce", + "nahoda", + "prevadeni_a_codeinputcode", + "prevadeni_typu", + "solution-0", + "uzitecne_funkce", + "vstup_a_vystup" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#matematicke_funkce", + "#nahoda", + "#prevadeni_a_codeinputcode", + "#prevadeni_typu", + "#uzitecne_funkce", + "#vstup_a_vystup", + "https://cs.wikipedia.org/wiki/Radi%C3%A1n", + "https://docs.python.org/3/library/functions.html", + "https://docs.python.org/3/library/math.html", + "https://github.com/pyvec/cheatsheets/raw/master/basic-functions/basic-functions-cs.pdf", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -69,7 +103,29 @@ "content": { "path": "class/index.html" }, + "ids": [ + "atributy", + "hodnoty_a_objekty", + "metoda_code__init__code", + "metoda_code__str__code", + "parametr_codeselfcode", + "tridy", + "tvoreni_objektu_tridy", + "vlastni_tridy" + ], "license": "cc-by-sa-40", + "links": [ + "#atributy", + "#hodnoty_a_objekty", + "#metoda_code__init__code", + "#metoda_code__str__code", + "#parametr_codeselfcode", + "#tridy", + "#tvoreni_objektu_tridy", + "#vlastni_tridy", + "naucse:page?lesson=beginners/functions", + "naucse:page?lesson=beginners/inheritance" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/class/index.md", @@ -93,7 +149,43 @@ "content": { "path": "cmdline/index.html" }, + "ids": [ + "aktualni_adresar", + "co_v_tom_adresari_je", + "konec", + "kopirovani_z_prikazove_radky", + "o_uroven_nahoru", + "otevreni_vprohlizeci_souboru", + "pozorovani_zmen", + "prehled", + "prikazova_radka", + "prvni_prikaz", + "vgrafickem_hledatku", + "vkladani_do_prikazove_radky", + "vytvoreni_adresare", + "zmena_aktualniho_adresare" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualni_adresar", + "#co_v_tom_adresari_je", + "#konec", + "#kopirovani_z_prikazove_radky", + "#o_uroven_nahoru", + "#otevreni_vprohlizeci_souboru", + "#pozorovani_zmen", + "#prehled", + "#prikazova_radka", + "#prvni_prikaz", + "#vgrafickem_hledatku", + "#vkladani_do_prikazove_radky", + "#vytvoreni_adresare", + "#zmena_aktualniho_adresare", + "naucse:static?filename=linux-file-browser.png", + "naucse:static?filename=macos-file-browser.png", + "naucse:static?filename=windows-cmd-properties.png", + "naucse:static?filename=windows-file-browser.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/cmdline/index.md", @@ -129,7 +221,22 @@ "content": { "path": "comparisons/index.html" }, + "ids": [ + "dalsi_podminene_prikazy", + "podminky", + "porovnavani", + "solution-0", + "zanorovani" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_podminene_prikazy", + "#podminky", + "#porovnavani", + "#zanorovani", + "http://en.wikipedia.org/wiki/George_Boole", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -156,7 +263,24 @@ "content": { "path": "def/index.html" }, + "ids": [ + "cviceni", + "definice_funkce", + "definice_funkci", + "kcemu_jsou_funkce", + "solution-0", + "vraceni_ukoncuje_funkci" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#definice_funkce", + "#definice_funkci", + "#kcemu_jsou_funkce", + "#vraceni_ukoncuje_funkci", + "naucse:page?lesson=beginners/functions", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -185,7 +309,27 @@ "content": { "path": "dict/index.html" }, + "ids": [ + "a_to_je_zatim_ke_slovnikum_vse", + "iterace", + "jak_udelat_slovnik", + "meneni_slovniku", + "slovniky", + "typy_klicu_a_hodnot", + "zapln_prazdny_slovnik" + ], "license": "cc-by-sa-40", + "links": [ + "#a_to_je_zatim_ke_slovnikum_vse", + "#iterace", + "#jak_udelat_slovnik", + "#meneni_slovniku", + "#slovniky", + "#typy_klicu_a_hodnot", + "#zapln_prazdny_slovnik", + "https://docs.python.org/3.0/library/stdtypes.html#mapping-types-dict", + "https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/dict/index.md", @@ -208,7 +352,13 @@ "content": { "path": "dict-with-list-values/index.html" }, + "ids": [ + "vice_hodnot_vjednom_zaznamu_slovniku" + ], "license": "cc-by-sa-40", + "links": [ + "#vice_hodnot_vjednom_zaznamu_slovniku" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/dict-with-list-values/index.md", @@ -231,7 +381,24 @@ "content": { "path": "exceptions/index.html" }, + "ids": [ + "dalsi_prilohy_kcodetrycode", + "druhy_chyb", + "nechytej_je_vsechny", + "osetreni_chyby", + "vyjimky", + "vyvolani_chyby" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_prilohy_kcodetrycode", + "#druhy_chyb", + "#nechytej_je_vsechny", + "#osetreni_chyby", + "#vyjimky", + "#vyvolani_chyby", + "https://docs.python.org/3/library/exceptions.html#exception-hierarchy" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/exceptions/index.md", @@ -254,7 +421,13 @@ "content": { "path": "expressions/index.html" }, + "ids": [ + "vyhodnocovani_vyrazu" + ], "license": "cc-by-sa-40", + "links": [ + "#vyhodnocovani_vyrazu" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/expressions/index.md", @@ -277,7 +450,23 @@ "content": { "path": "files/index.html" }, + "ids": [ + "automaticke_zavirani_souboru", + "iterace_nad_soubory", + "psani_souboru", + "solution-0", + "soubory" + ], "license": "cc-by-sa-40", + "links": [ + "#automaticke_zavirani_souboru", + "#iterace_nad_soubory", + "#psani_souboru", + "#soubory", + "https://en.wikipedia.org/wiki/UTF-8", + "naucse:page?lesson=beginners/str", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -307,7 +496,17 @@ "content": { "path": "first-steps/index.html" }, + "ids": [ + "interaktivni_rezim_pythonu", + "prvni_prikaz", + "ukonceni" + ], "license": "cc-by-sa-40", + "links": [ + "#interaktivni_rezim_pythonu", + "#prvni_prikaz", + "#ukonceni" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/first-steps/index.md", @@ -330,8 +529,17 @@ "content": { "path": "fstring/index.html" }, + "ids": [ + "metoda_format", + "sablony_formatovaci_retezce" + ], "license": "cc-by-sa-40", "license_code": "cc0", + "links": [ + "#metoda_format", + "#sablony_formatovaci_retezce", + "https://docs.python.org/3.6/reference/lexical_analysis.html#formatted-string-literals" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/fstring/index.md", @@ -354,7 +562,31 @@ "content": { "path": "functions/index.html" }, + "ids": [ + "argumenty", + "delka_retezce", + "funkce", + "funkce_je_potreba_volat", + "pojmenovane_argumenty", + "prehled_funkci", + "procedury", + "solution-0", + "volani_funkce_jako_vyraz" + ], "license": "cc-by-sa-40", + "links": [ + "#argumenty", + "#delka_retezce", + "#funkce", + "#funkce_je_potreba_volat", + "#pojmenovane_argumenty", + "#prehled_funkci", + "#procedury", + "#volani_funkce_jako_vyraz", + "naucse:page?lesson=beginners/basic-functions", + "naucse:solution?solution=0", + "naucse:static?filename=call-anatomy.svg" + ], "slug": "index", "solutions": [ { @@ -385,7 +617,19 @@ "content": { "path": "hello-world/index.html" }, + "ids": [ + "prvni_program", + "spusteni" + ], "license": "cc-by-sa-40", + "links": [ + "#prvni_program", + "#spusteni", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/install", + "naucse:page?lesson=beginners/install-editor", + "naucse:page?lesson=beginners/venv-setup" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/hello-world/index.md", @@ -408,7 +652,20 @@ "content": { "path": "inheritance/index.html" }, + "ids": [ + "dedicnost", + "generalizace", + "polymorfismus", + "prepisovani_metod_a_codesupercode" + ], "license": "cc-by-sa-40", + "links": [ + "#dedicnost", + "#generalizace", + "#polymorfismus", + "#prepisovani_metod_a_codesupercode", + "https://en.wikipedia.org/wiki/Liskov_substitution_principle" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/inheritance/index.md", @@ -431,7 +688,16 @@ "content": { "path": "install/index.html" }, + "ids": [ + "instalace_pythonu" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu", + "naucse:page?lesson=beginners/install&page=linux", + "naucse:page?lesson=beginners/install&page=macos", + "naucse:page?lesson=beginners/install&page=windows" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install/index.md", @@ -447,7 +713,24 @@ "content": { "path": "install/linux.html" }, + "ids": [ + "check-tkinter", + "doinstalovani_virtualenv", + "instalace_pythonu_3", + "instalace_pythonu_na_linux", + "install-virtualenv", + "kontrola_tkinter" + ], "license": "cc-by-sa-40", + "links": [ + "#check-tkinter", + "#doinstalovani_virtualenv", + "#instalace_pythonu_3", + "#instalace_pythonu_na_linux", + "#install-virtualenv", + "#kontrola_tkinter", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "linux", "solutions": [], "source_file": "lessons/beginners/install/linux.md", @@ -464,7 +747,15 @@ "content": { "path": "install/macos.html" }, + "ids": [ + "instalace_pythonu_pro_macos" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_pythonu_pro_macos", + "http://brew.sh", + "naucse:page?lesson=beginners/cmdline" + ], "slug": "macos", "solutions": [], "source_file": "lessons/beginners/install/macos.md", @@ -481,7 +772,26 @@ "content": { "path": "install/windows.html" }, + "ids": [ + "download", + "instalace", + "instalace_pythonu_pro_windows", + "stazeni", + "zjisti_jestli_uz_mas_python_nainstalovany" + ], "license": "cc-by-sa-40", + "links": [ + "#download", + "#instalace", + "#instalace_pythonu_pro_windows", + "#stazeni", + "#zjisti_jestli_uz_mas_python_nainstalovany", + "https://www.python.org/downloads/windows/", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=beginners/venv-setup", + "naucse:static?filename=windows_32v64-bit.png", + "naucse:static?filename=windows_add_python_to_path.png" + ], "slug": "windows", "solutions": [], "source_file": "lessons/beginners/install/windows.md", @@ -512,7 +822,21 @@ "content": { "path": "install-editor/atom.html" }, + "ids": [ + "instalace_atomu", + "kontrola_stylu_zdrojoveho_kodu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_atomu", + "#kontrola_stylu_zdrojoveho_kodu", + "#nacvik_odsazovani", + "#nastaveni", + "https://atom.io", + "https://www.python.org/dev/peps/pep-0008/" + ], "slug": "atom", "solutions": [], "source_file": "lessons/beginners/install-editor/atom.md", @@ -529,7 +853,21 @@ "content": { "path": "install-editor/gedit.html" }, + "ids": [ + "instalace_geditu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_geditu", + "#nacvik_odsazovani", + "#nastaveni", + "https://wiki.gnome.org/Apps/Gedit", + "naucse:static?filename=gedit_indent.png", + "naucse:static?filename=gedit_linenums.png", + "naucse:static?filename=gedit_prefs.png" + ], "slug": "gedit", "solutions": [], "source_file": "lessons/beginners/install-editor/gedit.md", @@ -546,7 +884,28 @@ "content": { "path": "install-editor/index.html" }, + "ids": [ + "co_programatorsky_editor_umi", + "ide", + "instalace_editoru", + "volba_a_nastaveni_editoru" + ], "license": "cc-by-sa-40", + "links": [ + "#co_programatorsky_editor_umi", + "#ide", + "#instalace_editoru", + "#volba_a_nastaveni_editoru", + "https://eclipse.org/", + "https://www.jetbrains.com/pycharm/", + "https://www.kdevelop.org/", + "naucse:page?lesson=beginners/install-editor&page=atom", + "naucse:page?lesson=beginners/install-editor&page=gedit", + "naucse:page?lesson=beginners/install-editor&page=kate", + "naucse:page?lesson=beginners/install-editor&page=notepad-plus-plus", + "naucse:page?lesson=beginners/install-editor&page=others", + "naucse:page?lesson=beginners/install-editor&page=vscode" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/install-editor/index.md", @@ -562,7 +921,18 @@ "content": { "path": "install-editor/kate.html" }, + "ids": [ + "instalace_kate", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_kate", + "#nacvik_odsazovani", + "#nastaveni", + "https://kate-editor.org/get-it/" + ], "slug": "kate", "solutions": [], "source_file": "lessons/beginners/install-editor/kate.md", @@ -579,7 +949,18 @@ "content": { "path": "install-editor/notepad-plus-plus.html" }, + "ids": [ + "instalace_notepadu", + "nacvik_odsazovani", + "nastaveni" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_notepadu", + "#nacvik_odsazovani", + "#nastaveni", + "https://notepad-plus-plus.org/" + ], "slug": "notepad-plus-plus", "solutions": [], "source_file": "lessons/beginners/install-editor/notepad-plus-plus.md", @@ -596,7 +977,26 @@ "content": { "path": "install-editor/others.html" }, + "ids": [ + "cislovani_radku", + "instalace_editoru", + "kontrola_stylu_zdrojoveho_kodu", + "nacvik_odsazovani", + "nastaveni", + "obarvovani", + "odsazovani" + ], "license": "cc-by-sa-40", + "links": [ + "#cislovani_radku", + "#instalace_editoru", + "#kontrola_stylu_zdrojoveho_kodu", + "#nacvik_odsazovani", + "#nastaveni", + "#obarvovani", + "#odsazovani", + "https://www.python.org/dev/peps/pep-0008/" + ], "slug": "others", "solutions": [], "source_file": "lessons/beginners/install-editor/others.md", @@ -613,7 +1013,24 @@ "content": { "path": "install-editor/vscode.html" }, + "ids": [ + "instalace_visual_studio_code", + "nacvik_odsazovani", + "nastaveni", + "odesilani_telemetrickych_dat", + "stazeni_a_instalace" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_visual_studio_code", + "#nacvik_odsazovani", + "#nastaveni", + "#odesilani_telemetrickych_dat", + "#stazeni_a_instalace", + "https://code.visualstudio.com/", + "https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting", + "https://privacy.microsoft.com/en-us/privacystatement" + ], "slug": "vscode", "solutions": [], "source_file": "lessons/beginners/install-editor/vscode.md", @@ -647,7 +1064,19 @@ "content": { "path": "interfaces/index.html" }, + "ids": [ + "rozhrani", + "rozhrani_funkce", + "vyzkousej_si_to" + ], "license": "cc-by-sa-40", + "links": [ + "#rozhrani", + "#rozhrani_funkce", + "#vyzkousej_si_to", + "naucse:static?filename=tkui.py", + "naucse:static?filename=yn.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/interfaces/index.md", @@ -677,7 +1106,40 @@ "content": { "path": "list/index.html" }, + "ids": [ + "dalsi_zpusoby_jak_menit_seznamy", + "mazani_prvku", + "meneni_prvku", + "meneni_seznamu", + "nemenitelne_hodnoty", + "razeni", + "seznam_jako_podminka", + "seznamy", + "seznamy_a_nahoda", + "seznamy_a_retezce", + "tvoreni_seznamu", + "vybirani_ze_seznamu", + "zname_operace_se_seznamy" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_zpusoby_jak_menit_seznamy", + "#mazani_prvku", + "#meneni_prvku", + "#meneni_seznamu", + "#nemenitelne_hodnoty", + "#razeni", + "#seznam_jako_podminka", + "#seznamy", + "#seznamy_a_nahoda", + "#seznamy_a_retezce", + "#tvoreni_seznamu", + "#vybirani_ze_seznamu", + "#zname_operace_se_seznamy", + "https://github.com/pyvec/cheatsheets/blob/master/lists/lists-cs.pdf", + "naucse:page?lesson=beginners/str-index-slice#slicing-diagram", + "naucse:static?filename=methods.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/list/index.md", @@ -704,7 +1166,25 @@ "content": { "path": "local-variables/index.html" }, + "ids": [ + "lokalni_nebo_globalni", + "lokalni_promenne", + "prirazeni", + "rada_na_zaver", + "skryvani_detailu", + "solution-0", + "zakryvani_jmena" + ], "license": "cc-by-sa-40", + "links": [ + "#lokalni_nebo_globalni", + "#lokalni_promenne", + "#prirazeni", + "#rada_na_zaver", + "#skryvani_detailu", + "#zakryvani_jmena", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -731,7 +1211,15 @@ "content": { "path": "main-module/index.html" }, + "ids": [ + "negativni_testy", + "spousteci_moduly" + ], "license": "cc-by-sa-40", + "links": [ + "#negativni_testy", + "#spousteci_moduly" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/main-module/index.md", @@ -754,7 +1242,19 @@ "content": { "path": "modules/index.html" }, + "ids": [ + "adresar_pro_kazdy_projekt", + "moduly", + "vedlejsi_efekty", + "vlastni_moduly" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdy_projekt", + "#moduly", + "#vedlejsi_efekty", + "#vlastni_moduly" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/modules/index.md", @@ -777,7 +1277,13 @@ "content": { "path": "nested-list/index.html" }, + "ids": [ + "vnorene_seznamy" + ], "license": "cc-by-sa-40", + "links": [ + "#vnorene_seznamy" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/nested-list/index.md", @@ -800,7 +1306,13 @@ "content": { "path": "nested-traceback/index.html" }, + "ids": [ + "vypisy_chyb_ze_zanorenych_funkci" + ], "license": "cc-by-sa-40", + "links": [ + "#vypisy_chyb_ze_zanorenych_funkci" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/nested-traceback/index.md", @@ -823,7 +1335,15 @@ "content": { "path": "prefer-return/index.html" }, + "ids": [ + "none", + "vratit_nebo_vypsat" + ], "license": "cc-by-sa-40", + "links": [ + "#none", + "#vratit_nebo_vypsat" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/prefer-return/index.md", @@ -847,7 +1367,22 @@ "path": "print/index.html" }, "css": ".err-lineno {\n display: inline-block;\n background-color: #FCC;\n}\n.err-exctype {\n display: inline-block;\n background-color: #CFC;\n}\n", + "ids": [ + "dalsi_prikazy", + "jak_cist_chyby", + "jak_funguje_program", + "print_a_chybove_hlasky", + "print_a_vyrazy" + ], "license": "cc-by-sa-40", + "links": [ + "#dalsi_prikazy", + "#jak_cist_chyby", + "#jak_funguje_program", + "#print_a_chybove_hlasky", + "#print_a_vyrazy", + "naucse:page?lesson=beginners/variables" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/print/index.md", @@ -870,7 +1405,13 @@ "content": { "path": "range/index.html" }, + "ids": [ + "range_sekvence_cisel" + ], "license": "cc-by-sa-40", + "links": [ + "#range_sekvence_cisel" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/range/index.md", @@ -893,7 +1434,17 @@ "content": { "path": "reassignment/index.html" }, + "ids": [ + "prepisovani_promennych", + "prepisovani_vcyklu", + "solution-0" + ], "license": "cc-by-sa-40", + "links": [ + "#prepisovani_promennych", + "#prepisovani_vcyklu", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -921,7 +1472,32 @@ "content": { "path": "str/index.html" }, + "ids": [ + "cviceni", + "novy_radek", + "sekvence_se_zpetnym_lomitkem", + "solution-0", + "trojite_uvozovky", + "uvozovky", + "uvozovky_vuvozovkach", + "zapis_retezcu", + "znaky", + "zpetne_lomitko" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#novy_radek", + "#sekvence_se_zpetnym_lomitkem", + "#trojite_uvozovky", + "#uvozovky", + "#uvozovky_vuvozovkach", + "#zapis_retezcu", + "#znaky", + "#zpetne_lomitko", + "naucse:solution?solution=0", + "naucse:static?filename=quote-comic.svg" + ], "slug": "index", "solutions": [ { @@ -952,7 +1528,30 @@ "content": { "path": "str-index-slice/index.html" }, + "ids": [ + "cviceni", + "sekani_retezcu", + "slicing-diagram", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "vyber_znaku", + "vyber_zretezcu" + ], "license": "cc-by-sa-40", + "links": [ + "#cviceni", + "#sekani_retezcu", + "#vyber_znaku", + "#vyber_zretezcu", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4" + ], "slug": "index", "solutions": [ { @@ -991,7 +1590,23 @@ "content": { "path": "str-methods/index.html" }, + "ids": [ + "a_dalsi", + "inicialy", + "metody", + "retezcove_funkce_a_metody", + "solution-0" + ], "license": "cc-by-sa-40", + "links": [ + "#a_dalsi", + "#inicialy", + "#metody", + "#retezcove_funkce_a_metody", + "https://docs.python.org/3/library/stdtypes.html#string-methods", + "https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -1018,7 +1633,22 @@ "content": { "path": "testing/index.html" }, + "ids": [ + "instalace_knihovny_pytest", + "psani_testu", + "spousteni_testu", + "testovaci_moduly", + "testovani" + ], "license": "cc-by-sa-40", + "links": [ + "#instalace_knihovny_pytest", + "#psani_testu", + "#spousteni_testu", + "#testovaci_moduly", + "#testovani", + "naucse:page?lesson=beginners/install" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/testing/index.md", @@ -1041,7 +1671,17 @@ "content": { "path": "tuple/index.html" }, + "ids": [ + "kdy_pouzit_seznam_a_kdy_varnvar-tici", + "male_varnvar-tice", + "varnvar-tice" + ], "license": "cc-by-sa-40", + "links": [ + "#kdy_pouzit_seznam_a_kdy_varnvar-tici", + "#male_varnvar-tice", + "#varnvar-tice" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/tuple/index.md", @@ -1064,7 +1704,28 @@ "content": { "path": "variables/index.html" }, + "ids": [ + "ctverec", + "komentare", + "kruhy", + "mensi_ctverec", + "nacitani_vstupu", + "promenne", + "solution-0", + "solution-1" + ], "license": "cc-by-sa-40", + "links": [ + "#ctverec", + "#komentare", + "#kruhy", + "#mensi_ctverec", + "#nacitani_vstupu", + "#promenne", + "naucse:page?lesson=beginners/print", + "naucse:solution?solution=0", + "naucse:solution?solution=1" + ], "slug": "index", "solutions": [ { @@ -1094,7 +1755,24 @@ "content": { "path": "venv-setup/index.html" }, + "ids": [ + "adresar_pro_kazdou_lekci", + "aktivace_virtualniho_prostredi", + "nastaveni_prostredi", + "prepnuti", + "priprava_adresare", + "virtualni_prostredi" + ], "license": "cc-by-sa-40", + "links": [ + "#adresar_pro_kazdou_lekci", + "#aktivace_virtualniho_prostredi", + "#nastaveni_prostredi", + "#prepnuti", + "#priprava_adresare", + "#virtualni_prostredi", + "naucse:static?filename=dirs-00.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/venv-setup/index.md", @@ -1121,7 +1799,17 @@ "content": { "path": "while/index.html" }, + "ids": [ + "oko_bere", + "solution-0", + "while" + ], "license": "cc-by-sa-40", + "links": [ + "#oko_bere", + "#while", + "naucse:solution?solution=0" + ], "slug": "index", "solutions": [ { @@ -1148,7 +1836,15 @@ "content": { "path": "with/index.html" }, + "ids": [ + "kontext_codewithcode_a_codefinallycode", + "kontrola_vyjimek" + ], "license": "cc-by-sa-40", + "links": [ + "#kontext_codewithcode_a_codefinallycode", + "#kontrola_vyjimek" + ], "slug": "index", "solutions": [], "source_file": "lessons/beginners/with/index.md", @@ -1171,7 +1867,25 @@ "content": { "path": "zip-enumerate/index.html" }, + "ids": [ + "enumerate_ocislovani_sekvence", + "iteratory_n-tic", + "rozbalovani_v_cyklu_for", + "solution-0", + "solution-1", + "zip_longest_pro_ty_co_chteji_vsechno", + "zip_vic_iteraci_najednou" + ], "license": "cc-by-sa-40", + "links": [ + "#enumerate_ocislovani_sekvence", + "#iteratory_n-tic", + "#rozbalovani_v_cyklu_for", + "#zip_longest_pro_ty_co_chteji_vsechno", + "#zip_vic_iteraci_najednou", + "naucse:solution?solution=0", + "naucse:solution?solution=1" + ], "slug": "index", "solutions": [ { @@ -1202,7 +1916,34 @@ "path": "basics/index.html" }, "css": ".green { color: #0a0; }\n.red { color: #a00; }\n.yellow { color: #a50; }\n.strong { font-weight: bold; }\n.blue { color: #0aa; }\n", + "ids": [ + "diagram", + "druha_revize", + "git", + "gitk", + "instalace", + "log", + "prvni_revize", + "repozitar", + "zaver" + ], "license": "cc-by-sa-40", + "links": [ + "#diagram", + "#druha_revize", + "#git", + "#gitk", + "#instalace", + "#log", + "#prvni_revize", + "#repozitar", + "#zaver", + "naucse:page?lesson=beginners/cmdline", + "naucse:page?lesson=git/install", + "naucse:static?filename=diagram.svg", + "naucse:static?filename=dropbox.png", + "naucse:static?filename=gitk.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/basics/index.md", @@ -1235,7 +1976,18 @@ "content": { "path": "branching/index.html" }, + "ids": [ + "slouceni", + "vetveni_v_gitu" + ], "license": "cc-by-sa-40", + "links": [ + "#slouceni", + "#vetveni_v_gitu", + "naucse:static?filename=branch1.png", + "naucse:static?filename=branches.png", + "naucse:static?filename=merge.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/branching/index.md", @@ -1268,7 +2020,67 @@ "content": { "path": "collaboration/index.html" }, + "ids": [ + "aktualizace_smallcodegit_pullcodesmall", + "github", + "hlaseni_chyb_smallemissuesemsmall", + "licence", + "naklonovani_repozitare_smallcodegit_clonecodesmall", + "open_source", + "posilani_zmen_smallcodegit_pushcodesmall", + "readme_informace_pro_ostatni", + "spoluprace", + "vytvoreni_vetve", + "zadost_o_zacleneni_smallempull_requestemsmall" + ], "license": "cc-by-sa-40", + "links": [ + "#aktualizace_smallcodegit_pullcodesmall", + "#github", + "#hlaseni_chyb_smallemissuesemsmall", + "#licence", + "#naklonovani_repozitare_smallcodegit_clonecodesmall", + "#open_source", + "#posilani_zmen_smallcodegit_pushcodesmall", + "#readme_informace_pro_ostatni", + "#spoluprace", + "#vytvoreni_vetve", + "#zadost_o_zacleneni_smallempull_requestemsmall", + "http://choosealicense.com/", + "http://creativecommons.org/choose/", + "https://bitbucket.org", + "https://choosealicense.com/licenses/agpl-3.0/", + "https://choosealicense.com/licenses/cc-by-sa-4.0/", + "https://choosealicense.com/licenses/mit/", + "https://chromium.googlesource.com/chromium/src.git", + "https://cs.wikipedia.org/wiki/Markdown", + "https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software", + "https://en.wikipedia.org/wiki/Richard_Stallman", + "https://github.com", + "https://github.com/", + "https://github.com/GNOME/gedit", + "https://github.com/Microsoft/vscode", + "https://github.com/aosp-mirror", + "https://github.com/atom/atom", + "https://github.com/django/django", + "https://github.com/jupyter/notebook", + "https://github.com/kennethreitz/requests", + "https://github.com/matplotlib/matplotlib", + "https://github.com/mitsuhiko/flask", + "https://github.com/mozilla/gecko-dev", + "https://github.com/naucse/prezencka", + "https://github.com/numpy/numpy", + "https://github.com/pytest-dev/pytest/", + "https://github.com/python/cpython", + "https://github.com/pyvec/naucse.python.cz", + "https://github.com/torvalds/linux", + "https://gitlab.com/", + "https://launchpad.net/", + "https://opensource.org/licenses", + "https://pagure.io/", + "https://www.gnu.org/gnu/manifesto.en.html", + "naucse:static?filename=gh-workflow-diagram.svg" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/collaboration/index.md", @@ -1295,7 +2107,27 @@ "content": { "path": "ignoring/index.html" }, + "ids": [ + "automaticke_pridavani", + "dalsi_haraburdi", + "format_ignorovaciho_souboru", + "ignorovani_souboru", + "osobni_poznamky", + "priprava", + "vystupy_programu_a_pomocne_soubory_spolecnych_nastroju" + ], "license": "cc-by-sa-40", + "links": [ + "#automaticke_pridavani", + "#dalsi_haraburdi", + "#format_ignorovaciho_souboru", + "#ignorovani_souboru", + "#osobni_poznamky", + "#priprava", + "#vystupy_programu_a_pomocne_soubory_spolecnych_nastroju", + "https://git-scm.com/docs/gitignore", + "https://inkscape.org/" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/ignoring/index.md", @@ -1318,7 +2150,24 @@ "content": { "path": "install/index.1.html" }, + "ids": [ + "config", + "git", + "linux", + "macos", + "nastaveni", + "windows" + ], "license": "cc-by-sa-40", + "links": [ + "#config", + "#git", + "#linux", + "#macos", + "#nastaveni", + "#windows", + "https://git-scm.org" + ], "slug": "index", "solutions": [], "source_file": "lessons/git/install/index.md", @@ -1341,7 +2190,34 @@ "content": { "path": "json/index.html" }, + "ids": [ + "hezky_vystup", + "jina_kodovani", + "json", + "kodovani", + "kodovani_dat", + "toml", + "typy", + "yaml" + ], "license": "cc-by-sa-40", + "links": [ + "#hezky_vystup", + "#jina_kodovani", + "#json", + "#kodovani", + "#kodovani_dat", + "#toml", + "#typy", + "#yaml", + "http://en.wikipedia.org/wiki/Bencode", + "http://json.org/", + "http://www.yaml.org/", + "https://docs.python.org/3/library/json.html", + "https://docs.python.org/3/library/pickle.html", + "https://github.com/toml-lang/toml", + "https://yaml.org/" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/json/index.md", @@ -1365,7 +2241,40 @@ "content": { "path": "pyglet/index.html" }, + "ids": [ + "animace", + "cas_", + "grafika", + "interaktivni_programy", + "klik_", + "pokracovani_priste", + "pyglet_", + "text", + "vykreslovani_", + "zavolej_pozdeji" + ], "license": "cc-by-sa-40", + "links": [ + "#animace", + "#cas_", + "#grafika", + "#interaktivni_programy", + "#klik_", + "#pokracovani_priste", + "#pyglet_", + "#text", + "#vykreslovani_", + "#zavolej_pozdeji", + "http://pyglet.readthedocs.org/en/latest/index.html", + "https://cs.wikipedia.org/wiki/Sprite_%28po%C4%8D%C3%ADta%C4%8Dov%C3%A1_grafika%29", + "https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf", + "https://www.google.cz/search?tbs=ift:png&tbm=isch&q=snake+icon", + "naucse:page?lesson=beginners/functions", + "naucse:page?lesson=projects/pong", + "naucse:static?filename=had.png", + "naucse:static?filename=had2.png", + "naucse:static?filename=pong.py" + ], "slug": "index", "solutions": [], "source_file": "lessons/intro/pyglet/index.md", @@ -1401,7 +2310,62 @@ "content": { "path": "turtle/index.html" }, + "ids": [ + "_", + "a_kde_je_ta_zelva", + "ctverec", + "ctverec_ii", + "dlouha_prerusovana_cara", + "jak_opakovat_a_neopakovat_emseem", + "obdelnik", + "otaceni", + "prerusovana_cara", + "range", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "solution-5", + "solution-6", + "solution-7", + "tri_ctverce", + "ukol_navic", + "vycet", + "zelvi_program" + ], "license": "cc-by-sa-40", + "links": [ + "#_", + "#a_kde_je_ta_zelva", + "#ctverec", + "#ctverec_ii", + "#dlouha_prerusovana_cara", + "#jak_opakovat_a_neopakovat_emseem", + "#obdelnik", + "#otaceni", + "#prerusovana_cara", + "#range", + "#tri_ctverce", + "#ukol_navic", + "#vycet", + "#zelvi_program", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:solution?solution=5", + "naucse:solution?solution=6", + "naucse:solution?solution=7", + "naucse:static?filename=turtle-dashed.png", + "naucse:static?filename=turtle-dashed2.png", + "naucse:static?filename=turtle-hexagons.png", + "naucse:static?filename=turtle-rect.png", + "naucse:static?filename=turtle-square.png", + "naucse:static?filename=turtle-squares.png", + "naucse:static?filename=turtle-stairs.png" + ], "slug": "index", "solutions": [ { @@ -1471,7 +2435,38 @@ "content": { "path": "asteroids/index.html" }, + "ids": [ + "asteroidy", + "dokonceni_a_rozsireni", + "hra_typu_asteroids", + "kolize", + "utok", + "vesmirna_lod" + ], "license": "cc-by-sa-40", + "links": [ + "#asteroidy", + "#dokonceni_a_rozsireni", + "#hra_typu_asteroids", + "#kolize", + "#utok", + "#vesmirna_lod", + "http://kenney.nl", + "http://opengameart.org/content/smoke-particle-assets", + "http://opengameart.org/content/space-shooter-redux", + "http://pyglet.readthedocs.org/en/latest/programming_guide/text.html", + "https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset", + "https://docs.python.org/3/tutorial/datastructures.html#sets", + "https://en.wikipedia.org/wiki/Asteroids_%28video_game%29", + "https://en.wikipedia.org/wiki/Wraparound_%28video_games%29", + "https://github.com/pyvec/cheatsheets/blob/master/sets/sets-cs.pdf", + "https://pyglet.readthedocs.io/en/latest/modules/math.html#pyglet.math.Mat4", + "https://pyglet.readthedocs.io/en/latest/programming_guide/migration.html?highlight=matrix#window-projection-and-cameras", + "https://pyglet.readthedocs.io/en/latest/programming_guide/shapes.html", + "https://pythonhosted.org/pyglet/api/pyglet.graphics.Batch-class.html", + "naucse:page?lesson=beginners/inheritance", + "naucse:static?filename=screenshot.png" + ], "slug": "index", "solutions": [], "source_file": "lessons/projects/asteroids/index.md", @@ -1498,7 +2493,31 @@ "content": { "path": "github-api/index.html" }, + "ids": [ + "api_githubu", + "autorizace", + "interakce", + "requests", + "uzivatelsky_ucet", + "webove_api" + ], "license": "cc-by-sa-40", + "links": [ + "#api_githubu", + "#autorizace", + "#interakce", + "#requests", + "#uzivatelsky_ucet", + "#webove_api", + "https://api.github.com/emojis", + "https://developer.github.com/v3/", + "https://docs.github.com/en/rest/reference/activity#star-a-repository-for-the-authenticated-user", + "https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods", + "https://github.com", + "https://github.com/pyvec/naucse.python.cz/stargazers", + "https://github.com/settings/tokens", + "naucse:page?lesson=intro/json" + ], "slug": "index", "solutions": [], "source_file": "lessons/projects/github-api/index.md", @@ -1521,7 +2540,47 @@ "content": { "path": "pong/index.html" }, + "ids": [ + "dynamika_hry", + "konstanty_a_stav_hry", + "odrazeni_micku", + "pohyb_palek", + "pong", + "rozehrani", + "solution-0", + "solution-1", + "solution-2", + "solution-3", + "solution-4", + "solution-5", + "vstup_od_uzivatele", + "vykresleni_hraci_plochy", + "zaver" + ], "license": "cc-by-sa-40", + "links": [ + "#dynamika_hry", + "#konstanty_a_stav_hry", + "#odrazeni_micku", + "#pohyb_palek", + "#pong", + "#rozehrani", + "#vstup_od_uzivatele", + "#vykresleni_hraci_plochy", + "#zaver", + "https://en.wikipedia.org/wiki/Atari,_Inc.", + "https://en.wikipedia.org/wiki/Pong", + "https://www.youtube.com/watch?v=fiShX2pTz9A", + "naucse:page?lesson=intro/pyglet", + "naucse:solution?solution=0", + "naucse:solution?solution=1", + "naucse:solution?solution=2", + "naucse:solution?solution=3", + "naucse:solution?solution=4", + "naucse:solution?solution=5", + "naucse:static?filename=pong.png", + "naucse:static?filename=pong.py" + ], "slug": "index", "solutions": [ { diff --git a/pyladies/def/index.html b/pyladies/def/index.html index 270d1ea8..1e6014f4 100644 --- a/pyladies/def/index.html +++ b/pyladies/def/index.html @@ -1,12 +1,12 @@

        Definice funkcí -# +#

        Dříve jsme volali funkce, které napsal někdo jiný:

        print('Ahoj světe!')
         

        Dnes si ukážeme, jak psát funkce vlastní.

        K čemu jsou funkce? -# +#

        Často se stává, že kód, který dělá nějakou jednoduchou věc, není úplně jednoduchý. @@ -37,12 +37,12 @@

        K čemu jsou funkce?

        Funkce umožňuje pojmenovat nějaký kousek programu, který se pak dá použít pomocí jména bez detailních znalostí toho, jak to vevnitř funguje.

        Definice funkce -# +#

        Protože už znáš if a for, které mají jednořádkovou hlavičku a odsazené tělo příkazu, neměl by ti zápis funkce připadat příliš zvláštní:

        def zamen(slovo, pozice, novy_znak):
        -    """V daném slově zamění znak na dané pozici za daný nový znak."""
        +    """V daném slově zamění znak na dané pozici za daný nový znak."""
             zacatek = slovo[:pozice]
             konec = slovo[pozice + 1:]
             nove_slovo = zacatek + novy_znak + konec
        @@ -79,7 +79,7 @@ 

        Definice funkce

        Tělo funkce může mít více příkazů – včetně podmínek, cyklů a podobně. Následující procedura třeba vypíše skóre daného hráče a k tomu hlášku:

        def napis_hlasku(nazev, skore):
        -    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
        +    """Popíše skóre. Název má být přivlastňovací přídavné jméno."""
         
             print(nazev, 'skóre je', skore)
             if skore > 1000:
        @@ -96,7 +96,7 @@ 

        Definice funkce napis_hlasku('Tvoje', 256) napis_hlasku('Protivníkovo', 5)

        Cvičení -# +#

        Zkus napsat funkci, která vrátí obsah obdélníka daných rozměrů. Příslušný vzoreček je S = a×b, @@ -115,7 +115,7 @@

        Řešení

        Vracení ukončuje funkci -# +#

        Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou návratovou hodnotu ven z funkce a zároveň ukončí provádění funkce.

        @@ -144,7 +144,7 @@

        Řešení

        def ano_nebo_ne(otazka):
        -     """Vrátí True nebo False podle odpovědi uživatele"""
        +     """Vrátí True nebo False podle odpovědi uživatele"""
             while True:
                 odpoved = input(otazka)
                 if odpoved == 'ano':
        diff --git a/pyladies/dict-with-list-values/index.html b/pyladies/dict-with-list-values/index.html
        index b3d9afc9..4118e383 100644
        --- a/pyladies/dict-with-list-values/index.html
        +++ b/pyladies/dict-with-list-values/index.html
        @@ -1,5 +1,5 @@
         

        Více hodnot v jednom záznamu slovníku -# +#

        Ke každému klíči může patřit jen jedna hodnota. Jak bys zařídil/a, aby hodnot bylo víc?

        diff --git a/pyladies/dict/index.html b/pyladies/dict/index.html index 0d29c912..748f4a20 100644 --- a/pyladies/dict/index.html +++ b/pyladies/dict/index.html @@ -1,5 +1,5 @@

        Slovníky -# +#

        Další základní datový typ, který si představíme – po číslech, řetězcích, seznamech a n-ticích – @@ -34,7 +34,7 @@

        Slovníky

        Naopak to nejde – slovník neumožňuje podle hodnoty přímo zjistit klíč. Na překlad z angličtiny do češtiny bys potřeboval/a druhý slovník.

        Měnění slovníků -# +#

        Co se stane, když klíč ve slovníku není?

        >>> slovnik['Pes']
        @@ -72,7 +72,7 @@ 

        Slovníky >>> 'Mouse' in slovnik False

        Iterace -# +#

        Když slovník projdeš cyklem for, dostaneš klíče jednotlivých záznamů:

        >>> for klic in slovnik:
        @@ -105,7 +105,7 @@ 

        Slovníky RuntimeError: dictionary changed size during iteration

        Hodnoty u už existujících klíčů ale měnit můžeš.

        Jak udělat slovník -# +#

        Slovník se dá vytvořit několika způsoby. První, pomocí složených závorek, jsi už viděl/a. @@ -139,7 +139,7 @@

        Jak udělat slovník Například takhle nejde zadat jako klíč řetězec "def" nebo "propan-butan".

        Zaplň prázdný slovník -# +#

        Nejobecnější způsob vytváření slovníků je podobný tomu co znáš u seznamů: vytvoř prázdný slovník a postupně do něj přidávej záznamy, jeden za druhým.

        @@ -160,7 +160,7 @@

        Jak udělat slovník print(barvy_po_tydnu['jablko'])

        Typy klíčů a hodnot -# +#

        Do slovníku můžeš uložit jakoukoli hodnotu: řetězce, seznamy, nebo čísla.

        uzivatel = {'jméno': 'Amálka', 'velikost nohy': 36, 'oblíbená čísla': [5, 27]}
        @@ -185,7 +185,7 @@ 

        Jak udělat slovník File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'

        A to je zatím ke slovníkům vše -# +#

        Chceš-li mít všechny triky, které slovníky umí, pěkně pohromadě, můžeš si stáhnout diff --git a/pyladies/exceptions/index.html b/pyladies/exceptions/index.html index 7f42a513..578036e1 100644 --- a/pyladies/exceptions/index.html +++ b/pyladies/exceptions/index.html @@ -1,11 +1,11 @@

        Výjimky -# +#

        Pojďme si prohloubit znalosti o chybách, neboli odborně o výjimkách (angl. exceptions).

        Podívej se na následující funkci:

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             odpoved = input('Zadej číslo: ')
             return int(odpoved)
         

        Když uživatel nezadá číslice, ale třeba text cokolada, @@ -13,7 +13,7 @@

        Výjimky odpovídající chybovou hlášku:

        Traceback (most recent call last):
           File "ukazka.py", line 4, in nacti_cislo
        -    cislo = int(odpoved)
        +    cislo = int(odpoved)
         ValueError: invalid literal for int() with base 10: 'cokolada'
         

        Program volá funkci int() pro něco, co nedává smysl jako číslo. Co s tím má chudák funkce int dělat? @@ -25,7 +25,7 @@

        Výjimky Kdybys měl/a funkci, která zjistí jestli jsou v řetězci jen číslice, mohlo by to fungovat nějak takhle:

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             while True:
                 odpoved = input('Zadej číslo: ')
                 if obsahuje_jen_cislice(odpoved):
        @@ -54,11 +54,11 @@ 

        Výjimky

        Chceš-li zjistit, jestli funkce int umí daný řetězec převést na číslo, nejlepší je použít přímo funkci int.

        Ošetření chyby -# +#

        Pro zachycení chyby má Python příkaz try/except.

        def nacti_cislo():
        -    """Získá od uživatele celé číslo a vrátí ho"""
        +    """Získá od uživatele celé číslo a vrátí ho"""
             while True:
                 odpoved = input('Zadej číslo: ')
                 try:
        @@ -72,7 +72,7 @@ 

        Výjimky v bloku except. Pokud výjimka nenastala, přeskočí se celý blok except.

        Druhy chyb -# +#

        A co je to ValueError? To je typ chyby. Podobných typů je spousta. @@ -101,7 +101,7 @@

        Druhy chyb například except ArithmeticError: zachytí i ZeroDivisionError. A except Exception: zachytí všechny výjimky, které běžně chceš zachytit.

        Nechytej je všechny! -# +#

        Většinu chyb není potřeba ošetřovat.

        Nastane-li nečekaná situace, je téměř vždy @@ -122,7 +122,7 @@

        Nechytej je všechny! Neboli vypsat chybovou hlášku. A to se stane normálně, bez try.

        Další přílohy k try -# +#

        Pro úplnost: kromě except existují dva jiné bloky, které můžeš „přilepit“ k try, a to else a finally. @@ -148,7 +148,7 @@

        Další přílohy k try finally: print('Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`')

        Vyvolání chyby -# +#

        Občas se stane, že výjimku budeš potřebovat vyvolat sám/sama.

        Často se to stává, když píšeš nějakou obecnou funkci. @@ -174,7 +174,7 @@

        Další přílohy k try Chybu můžeš vyvolat pomocí příkazu raise. Za příkaz dáš druh výjimky a pak do závorek nějaký popis toho, co je špatně.

        def obsah_ctverce(strana):
        -    """Vrátí obsah čtverce s danou délkou strany"""
        +    """Vrátí obsah čtverce s danou délkou strany"""
             if strana > 0:
                 return strana ** 2
             else:
        diff --git a/pyladies/expressions/index.html b/pyladies/expressions/index.html
        index d6deb629..ebe5dfcc 100644
        --- a/pyladies/expressions/index.html
        +++ b/pyladies/expressions/index.html
        @@ -1,5 +1,5 @@
         

        Vyhodnocování výrazů -# +#

        Už víš, že Python se dá použít jako kalkulačka: dokáže spočítat hodnotu výrazu (angl. expression) jako 3 * (5 + 2). diff --git a/pyladies/files/index.html b/pyladies/files/index.html index ebb326ba..4857abe5 100644 --- a/pyladies/files/index.html +++ b/pyladies/files/index.html @@ -1,5 +1,5 @@

        Soubory -# +#

        Dnes se podíváme na to, jak v Pythonu číst z (a pak i zapisovat do) souborů.

        @@ -36,7 +36,7 @@

        Soubory najednou přečte celý obsah souboru a vrátí ho jako řetězec. Nakonec metoda close() otevřený soubor zase zavře.

        Automatické zavírání souborů -# +#

        Soubory se dají přirovnat k ledničce: abys něco mohl/a z ledničky vzít, nebo dát dovnitř, musíš @@ -66,7 +66,7 @@

        Automatické zavírání souborů Když se Python dostane na konec odsazeného bloku, soubor automaticky zavře.

        V naprosté většině případů je pro otevírání souborů nejlepší použít with.

        Iterace nad soubory -# +#

        Otevřené soubory se, jako např. řetězce či range, dají použít s příkazem for. @@ -115,7 +115,7 @@

        Řešení

        print() print('Jak se ti líbí?')

        Psaní souborů -# +#

        Pozor!

        Pro Python není problém smazat obsah jakéhokoli souboru. diff --git a/pyladies/first-steps/index.html b/pyladies/first-steps/index.html index f1ef9e68..55fdb14c 100644 --- a/pyladies/first-steps/index.html +++ b/pyladies/first-steps/index.html @@ -1,5 +1,5 @@

        Interaktivní režim Pythonu -# +#

        Chceš-li si začít hrát s Pythonem, otevři příkazový řádek a aktivuj virtuální prostředí. Zkontroluj si, že ti na začátku příkazové řádky svítí (venv).

        @@ -26,7 +26,7 @@

        Interaktivní režim Pythonu V průběhu kurzu jich uvidíš ještě spoustu, takže si ji dobře prohlédni, ať ji příště poznáš.

        První příkaz -# +#

        Třemi „zobáčky“ >>> Python prosí o instrukce. Pojď mu nějakou dát!

        @@ -66,7 +66,7 @@

        První příkaz v těchto materiálech. Kód je pak čitelnější.

        Ukončení -# +#

        Pokud ses dostal/a až sem, gratuluji! Python máš nejen nainstalovaný, ale taky ti funguje. diff --git a/pyladies/fstring/index.html b/pyladies/fstring/index.html index 7885da6b..80def15a 100644 --- a/pyladies/fstring/index.html +++ b/pyladies/fstring/index.html @@ -1,5 +1,5 @@

        Šablony (formátovací řetězce) -# +#

        Řekněme, že chceš uživateli vypsat určitou hodnotu s nějakou „omáčkou“ okolo. Dá se na to použít print(), kterému můžeš předat „mix“ řetězců a čísel:

        @@ -44,15 +44,15 @@

        Šablony (formátovací řetězce) Váš výsledek je {soucet}. S pozdravem, -{podpis} +{podpis} """)

        A nakonec – v šabloně můžeš použít nejen jména proměnných, ale jakékoli výrazy.

        -
        >>> hlaska = f'Součet je {3 + 4}'
        +
        >>> hlaska = f'Součet je {3 + 4}'
         

        Ale nepřežeň to! Většinou je program přehlednější, když si každou vypisovanou hodnotu zvlášť pojmenuješ – tedy uložíš do vhodně pojmenované proměnné.

        Metoda format -# +#

        Někdy se stane, že jednu šablonu potřebuješ použít vícekrát. Pak formátovací řetězec použít nemůžeš, protože se do něj proměnné doplňují diff --git a/pyladies/functions/index.html b/pyladies/functions/index.html index 3c02f37c..0d8b8c3e 100644 --- a/pyladies/functions/index.html +++ b/pyladies/functions/index.html @@ -1,5 +1,5 @@

        Funkce -# +#

        Známe spoustu matematických operací, které se zapisují pomocí symbolů – třeba plus a minus. @@ -63,7 +63,7 @@

        Funkce .

        Všechno ostatní vyjádříme slovně.

        Délka řetězce -# +#

        Jedna operace, na kterou v Pythonu není symbol, je zjištění délky řetězce. Místo symbolu má název. @@ -89,7 +89,7 @@

        Délka řetězce i když se stejně jmenují a podobně zapisují. Pythonní funkce může např. mít pro stejný argument různé hodnoty.

        Volání funkce jako výraz -# +#

        Vzpomínáš si, jak Python vyhodnocuje výrazy?

        vysledek = 3 * (5 + 2)
        @@ -134,7 +134,7 @@ 

        Délka řetězce print( 9 )

        … a podobně.

        Procedury -# +#

        Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") je taky volání funkce. @@ -164,7 +164,7 @@

        Procedury Kdybys o něm diskutoval/a s nějakým zkušeným programátorem, odkaž ho prosím na tyto materiály.

        Argumenty -# +#

        Argument je to, co funkci dáš k dispozici. Hodnota, se kterou funkce pracuje. Chceš-li délku řetězce Ahoj!, použiješ funkci len která umí vypočítat @@ -191,7 +191,7 @@

        Řešení

        Funkce print zavolaná bez argumentů napíše prázdný řádek.

        Pojmenované argumenty -# +#

        Některé funkce umí pracovat i s pojmenovanými argumenty. Píšou se podobně jako přiřazení do proměnné, @@ -209,7 +209,7 @@

        Řešení

        print(1 + 2, end='!') print()

        Funkce je potřeba volat -# +#

        Pozor na to, že když nenapíšeš závorky, funkce se nezavolá! Výraz len(s) je volání funkce, ale len bez závorek označuje @@ -224,7 +224,7 @@

        Řešení

        print(len) # Vypsání samotné funkce print(len + 1) # Sečtení funkce a čísla

        Přehled funkcí -# +#

        A jaké funkce můžeš, kromě len a print, použít? Přehled těch základních najdeš v následující lekci.

        \ No newline at end of file diff --git a/pyladies/github-api/index.html b/pyladies/github-api/index.html index fb899589..f6e8976b 100644 --- a/pyladies/github-api/index.html +++ b/pyladies/github-api/index.html @@ -1,5 +1,5 @@

        Webové API -# +#

        Jak už bylo řečeno v lekci o JSON, hlavní výhoda formátu JSON je, že se na Internetu rozšířil nejvíc. @@ -14,7 +14,7 @@

        Webové API

        Z minulých lekcí bys měl/a mít založený účet na github.com. Podívejme se na to, jak se zeptat Githubu, co o tobě ví.

        Autorizace -# +#

        První, a mnohdy nejsložitější, krok k použití API je přihlášení. Počítače se totiž přihlašují jinak @@ -34,11 +34,11 @@

        Autorizace

        Obsah tokenu se ti zobrazí pouze jednou, hned po vytvoření. Když ho zapomeneš, deaktivuj ho a vytvoř si nový.

        Requests -# +#

        K práci s internetovými stránkami použijeme knihovnu Requests. V aktivovaném virtuálním prostředí si ji nainstaluj příkazem:

        -
        (venv)$ python -m pip install requests
        +
        (venv)$ python -m pip install requests
         

        A potom v Pythonu zkus stáhnout nějakou stránku:

        import requests
         
        @@ -58,7 +58,7 @@ 

        Requests

        Ale my nechceme obsah pro lidi. Podívejme se, co Github zpřístupňuje počítačům.

        Uživatelský účet -# +#

        Zkus, co dělá tento kód:

        import requests
        @@ -91,7 +91,7 @@ 

        Uživatelský účet Třeba adresu svého profilového obrázku můžeš vypsat pomocí:

        print(data['avatar_url'])
         

        API Githubu -# +#

        API Githubu toho umí mnohem víc. Třeba na adrese https://api.github.com/emojis na tebe čeká @@ -100,7 +100,7 @@

        Uživatelský účet Celé API je zdokumentováno na adrese developer.github.com.

        Interakce -# +#

        Pomocí webových API se dají informace nejen číst, ale i měnit.

        Na stránce diff --git a/pyladies/hello-world/index.html b/pyladies/hello-world/index.html index 8fca0803..cee6ee22 100644 --- a/pyladies/hello-world/index.html +++ b/pyladies/hello-world/index.html @@ -1,5 +1,5 @@

        První program -# +#

        >>> 3 + 4
         7
        @@ -23,7 +23,7 @@ 

        První program

        Pokud máš v ukládacím okýnku možnost zvolit kódování, zvol UTF-8. Můžeš–li zvolit typ souboru, zvol .py nebo „všechny soubory“.

        Spuštění -# +#

        Otevři si příkazovou řádku. Pomocí cd donaviguj do adresáře, kde máš soubory ke kurzům Pythonu.

        @@ -34,7 +34,7 @@

        Spuštění

        Příkaz k tomu jsme si ukázali na konci návodu na tvorbu virtuálního prostředí; končí activate.

        Pak a zadej tento příkaz:

        -
        (venv)$ python ahoj.py
        +
        (venv)$ python ahoj.py
         

        Pokud se vypíše hláška Ahoj světe!, gratuluji! Napsal/a jsi svůj první program v Pythonu!

        Jestli to nefunguje, zkontroluj, že:

        diff --git a/pyladies/ignoring/index.html b/pyladies/ignoring/index.html index e546d629..0e7d669e 100644 --- a/pyladies/ignoring/index.html +++ b/pyladies/ignoring/index.html @@ -1,5 +1,5 @@

        Ignorování souborů -# +#

        Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:

        @@ -34,7 +34,7 @@

        Ignorování souborů

        My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby git status neukazoval červeně, že ještě nejsou v repozitáři.

        Příprava -# +#

        Pojďme si to ukázat na příkladu. Založ si nový repozitář a vytvoř v něm tři soubory s tímto obsahem:

        @@ -80,7 +80,7 @@

        Příprava nothing added to commit but untracked files present (use "git add" to track)

        Spousta souborů, ale jen jeden z nich chceš v repozitáři. Co s těmi ostatními?

        Výstupy programu a pomocné soubory společných nástrojů -# +#

        Nejjednodušší je vyrovnat se se souborem obrazek.ps. V repozitáři ho nechceš (je to repozitář zdrojového kódu; výsledky bývá @@ -126,7 +126,7 @@

        Výstupy program .gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

        Jak ignorovat zbylé dva soubory?

        Osobní poznámky -# +#

        Soubor poznamky.txt se taky dá zařadit do .gitignore, ale moc se tam nehodí. Existuje jen u tebe; není důvod předpokládat, že si někdo jiný vytvoří @@ -153,7 +153,7 @@

        Osobní poznámky Untracked files: (use "git add <file>..." to include in what will be committed) Autofile.tmp

        Další haraburdí -# +#

        Některé programy automaticky vytvářejí pomocné soubory. Často to dělají správci souborů (často .Thumbnails na Linuxu, @@ -182,7 +182,7 @@

        Osobní poznámky (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: obrazek.py

        Formát ignorovacího souboru -# +#

        Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: každý na zvláštní řádek. @@ -197,13 +197,13 @@

        Osobní poznámky

        Další detaily je možné najít v dokumentaci.

        Automatické přidávání -# +#

        Teď, když umíš ignorovat soubory, si můžeme ukázat zkratku. Místo

        -
        $ git add soubor1 soubor2
        -$ git commit
        +
        $ git add soubor1 soubor2
        +$ git commit
         

        můžeš napsat jen git commit s tečkou na konci:

        -
        $ git commit .
        +
        $ git commit .
         

        To automaticky přidá všechny neignorované soubory, které git status ukazuje červeně. Tečka je jméno pro aktuální adresář – celý adresář a všechno pod ním se přidá @@ -213,5 +213,5 @@

        Automatické přidávání

        Taky doporučuji si nastavit Git, aby se v editoru, kam píšeš popisek revize, ukazovala poznámka s tím, co vlastně v nové revizi bude. Uvidíš tak něco jako git status vždy, když začneš psát popisek k revizi:

        -
        $ git config --global commit.verbose 1
        +
        $ git config --global commit.verbose 1
         
        \ No newline at end of file diff --git a/pyladies/inheritance/index.html b/pyladies/inheritance/index.html index 6b0d2653..6f0d2aad 100644 --- a/pyladies/inheritance/index.html +++ b/pyladies/inheritance/index.html @@ -1,5 +1,5 @@

        Dědičnost -# +#

        Minule jsme probrali třídy. Jako příklad jsme si ukázali třídu pro koťátka:

        @@ -77,7 +77,7 @@

        Dědičnost Takže všechno, co je definované pro Zviratko, platí i pro koťátka – dokud to výslovně nezměníš.

        Přepisování metod a super() -# +#

        Když se ti nebude líbit chování některé metody v nadtřídě, stačí dát metodu stejného jména do @@ -125,7 +125,7 @@

        Přepisování metod a super()< kombinovat se speciálními metodami jako __init__. Dokonce se to dělá poměrně často!

        Polymorfismus -# +#

        Programátoři nezavedli dědičnost jen proto, že jsou líní a nechtějí psát dvakrát stejný kód. @@ -166,7 +166,7 @@

        Polymorfismus Liskovové substituční princip, jde o právě tento problém.)

        Generalizace -# +#

        Když se teď podíváš na funkce zamnoukej a zastekej, možná tě napadne, že by se diff --git a/pyladies/install-editor/atom.html b/pyladies/install-editor/atom.html index b8da122f..39dbf04b 100644 --- a/pyladies/install-editor/atom.html +++ b/pyladies/install-editor/atom.html @@ -1,11 +1,11 @@

        Instalace Atomu -# +#

        Editor Atom si stáhni z jeho domovské stránky a nainstaluj.

        Nastavení -# +#

        V Atomu se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

        Odsazování a obarvování bude fungovat správně jen v souborech s koncovkou .py @@ -14,7 +14,7 @@

        Nastavení

        Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Kontrola stylu zdrojového kódu -# +#

        Jedna věc nám v Atomu přeci jen chybí: plugin pro kontrolu správného stylu zdrojového kódu.

        @@ -28,7 +28,7 @@

        Kontrola stylu zdrojového kódu který tě na jejich porušení upozorní.

        Nejprve je potřeba si nainstalovat speciální knihovnu, která se o kontrolu dokáže postarat. Do příkazové řádky zadej následující:

        -
        $ python -m pip install flake8
        +
        $ python -m pip install flake8
         

        A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber „Soubor > Nastavení/File > Settings“ a v nabídce uprostřed okna vyber poslední položku @@ -37,7 +37,7 @@

        Kontrola stylu zdrojového kódu na tlačítko „Instalovat/Install“. Bude ještě potřeba schválit instalaci všech závislostí, na které se Atom postupně zeptá.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install-editor/gedit.html b/pyladies/install-editor/gedit.html index 10b019e4..edc59195 100644 --- a/pyladies/install-editor/gedit.html +++ b/pyladies/install-editor/gedit.html @@ -1,14 +1,14 @@

        Instalace Geditu -# +#

        Na Linuxu se Gedit instaluje jako ostatní programy:

        -
        Fedora
        $ sudo dnf install gedit
        -
        Ubuntu
        $ sudo apt-get install gedit
        +
        Fedora
        $ sudo dnf install gedit
        +
        Ubuntu
        $ sudo apt-get install gedit
         

        Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

        Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

        Nastavení -# +#

        Gedit se nastavuje v Předvolbách (Preferences).

        @@ -28,7 +28,7 @@

        Nastavení

        Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install-editor/index.html b/pyladies/install-editor/index.html index 149d1c70..6eeebbff 100644 --- a/pyladies/install-editor/index.html +++ b/pyladies/install-editor/index.html @@ -1,5 +1,5 @@

        Instalace editoru -# +#

        Editor, program na úpravu textu, je základní pomůcka každého programátora, @@ -12,7 +12,7 @@

        Instalace editoru nebude ti stačit. Stejně tak nejsou vhodné programy jako Word či Writer.

        Co programátorský editor umí -# +#

        Editor pro programátory nám umožňuje upravovat prostý text – písmenka. Na rozdíl od programů jako Word, Writer či Pages neumožňuje text formátovat, @@ -51,7 +51,7 @@

        Co programátorský editor umí 9 except TemplateNotFound: 10 abort(404)

        Volba a nastavení editoru -# +#

        Vybereš-li editor, klikni na jeho jméno a dostaneš se na instrukce ke stažení a nastavení. @@ -86,7 +86,7 @@

        Co programátorský editor umí si že je správně nastaven.

        IDE -# +#

        Existují i složitější a mocnější editory, takzvané IDE (angl. Integrated Development Environment, integrované vývojové prostředí), diff --git a/pyladies/install-editor/kate.html b/pyladies/install-editor/kate.html index 1edddb3b..d2b4d4f3 100644 --- a/pyladies/install-editor/kate.html +++ b/pyladies/install-editor/kate.html @@ -1,14 +1,14 @@

        Instalace Kate -# +#

        Na Linuxu se Kate instaluje jako ostatní programy:

        -
        Fedora
        $ sudo dnf install kate
        -
        Ubuntu
        $ sudo apt-get install kate
        +
        Fedora
        $ sudo dnf install kate
        +
        Ubuntu
        $ sudo apt-get install kate
         

        Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

        Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

        Nastavení -# +#

        Číslování řádků

        V menu Pohled/View vyber @@ -30,7 +30,7 @@

        Nastavení

        Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install-editor/notepad-plus-plus.html b/pyladies/install-editor/notepad-plus-plus.html index 8ec767cb..9a3b24da 100644 --- a/pyladies/install-editor/notepad-plus-plus.html +++ b/pyladies/install-editor/notepad-plus-plus.html @@ -1,11 +1,11 @@

        Instalace Notepadu++ -# +#

        Notepad++ je k dispozici pouze pro Windows.

        Stáhni jej z jeho domovské stránky a nainstaluj.

        Nastavení -# +#

        Odsazování

        V menu Nastavení zvol Předvolby a pak nastav @@ -17,7 +17,7 @@

        Nastavení

        Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install-editor/others.html b/pyladies/install-editor/others.html index 3f1ecc53..90afd615 100644 --- a/pyladies/install-editor/others.html +++ b/pyladies/install-editor/others.html @@ -1,19 +1,19 @@

        Instalace editoru -# +#

        Používáš-li editor, pro který nemáme instrukce, budeš ho muset nastavit sám/sama. Tady je pár tipů, na co si dát pozor.

        Nastavení -# +#

        Číslování řádků -# +#

        Ujisti se, že ti editor čísluje řádky. Pokud ne, podívej se do nastavení a zjisti, jak se to zapíná.

        Obarvování -# +#

        Ulož soubor s koncovkou .py – například zkouska.py – a zkopíruj do něj následující program:

        @@ -23,7 +23,7 @@

        Obarvování je tvůj editor nastavený správně. Jinak se podívej do nastavení a zjisti, jak se to zapíná.

        Odsazování -# +#

        Stisknutím klávesy Tab na začatku řádku se vloží 4 mezery. Pro psaní a sdílení kódu v Pythonu je důležité, @@ -34,7 +34,7 @@

        Odsazování Tab vloží jiný počet než 4, podívej se do nastavení po možnostech jako „velikost odsazení“ nebo „nahrazovat tabulátory za mezery”.

        Kontrola stylu zdrojového kódu -# +#

        Editory často podporují instalaci pluginů, které mohou psaní kódu usnadnit a pomoci s jeho kontrolou. @@ -47,7 +47,7 @@

        Kontrola stylu zdrojového kódu v dokumentu PEP8.

        Zkus takový plugin pro svůj editor najít a nainstalovat.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install-editor/vscode.html b/pyladies/install-editor/vscode.html index f3b65548..a2f062f8 100644 --- a/pyladies/install-editor/vscode.html +++ b/pyladies/install-editor/vscode.html @@ -1,18 +1,18 @@

        Instalace Visual Studio Code -# +#

        Stažení a instalace -# +#

        Editor si můžeš stáhnout z jeho domovské stránky. Vyber na ní zelené tlačítko Download a vyber instalátor pro svůj systém. Dále se řiď instrukcemi instalátoru jako u každého jiného programu.

        Nastavení -# +#

        Ve Visual Studio Code se nemusí nic nastavovat, funguje „od výroby“ tak, jak má.

        Odesílání telemetrických dat -# +#

        Tento textový editor ale odesílá data o tvém používání (nejspíš včetně např. obsahu otevřených souborů). @@ -23,7 +23,7 @@

        Odesílání telemetrických dat

        Viz též původni postup v angličtině.

        Nácvik odsazování -# +#

        Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. Proto se nám bude hodit vědět, jak rychle odsazovat bloky textu. diff --git a/pyladies/install/index.1.html b/pyladies/install/index.1.html index 2570359d..c00835e2 100644 --- a/pyladies/install/index.1.html +++ b/pyladies/install/index.1.html @@ -1,5 +1,5 @@

        Git -# +#

        Další program, který budeme později potřebovat, nám později umožní (mimojiné) spolupracovat @@ -8,22 +8,22 @@

        Git Pojďme si ho nainstalovat a nastavit.

        Instalace je různá pro různé operační systémy, vyber ten svůj.

        Linux -# +#

        Instalaci na Linux zvládneme jedním příkazem:

        Fedora, RHEL:

        -
        $ sudo dnf install git gitk git-gui nano
        +
        $ sudo dnf install git gitk git-gui nano
         

        Ubuntu, Debian:

        -
        $ sudo apt-get install git gitk git-gui nano
        +
        $ sudo apt-get install git gitk git-gui nano
         

        U jiných Linuxů předpokládám, že instalovat umíš; nainstaluj si git, gitk, git gui a nano.

        Jestli máš nainstalováno, ještě nastav Gitu editor. Pokud nemáš rád/a Vim (nebo nevíš co to je), zadej tento příkaz:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením níže.

        Windows -# +#

        Jdi na stránku git-scm.org, stáhni si Git a nainstaluj si ho.

        @@ -42,21 +42,21 @@

        Windows > git config --global gui.encoding utf-8

        A teď pokračuj v sekci Nastavení níže – macOS přeskoč.

        macOS -# +#

        Spusť v příkazové řádce git. Je-li už nainstalovaný, dozvíš se, jak ho používat (výpis začíná usage). Jinak ho nainstaluj pomocí Homebrew:

        -
        $ brew install git git-gui
        +
        $ brew install git git-gui
         

        Nainstalovanému Gitu je ještě potřeba nastavit editor (zadej nano, i když sis v rámci instalace editoru nainstaloval/a např. Atom). Dělá se to tímto příkazem:

        -
        $ git config --global core.editor nano
        +
        $ git config --global core.editor nano
         

        Dál pokračuj obecným nastavením:

        Nastavení -# +#

        Na projektu, který bude uložen v Gitu, může spolupracovat více lidí. @@ -64,8 +64,8 @@

        Nastavení potřeba říct jméno a e-mail. Do příkazové řádky zadej následující příkazy, změň v nich ale jméno a adresu:

        -
        $ git config --global user.name "Adéla Novotná"
        -$ git config --global user.email adela.novotna@example.cz
        +
        $ git config --global user.name "Adéla Novotná"
        +$ git config --global user.email adela.novotna@example.cz
         

        Můžeš samozřejmě použít i přezdívku, nebo dokonce falešný e-mail, ale v takovém případě bude složitější se zapojit do týmových projektů. @@ -80,11 +80,11 @@

        Nastavení

        Dále si můžeš nastavit barevné výpisy – pokud si tedy (jako někteří autoři Gitu) nemyslíš, že příkazová řádka má být černobílá:

        -
        $ git config --global color.ui true
        +
        $ git config --global color.ui true
         

        Spuštění git config nevypíše žádnou hlášku, že se operace povedla. To je normální; stejně se chová spousta dalších příkazů, např. cd.

        Aktuální konfiguraci gitu si můžeš zkontrolovat příkazem:

        -
        $ git config --global --list
        +
        $ git config --global --list
         user.name=Adéla Novotná
         user.email=adela.novotna@example.cz
         

        A to je vše! Git máš nainstalovaný. Gratuluji!

        \ No newline at end of file diff --git a/pyladies/install/index.html b/pyladies/install/index.html index ff966cda..c238b86c 100644 --- a/pyladies/install/index.html +++ b/pyladies/install/index.html @@ -1,5 +1,5 @@

        Instalace Pythonu -# +#

        V této sekci nainstalujeme Python.

        To se na každém druhu operačního systému dělá trošku jinak. diff --git a/pyladies/install/linux.html b/pyladies/install/linux.html index 8714817f..46ec84cf 100644 --- a/pyladies/install/linux.html +++ b/pyladies/install/linux.html @@ -1,16 +1,16 @@

        Instalace Pythonu na Linux -# +#

        Nainstalovat Pyhon na Linux je většinou jednoduché. Jen existuje spousta druhů Linuxu a máme s ním největší zkušenosti, tak jsou tyhle instrukce trochu delší. Nezalekni se – většinu sekcí pravděpodobně přeskočíš. :)

        Instalace Pythonu 3 -# +#

        Na Linuxu většinou Python 3 už bývá. Abys to zkontroloval/a, spusť v příkazové řádce příkaz:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Přejdi na další sekci, kontrolu tkinter.

        @@ -20,42 +20,42 @@

        Instalace Pythonu 3 doinstaluj Python. Konkrétní příkaz záleží na distribuci:

          -
        • Fedora:
          $ sudo dnf install python3
          +
        • Fedora:
          $ sudo dnf install python3
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3
          +
        • Ubuntu:
          $ sudo apt-get install python3
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        Kontrola Tkinter -# +#

        Některé linuxové distribuce obsahují standardně jen část celkové funkčnosti Pythonu. Konkrétně knihovnu tkinter (která umožňuje např. kreslit „želví obrázky“) často musíme nainstalovat zvlášť. Abys zjistil/a, jestli je už je nainstalovaná, zadej příkaz:

        -
        $ python3 -m tkinter
        +
        $ python3 -m tkinter
         

        Objeví-li se okýnko, je všechno v pořádku. Zavři ho a přejdi na doinstalování virtualenv.

        Jestli ne, modul tkinter ještě nainstaluj:

          -
        • Fedora:
          $ sudo dnf install python3-tkinter
          +
        • Fedora:
          $ sudo dnf install python3-tkinter
           
        • -
        • Ubuntu:
          $ sudo apt-get install python3-tk
          +
        • Ubuntu:
          $ sudo apt-get install python3-tk
           

        Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

        Doinstalování Virtualenv -# +#

        Novější verze Pythonu mají zabudovaný nástroj venv, který použijeme níže. Starší verze ho ale nemají (a některé distribuce Linuxu ho dokonce z Pythonu vyřadily). Potřebuješ proto zjistit, jestli venv máš, a případně nainstalovat alternativu.

        Spusť v příkazové řádce příkaz:

        -
        $ python3 -m ensurepip --version
        +
        $ python3 -m ensurepip --version
         

        Objeví-li se výpis začínající „pip“, máš funkční venv nainstalovaný. Zbytek této sekce můžeš přeskočit!

        Objeví-li se ale nápis No module named ensurepip, je potřeba doinstalovat @@ -63,7 +63,7 @@

        Doinstalování Virtualenv
          -
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
          +
        • Ubuntu:
          $ sudo apt-get install python-virtualenv
           

        Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

        diff --git a/pyladies/install/macos.html b/pyladies/install/macos.html index 0e3c99dc..428a02ef 100644 --- a/pyladies/install/macos.html +++ b/pyladies/install/macos.html @@ -1,15 +1,15 @@

        Instalace Pythonu pro macOS -# +#

        Nainstaluj si nástroj Homebrew, který řeší a zjednodušuje instalaci aplikací a knihoven, které budeme potřebovat pro programování. Jak na to?

        Spusť v příkazové řádce příkaz:

        -
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        +
        $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         

        Pak zadej následující příkaz a Python bude nainstalovaný:

        -
        $ brew install python3
        +
        $ brew install python3
         

        Zkontroluj si, že máš verzi 3.6 nebo vyšší:

        -
        $ python3 --version
        +
        $ python3 --version
         

        Objeví-li se „Python“ a číslo verze (např. Python 3.6.6) a verze je 3.6 nebo vyšší, máš nainstalováno. Jinak je něco špatně; diff --git a/pyladies/install/windows.html b/pyladies/install/windows.html index c75117a7..99135c9e 100644 --- a/pyladies/install/windows.html +++ b/pyladies/install/windows.html @@ -1,8 +1,8 @@

        Instalace Pythonu pro Windows -# +#

        Zjisti, jestli už máš Python nainstalovaný -# +#

        Otevři si příkazovou řádku (pokud nevíš o co jde, přečti si o ní tady).

        Napiš python a zmáčkni na klávesnici Enter. @@ -25,7 +25,7 @@

        Zjisti, jestli už máš Pyth

        Stažení -# +#

        • Běž na stahovací stránku
        • @@ -37,7 +37,7 @@

          Stažení Pokud máš novější počítač, téměř jistě budeš mít Windows 64bitové.

          Screenshot zjišťování verze systému

        Instalace -# +#

        Stažený instalátor spusť.

        Na začátku instalace zaškrtni:

        diff --git a/pyladies/interfaces/index.html b/pyladies/interfaces/index.html index cc28ccbf..a681ff19 100644 --- a/pyladies/interfaces/index.html +++ b/pyladies/interfaces/index.html @@ -1,5 +1,5 @@

        Rozhraní -# +#

        Už víš že funkce ti umožňují kousek kódu:

          @@ -24,12 +24,12 @@

          Rozhraní Tyhle parametry tvoří rozhraní, které umožňuje připojit jakýkoli spotřebič k jakékoli elektrárně.

          Rozhraní funkce -# +#

          Podívej se na tuhle hlavičku funkce. Je z ní poznat, co ta funkce dělá a jak ji použít?

          def ano_nebo_ne(otazka):
          -    """Zeptá se uživatele na otázku a vrátí True nebo False dle odpovědi"""
          +    """Zeptá se uživatele na otázku a vrátí True nebo False dle odpovědi"""
               ...
           

          Podobnou funkci už jsi napsal/a. Když zavoláš ano_nebo_ne('Chutná ti čokoláda?'), otázka se objeví @@ -37,7 +37,7 @@

          Rozhraní funkce Když uživatel odpoví, funkce vrátí True nebo False.

          Co kdybys ale měl/a následující funkci?

          def ano_nebo_ne(otazka):
          -    """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
          +    """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
               nebo False dle stisknutého tlačítka."""
               ...
           

          Screenshot s tlačítky Ano a Ne

          @@ -47,7 +47,7 @@

          Rozhraní funkce

          Z hlediska programu se nic nemění: jediné co se změní je definice funkce; volání a práce s návratovou hodnotou je pak stejné jako dřív.

          Vyzkoušej si to! -# +#

          Najdi nějaký svůj program, který používá ano_nebo_ne, případně jen print a input.

          diff --git a/pyladies/json/index.html b/pyladies/json/index.html index 5f68099f..cf9d0b91 100644 --- a/pyladies/json/index.html +++ b/pyladies/json/index.html @@ -1,5 +1,5 @@

          Kódování dat -# +#

          V Pythonu informace spravuješ v seznamech, slovnících a jiných datových strukturách. @@ -25,7 +25,7 @@

          Kódování dat Vystačíš si proto s převáděním na řetězce, se kterými – na rozdíl od bytů – už umíš pracovat.

        Kódování -# +#

        Existuje spousta způsobů jak zakódovat data do textu. Každý způsob se snaží najít vhodnou rovnováhu mezi @@ -39,13 +39,13 @@

        Kódování dat 'věk': 26, }

        Jiný způsob kódování dat je YAML:

        -
        jméno: Anna
        -město: Brno
        -jazyky:
        -  - čeština
        -  - angličtina
        -  - Python
        -věk: 26
        +
        jméno: Anna
        +město: Brno
        +jazyky:
        +  - čeština
        +  - angličtina
        +  - Python
        +věk: 26
         

        Nebo třeba Bencode:

        d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

        Existují i netextové formáty jako Pickle 3. @@ -55,12 +55,12 @@

        Kódování dat K▒u.

        A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:

        -
        {
        -  "jméno": "Anna",
        -  "město": "Brno",
        -  "jazyky": ["čeština", "angličtina", "Python"],
        -  "věk": 26
        -}
        +
        {
        +  "jméno": "Anna",
        +  "město": "Brno",
        +  "jazyky": ["čeština", "angličtina", "Python"],
        +  "věk": 26
        +}
         

        Pozor na to, že ačkoli JSON vypadá podobně jako zápis v Pythonu, je to jiný formát s vlastními pravidly. Nezaměňuj je!

        @@ -68,7 +68,7 @@

        Kódování dat nech na počítači, aby dal na správné místo správné čárky a uvozovky.

        JSON -# +#

        Pojďme se zaměřit na populární JSON; práce s ostatními formáty funguje podobně.

        K zakódování dat do textu použij funkci dumps z modulu json @@ -94,7 +94,7 @@

        Kódování dat >>> print(data['věk'] + 1) 27

        Hezký výstup -# +#

        To, co vrací json.dumps, je vhodné pro počítačové zpracování:

        >>> kod = json.dumps(data)
        @@ -122,7 +122,7 @@ 

        Kódování dat včetně funkcí na zápis/čtení přímo do/ze souborů – je v příslušné dokumentaci.

        Typy -# +#

        JSON neumožňuje věrně zakódovat jakýkoli Pythonní objekt. Zaměřuje se na výměnu informací mezi různými programy a programovacími jazyky.

        @@ -152,7 +152,7 @@

        Kódování dat >>> json.loads(kod) {'dvojice': [1, 2], 'seznam': [3, 4], '2': 'dva', '11': 'jedenáct'}

        Jiná kódování -# +#

        Jak už bylo řečeno, JSON je jen jeden ze způsobů, kterými lze data zakódovat. Jiná kódování mají svá pro a proti, ale v podstatě fungují stejně: @@ -161,13 +161,13 @@

        Kódování dat

        V případech, kdy má soubor s informacemi psát člověk, se často používají formáty TOML nebo YAML.

        TOML -# +#

        Knihovnu pro TOML potřeba si nainstalovat. Dělá se to příkazem, který znáš z instalace knihovny Pytest. Pozor ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného (a možná nebezpečného!):

        -
        (venv)$ python -m pip install toml
        +
        (venv)$ python -m pip install toml
         

        Data pak lze kódovat pomocí toml.dumps a dekódovat pomocí toml.loads:

        >>> import toml
         >>> print(toml.dumps(data))
        @@ -176,20 +176,20 @@ 

        TOML jazyky = ["čeština", "angličtina", "Python"] "město" = "Brno"

        YAML -# +#

        Knihovnu pro YAML je také potřeba doinstalovat. Opět – ve jméně pyyaml neudělej překlep!

        -
        (venv)$ python -m pip install pyyaml
        +
        (venv)$ python -m pip install pyyaml
         

        Data pak lze kódovat pomocí yaml.safe_dump (nebo „hezky“ pomocí yaml.safe_dump(data, indent=4, allow_unicode=True)) a zapisovat pomocí yaml.safe_load(kod). Výsledný soubor vypadá takto:

        -
        jazyky:
        -- čeština
        -- angličtina
        -- Python
        -jméno: Anna
        -město: Brno
        -věk: 26
        +
        jazyky:
        +- čeština
        +- angličtina
        +- Python
        +jméno: Anna
        +město: Brno
        +věk: 26
         
        \ No newline at end of file diff --git a/pyladies/list/index.html b/pyladies/list/index.html index 37d929d5..135b7b38 100644 --- a/pyladies/list/index.html +++ b/pyladies/list/index.html @@ -2,7 +2,7 @@ Tahák na seznamy, který si můžeš vytisknout.

        Seznamy -# +#

        Dnes si ukážeme, jak pracovat se seznamy (angl. lists).

        Začneme prakticky. @@ -32,7 +32,7 @@

        Seznamy
        seznam = [1, 'abc', True, None, range(10), len]
         print(seznam)
         

        Neměnitelné hodnoty -# +#

        Důležitá vlastnost seznamů je, že se dají měnit.

        Než vysvětlíme, o co jde, připomeňme si, jak fungují hodnoty, které se měnit @@ -57,7 +57,7 @@

        Seznamy kamaradka = 'Alexandra' print(kamaradka)

        Měnění seznamů -# +#

        A jak jsou na tom seznamy? Ty se měnit dají.

        @@ -89,7 +89,7 @@

        Seznamy a.append(4) print(b)

        Další způsoby, jak měnit seznamy -# +#

        Kromě metody append, která přidává jediný prvek na konec, existuje spousta dalších metod, které seznamy mění. @@ -114,7 +114,7 @@

        Seznamy zviratka.reverse() # ['pes', 'králík', 'kočka'] zviratka.clear() # []

        Vybírání ze seznamů -# +#

        Často budeš ze seznamu chtít vybrat prvek na určité pozici. To funguje jako u řetězců: do hranatých závorek dáš číslo prvku. @@ -130,7 +130,7 @@

        Seznamy

        „Sekáním“ vzniká nový seznam – když pak původní seznam změníš, v novém menším seznamu se to neprojeví.

        Měnění prvků -# +#

        Na rozdíl od řetězců (které se měnit nedají) můžeš u existujících seznamů nastavovat konkrétní prvky – a to tak, že do prvku přiřadíš jako by to byla @@ -146,7 +146,7 @@

        Měnění prvků zviratka[1:-2] = ['koťátko', 'králíček'] print(zviratka)

        Mazání prvků -# +#

        Přiřazením do podseznamu můžeš i změnit délku seznamu nebo některé prvky úplně odstranit:

        @@ -195,7 +195,7 @@

        Měnění prvků balicek.clear() print(balicek)

        Řazení -# +#

        Metoda sort seřadí prvky seznamu.

        seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
        @@ -213,7 +213,7 @@ 

        Měnění prvků seznam.sort(reverse=True) print(seznam)

        Známé operace se seznamy -# +#

        Spousta toho, co můžeš dělat s řetězci, má stejný účinek i u seznamů. Třeba sečítání a násobení číslem:

        @@ -236,7 +236,7 @@

        Měnění prvků print(melodie.count('DE')) print(melodie.index('DE'))

        Seznam jako podmínka -# +#

        Seznam můžeš použít v příkazu if (nebo while) jako podmínku, která platí, když v tom seznamu něco je. @@ -248,7 +248,7 @@

        Měnění prvků

        Podobně můžeš v podmínce použít i řetězce. A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.

        Tvoření seznamů -# +#

        Tak jako funkce int převádí na celá čísla a str na řetězce, @@ -333,7 +333,7 @@

        Tvoření seznamů ['J', 'Q', 'K', 'A']?

        Řešení najdeš v textu o kousek níže.

        Seznamy a řetězce -# +#

        Seznamy a řetězce jsou druhy sekvencí. Můžeš různě převádět z jednoho typu na druhý.

        @@ -357,7 +357,7 @@

        Tvoření seznamů
        veta = ' '.join(slova)
         print(veta)
         

        Seznamy a náhoda -# +#

        Modul random obsahuje funkce, které mají něco společného s náhodou: třeba nám už známou random.randrange. diff --git a/pyladies/local-variables/index.html b/pyladies/local-variables/index.html index d1c2bcaf..c0d96e1a 100644 --- a/pyladies/local-variables/index.html +++ b/pyladies/local-variables/index.html @@ -1,5 +1,5 @@

        Lokální proměnné -# +#

        Už umíš definovat vlastní funkce. Zbývá ale ještě dovysvětlit, jak v nich fungují proměnné.

        @@ -30,11 +30,11 @@

        Lokální proměnné pro ni. Když funkce nastav_x skončí, proměnná x přestane existovat.

        Skrývání detailů -# +#

        Podobně skončí s chybou i složitější program:

        def zamen(slovo, pozice, novy_znak):
        -    """V daném slově zamění znak na dané pozici za daný nový znak"""
        +    """V daném slově zamění znak na dané pozici za daný nový znak"""
             zacatek = slovo[:pozice]
             konec = slovo[pozice + 1:]
             nove_slovo = zacatek + novy_znak + konec
        @@ -54,7 +54,7 @@ 

        Skrývání detailů Jak divné by bylo, kdyby po každém zavolání print byla najednou nastavená proměnná i, kterou print náhodou používá při procházení svých parametrů!

        Přiřazení -# +#

        To, co dělá lokální proměnnou, je přiřazení. Porovnej nastav_x s příkladem na obsah_kruhu výše: rozdíl mezi pi a x @@ -75,7 +75,7 @@

        Přiřazení
      • Přiřazují i speciální přiřazovací operátory jako +=, *=, :=.
      • Zakrývání jména -# +#

        Jak to funguje, když ve funkci přiřadíš do proměnné, která existuje i globálně? Pak tu máme problém.

        @@ -95,7 +95,7 @@

        Přiřazení Jedna je globální. Jedna je lokální pro funkci nastav_x. Jmenují se stejně, ale jsou to dvě různé proměnné.

        Lokální nebo globální? -# +#

        Pojďme si to ukázat. Než spustíš tenhle program, zkus předpovědět co bude dělat. @@ -151,7 +151,7 @@

        Řešení

        Rada na závěr -# +#

        Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších věcí v Pythonu. diff --git a/pyladies/main-module/index.html b/pyladies/main-module/index.html index 9c8f3d26..044180ca 100644 --- a/pyladies/main-module/index.html +++ b/pyladies/main-module/index.html @@ -1,5 +1,5 @@

        Spouštěcí moduly -# +#

        Automatické testy musí projít „bez dozoru“. V praxi se často automaticky spouští, případné chyby se automaticky @@ -99,7 +99,7 @@

        Spouštěcí moduly Protože ale hlavní část programu (vyhodnot) jde pokrýt automatickými testy, ruční testování nemusí být tak důkladné.

        Negativní testy -# +#

        Test test_vyhry, ukázaný výše, není úplný. Splnila by ho i funkce jako:

        @@ -118,7 +118,7 @@

        Negativní testy teď stačí říct, že with pytest.raises ověří, že odsazený blok kódu pod ním vyvolá danou výjimku:

        def test_spatneho_tahu():
        -    """🤘 vs. 🖖 není správný vstup"""
        +    """🤘 vs. 🖖 není správný vstup"""
             with pytest.raises(ValueError):
                 vyhodnot('metal', 'spock')
         
        \ No newline at end of file diff --git a/pyladies/modules/index.html b/pyladies/modules/index.html index 8dd813ba..2d31055c 100644 --- a/pyladies/modules/index.html +++ b/pyladies/modules/index.html @@ -1,5 +1,5 @@

        Moduly -# +#

        Modul je v Pythonu něco, z čeho můžeš importovat. Třeba z modulu math můžeš importovat funkci sqrt:

        @@ -29,7 +29,7 @@

        Moduly Až začneš psát větší programy, zjednoduší ti to práci.

        Vlastní moduly -# +#

        A teď to hlavní! Můžeš vytvořit vlastní importovatelný modul @@ -48,13 +48,13 @@

        Moduly print(louka.popis_stav())

        A pak spusť vypis.py:

        -
        $ python vypis.py
        +
        $ python vypis.py
         

        Příkaz import hledá soubory (mimo jiné) v adresáři, ve kterém je „hlavní modul” programu – tedy soubor který spouštíš (tady vypis.py). Oba soubory by proto měly být ve stejném adresáři.

        Vedlejší efekty -# +#

        Co přesně dělá příkaz import louka?

        Python najde příslušný soubor (louka.py) a provede v něm všechny příkazy, @@ -91,7 +91,7 @@

        Vedlejší efekty Importem si programátor připravuje nástroje; teprve zavoláním funkce je používá.

        Příkaz print proto radši z modulu zase smaž.

        Adresář pro každý projekt -# +#

        Od teď budeš občas psát větší projekty, které budou obsahovat více souvisejících souborů. diff --git a/pyladies/nested-list/index.html b/pyladies/nested-list/index.html index 99c289bc..d2eae3bb 100644 --- a/pyladies/nested-list/index.html +++ b/pyladies/nested-list/index.html @@ -1,5 +1,5 @@

        Vnořené seznamy -# +#

        Seznam může obsahovat jakýkoli typ hodnot: čísla, řetězce a tak dále:

        prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
        @@ -26,14 +26,14 @@ 

        Vnořené seznamy Stejně jako vnořené cykly for ti umožnily vypsat tabulku, vnořené seznamy ti umožní si tabulku „zapamatovat”.

        def vytvor_radek_tabulky(cislo_radku, velikost):
        -    """Vrátí seznam – daný řádek tabulky s násobilkou"""
        +    """Vrátí seznam – daný řádek tabulky s násobilkou"""
             radek = []
             for cislo_sloupce in range(velikost):
                 radek.append(cislo_radku * cislo_sloupce)
             return radek
         
         def vytvor_tabulku(velikost):
        -    """Vrátí seznam seznamů – tabulku s násobilkou"""
        +    """Vrátí seznam seznamů – tabulku s násobilkou"""
             seznam_radku = []
             for cislo_radku in range(velikost):
                 radek = vytvor_radek_tabulky(cislo_radku, velikost)
        diff --git a/pyladies/nested-traceback/index.html b/pyladies/nested-traceback/index.html
        index e0595241..de75e00d 100644
        --- a/pyladies/nested-traceback/index.html
        +++ b/pyladies/nested-traceback/index.html
        @@ -1,5 +1,5 @@
         

        Výpisy chyb ze zanořených funkcí -# +#

        Teď si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která nastane v zanořené funkci.

        @@ -8,17 +8,17 @@

        Výpisy chyb ze zanořených funkcí

        def podel(delenec, delitel):
        -    """Podělí čísla mezi sebou a vrátí výsledek."""
        +    """Podělí čísla mezi sebou a vrátí výsledek."""
             return delenec / delitel        # řádek 3
         
         
         def podel_nulou(cislo):
        -    """Vydělí dané číslo nulou a vrátí výsledek."""
        +    """Vydělí dané číslo nulou a vrátí výsledek."""
             return podel(cislo, 0)          # řádek 8
         
         
         def ukaz_priklad():
        -    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
        +    """Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
             vysledek = podel_nulou(3)       # řádek 13
             print(vysledek)
         
        @@ -26,13 +26,13 @@ 

        Výpisy chyb ze zanořených funkcí

        Co se stane, když tohle pustíš?

        Traceback (most recent call last):
           File "ukazka.py", line 16, in <module>
        -    ukaz_priklad()
        +    ukaz_priklad()
           File "ukazka.py", line 13, in ukaz_priklad
        -    vysledek = podel_nulou(3)
        +    vysledek = podel_nulou(3)
           File "ukazka.py", line 8, in podel_nulou
        -    return podel(cislo, 0)
        +    return podel(cislo, 0)
           File "ukazka.py", line 3, in podel
        -    return delenec / delitel
        +    return delenec / delitel
         ZeroDivisionError: division by zero
         

        Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu. Skutečná chyba (tedy místo, které musíš opravit) je asi někde poblíž těchto diff --git a/pyladies/pong/index.html b/pyladies/pong/index.html index f3be3c6c..38c56cc8 100644 --- a/pyladies/pong/index.html +++ b/pyladies/pong/index.html @@ -1,5 +1,5 @@

        Pong -# +#

        @@ -13,7 +13,7 @@

        Pong

        Na Youtube se můžeš podívat na video, které ukazuje jak se Pong hraje.

        Konstanty a stav hry -# +#

        Hra Pong má jednoduchá pravidla. Musíme je ale umět vyjádřit v Pythonu a to není úplně jednoduché. @@ -78,7 +78,7 @@

        Konstanty a stav hry stisknute_klavesy = set() # sada stisknutych klaves skore = [0, 0] # skore dvou hracu

        Vykreslení hrací plochy -# +#

        Nejprve si v Pygletu otevřeme okno velikosti hrací plochy.

        import pyglet
        @@ -99,7 +99,7 @@ 

        Konstanty a stav hry
        from pyglet import gl
         ...
         def nakresli_obdelnik(x, y, sirka, vyska):
        -    """Nakresli obdelnik na danych souradnicich
        +    """Nakresli obdelnik na danych souradnicich
         
             Nazorny diagram::
         
        @@ -127,7 +127,7 @@ 

        Konstanty a stav hry grafických prvků.

        ...
         def vykresli():
        -    """Vykresli stav hry"""
        +    """Vykresli stav hry"""
             window.clear()  # smaz obsah okna (vybarvi na cerno)
         
         window = pyglet.window.Window(width=SIRKA, height=VYSKA)
        @@ -220,7 +220,7 @@ 

        Řešení

        volali funkci, a uložíme si ho do proměnné: napis = Label().

        def nakresli_text(text, x, y, pozice_x):
        -    """Nakresli dany text na danou pozici
        +    """Nakresli dany text na danou pozici
         
             Argument ``pozice_x`` muze byt "left" nebo "right", udava na kterou stranu
             bude text zarovnany
        @@ -260,12 +260,12 @@ 

        Řešení

        Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

        Dynamika hry -# +#

        Teď to začne být zajímavé. Nejdřív rozhýbeme pálky, protože je to jednodušší, pak míček.

        Vstup od uživatele -# +#

        Potřebujeme pohybovat s pálkami podle vstupu od uživatele. Dokud bude uživatel držet např. klávesu S, levá pálka @@ -349,7 +349,7 @@

        Řešení

        ) pyglet.app.run()

        Pohyb pálek -# +#

        Když už jsme dokázali zpracovat vstup od uživatele, můžeme podle něj pohnout s pálkami. @@ -393,7 +393,7 @@

        Řešení

        pyglet.app.run()

        a podívej se na výsledek.

        Rozehrání -# +#

        Než začneme míček odrážet od stěn, musíme ho nejprve uvést do pohybu. Vystřelíme ho ze středu hrací plochy @@ -452,7 +452,7 @@

        Řešení

        Zkus, co se teď stane při spuštění hry. Míček by měl vyletět pokaždé do jiného směru.

        Odrážení míčku -# +#

        Míček nám teď nekontrolovaně vyletí z hřiště. Musíme tedy zařídit, aby se odrážel od stěn. @@ -504,7 +504,7 @@

        Odrážení míčku skore[0] += 1 reset()

        Závěr -# +#

        Hurá, prokousali jsme se k zdárnému konci Pongu! Máš teď plně funkční interaktivní grafickou diff --git a/pyladies/prefer-return/index.html b/pyladies/prefer-return/index.html index 0fbe7935..57d037da 100644 --- a/pyladies/prefer-return/index.html +++ b/pyladies/prefer-return/index.html @@ -1,5 +1,5 @@

        Vrátit nebo vypsat? -# +#

        Podívejme se teď na následující program, který vypíše obsah elipsy:

        from math import pi
        @@ -41,7 +41,7 @@ 

        Vrátit nebo vypsat?
        from math import pi
         
         def obsah_elipsy(a, b):
        -    """Vrátí obsah elipsy s poloosami daných délek"""
        +    """Vrátí obsah elipsy s poloosami daných délek"""
             # Jen samotný výpočet:
             return pi * a * b
         
        @@ -55,14 +55,14 @@ 

        Vrátit nebo vypsat? Když ale funkce něco počítá, nebo když si nejsi jistý/á, je dobré ve funkci print ani input nemít.

        None -# +#

        Když funkce neskončí příkazem return, automaticky se vrátí hodnota None.

        Je to hodnota zabudovaná přímo do Pythonu, podobně jako True nebo False, a znamená „nic“.

        def nic():
        -     """Tahle funkce nic nedělá """
        +     """Tahle funkce nic nedělá """
         
         print(nic())
         

        Procedury v Pythonu vracejí právě toto „nic“.

        \ No newline at end of file diff --git a/pyladies/print/index.html b/pyladies/print/index.html index 602304e1..06b74940 100644 --- a/pyladies/print/index.html +++ b/pyladies/print/index.html @@ -1,5 +1,5 @@

        Print a chybové hlášky -# +#

        Vytvoř v editoru nový soubor, ulož ho do adresáře pro dnešní lekci pod jménem printing.py a napiš do něj teď už známý příkaz:

        @@ -13,7 +13,7 @@

        Print a chybové hlášky

        Funguje? Doufám, že ano; za chvíli ho vylepšíme.

        Další příkazy -# +#

        Zkus do programu postupně, po jednom, přidávat další řádky. Po přidání každého dalšího print program znovu spusť a vyzkoušej, jestli @@ -42,7 +42,7 @@

        Další příkazy Více se dozvíš později, zatím si zapamatuj, že se takovýto text označuje označuje v programovací hantýrce jako řetězec.

        Jak číst chyby -# +#

        Často zjistíš, že program, který napíšeš, nebude fungovat hned napoprvé. Počítač je hloupý stroj; pokud instrukce nenapíšeš přesně podle pravidel jazyka @@ -79,7 +79,7 @@

        Další příkazy Jestli funguje, gratuluji! Jinak chybu opět oprav a opakuj, dokud to nebude fungovat :)

        Jak funguje program -# +#

        Teď, když program běží, se můžeme podívat, co se při jeho spuštění vlastně děje. @@ -93,7 +93,7 @@

        Jak funguje program ale základní myšlenka je stále stejná: počítač „čte“ odshora dolů a provádí příkazy jeden po druhém.

        A z jakých že instrukcí se náš „recept“ skládá?

        Ten print, který tu celou dobu používáš, je funkce. diff --git a/pyladies/pyglet/index.html b/pyladies/pyglet/index.html index d1e69421..eb6828b4 100644 --- a/pyladies/pyglet/index.html +++ b/pyladies/pyglet/index.html @@ -1,5 +1,5 @@

        Grafika -# +#

        Dnes si ukážeme, jak s Pythonem napsat grafickou aplikaci.

        Použijeme knihovnu, která není zabudovaná přímo @@ -8,7 +8,7 @@

        Grafika v zapnutém virtualenvu modul pip – konkrétně příkaz python -m pip install pyglet. U mě vypadá instalace nějak takto:

        -
        (venv)$ python -m pip install pyglet
        +
        (venv)$ python -m pip install pyglet
         Collecting pyglet
           Downloading pyglet-1.2.4-py3-none-any.whl (964kB)
         Installing collected packages: pyglet
        @@ -28,7 +28,7 @@ 

        Grafika uklidíme.

        Hotovo? Pojďme si vysvětlit, co se tu vlastně děje.

        Interaktivní programy -# +#

        Podívejme se ještě jednou, jak zhruba vypadá hlavní program pro Piškvorky, který jsme napsali @@ -93,7 +93,7 @@

        Interaktivní programy knihovna (angl. library) a ostatní to pak můžou používat.

        Pyglet 🐷 -# +#

        Jedna z takových knihoven je Pyglet. Obsahuje kromě smyčky událostí taky funkce na @@ -117,7 +117,7 @@

        Pyglet 🐷 (funkce pyglet.app.run()) a program může pokračovat.

        Text -# +#

        Klávesa Esc není příliš zajímavá. Zkusme reagovat i na jiné klávesy.

        @@ -171,7 +171,7 @@

        Text Proto Pygletu dáme samotnou funkci, kterou bude sám volat, kdykoli uživatel stiskne klávesu.

        Čas ⏲ -# +#

        Ještě jednu událost zpracujme, než se přesuneme ke grafice.

        Bude to takzvaný tik hodin @@ -209,7 +209,7 @@

        Čas ⏲ Většina filmů používá jen 24 obrázků za vteřinu; realistické 3D hry až 60.

        Vykreslování 🖌 -# +#

        Program, který vypisuje na terminál spoustu čísel, @@ -287,7 +287,7 @@

        Čas ⏲ kterou Pyglet volá z on_draw. Jinde funkce jako clear a draw nebudou fungovat správně.

        Animace -# +#

        Pojď si teď se Spritem trochu pohrát.

        Do funkce zpracuj_text dej místo printu tento příkaz:

        @@ -311,7 +311,7 @@

        Animace

        Co se stane, když začneš měnit ta čísla?

        Co se stane, když zkusíš podobně nastavovat atribut rotation?

        Zavolej později -# +#

        Pyglet umí kromě opakovaného „tikání“ zavolat funkci @@ -340,7 +340,7 @@

        Zavolej později had.image = obrazek pyglet.clock.schedule_once(zmen, 0.2)

        Klik 🐭 -# +#

        Poslední věc, na kterou se tady naučíme reagovat, je klikání. Těsně před window.push_handlers napiš funkci:

        @@ -358,7 +358,7 @@

        Zavolej později
      • Jak se projeví Shift+klik?
      • Pokračování příště -# +#

        Koukám že kódu už je dnes tak akorát na ukončení lekce:

        import math
        diff --git a/pyladies/range/index.html b/pyladies/range/index.html
        index e0f5e8e4..24d32fc4 100644
        --- a/pyladies/range/index.html
        +++ b/pyladies/range/index.html
        @@ -1,5 +1,5 @@
         

        Range – sekvence čísel -# +#

        Funkce range(10) vrátí speciální hodnotu, která v sobě obsahuje čísla od 0 do 9:

        diff --git a/pyladies/reassignment/index.html b/pyladies/reassignment/index.html index 74cf378c..6548d02f 100644 --- a/pyladies/reassignment/index.html +++ b/pyladies/reassignment/index.html @@ -1,5 +1,5 @@

        Přepisování proměnných -# +#

        Už víš, že hodnota proměnné se může v čase měnit: když přiřadíš do už existující proměnné, stará hodnota se zahodí @@ -31,7 +31,7 @@

        Přepisování proměnných # ▲ | # ╰──────────────────╯

        Přepisování v cyklu -# +#

        Ještě „zajímavější“ je použít podobné přepisování v cyklu.

        Zopakuj si, že for cyklus jako:

        diff --git a/pyladies/str-index-slice/index.html b/pyladies/str-index-slice/index.html index ffc7e48b..5ee59f0a 100644 --- a/pyladies/str-index-slice/index.html +++ b/pyladies/str-index-slice/index.html @@ -1,5 +1,5 @@

        Výběr z řetězců -# +#

        Už umíš spojovat dohromady kratší řetězce:

        spojeny_retezec = 'a' + 'b'
        @@ -8,7 +8,7 @@ 

        Výběr z řetězců řetězce dostat kratší součásti. Začneme jednotlivými znaky.

        Výběr znaku -# +#

        Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku (angl. subscripting), @@ -61,7 +61,7 @@

        Řešení

        ╰───┴───┴───┴───┴───┴───┴───┴───╯

        Sekání řetězců -# +#

        Kromě jednotlivých znaků můžeme vybírat i delší části – odborně podřetězce (angl. substrings).

        @@ -128,7 +128,7 @@

        Řešení

        ╰───────────╯ 'čokoláda'[-3:] == 'áda'

        Cvičení -# +#

        Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za jiné. Například:

        diff --git a/pyladies/str-methods/index.html b/pyladies/str-methods/index.html index 2e50c757..13105d5a 100644 --- a/pyladies/str-methods/index.html +++ b/pyladies/str-methods/index.html @@ -1,5 +1,5 @@

        Řetězcové funkce a metody -# +#

        Řetězce umí všelijaké triky. Funkcí len() můžeš zjistit, jak je řetězec dlouhý; @@ -33,7 +33,7 @@

        Řetězcové funkce a metody

        A jak se převádí na malá písmena? K tomu budeme potřebovat další novou vlastnost Pythonu: metody.

        Metody -# +#

        Metoda (angl. method) je jako funkce – něco, co se dá zavolat. Na rozdíl od funkce je svázaná s nějakým objektem (hodnotou). @@ -53,7 +53,7 @@

        Metody nedá změnit, dá se jen vytvořit nějaký odvozený. S touto vlastností už ses mohl/a setkat při psaní funkce zamen.

        Iniciály -# +#

        Pro procvičení metod a vybírání znaků si zkus napsat program, který se zeptá na jméno, pak na příjmení @@ -81,7 +81,7 @@

        Řešení

        Je sice delší, ale mnohem přehlednější.

        A další -# +#

        Řetězcových metod je celá řada. Nejužitečnější z nich najdeš v taháku, který si můžeš stáhnout či vytisknout. diff --git a/pyladies/str/index.html b/pyladies/str/index.html index dd7f72e0..c28017fe 100644 --- a/pyladies/str/index.html +++ b/pyladies/str/index.html @@ -1,5 +1,5 @@

        Zápis řetězců -# +#

        Teď se podíváme na zoubek řetězcům. Už s nimi trochu umíš, tak začneme rekapitulací.

        @@ -17,7 +17,7 @@

        Zápis řetězců a tak je uvozovky potřeba používat důsledně.

        (Ilustrační komiks. Člověk říká robotovi: "Řekni Pavlovi, ať mi zavolá!". Robot odpoví: "PAVLOVI AŤ MI ZAVOLÁ!")

        Znaky -# +#

        Texty sestávají z jednotlivých písmenek. Řetězce víceméně taky, ale aby bylo jasné, co přesně tím písmenkem @@ -43,7 +43,7 @@

        Znaky >>> len("") 0

        Uvozovky -# +#

        K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. Není mezi nimi rozdíl. @@ -63,7 +63,7 @@

        Znaky Funkce print() vypisuje hodnoty „hezky“, „pro uživatele“ – v případě řetězců tedy bez uvozovek.

        Uvozovky v uvozovkách -# +#

        Proč si při zadávání textu můžeš vybrat mezi dvěma druhy uvozovek?

        Občas se stane, že v rámci textu potřebuješ použít samotnou uvozovku (nebo @@ -76,14 +76,14 @@

        Znaky
        >>> len("Zpívala si: "Tralala"")
         Traceback (most recent call last)
           File "<>", line 1
        -    len("Zpívala si: "Tralala"")
        -                      ^
        +    len("Zpívala si: "Tralala"")
        +                      ^
         SyntaxError: invalid syntax
         

        Pokud používáš chytrý editor, doporučuju si zvyknout na to, jakou barvou máš řetězce zvýrazněné. Často to pomáhá odhalit chybky.

        Sekvence se zpětným lomítkem -# +#

        Co dělat, když v řetězci potřebuješ oba druhy uvozovek, jako ve větě Vtom vnuk křik': "Hleď!"?

        @@ -146,7 +146,7 @@

        Řešení

        >>> print('-\U0001F0BD-') -🂽-

        Zpětné lomítko -# +#

        Zpětné lomítko tedy začíná speciální sekvenci (známou pod anglickým termínem escape sequence), kterou zadáš jediný znak.

        @@ -158,7 +158,7 @@

        Řešení

        Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ je zápis pro jedno zpětné lomítko.

        Nový řádek -# +#

        Někdy potřebuješ řetězce, které obsahují více řádků. Pythonní řetězce ale můžeš normálně napsat jen na jeden řádek. @@ -177,7 +177,7 @@

        Nový řádek >>> len('-\n-') 3

        Trojité uvozovky -# +#

        Kromě \n je i druhý způsob, jak zadat řetězec se znakem nového řádku: ohraničit ho třemi uvozovkami (jednoduchými nebo dvojitými) @@ -199,7 +199,7 @@

        Nový řádek Číslo je kladné. """)

        Cvičení -# +#

        Jaká je délka těchto řetězců?

        Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

        diff --git a/pyladies/testing/index.html b/pyladies/testing/index.html index f0c3baf6..5a99557a 100644 --- a/pyladies/testing/index.html +++ b/pyladies/testing/index.html @@ -1,5 +1,5 @@

        Testování -# +#

        Programátorská práce nespočívá jen v tom, program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. @@ -18,7 +18,7 @@

        Testování Když v otestovaném kódu v budoucnu uděláš nějakou změnu, testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

        Instalace knihovny pytest -# +#

        Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. @@ -48,7 +48,7 @@

        Instalace knihovny pytest Dej si proto pozor a ve jménu pytest neudělej překlep!

        Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

        -
        (venv)$ python -m pip install pytest
        +
        (venv)$ python -m pip install pytest
         

        Co ten příkaz znamená?

        python -m pip zavolá Python s tím, že má pustit modul pip. Tento modul umí instalovat nebo @@ -67,7 +67,7 @@

        Instalace knihovny pytest Program se ale bez příkazu python může spustit v jiném Pythonu, než v tom z virtuálního prostředí – a tam pytest nebude k dispozici.

        Psaní testů -# +#

        Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst @@ -78,11 +78,11 @@

        Instalace knihovny pytest že jména jak souborů s testy tak samotných testovacích funkcí začínají na test_.

        def secti(a, b):
        -    """Vrátí součet dvou čísel"""
        +    """Vrátí součet dvou čísel"""
             return a + b
         
         def test_secti():
        -    """Otestuje funkci secti"""
        +    """Otestuje funkci secti"""
             assert secti(1, 2) == 3
         

        Co se v té testovací funkci děje?

        Příkaz assert vyhodnotí výraz za ním a pokud výsledek není pravdivý, @@ -94,14 +94,14 @@

        Instalace knihovny pytest V „normálním” kódu se assert může chovat trochu jinak než výše, ale do toho teď nebudeme zabředávat.

        Spouštění testů -# +#

        Testy se spouští zadáním příkazu python -m pytest -v následovaným názvem souboru s testy. Tedy v překladu: Pythone, pusť modul pytest, v „ukecaném” režimu (angl. verbose) a se zadaným souborem.

        -
        $ python -m pytest -v test_secteni.py
        +
        $ python -m pytest -v test_secteni.py
         
        ============================= test session starts ==============================
         platform linux -- Python 3.7.1, pytest-3.6.4, py-1.5.4, pluggy-0.6.0 -- venv/bin/python
         cachedir: .pytest_cache
        @@ -124,7 +124,7 @@ 

        Instalace knihovny pytest

        Zkus si změnit funkci secti (nebo její test) a podívat se, jak to vypadá když test „neprojde“.

        Testovací moduly -# +#

        Testy se většinou nepíšou přímo ke kódu, ale do souboru vedle. diff --git a/pyladies/tuple/index.html b/pyladies/tuple/index.html index 2322a66f..9eb9c80e 100644 --- a/pyladies/tuple/index.html +++ b/pyladies/tuple/index.html @@ -1,5 +1,5 @@

        N-tice -# +#

        Když už známe seznam, podívejme se na jeho sestřičku: takzvanou n-tici (angl. tuple).

        @@ -62,7 +62,7 @@

        N-tice
        ix, ocko = 'xo'
         jedna, dva, tri = [1, 2, 3]
         

        Malé n-tice -# +#

        Jak vytvořit n-tici s žádným nebo jedním prvkem? Takhle:

        prazdna_ntice = ()
        @@ -73,7 +73,7 @@ 

        N-tice Když budeš opravdu potřebovat jednoprvkovou n-tici, radši ji pro přehlednost ozávorkuj.

        Kdy použít seznam a kdy n-tici? -# +#

        Seznamy se používají, když předem nevíš, kolik v nich přesně bude hodnot, diff --git a/pyladies/turtle/index.html b/pyladies/turtle/index.html index b5a9f942..fc90c873 100644 --- a/pyladies/turtle/index.html +++ b/pyladies/turtle/index.html @@ -1,12 +1,12 @@

        🐍 🐢 -# +#

        V této lekci si vyzkoušíš želví kreslení.

        Pusť Python v interaktivním módu (bez souboru .py).

        $ python
         
        ->>>
        -

        (Znaky > a $ píše počítač, ne ty. +>>> +

        (Znaky > a $ píše počítač, ne ty. Na Windows bude místo $ znak > a před $ nebo > může být ještě něco dalšího.)

        @@ -18,7 +18,7 @@

        🐍 🐢 Dej ho tak, abys viděla i příkazovou řádku i nové okýnko.

        A kde je ta želva? -# +#

        Želva je zrovna převlečená za šipku. Ale funkce shape ji umí odmaskovat:

        @@ -28,7 +28,7 @@

        A kde je ta želva?

        Modul turtle obsahuje spoustu dalších funkcí, kterými můžeš želvu ovládat. Pojďme se na ně kouknout zblízka.

        Otáčení -# +#

        Želva se umí otáčet (doleva – left a doprava – right) a lézt po papíře (dopředu – forward). @@ -44,7 +44,7 @@

        Otáčení Když se ti výsledek nelíbí, můžeš zavřít kreslící okno a zkusit to znovu. (Nebo místo zavření okna můžeš naimportovat a použít funkci clear().)

        Želví program -# +#

        Interaktivní mód je skvělý na hraní, ale teď přejdeme zase na soubory.

        @@ -61,7 +61,7 @@

        Želví program

        Otázka

        Co dělá funkce exitonclick, kterou voláš na konci programu?

        Přerušovaná čára -# +#

        Funkce penup řekne želvě, aby zvedla ocásek se štětcem: bude se tak hýbat aniž by za sebou nechávala stopu. @@ -78,7 +78,7 @@

        Želví program exitonclick()

        Až to budeš mít hotové, zkus začít kreslit trochu složitější obrázky:

        Čtverec -# +#

        Nakresli čtverec.

        Želví čtverec

        @@ -105,7 +105,7 @@

        Řešení

        Obdélník -# +#

        Nakresli obdélník.

        Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

        @@ -131,7 +131,7 @@

        Řešení

        Tři čtverce -# +#

        Nakresli tři čtverce, každý otočený třeba o 20°.

        Tři želví čtverce

        @@ -181,7 +181,7 @@

        Řešení

        Jde. Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

        Jak opakovat – a neopakovat se -# +#

        Udělej v editoru nový soubor a ulož ho jako cykly.py. Budeš v něm zkoušet cykly.

        @@ -203,7 +203,7 @@

        Jak opakovat – a neopakovat seif se provede jen někdy; tělo příkazu for se opakuje několikrát dokola.

        Výčet -# +#

        Zkus napsat ještě jeden vzorový program, který v češtině zní:

          @@ -238,7 +238,7 @@

          Výčet pozdrav = 'SYN' print(pozdrav + '!')

          Range -# +#

          Vraťme se k for i in range(100). Už víš, že to znamená „Pro každé i ze sekvence range(100)“. @@ -313,7 +313,7 @@

          Řešení

          for _ in range(100):
              print('Nikdy nebudu odsazovat o tři mezery!')
           

          Dlouhá přerušovaná čára -# +#

          Už víš, že pomocí penup a pendown lze nakreslit přerušenou čáru:

          from turtle import forward, penup, pendown, exitonclick
          @@ -370,7 +370,7 @@ 

          Řešení

          Čtverec II -# +#

          A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

          Čtverec se kreslí následovně:

          @@ -398,7 +398,7 @@

          Řešení

          Tři čtverce -# +#

          Nakonec nakresli 3 čtverce, každý otočený o 20°. Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu @@ -434,7 +434,7 @@

          Řešení

          Úkol navíc -# +#

          Máš-li hotovo, zkus nakreslit schody:

          Želví schody

          diff --git a/pyladies/variables/index.html b/pyladies/variables/index.html index 23db02b3..67bf65fc 100644 --- a/pyladies/variables/index.html +++ b/pyladies/variables/index.html @@ -1,5 +1,5 @@

          Čtverec -# +#

          Teď se vrátíme do základní školy a zkusíme si napsat program, který vypočítá obsah a obvod čtverce, u kterého známe délku strany.

          @@ -46,7 +46,7 @@

          Řešení

          Menší čtverec -# +#

          Jestli všechno funguje, zkus změnit program tak, aby počítal obsah a obvod čtverce o straně 123 cm.

          @@ -61,7 +61,7 @@

          Řešení

          Proměnné -# +#

          Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? Baví tě přepisování čísel? @@ -94,7 +94,7 @@

          Řešení

          4 * 183 není moc jasné, co ta čísla znamenají. Výraz 4 * strana je na tom mnohem líp.

          Kruhy -# +#

          Tohle je příklad navíc! Klidně ho přeskoč.

          Změna zadání! @@ -107,7 +107,7 @@

          Řešení

          Všechna čísla, která matematici označují jen jedním písmenkem (klidně řeckým), vhodně pojmenuj.

          Komentáře -# +#

          Program si teď zpřehledníme komentářem. V Pythonu komentář začíná dvojkřížkem (#), @@ -131,7 +131,7 @@

          Řešení

          mezery (nebo i víc). Za # pak patří právě jedna.

          Načítání vstupu -# +#

          Nakonec se podíváme, jak zařídit, aby číslo nemuselo být zapsáno v programu, ale aby ho mohl uživatel zadat sám.

          diff --git a/pyladies/venv-setup/index.html b/pyladies/venv-setup/index.html index 718d9497..d6e6a975 100644 --- a/pyladies/venv-setup/index.html +++ b/pyladies/venv-setup/index.html @@ -1,5 +1,5 @@

          Nastavení prostředí -# +#

          V této sekci si:

            @@ -8,7 +8,7 @@

            Nastavení prostředí
          • aktivuješ virtuální prostředí.

          Příprava adresáře -# +#

          Programátoři vytváří spoustu souborů a víc než u mnoha jiných uživatelů počítače jim záleží na tom, kde jsou ty soubory uložené.

          @@ -29,7 +29,7 @@

          Příprava adresáře Poznamenej si proto kde přesně je – zkopíruj si celé jeho jméno, které pak můžeš vložit do cd v příkazové řádce nebo do grafického prohlížeče souborů.

          Adresář pro každou lekci -# +#

          Nový adresář je zatím prázdný. To se ale brzo změní a čím víc věcí v něm bude, tím bude důležitější @@ -42,12 +42,12 @@

          Adresář pro každou lekci

          Adresář 00 si vytvoř už teď. (Možná do něj dnes nic nedáš, ale hodí se ho mít jako ukázku pro příště.)

          Přepnutí -# +#

          Pak otevři příkazovou řádku a příkazem cd přepni do adresáře, ve kterém jsi právě vytvořil/a 00 (t.j. ne přímo do 00). Například:

          -
          $ cd naucse-python
          +
          $ cd naucse-python
           

          Pak zkontroluj, že jsi na správném místě:

          • Pomocí příkazu pwd (na Windows cd) zkontroluj, @@ -70,7 +70,7 @@

            Windows

            > <
              Directory of C:\Users\Helena\naucse-python
             05/08/2014 07:28 PM <DIR>  00
             

          Virtuální prostředí -# +#

          Teď si vytvoříš virtuální prostředí pro Python.

          Virtuální prostředí je něco, co zajistí že se všechny počítače budou @@ -90,12 +90,12 @@

          Windows

          > <
            příkazů.
            Bude je rychlejší vyzkoušet než popsat kdy je který správný,
            takže nejdřív zkus:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           

          A jestli dostaneš chybu No module named venv, zkus místo toho:

          -
           $ virtualenv -p python3 venv
          +
           $ virtualenv -p python3 venv
           
        • macOS:

          -
           $ python3 -m venv venv
          +
           $ python3 -m venv venv
           
        • Windows:

          Podle toho jak máš Python nainstalovaný bude fungovat jeden z následujících @@ -122,11 +122,11 @@

          Windows

          > <
           
        • V grafickém prohlížeči souborů to vypadá např. takto:

          (adresáře '00' a 'venv' vedle sebe)

          Aktivace virtuálního prostředí -# +#

          Nakonec virtuální prostředí aktivuj:

          -

          Unix

          $ source venv/bin/activate
          +                

          Unix

          $ source venv/bin/activate
           

          Windows

          > venv\Scripts\activate
           

          Jestli používáš příkazovou řádku ve Visual Studio Code, diff --git a/pyladies/while/index.html b/pyladies/while/index.html index 6377807f..37dce985 100644 --- a/pyladies/while/index.html +++ b/pyladies/while/index.html @@ -1,5 +1,5 @@

          While -# +#

          Kromě cyklu for máme ještě druhý typ cyklu: while (angl. dokud). Na rozdíl od for, kde předem známe počet opakování, @@ -58,7 +58,7 @@

          While

          Ale zpátky k while! Dokážeš napsat tenhle program?

          Oko bere -# +#

          • Začínáš s 0 body.
          • diff --git a/pyladies/with/index.html b/pyladies/with/index.html index 44341acf..4cefabed 100644 --- a/pyladies/with/index.html +++ b/pyladies/with/index.html @@ -1,5 +1,5 @@

            Kontext: with a finally -# +#

            Čteš-li tyto materiály poprvé, tuto sekci můžeš s klidným svědomím přeskočit. Pokročilejším ale doporučuju vsadit věci do širšího kontextu.

            @@ -32,7 +32,7 @@

            Kontext: with a # Pro vyzkoušení napiš do souboru 'cislo.txt' nějaké číslo. print(nacti_cele_cislo('cislo.txt') * 11)

            Kontrola výjimek -# +#

            Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. diff --git a/pyladies/zip-enumerate/index.html b/pyladies/zip-enumerate/index.html index 382ec9eb..e102c6ce 100644 --- a/pyladies/zip-enumerate/index.html +++ b/pyladies/zip-enumerate/index.html @@ -1,5 +1,5 @@

            Iterátory n-tic -# +#

            Některé hodnoty v Pythonu jsou iterovatelné (angl. iterable): obsahují sekvenci jiných hodnot a lze je „projít“ (iterovat) cyklem for nebo @@ -16,7 +16,7 @@

            Iterátory n-tic

            Podívejme se na dva další iterovatelné objekty: enumerate a zip. Oba jsou sekvence vytvořené z jiných, jednodušších sekvencí.

            Enumerate: očíslování sekvence -# +#

            Funkce enumerate vezme nějakou existující sekvenci a očísluje ji: ve vrácené sekvenci budou dvojice (index, původní hodnota).

            @@ -50,7 +50,7 @@

            Enumerate: očíslování sekvence

            Když budeš od sekvence enumerate chtít něco víc než iterování, převeď ji na seznam.

            Rozbalování v cyklu for -# +#

            Cyklus for umíš rozepsat: opakuje se v něm nastavení proměnné (které dělá for za tebe), pak tělo cyklu, a znovu nastavení proměnné, tělo cyklu atd. @@ -116,7 +116,7 @@

            Řešení

            Zip: Víc iterací najednou -# +#

            Další iterátor n-tic je funkce zip, která umí projít dvě sekvence naráz.

            @@ -150,7 +150,7 @@

            Řešení

            for vec, barva, misto, cislo in zip(veci, barvy, mista, cisla): print(f"{cislo}. {barva} {vec} je {misto}")

            Zip Longest: Pro ty co chtějí všechno -# +#

            Jak se zip chová, když dostane seznamy různých délek?

            veci = ['tráva', 'slunce', 'mrkev', 'list', 'myšlenka', 'spravedlnost']
            
            From 558c5eaa7e42b94be3b9e5d344847b450b656ebb Mon Sep 17 00:00:00 2001
            From: ghp_import <>
            Date: Mon, 4 Sep 2023 15:24:35 +0000
            Subject: [PATCH 23/31] Compiled
            
            ---
             lessons/with/index.html  | 16 ++++++++--------
             pyladies/with/index.html | 16 ++++++++--------
             2 files changed, 16 insertions(+), 16 deletions(-)
            
            diff --git a/lessons/with/index.html b/lessons/with/index.html
            index 4cefabed..9f717a63 100644
            --- a/lessons/with/index.html
            +++ b/lessons/with/index.html
            @@ -6,7 +6,7 @@ 

            Kontext: with a

            Příkaz with pracuje s tzv. kontextem (tady s kontextem otevřeného souboru), který má začátek a konec a při ukončení je potřeba něco udělat (tady zavřít soubor).

            -

            Kontext je v podstatě zkratka pro try/finally. Pamatuješ si na finally?

            +

            Kontext je v podstatě zkratka pro try/finally. Pamatuješ si na finally?

            Toto:

            with open('basnicka.txt', encoding='utf-8') as soubor:
                 # Zpracování souboru
            @@ -21,7 +21,7 @@ 

            Kontext: with a soubor.close()

            Jak with tak finally zaručí, že se soubor vždy uzavře: když se zpracování povede, ale i když v něm nastane výjimka, -nebo když z něj vyskočíš pomocí return nebo break:

            +nebo když z něj vyskočíš pomocí return nebo break:

            def nacti_cele_cislo(jmeno_souboru):
                 with open(jmeno_souboru, encoding='utf-8') as soubor:
                     return int(soubor.read())
            @@ -36,10 +36,10 @@ 

            Kontext: with a

            Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. -Podobných „samozavíracích“ objektů které se dají použít s with existuje -v různých knihovnách víc. -Typické jsou objekty, které se starají o připojení např. k jinému počítači -nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

            -

            Z lekce o testování si možná pamatuješ with pytest.raises(...):. -Výsledek pytest.raises na konci bloku with kontroluje, že v rámci bloku +Podobných „samozavíracích“ objektů které se dají použít s with existuje +v různých knihovnách víc. +Typické jsou objekty, které se starají o připojení např. k jinému počítači +nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

            +

            Z lekce o testování si možná pamatuješ with pytest.raises(...):. +Výsledek pytest.raises na konci bloku with kontroluje, že v rámci bloku nastala správná výjimka.

            \ No newline at end of file diff --git a/pyladies/with/index.html b/pyladies/with/index.html index 4cefabed..9f717a63 100644 --- a/pyladies/with/index.html +++ b/pyladies/with/index.html @@ -6,7 +6,7 @@

            Kontext: with a

            Příkaz with pracuje s tzv. kontextem (tady s kontextem otevřeného souboru), který má začátek a konec a při ukončení je potřeba něco udělat (tady zavřít soubor).

            -

            Kontext je v podstatě zkratka pro try/finally. Pamatuješ si na finally?

            +

            Kontext je v podstatě zkratka pro try/finally. Pamatuješ si na finally?

            Toto:

            with open('basnicka.txt', encoding='utf-8') as soubor:
                 # Zpracování souboru
            @@ -21,7 +21,7 @@ 

            Kontext: with a soubor.close()

            Jak with tak finally zaručí, že se soubor vždy uzavře: když se zpracování povede, ale i když v něm nastane výjimka, -nebo když z něj vyskočíš pomocí return nebo break:

            +nebo když z něj vyskočíš pomocí return nebo break:

            def nacti_cele_cislo(jmeno_souboru):
                 with open(jmeno_souboru, encoding='utf-8') as soubor:
                     return int(soubor.read())
            @@ -36,10 +36,10 @@ 

            Kontext: with a

            Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. -Podobných „samozavíracích“ objektů které se dají použít s with existuje -v různých knihovnách víc. -Typické jsou objekty, které se starají o připojení např. k jinému počítači -nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

            -

            Z lekce o testování si možná pamatuješ with pytest.raises(...):. -Výsledek pytest.raises na konci bloku with kontroluje, že v rámci bloku +Podobných „samozavíracích“ objektů které se dají použít s with existuje +v různých knihovnách víc. +Typické jsou objekty, které se starají o připojení např. k jinému počítači +nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

            +

            Z lekce o testování si možná pamatuješ with pytest.raises(...):. +Výsledek pytest.raises na konci bloku with kontroluje, že v rámci bloku nastala správná výjimka.

            \ No newline at end of file From f7ed233c652e34872e6b851346872192147657f5 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Mon, 18 Sep 2023 13:16:15 +0000 Subject: [PATCH 24/31] Compiled --- lessons/local-run/index.html | 6 ++++++ meta/local-run/index.html | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/lessons/local-run/index.html b/lessons/local-run/index.html index 138a0dcb..e939e7bb 100644 --- a/lessons/local-run/index.html +++ b/lessons/local-run/index.html @@ -135,6 +135,12 @@

            .gith

            Tyhle instrukce můžou být pro každou sadu kurzů jiné. Až budeš kurz přidávat na naucse.python.cz, měly by se zkontrolovat, ale do té doby se s tímto souborem netrap.

            +

            Pravděpodobně je tvůj kurz forkem jiného kurzu, a proto je potřeba GitHub +Actions explicitně povolit (v záložce Actions). Potom se musí v Settings -> +Actions -> General -> Workflow permissions nastavit Read and write +permissions - Workflows have read and write permissions in the repository for +all scopes. Pouze tak se ti po ručním spuštění GitHub Action úspěšně vytvoří +nová větev s prefixem compliled/ s obsahem pro publikaci na web.

            licenses/ #

            diff --git a/meta/local-run/index.html b/meta/local-run/index.html index 138a0dcb..e939e7bb 100644 --- a/meta/local-run/index.html +++ b/meta/local-run/index.html @@ -135,6 +135,12 @@

            .gith

            Tyhle instrukce můžou být pro každou sadu kurzů jiné. Až budeš kurz přidávat na naucse.python.cz, měly by se zkontrolovat, ale do té doby se s tímto souborem netrap.

            +

            Pravděpodobně je tvůj kurz forkem jiného kurzu, a proto je potřeba GitHub +Actions explicitně povolit (v záložce Actions). Potom se musí v Settings -> +Actions -> General -> Workflow permissions nastavit Read and write +permissions - Workflows have read and write permissions in the repository for +all scopes. Pouze tak se ti po ručním spuštění GitHub Action úspěšně vytvoří +nová větev s prefixem compliled/ s obsahem pro publikaci na web.

            licenses/ #

            From 939ab1c089b8b0f2b7e202d5c75ad9260b8390f7 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Tue, 19 Sep 2023 11:34:41 +0000 Subject: [PATCH 25/31] Compiled --- lessons/local-run/index.html | 2 +- meta/local-run/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lessons/local-run/index.html b/lessons/local-run/index.html index e939e7bb..46cf8971 100644 --- a/lessons/local-run/index.html +++ b/lessons/local-run/index.html @@ -140,7 +140,7 @@

            .gith Actions -> General -> Workflow permissions nastavit Read and write permissions - Workflows have read and write permissions in the repository for all scopes. Pouze tak se ti po ručním spuštění GitHub Action úspěšně vytvoří -nová větev s prefixem compliled/ s obsahem pro publikaci na web.

            +nová větev s prefixem compiled/ s obsahem pro publikaci na web.

            licenses/ #

            diff --git a/meta/local-run/index.html b/meta/local-run/index.html index e939e7bb..46cf8971 100644 --- a/meta/local-run/index.html +++ b/meta/local-run/index.html @@ -140,7 +140,7 @@

            .gith Actions -> General -> Workflow permissions nastavit Read and write permissions - Workflows have read and write permissions in the repository for all scopes. Pouze tak se ti po ručním spuštění GitHub Action úspěšně vytvoří -nová větev s prefixem compliled/ s obsahem pro publikaci na web.

            +nová větev s prefixem compiled/ s obsahem pro publikaci na web.

            licenses/ #

            From 34c2331c6f119c85b9e9dcf6b38d295b5d69f290 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Sat, 27 Apr 2024 13:07:23 +0000 Subject: [PATCH 26/31] Compiled --- lessons/install/linux.html | 2 +- meta/install/linux.html | 2 +- mi-pyt/install/linux.html | 2 +- pyladies/install/linux.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lessons/install/linux.html b/lessons/install/linux.html index 46ec84cf..c7bc0189 100644 --- a/lessons/install/linux.html +++ b/lessons/install/linux.html @@ -63,7 +63,7 @@

            Doinstalování Virtualenv
              -
            • Ubuntu:
              $ sudo apt-get install python-virtualenv
              +
            • Ubuntu:
              $ sudo apt-get install python3-virtualenv
               

            Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

            diff --git a/meta/install/linux.html b/meta/install/linux.html index 46ec84cf..c7bc0189 100644 --- a/meta/install/linux.html +++ b/meta/install/linux.html @@ -63,7 +63,7 @@

            Doinstalování Virtualenv
              -
            • Ubuntu:
              $ sudo apt-get install python-virtualenv
              +
            • Ubuntu:
              $ sudo apt-get install python3-virtualenv
               

            Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

            diff --git a/mi-pyt/install/linux.html b/mi-pyt/install/linux.html index 46ec84cf..c7bc0189 100644 --- a/mi-pyt/install/linux.html +++ b/mi-pyt/install/linux.html @@ -63,7 +63,7 @@

            Doinstalování Virtualenv
              -
            • Ubuntu:
              $ sudo apt-get install python-virtualenv
              +
            • Ubuntu:
              $ sudo apt-get install python3-virtualenv
               

            Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

            diff --git a/pyladies/install/linux.html b/pyladies/install/linux.html index 46ec84cf..c7bc0189 100644 --- a/pyladies/install/linux.html +++ b/pyladies/install/linux.html @@ -63,7 +63,7 @@

            Doinstalování Virtualenv
              -
            • Ubuntu:
              $ sudo apt-get install python-virtualenv
              +
            • Ubuntu:
              $ sudo apt-get install python3-virtualenv
               

            Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

            From db83502c2c8e4f822ad81c5ef5a21c44c999b6a4 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Sat, 27 Apr 2024 15:33:23 +0000 Subject: [PATCH 27/31] Compiled --- lessons/and-or/index.html | 2 +- lessons/circular-imports/index.html | 6 +++--- lessons/cmdline/index.html | 18 +++++++++--------- lessons/comparisons/index.html | 2 +- lessons/course.json | 2 +- lessons/def/index.html | 4 ++-- lessons/exceptions/index.html | 8 ++++---- lessons/first-steps/index.html | 2 +- lessons/functions/index.html | 18 +++++++++--------- lessons/hello-world/index.html | 4 ++-- lessons/install-editor/index.html | 4 ++-- lessons/local-variables/index.html | 6 +++--- lessons/nested-traceback/index.html | 2 +- lessons/prefer-return/index.html | 2 +- lessons/recursion/index.html | 4 ++-- lessons/str-index-slice/index.html | 2 +- lessons/str/index.html | 2 +- lessons/venv-setup/index.html | 12 ++++++------ meta/cmdline/index.html | 18 +++++++++--------- meta/venv-setup/index.html | 12 ++++++------ mi-pyt/cmdline/index.html | 18 +++++++++--------- mi-pyt/venv-setup/index.html | 12 ++++++------ pyladies/and-or/index.html | 2 +- pyladies/cmdline/index.html | 18 +++++++++--------- pyladies/comparisons/index.html | 2 +- pyladies/course.json | 2 +- pyladies/def/index.html | 4 ++-- pyladies/exceptions/index.html | 8 ++++---- pyladies/first-steps/index.html | 2 +- pyladies/functions/index.html | 18 +++++++++--------- pyladies/hello-world/index.html | 4 ++-- pyladies/install-editor/index.html | 4 ++-- pyladies/local-variables/index.html | 6 +++--- pyladies/nested-traceback/index.html | 2 +- pyladies/prefer-return/index.html | 2 +- pyladies/str-index-slice/index.html | 2 +- pyladies/str/index.html | 2 +- pyladies/venv-setup/index.html | 12 ++++++------ 38 files changed, 125 insertions(+), 125 deletions(-) diff --git a/lessons/and-or/index.html b/lessons/and-or/index.html index 8b3c36b9..5c7fb6d3 100644 --- a/lessons/and-or/index.html +++ b/lessons/and-or/index.html @@ -84,7 +84,7 @@

            Nebo anebo a else: # A tady víme, že není ani šťastná, ani bohatá. print('To je mi líto.') -

            Všimni si co se stane, když zadáš něco jiného než „ano“ nebo „ne“.

            +

            Všimni si, co se stane, když zadáš něco jiného než „ano“ nebo „ne“.

            Proměnná stastna nebo bohata se nenastaví, a když je ji potom potřeba použít, program skončí s chybou.

            O tom, jak se vypořádat s chybami, si povíme později.

            diff --git a/lessons/circular-imports/index.html b/lessons/circular-imports/index.html index 11a08915..2c9126d0 100644 --- a/lessons/circular-imports/index.html +++ b/lessons/circular-imports/index.html @@ -6,7 +6,7 @@

            Cyklické importy abys věděl/a o čem tu je řeč.

            Po rozdělení bude projekt vypadat třeba nějak takhle: (Šipky mezi moduly znázorňují importování.)

            -
            ┌──────────────────╮  ┌───────────────╮  ┌──────────────────╮ 
            +
            ┌──────────────────╮  ┌───────────────╮  ┌──────────────────╮
             │      ai.py       │  │ piskvorky.py  │  │    hra.py        │
             ├──────────────────┤  ├───────────────┤  ├──────────────────┤
             │                  │◀-│ import ai     │◀-│ import piskvorky │
            @@ -60,7 +60,7 @@ 

            Cyklické importy

            Organizace modulů podle závislostí #

            -

            První možnost je importovat funkci tah v modulu ai +

            První možnost je definovat funkci tah v modulu ai a používat ji odtamtud. To je jednoduché, ale nerespektuje účel modulu ai, který má obsahovat jenom logiku @@ -79,7 +79,7 @@

            Organizace modulů podle závislost

            Druhá možnost je definovat nový, sdílený modul, který se použije jak v piskvorky.py tak v ai.py.

            -

            Takový modul se často se pojmenovává +

            Takový modul se často pojmenovává util.py (z angl. utility, pomůcka, nástroj).

                          ┌──────────────────╮
                           │ util.py          │
            diff --git a/lessons/cmdline/index.html b/lessons/cmdline/index.html
            index 2d2fcbcb..6454ba49 100644
            --- a/lessons/cmdline/index.html
            +++ b/lessons/cmdline/index.html
            @@ -3,7 +3,7 @@ 

            Příkazová řádka

            V této lekci se seznámíme s příkazovou řádkou – černým okýnkem, které programátoři používají na zadávání textových příkazů.

            -

            Na většinu z toho co příkazová řádka umí můžeš použít i něco jiného – ikonku +

            Na většinu z toho, co příkazová řádka umí, můžeš použít i něco jiného – ikonku na ploše, speciální program nebo editor, webovou aplikaci – ale tyhle vychytávky mají dvě nevýhody:

              @@ -97,7 +97,7 @@

              Co v tom adresáři je? #

              Příkaz ls nebo dir (z angl. list – vyjmenovat, resp. directory – adresář) -ti vypíše co aktuální adresář obsahuje: všechny soubory, +ti vypíše, co aktuální adresář obsahuje: všechny soubory, včetně podadresářů, které se v aktuálním adresáři nacházejí.

              Unix

              $ ls
              @@ -149,15 +149,15 @@ 

              Windows

              > <
                               

              Unix

              $ mkdir zkouska
               

              Windows

              > mkdir zkouska
              -

              Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí +

            Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. +Jeden z vypsaných adresářů bude zkouska.

            +

            Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

            Unix

            $ cd zkouska
             

            Windows

            > cd zkouska
            -

            Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. -Jeden z vypsaných adresářů bude zkouska.

            -

            V grafickém hledátku +

            V grafickém hledátku #

            Často nebudeš pracovat jenom s příkazovou řádkou. @@ -178,14 +178,14 @@

            macOS

            Windows

            Screenshot průzkumníka na Windows -

            Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře který je +

            Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je aktivní v příkazové řádce. V budoucnu to ale bude složitější, takže bude dobré si vyzkoušet kopírovat text z příkazové řádky a vložit ho do prohlížeče souborů.

            Bohužel se to dělá na každém systému jinak. A protože známé zkratky Ctrl+C a Ctrl+V dělají v příkazové řádce něco jiného než -kopírování, nejspíš se to dělá jinak než jsi zvyklý/á.

            +kopírování, nejspíš se to dělá jinak, než jsi zvyklý/á.

            Nejdřív si pomocí příkazu cd nebo pwd nech vypsat celé jméno adresáře zkouska:

            @@ -247,7 +247,7 @@

            Vkládání do příkazové řádky

            Vyzkoušej si, že se v řádce projeví i změny, které na počítači uděláš jiným způsobem.

            -

            V grafickém prohlížeči, který se „dívá“ na stejný adresář který máš aktivní +

            V grafickém prohlížeči, který se „dívá“ na stejný adresář, jako máš aktivní v příkazové řádce, vytvoř nový soubor nebo adresář. Pak se pomocí příkazu ls nebo dir podívej, že se opravdu vytvořil. Potom ho v grafickém programu smaž – a v příkazové řádce se ujisti, diff --git a/lessons/comparisons/index.html b/lessons/comparisons/index.html index 3f529682..7819c44c 100644 --- a/lessons/comparisons/index.html +++ b/lessons/comparisons/index.html @@ -56,7 +56,7 @@

            Porovnávání

        -
        3 <= 5, 3 >= 5 Menší nebo rovno, větší nebo rovno

        Hodnoty provnání jsou takzvané booleovské hodnoty +

        Hodnoty porovnání jsou takzvané booleovské hodnoty (angl. boolean, podle G. Boolea). V Pythonu je můžeš použít vždycky, když potřebuješ vědět, jestli něco platí nebo neplatí. diff --git a/lessons/course.json b/lessons/course.json index bbc9f6af..84caadec 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -1694,7 +1694,7 @@ "content": "

        Zápis retezec[5:] vybere podřetězec od znaku číslo 5 dál.

        " }, { - "content": "

        Zápis retezec[od:do] vybere podřetězec od pozice od do pozice do.\nKdyž jednu z hodnot vynecháš, vybírá se od začádku, resp. do konce.

        \n
        retezec = 'čokoláda'\nprint(retezec[:4])      # → čoko\nprint(retezec[2:6])     # → kolá\nprint(retezec[-3:])     # → áda\nprint(retezec[:])       # → čokoláda\n
        " + "content": "

        Zápis retezec[od:do] vybere podřetězec od pozice od do pozice do.\nKdyž jednu z hodnot vynecháš, vybírá se od začátku, resp. do konce.

        \n
        retezec = 'čokoláda'\nprint(retezec[:4])      # → čoko\nprint(retezec[2:6])     # → kolá\nprint(retezec[-3:])     # → áda\nprint(retezec[:])       # → čokoláda\n
        " }, { "content": "
        slovo = input('Slovo: ')\npozice = int(input('Které písmeno zaměnit (od nuly)? '))\nnovy_znak = input('Nové písmeno: ')\n\nzacatek_slova = slovo[:pozice]\nkonec_slova = slovo[pozice + 1:]\nnove_slovo = zacatek_slova + novy_znak + konec_slova\n\nprint(nove_slovo)\n
        " diff --git a/lessons/def/index.html b/lessons/def/index.html index 1e6014f4..c780e573 100644 --- a/lessons/def/index.html +++ b/lessons/def/index.html @@ -17,7 +17,7 @@

        K čemu jsou funkce? nove_slovo = zacatek + novy_znak + konec

      Z takového kódu není na první pohled jasné, co přesně dělá. Zvlášť když kód použiješ ve složitějším programu.

      -

      Dá se to vyřešit komentářem: ten, kdo bude program číst, si může přečíst +

      Dá se to vyřešit komentářem: ten, kdo bude program číst, si může přečíst, co to má dělat. Samotný složitější kód pak může ignorovat.

      # Ve slově `slovo` zaměnit znak na pozici `pozice` za `novy_znak`;
       # výsledek bude v proměnné `nove_slovo`.
      @@ -54,7 +54,7 @@ 

      Definice funkce

      Funkce se definuje příkazem def, za nějž napíšeš jméno funkce, pak do závorky seznam parametrů, které funkce bere, a pak dvojtečku.

      Potom následuje odsazené tělo funkce – příkazy, které funkce provádí.

      -

      Tělo může začít dokumentačním řetězcem (angl. docstring), který popisuje +

      Tělo může začít dokumentačním řetězcem (angl. docstring), který popisuje, co funkce dělá. To může být jakýkoli řetězec, ale tradičně se uvozuje třemi uvozovkami (i v případě, že je jen jednořádkový).

      diff --git a/lessons/exceptions/index.html b/lessons/exceptions/index.html index 578036e1..6ab53866 100644 --- a/lessons/exceptions/index.html +++ b/lessons/exceptions/index.html @@ -19,10 +19,10 @@

      Výjimky Co s tím má chudák funkce int dělat? Není žádná rozumná hodnota, kterou by mohla vrátit. Převádění tohoto textu na celé číslo nedává smysl.

      -

      Až funkce nacti_cislo nejlíp „ví“, co se má stát když uživatel nezadá +

      Až funkce nacti_cislo nejlíp „ví“, co se má stát, když uživatel nezadá číslice. Stačí se uživatele zeptat znovu! -Kdybys měl/a funkci, která zjistí jestli jsou v řetězci jen číslice, +Kdybys měl/a funkci, která zjistí, jestli jsou v řetězci jen číslice, mohlo by to fungovat nějak takhle:

      def nacti_cislo():
           """Získá od uživatele celé číslo a vrátí ho"""
      @@ -111,8 +111,8 @@ 

      Nechytej je všechny! připraví, může hodně ulehčit hledání chyby.

      Zachytávej tedy jenom ty chyby, které očekáváš – víš přesně, která chyba může nastat a proč; máš možnost správně zareagovat.

      -

      V našem příkladu to platí pro ValueError z funkce int: víš že uživatel -nemusí vždy zadat číslo ve správném formátu a víš že správná +

      V našem příkladu to platí pro ValueError z funkce int: víš, že uživatel +nemusí vždy zadat číslo ve správném formátu, a víš, že správná reakce na tuhle situaci je problém vysvětlit a zeptat se znovu.

      Co ale dělat, když uživatel chce ukončit program a zmáčkne Ctrl+C? diff --git a/lessons/first-steps/index.html b/lessons/first-steps/index.html index 55fdb14c..d87f4682 100644 --- a/lessons/first-steps/index.html +++ b/lessons/first-steps/index.html @@ -70,7 +70,7 @@

      První příkaz

      Pokud ses dostal/a až sem, gratuluji! Python máš nejen nainstalovaný, ale taky ti funguje. -Stačí ho už jen zavřít a pak opustit i samotnou příkazovou řádku. +Stačí ho už jen zavřít. V Pythonu se to dělá pomocí quit(), s prázdnými závorkami na konci.

       >>> quit()
      diff --git a/lessons/functions/index.html b/lessons/functions/index.html
      index 0d8b8c3e..97557c22 100644
      --- a/lessons/functions/index.html
      +++ b/lessons/functions/index.html
      @@ -35,7 +35,7 @@ 

      Funkce
      ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

      Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, aby se dal snadno naučit. A tak používá symboly jen pro ty nejčastější operace. -Operátorů které využívají symboly je tak málo, že už jich zhruba půlku znáš!

      +Operátorů, které využívají symboly, je tak málo, že už jich zhruba půlku znáš!

      Pro zajímavost, tady jsou všechny – i ty co ještě neznáš:

      +V záložce Písmo si pak můžeš vybrat větší font.

      + +

      Screenshot menu příkazové řádky

      Na ostatních systémech hledej v nastavení, nebo zkus Ctrl++ a @@ -63,7 +66,9 @@

      Unix

      $ 
       

      Windows

      > whoami
       pocitac\Helena
      -

      Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš +

    + +

    Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš příkaz do příkazové řádky. Vypíše ho počítač, většinou ještě s něčím před ním, takže ho nepiš sám/sama! Zadej jen whoami a Enter.

    @@ -83,7 +88,9 @@

    Unix

    $ 
     

    Windows

    > cd
     C:\Users\helena
    -

    Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem +

    + +

    Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem $ nebo >. Ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a. Občas totiž bývá vypsaný zkráceně. @@ -114,7 +121,9 @@

    Windows

    > <
     05/08/2014 07:28 PM <DIR>  Downloads
     05/08/2014 07:28 PM <DIR>  Music
     
    -

    Změna aktuálního adresáře + + +

    Změna aktuálního adresáře #

    Aktuální adresář se dá změnit pomocí příkazu cd @@ -134,7 +143,9 @@

    Unix

    $ 
                     

    Windows

    > cd Desktop
     > cd
     C:\Users\helena\Desktop
    -

    Poznámka pro Windows

    +
    + +

    Poznámka pro Windows

    Pokud přecházíš do adresáře na jiném disku, například D: místo C:, je potřeba kromě cd zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

    @@ -149,7 +160,9 @@

    Windows

    > <
                     

    Unix

    $ mkdir zkouska
     

    Windows

    > mkdir zkouska
    -

    Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. + + +

    Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

    Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

    @@ -157,7 +170,9 @@

    Windows

    > <
                     

    Unix

    $ cd zkouska
     

    Windows

    > cd zkouska
    -

    V grafickém hledátku + + +

    V grafickém hledátku #

    Často nebudeš pracovat jenom s příkazovou řádkou. @@ -178,7 +193,9 @@

    macOS

    Windows

    Screenshot průzkumníka na Windows -

    Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je + + +

    Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je aktivní v příkazové řádce. V budoucnu to ale bude složitější, takže bude dobré si vyzkoušet kopírovat text z příkazové řádky a vložit ho do prohlížeče souborů.

    @@ -194,7 +211,9 @@

    Unix

    $ 
     

    Windows

    > cd
     C:\Users\helena\Desktop\zkouska
    -

    Kopírování z příkazové řádky + + +

    Kopírování z příkazové řádky #

    Na Linuxu vyber text myší a pak buď:

    @@ -237,9 +256,9 @@

    Vkládání do příkazové řádky
  • macOS: ⌘ Command+V
  • Windows: Menu EditPaste
  • -

    Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, +

    Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš -", např:

    +", např:

    $ cd "můj super adresář"
     

    Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

    Pozorování změn @@ -274,7 +293,9 @@

    Unix

    $ 
                     

    Windows

    > cd ..
     > cd
     C:\Users\helena\Desktop
    -

    Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem + + +

    Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

    Konec # @@ -332,5 +353,7 @@

    Přehled ukončení exit -

    Další příkazy jako python nebo git si vysvětlíme až budou potřeba, + + +

    Další příkazy jako python nebo git si vysvětlíme až budou potřeba, po tom, co si je nainstaluješ.

    \ No newline at end of file diff --git a/lessons/collaboration/index.html b/lessons/collaboration/index.html index d15b81dd..3198a583 100644 --- a/lessons/collaboration/index.html +++ b/lessons/collaboration/index.html @@ -42,7 +42,9 @@

    Spolupráce
  • svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
  • svoboda redistribuovat kopie programu,
  • svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
  • -

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) + + +

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) dostupná na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

    @@ -224,19 +226,25 @@

    Vytvoření větve který máš na GitHubu ty. (Pozor, v příkazu je tvojejmeno dvakrát!)

    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    -

    a zkontroluj si, že se to povedlo:

    +
    + +

    a zkontroluj si, že se to povedlo:

    $ git remote -v
     origin  git@github.com:naucse/prezencka.git (fetch)
     origin  git@github.com:naucse/prezencka.git (push)
     tvojejmeno      https://github.com/tvojejmeno/prezencka (fetch)
     tvojejmeno      https://github.com/tvojejmeno/prezencka (push)
    -

    Tolik k nastavení – git remote add + + +

    Tolik k nastavení – git remote add stačí udělat jednou pro každý repozitář. Pak už můžeš změny nahrávat pomocí:

    $ git push tvojejmeno pridani-jmena
    -

    což znamená: pošli na adresu uloženou pod zkratkou + + +

    což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev pridani-jmena.

    Funguje? Podívej se na diff --git a/lessons/comparisons/index.html b/lessons/comparisons/index.html index 7819c44c..a638ed2f 100644 --- a/lessons/comparisons/index.html +++ b/lessons/comparisons/index.html @@ -30,7 +30,9 @@

    Porovnávání 3 ** 2 Umocnění (3 na druhou) -

    Python ale zná i další druhy operátorů. + + +

    Python ale zná i další druhy operátorů. Důležité jsou operátory porovnávací. Zkus si co dělají! (Buď z programu pomocí print, @@ -56,7 +58,9 @@

    Porovnávání 3 <= 5, 3 >= 5 Menší nebo rovno, větší nebo rovno -

    Hodnoty porovnání jsou takzvané booleovské hodnoty + + +

    Hodnoty porovnání jsou takzvané booleovské hodnoty (angl. boolean, podle G. Boolea). V Pythonu je můžeš použít vždycky, když potřebuješ vědět, jestli něco platí nebo neplatí. @@ -101,11 +105,13 @@

    Řešení

    -

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. + + +

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. K tomu můžeš použít dvojici příkazů if (pokud) a else (jinak):

    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    diff --git a/lessons/course.json b/lessons/course.json
    index 84caadec..e8dc8f9c 100644
    --- a/lessons/course.json
    +++ b/lessons/course.json
    @@ -206,7 +206,7 @@
                         "index": {
                             "attribution": [
                                 "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.",
    -                            "Založeno na tutoriálu Django Girls."
    +                            "Založeno na tutoriálu [Django Girls].\n[Django Girls]: https://tutorial.djangogirls.org/en/intro_to_command_line/"
                             ],
                             "content": {
                                 "path": "cmdline/index.html"
    @@ -518,7 +518,7 @@
                             "slug": "index",
                             "solutions": [
                                 {
    -                                "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " + "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " } ], "source_file": "lessons/beginners/files/index.md", @@ -1688,7 +1688,7 @@ "content": "

    Nedostal/a – dostal/a jsi šesté písmeno.

    " }, { - "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯
    " + "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯\n
    " }, { "content": "

    Zápis retezec[5:] vybere podřetězec od znaku číslo 5 dál.

    " @@ -4238,7 +4238,7 @@ "https://www.aliexpress.com/wholesale?SearchText=nodemcu+v2+esp8266+ch340", "https://www.aliexpress.com/wholesale?SearchText=sg92r", "https://www.aliexpress.com/wholesale?SearchText=ws2812+strip", - "https://www.gme.cz/led-kulate-pouzdro?tech_par[103][]=18997&showFilter=103", + "https://www.gme.cz/led-kulate-pouzdro?tech_par%5B103%5D%5B%5D=18997&showFilter=103", "naucse:page?lesson=beginners/install-editor&page=gedit", "naucse:static?filename=boot.py", "naucse:static?filename=module_detail.jpg", diff --git a/lessons/cython/index.html b/lessons/cython/index.html index 3b1f7797..7c92d0c0 100644 --- a/lessons/cython/index.html +++ b/lessons/cython/index.html @@ -9,7 +9,7 @@
  • Na Windows se řiďte instrukcemi pro vaši verzi Pythonu na Python wiki.
  • -
    +

    C API #

    @@ -198,7 +198,7 @@

    PyObject

    Podívejme se teď na základní mechanismy interpretu CPython.

    Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject -(dokumentace, +(dokumentace, definice). Skládá se ze dvou prvků:

    typedef struct _object {
    @@ -490,13 +490,9 @@ 

    Používání NumPy způsoby: dekorátorem:

    @cython.boundscheck(False)
     cpdef funkce():
    -    ...
    -
    -

    ... nebo příkazem with:

    + ...

    ... nebo příkazem with:

    with cython.boundscheck(False):
    -    ...
    -
    -

    ... případně i pro celý soubor, viz dokumentace.

    + ...

    ... případně i pro celý soubor, viz dokumentace.

    Další zajímavá direktiva je cython.wraparound(False), která podobným způsobem vypíná pythonní způsob indexování zápornými čísly: místo indexování od konce s ní dostaneme nedefinované chování.

    diff --git a/lessons/decorators/index.html b/lessons/decorators/index.html index bb4d533f..7d5ed6e4 100644 --- a/lessons/decorators/index.html +++ b/lessons/decorators/index.html @@ -148,16 +148,18 @@

    Řešení

    -

    Tento dekorátor není úplně praktický. Pokud toho vypíše trochu víc, tak už se +

    + +

    Tento dekorátor není úplně praktický. Pokud toho vypíše trochu víc, tak už se v tom logu nikdo nevyzná. Myšlenka jako taková ovšem není úplně špatná. Kdyby třeba dekorátor počítal, kolikrát se funkce spustí, a jak dlouho obvykle trvá, mohl by nám pomoct najít místa pro optimalizaci.

    diff --git a/lessons/def/index.html b/lessons/def/index.html index c780e573..4b333123 100644 --- a/lessons/def/index.html +++ b/lessons/def/index.html @@ -109,12 +109,14 @@

    Řešení

    -

    Vracení ukončuje funkci + + +

    Vracení ukončuje funkci #

    Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou diff --git a/lessons/deployment/pythonanywhere.html b/lessons/deployment/pythonanywhere.html index 5644dd1a..4cbc292c 100644 --- a/lessons/deployment/pythonanywhere.html +++ b/lessons/deployment/pythonanywhere.html @@ -7,7 +7,7 @@

    Deployment webových apl

    Potom se zaregistrujte na www.pythonanywhere.com a vyberte Beginner Account. -Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. +Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. V té vytvořte a aktivujte virtuální prostředí a nainstalujte Flask (plus případně další závislosti nebo jiný webový framework).

    PythonAnywhere používá specificky nastavený Linux, @@ -29,7 +29,7 @@

    Deployment webových apl
    $ ssh-keygen  # (zeptá se na hesla ke klíči)
     $ cat ~/.ssh/id_rsa.pub
     

    Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním -nastavení v sekci "SSH and GPG Keys". +nastavení v sekci "SSH and GPG Keys". Pak můžete klonovat přes SSH:

    $ git clone git@github.com:<github-username>/<github-repo>.git
     

    Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

    @@ -39,7 +39,7 @@

    Deployment webových apl (Volby jiné než Manual Configuration automaticky vytvoří kostru aplikace. Vy ale už aplikaci máte hotovou, takže je nepotřebujete.)

    V konfiguraci vzniklé webové aplikace je potřeba nastavit Virtualenv -na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/__venv__), +na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/venv), a obsah WSGI Configuration File přepsat. To jde buď kliknutím na odkaz v konfiguraci (otevře se webový editor) nebo zpět v bashové konzoli pomocí editoru jako vi nebo nano.

    diff --git a/lessons/dict/index.html b/lessons/dict/index.html index 748f4a20..3195a738 100644 --- a/lessons/dict/index.html +++ b/lessons/dict/index.html @@ -137,7 +137,7 @@

    Jak udělat slovník

    Pozor na to, že v tomhle případě musí být klíče pythonní „jména“ – musí být použitelné jako jména proměnných. Například takhle nejde zadat jako klíč řetězec -"def" nebo "propan-butan".

    +"def" nebo "propan-butan".

    Zaplň prázdný slovník #

    diff --git a/lessons/distribution/index.html b/lessons/distribution/index.html index 3ecbfc69..3ef4ada4 100644 --- a/lessons/distribution/index.html +++ b/lessons/distribution/index.html @@ -87,7 +87,8 @@

    setup.py do kterého se tradičně píšou základní informace o projektu. Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, tedy tam, kde byste jej nejspíš čekali.

    -
    Czech public holiday checker...

    Poté spustíme setup.py sdist znovu:

    +
    Czech public holiday checker...
    +

    Poté spustíme setup.py sdist znovu:

    (__venv__)$ python setup.py sdist
     

    V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam být i soubor README.

    @@ -98,7 +99,8 @@

    setup.py nebude. Je to proto, že se standardně do archivu přidávají jen některé soubory. Další soubory lze přidat pomocí souboru MANIFEST.in, dle dokumentace.

    V našem případě bude MANIFEST.in vypadat takto:

    -
    include LICENSE

    Při dalším spuštění už setup.py přidá i soubor LICENSE. +

    include LICENSE
    +

    Při dalším spuštění už setup.py přidá i soubor LICENSE. To můžete zkontrolovat i ve výsledném archivu.

    (__venv__)$ python setup.py sdist
     ...
    @@ -306,7 +308,8 @@ 

    Programy pro příkazovou řádku tranzitivních – t.j. závisí-li náš balíček na Flask a Flask na Jinja2, najdeme v requirements.txt mimo jiné například řádky:

    Flask==0.11.1
    -Jinja2==2.8

    Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde +Jinja2==2.8 +

    Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde program běží, například mezi testovacím strojem a produkčním nasazením webové aplikace. Tento soubor se dá vygenerovat z aktuálního prostředí zadáním diff --git a/lessons/docs/index.html b/lessons/docs/index.html index c64dc311..a45c1172 100644 --- a/lessons/docs/index.html +++ b/lessons/docs/index.html @@ -39,7 +39,8 @@

    Sphinx ... -Finished: An initial directory structure has been created.

    Průvodce vytvoří ve složce docs několik souborů:

    +Finished: An initial directory structure has been created. +

    Průvodce vytvoří ve složce docs několik souborů:

    • conf.py – konfigurační soubor,
    • index.rst – vlastní text dokumantace,
    • @@ -110,7 +111,8 @@

      Textový obsah v dokumentaci K čemu dokumentace vlastně je?

      Dobrá dokumentace vysvětluje, proč a jak by váš projekt měl někdo používat. Jak říká Eric Holscher v jedné své prezentaci,

      -

      Když lidi neví, že váš projekt existuje,
      +

      +

      Když lidi neví, že váš projekt existuje,
      nebudou ho používat.
      Když lidi nepřijdou na to, jak váš projekt nainstalovat,
      nebudou ho používat.
      @@ -335,7 +337,8 @@

      Kompletní příklad

      Projekt pak lze nainstalovat pomocí .[dev] (tedy jméno balíčku a za ním jméno extras v hranatých závorkách):

      install:
      -- python -m pip install .[dev]

      autodoc +- python -m pip install .[dev] +

      autodoc #

      Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, diff --git a/lessons/drawing/index.html b/lessons/drawing/index.html index 0ad12f44..08e65c08 100644 --- a/lessons/drawing/index.html +++ b/lessons/drawing/index.html @@ -82,9 +82,10 @@

      Sázení čtverečku window.clear() pyglet.app.run() -

      -Stáhni si soubor green.png – zelený čtvereček – -a dej ho do adresáře, kam píšeš kód.

      + +Stáhni si soubor [green.png](naucse:static?filename=green.png) – zelený čtvereček – +a dej ho do adresáře, kam píšeš kód. +

      Pod import pyglet přidej řádek, který tento obrázek načte.

      green_image = pyglet.image.load('green.png')
       

      Potom zkus dovnitř do funkce on_draw přidat vykreslení obrázku na souřadnice @@ -116,22 +117,24 @@

      Řešení

      -

      Sázení hada + + +

      Sázení hada #

      Zkus teď na začátek programu – těsně pod import a konstantu – přidat @@ -155,34 +158,37 @@

      Řešení

      -

      Krmení + + +

      Krmení #

      -

      + Aby bylo ve hře co dělat, budeme potřebovat pro hada krmení. -Stáhni si do adresáře s projektem obrázek apple.png (ať už jednoduchý +Stáhni si do adresáře s projektem obrázek `apple.png` (ať už jednoduchý čtvereček nebo detailnější obrázek), a zkus vykreslit jídlo třeba -na následující souřadnice:

      +na následující souřadnice: +
      food = [(2, 0), (5, 1), (1, 4)]
       

      Řešení

      @@ -191,31 +197,33 @@

      Řešení

      -

      Používáš-li detailnější obrázek, možná si všimneš, že má trošičku „zubaté“ hrany. + + +

      Používáš-li detailnější obrázek, možná si všimneš, že má trošičku „zubaté“ hrany. To je dáno způsobem, jakým v Pygletu obrázek vykreslujeme. Úplné vysvětlení by zabralo příliš času, proto ukážu jen řešení. Až se naučíš grafiku víc do hloubky, pochopíš co se tu děje :)

      @@ -283,26 +291,29 @@

      Řešení

      'right-top': <ImageData 64x64>, 'left-bottom': <ImageData 64x64>, 'tail-left': <ImageData 64x64>, 'bottom-tongue': <ImageData 64x64>, 'left-top': <ImageData 64x64>, 'bottom-bottom': <ImageData 64x64>, - ...
      + ... +

      Řešení

      -

      Housenka + + +

      Housenka #

      A teď zkus načtení obrázků začlenit do programu s hadem!

      @@ -318,38 +329,40 @@

      Řešení

      -

      Jak vybrat čtverečky? + + +

      Jak vybrat čtverečky? #

      Místo toho, aby byl všude stejný kousek hada, @@ -368,7 +381,8 @@

      Řešení

      3 3 3 4 3 5 -4 5

      Zkus vymyslet, jak by se tenhle kód dal změnit, aby vypisoval ke každé +4 5 +

      Zkus vymyslet, jak by se tenhle kód dal změnit, aby vypisoval ke každé souřadnici směr k předchozímu a následujícímu políčku – tedy odkud a kam každý kousek hada „vede“. Takhle:

      @@ -378,7 +392,8 @@

      Řešení

      3 3 bottom top 3 4 bottom top 3 5 bottom right -4 5 left head

      Toto je těžký úkol. +4 5 left head +

      Toto je těžký úkol. Nepředpokládám, že ho zvládneš vyřešit hned, i když všechny potřebné informace a nástroje k tomu znáš. Zkus nad tím ale přemýšlet, nech si to rozležet v hlavě třeba přes noc, diff --git a/lessons/exceptions/index.html b/lessons/exceptions/index.html index 6ab53866..a7f138e8 100644 --- a/lessons/exceptions/index.html +++ b/lessons/exceptions/index.html @@ -94,7 +94,8 @@

      Druhy chyb │ ╰── IndentationError špatné odsazení │ ╰── TabError kombinování mezer a tabulátorů v odsazení ├── TypeError špatný typ, např. len(9) - ╰── ValueError špatná hodnota, např. int('xyz')

      Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, + ╰── ValueError špatná hodnota, např. int('xyz') +

      Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, vždy najdeš v příslušné chybové hlášce.

      Když odchytáváš obecnou výjimku, chytnou se i všechny podřízené typy výjimek – diff --git a/lessons/files/index.html b/lessons/files/index.html index 4857abe5..2dc93387 100644 --- a/lessons/files/index.html +++ b/lessons/files/index.html @@ -93,16 +93,18 @@

      Řešení

      -

      Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce + + +

      Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce bílé znaky (mezery a nové řádky) pomocí metody rstrip:

      print('Slyšela jsem tuto básničku:')
       print()
      diff --git a/lessons/first-steps/index.html b/lessons/first-steps/index.html
      index d87f4682..d84e4f62 100644
      --- a/lessons/first-steps/index.html
      +++ b/lessons/first-steps/index.html
      @@ -75,7 +75,9 @@ 

      První příkaz
       >>> quit()
       (venv)$
      -

      Zobáčky >>> se změnily na výzvu +

      + +

      Zobáčky >>> se změnily na výzvu příkazové řádky, která začíná (venv) a končí $ nebo >. Teď fungují příkazy jako whoami a cd, ale příkazy Pythonu jako 1 + 2 fungovat nebudou, dokud Python opět nepustíš pomocí diff --git a/lessons/flask/index.html b/lessons/flask/index.html index 75905d00..1c37ba22 100644 --- a/lessons/flask/index.html +++ b/lessons/flask/index.html @@ -175,7 +175,7 @@

      Šablony pro většinu stránek se obejdete s doplněním hodnoty ({{ promenna }}) a podmíněným obsahem ({% if %}) jako výše, případně s cyklem: {% for %}/{% endfor %}. Ve větších -aplikacích se pak hodí použití {% include ... %}, {% extends ... %} +aplikacích se pak hodí použití {% include ... %}, {% extends ... %} a případně také tvorba maker {% macro ... %}/{% endmacro %}.

      Veškerý kontext (proměnné) do šablony musí přijít z volání render_template(). Navíc můžete použít vybrané funkce, např. url_for(). @@ -214,7 +214,7 @@

      Escaping mají v HTML speciální význam. Zabraňuje se tak bezpečnostním rizikům, kdy se vstup od uživatele interpretuje jako HTML.

      -

      Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, +

      Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, bude výsledné HTML vypadat takto:

      <!doctype html>
       <title>Hello from Flask</title>
      @@ -252,17 +252,17 @@ 

      Statické soubory

      Logování #

      -

      Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím +

      Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného formatu), ale také vypisovat různé chybové, informační či ladící hlášky na -straně serveru. Možností je použít například funkci print, ale ta není -dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní -s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování -logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření +straně serveru. Možností je použít například funkci print, ale ta není +dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní +s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování +logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření samotné webové aplikace.

      -

      Řešením je použít standardní logovací modul logging, který řeší vše potřebné +

      Řešením je použít standardní logovací modul logging, který řeší vše potřebné (úrovně zpráv, filtry, formátování časového razítka a dalších meta-informací o -běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci +běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci vaší webové aplikace pak nebudou z formátu výstupů zmatení). Protože používáme Flask a ten také loguje tímto modulem, stačí použít předpřipravený app.logger.

      @@ -275,30 +275,30 @@

      Statické soubory def index(): app.logger.warning('Someone is accessing the index page!') return 'Index Page' -

      Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, +

      Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, error, critical). Při spuštění aplikace v ladícím režimu se loguje vše (navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody setLevel, viz dokumentace modulu logging.

      Větší Flask aplikace #

      -

      Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze -použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet +

      Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze +použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet aplikaci s databází a ORM modely, je nutné propojit Flask s dalšími knihovnami -(například flask-sqlalchemy, +(například flask-sqlalchemy, nebo flask-pymongo).

      Jiné frameworky postavené nad Model-View-Controller paradigmatem mají tyto vlastnosti již zabudovány v sobě (například Django).

      -

      Následující sekce popisují některé zajímavé techniky, které se mohou u větších +

      Následující sekce popisují některé zajímavé techniky, které se mohou u větších a složitějších aplikací hodit.

      create_app factory #

      Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí -funkce, tzv. application_factory, -standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se +funkce, tzv. application_factory, +standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se neinicializuje hned při importu modulu, ale až při zavolání funkce. Voláním funkce -můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu +můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu souboru). Díky tomu lze snadněji vytvářet Flask aplikace s různými konfiguracemi pro testování nebo dokonce vytvářet více Flask aplikací v rámci jednoho Python skriptu.

      def create_app(config=None):
      @@ -313,11 +313,11 @@ 

      create_app factory #

      Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do -samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky +samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky „modrotisk” nebo také „modrák”). Výhodou je, že můžete vytvořit blueprint (instanci -třídy Blueprint) s několika views, vlastní templates složkou a dalším -nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový +třídy Blueprint) s několika views, vlastní templates složkou a dalším +nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový blueprint pak můžete využívat i v několika různých aplikacích a snadno tak dosáhnout znovupouželnosti.

      from flask import Blueprint
      @@ -336,7 +336,7 @@ 

      create_app factory def user_link(username): ...

      Blueprint pak stačí ve Flask aplikaci registrovat -a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo +a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo jiné přidat i prefix pro všechny cesty v blueprintu.

      from flask import Flask
       from auth.views import auth
      @@ -349,8 +349,8 @@ 

      create_app factory

      Vlastní podtřída Flask #

      -

      Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat -výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které +

      Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat +výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které budou použity pro HTTP požadavky a odpovědi, měnit výchozí konfiguraci flask a spoustu dalšího. Nezapomeňte volat konstruktor nadtřídy.

      from flask import current_app, Flask, Response
      @@ -390,6 +390,6 @@ 

      create_app factory

      Flask umí i další věci – například zpracování formulářů, chybové stránky nebo přesměrování. Také existuje i řada rozšíření, které mohou ušetřit práci s běžnými úkony jako například správa uživatelů, - tvorba REST API nebo integrace s různými službami.

      +tvorba REST API nebo integrace s různými službami.

      Všechno to najdete v dokumentaci.

      \ No newline at end of file diff --git a/lessons/fstring/index.html b/lessons/fstring/index.html index 80def15a..7a166210 100644 --- a/lessons/fstring/index.html +++ b/lessons/fstring/index.html @@ -12,19 +12,23 @@

      Šablony (formátovací řetězce)

      To ale není tak přehledné, jak by mohlo. Lze to zpřehlednit použitím šablony.

      Takovou šablonu si představ jako formulář s vynechanými místy:

      -
      Součet je __________.

      Složitější šablona by byla třeba tahle:

      +
      Součet je __________.
      +

      Složitější šablona by byla třeba tahle:

      Mil[ý/á] _______,
       Váš výsledek je __________.
       
       S pozdravem,
      -_________

      Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba +_________ +

      Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba jednotlivá vynechaná místa ve formuláři nějak jednoznačně označit. Použijme jména v „kudrnatých“ závorkách:

      -
      Součet je {soucet}.
      Mil{y_a} {osloveni},
      +
      Součet je {soucet}.
      +
      Mil{y_a} {osloveni},
       Váš výsledek je {soucet}.
       
       S pozdravem,
      -{podpis}.

      Takovou šablonu můžeš použít jako formátovací řetězec +{podpis}. +

      Takovou šablonu můžeš použít jako formátovací řetězec (angl. formatted string literal, zkráceně f-string). Jako jakýkoli jiný řetězec ji vlož do uvozovek. diff --git a/lessons/functions/index.html b/lessons/functions/index.html index 97557c22..abc9c91e 100644 --- a/lessons/functions/index.html +++ b/lessons/functions/index.html @@ -31,8 +31,10 @@

      Funkce

      Ne že by neexistovaly programovací jazyky, na které je potřeba speciální klávesnice. Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:

      -

      -
      ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

      Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, + + +

      ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’
      +

      Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, aby se dal snadno naučit. A tak používá symboly jen pro ty nejčastější operace. Operátorů, které využívají symboly, je tak málo, že už jich zhruba půlku znáš!

      @@ -61,7 +63,9 @@

      Funkce [ ] ( ) { } . -

      Všechno ostatní vyjádříme slovně.

      + + +

      Všechno ostatní vyjádříme slovně.

      Délka řetězce #

      @@ -136,7 +140,7 @@

      Délka řetězce

      Procedury #

      -

      Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") +

      Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") je taky volání funkce. Stejně jako len dostává print v závorkách argument – hodnotu, se kterou pracuje. @@ -190,7 +194,9 @@

      Řešení

      -

      Pojmenované argumenty + + +

      Pojmenované argumenty #

      Některé funkce umí pracovat i s pojmenovanými argumenty. diff --git a/lessons/generators/index.html b/lessons/generators/index.html index 13adebe9..b1fd83e2 100644 --- a/lessons/generators/index.html +++ b/lessons/generators/index.html @@ -250,4 +250,5 @@

      Vracení hodnot z generátorů Got 3 Got 5 Got 8 -LOG: Generated 6 numbers

      Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

      \ No newline at end of file +LOG: Generated 6 numbers +

      Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

      \ No newline at end of file diff --git a/lessons/git-collaboration-2in1/index.html b/lessons/git-collaboration-2in1/index.html index 6830dfc9..746e95f7 100644 --- a/lessons/git-collaboration-2in1/index.html +++ b/lessons/git-collaboration-2in1/index.html @@ -4,13 +4,13 @@

      Spolupráce a Git

      „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat stejné části (soubory) programu?

      -

      Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +

      Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

      -

      Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. -Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +

      Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

      -

      Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +

      Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

      Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

      @@ -23,34 +23,34 @@

      Git a GitHub Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

      A co víc – Git vám dovoluje sdílet kód s ostatními programátory. Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. -S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře -a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

      -

      Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. -Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. -Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +

      Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). Zkuste se po nich podívat, ušetříte práci sobě i autorům.

      -

      Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +

      Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn (místo posílání mailů stačí zmáčknout tlačítko).

      Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

      -

      Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +

      Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, kam správce projektu dává aktuální „oficiální verzi”. Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv (nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). A třetí kopii repozitáře máte u sebe na počítači.

      -

      Git workflow

      +

      Git workflow

      Práce s lokálním repozitářem #

      Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. -Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

      1. Git bude sledovat změny, které ve složce uděláme.
      2. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
      3. -
      4. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
      5. +
      6. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.

      Pozor

      Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. @@ -75,7 +75,7 @@

      Stav repozitáře (git status<

      První revize (git commit) #

      -

      Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +

      Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

      Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt @@ -102,7 +102,7 @@

      První revize (git commit) new file: magdalena_rettigova.txt

      To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

      $ git commit
      -

      Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +

      Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). @@ -113,7 +113,7 @@

      První revize (git commit) (use "git push" to publish your local commits) nothing to commit, working tree clean

      Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

      -

      Git workflow

      +

      Git workflow

      Log (git log) #

      @@ -146,7 +146,7 @@

      Open-source a Free software 50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

      -

      Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +

      Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval Richard Stallman GNU Manifesto, kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. To prosazuje 4 následujících svobody (převzato z Wikipedie):

      @@ -156,17 +156,17 @@

      Open-source a Free software
    • svoboda redistribuovat kopie programu,
    • svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    • -

      Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +

      Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

      Pozor

      Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

      Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – -protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. A bohužel, ne všechny projekty mají přátelské autory.

      -

      Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +

      Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, ale každý může i zkontrolovat, jestli dělají to, co dělat mají. -Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), -ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní a lidé časem začnou používat opravenou verzi.

      Některé příklady populárních open-source projektů:

        @@ -179,12 +179,12 @@

        Open-source a Free software
      • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
      • Materiály k tomuto kurzu
      -

      A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +

      A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: všechno know-how je sdílené a budeme rádi, když se zapojíte.

      Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

      Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. -Licence projektu většinou najdete v souboru LICENCE. +Licence projektu většinou najdete v souboru LICENCE. Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

      Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

      Spolupráce na projektu @@ -194,16 +194,16 @@

      Spolupráce na projektu

      Posílání změn (git push) #

      -

      Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +

      Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, vizte obrázek na začátku.

      Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, -kterou jste použili pro git clone. +kterou jste použili pro git clone. Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

      -

      A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, -odkud se dají stahovat a kam se dají posílat změny. +

      A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

      $ git remote -v
       origin  https://github.com/asgeirrr/prezencka (fetch)
      @@ -226,10 +226,10 @@ 

      Posílání změn (git push

      Žádost o začlenění (pull request) #

      -

      Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +

      Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

      Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) -by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

      Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. (Diskutovat se dá na stránce pull requestu nebo přes mail.)

      @@ -243,7 +243,7 @@

      Žádost o začlenění (pull request)
      $ git pull origin master
       

      stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

      -

      Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +

      Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

      Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, ale nechme si to na pokračovací srazy nebo workshop.

      \ No newline at end of file diff --git a/lessons/github-api/index.html b/lessons/github-api/index.html index f6e8976b..7a4bd959 100644 --- a/lessons/github-api/index.html +++ b/lessons/github-api/index.html @@ -23,7 +23,7 @@

      Autorizace
      • Přihlaš se na github.com.
      • Jdi na nastavení Personal Accesss Tokens.
      • -
      • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
      • +
      • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
      • Zkopíruj si token (dlouhý řetězec), které takto dostaneš, do souboru token.txt.

      Pozor!

      @@ -95,9 +95,10 @@

      Uživatelský účet

      API Githubu toho umí mnohem víc. Třeba na adrese https://api.github.com/emojis na tebe čeká -slovník s adresami malých obrázků. +slovník s adresami malých obrázků.

      -Celé API je zdokumentováno na adrese + +

      Celé API je zdokumentováno na adrese developer.github.com.

      Interakce # diff --git a/lessons/hello-world/index.html b/lessons/hello-world/index.html index 45840307..f47b8c18 100644 --- a/lessons/hello-world/index.html +++ b/lessons/hello-world/index.html @@ -59,7 +59,7 @@

      Spuštění zkušenějšího programátora.

      Typografická vsuvka

      V Pythonu je většinou jedno, kde napíšeš mezeru. Stejně jako náš příkaz -print("Ahoj světe!") by fungovalo třeba:

      +print("Ahoj světe!") by fungovalo třeba:

      print      (   "Ahoj světe!"     )
       

      Je ale zvykem dodržovat určitá pravidla. Jako v češtině se po otvírací závorce a za @@ -68,5 +68,5 @@

      Spuštění „Správně“ je tedy:

      print("Ahoj světe!")
       

      V rámci uvozovek má pak každá mezera význam: když napíšeš -" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

      +" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

      \ No newline at end of file diff --git a/lessons/http/index.html b/lessons/http/index.html index 98df17b0..92a6e05b 100644 --- a/lessons/http/index.html +++ b/lessons/http/index.html @@ -33,7 +33,8 @@

      Webové adresy

      Jak taková komunikace vypadá si ukážeme na příkladu – co se stane, když do prohlížeče zadám tuhle adresu:

      -
      http://naucse.python.cz/lessons/fast-track/http/

      Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, +

      http://naucse.python.cz/lessons/fast-track/http/
      +

      Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, „jednotná adresa zdroje“) přesně určuje, jak se má prohlížeč dostat k informacím, které má zobrazit.

      http://naucse.python.cz/lessons/fast-track/http/

      diff --git a/lessons/ignoring/index.html b/lessons/ignoring/index.html index 0e7d669e..3fc7fc97 100644 --- a/lessons/ignoring/index.html +++ b/lessons/ignoring/index.html @@ -4,24 +4,27 @@

      Ignorování souborů

      Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:

      -
      Pomocné soubory nástrojů

      Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými +

      Pomocné soubory nástrojů
      +
      Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými soubory, aby zrychlil importování modulů. Některé počítače vytváří skryté soubory s názvy jako .Thumbnails, .DS_Store nebo Thumbs.db. Takové věci v repozitáři nemají co dělat – je -dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

      -
      Výstup programu a nastavení

      Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři +dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

      +
      Výstup programu a nastavení
      +
      Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři jen samotný program. -Obrázky si může pomocí programu každý vytvořit sám.

      -

      : Podobně fungují soubory s heslem: pokud program potřebuje heslo - např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně - k dispozici, musí si každý vytvořit soubor s heslem sám.

      -
      -
      Osobní soubory

      Občas se stane, že v adresáři s repozitářem máš soubor s osobními +Obrázky si může pomocí programu každý vytvořit sám.

      +
      Podobně fungují soubory s heslem: pokud program potřebuje heslo +např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně +k dispozici, musí si každý vytvořit soubor s heslem sám.
      +
      Osobní soubory
      +
      Občas se stane, že v adresáři s repozitářem máš soubor s osobními poznámkami. Zbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat -jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

      -
      Adresář s virtuálním prostředím

      Jistě už sis zvykl/a na virtuální prostředí. +jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

      +
      Adresář s virtuálním prostředím
      +
      Jistě už sis zvykl/a na virtuální prostředí. Adresář s ním se může jmenovat různě, v začátečnickém kurzu používáme název venv. Není dobré tento adresář dávat do Gitu, protože je jednoduché jej vždy vytvořit znovu @@ -30,8 +33,9 @@

      Ignorování souborů prostředí nebylo vždy na úplně stejném místě. Virtuální prostředí z adresáře /home/helena/projektABC/venv nebude fungovat z adresáře C:\Users\Helena\projektABC\venv, -ale ani z /home/mirka/projektABC/venv.

      -

      My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby +ale ani z /home/mirka/projektABC/venv. + +

      My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby git status neukazoval červeně, že ještě nejsou v repozitáři.

      Příprava # @@ -51,7 +55,8 @@

      Příprava getcanvas().postscript(file='obrazek.ps')

    • poznamky.txt

      -
      Tohle je tajné!
    • +
      Tohle je tajné!
      +
    • Autofile.tmp

      Do tohohle souboru napiš cokoliv. Různé operační systémy a (jiné programy) vytváří různé soubory @@ -72,12 +77,13 @@

      Příprava Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp - obrazek.ps - obrazek.py - poznamky.txt + Autofile.tmp + obrazek.ps + obrazek.py + poznamky.txt -nothing added to commit but untracked files present (use "git add" to track)

      Spousta souborů, ale jen jeden z nich chceš v repozitáři. +nothing added to commit but untracked files present (use "git add" to track) +

      Spousta souborů, ale jen jeden z nich chceš v repozitáři. Co s těmi ostatními?

      Výstupy programu a pomocné soubory společných nástrojů # @@ -94,7 +100,8 @@

      Výstupy program (Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává – doporučuji soubor vytvořit v programátorském editoru.) Do něj napiš:

      -
      obrazek.ps

      Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

      +
      obrazek.ps
      +

      Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

      $ git status
       On branch master
       
      @@ -102,12 +109,13 @@ 

      Výstupy program Untracked files: (use "git add <file>..." to include in what will be committed) - .gitignore - Autofile.tmp - obrazek.py - poznamky.txt + .gitignore + Autofile.tmp + obrazek.py + poznamky.txt -nothing added to commit but untracked files present (use "git add" to track)

      Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

      +nothing added to commit but untracked files present (use "git add" to track) +

      Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

      $ git add .gitignore obrazek.py
       $ git status
       On branch master
      @@ -116,13 +124,14 @@ 

      Výstupy program Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py + new file: .gitignore + new file: obrazek.py Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp - poznamky.txt

      Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou + Autofile.tmp + poznamky.txt +

      Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou .gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

      Jak ignorovat zbylé dva soubory?

      Osobní poznámky @@ -133,13 +142,14 @@

      Osobní poznámky soubor se stejným jménem.

      Dej ho tedy do souboru, který se nebude šířit s repozitářem. Tento soubor je .git/info/exclude. -(Může být trochu složité ho najít, protože adresář .git je skrytý. +(Může být trochu složité ho najít, protože adresář .git je skrytý. Nevidíš–li ho, napiš v editoru do okýnka pro otevření souboru .git a dostaneš se do něj.)

      Soubory v adresáři .git bys neměl/a měnit, protože se tak dá přijít o historii projektu. Ale exclude je výjimka. Napiš na konec tohoto souboru:

      -
      poznamky.txt

      A po uložení budou poznámky ignorovány!

      +
      poznamky.txt
      +

      A po uložení budou poznámky ignorovány!

      $ git status
       On branch master
       
      @@ -147,12 +157,13 @@ 

      Osobní poznámky Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py + new file: .gitignore + new file: obrazek.py Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp

      Další haraburdí + Autofile.tmp +

      Další haraburdí #

      Některé programy automaticky vytvářejí pomocné soubory. @@ -171,8 +182,10 @@

      Osobní poznámky Já doporučuji ho pojmenovat .gitignore_global a dát ho do tvého domovského adresáře.

      Do souboru zase napiš jméno ignorovaného souboru:

      -
      Autofile.tmp

      Potom řekni Gitu, kde tento soubor najít:

      -
      $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global

      A měl by být ignorován:

      +
      Autofile.tmp
      +

      Potom řekni Gitu, kde tento soubor najít:

      +
      $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global
      +

      A měl by být ignorován:

      $ git status
       On branch master
       
      @@ -180,8 +193,9 @@ 

      Osobní poznámky Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py

      Formát ignorovacího souboru + new file: .gitignore + new file: obrazek.py +

      Formát ignorovacího souboru #

      Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: @@ -190,10 +204,12 @@

      Osobní poznámky
      • * ve jméně souboru nahradí část jména souboru. Takže pokud chceš ignorovat všechny soubory s příponou .tmp, můžeš napsat:

        -
        *.tmp
      • +
        *.tmp
        +
      • / na konci jména značí adresář. Chceš-li tedy ignorovat adresáře __pycache__ (což v Pythonním projektu chceš), napiš do .gitignore:

        -
        __pycache__/
      • +
        __pycache__/
        +

      Další detaily je možné najít v dokumentaci.

      Automatické přidávání diff --git a/lessons/install-editor/atom.html b/lessons/install-editor/atom.html index 39dbf04b..f1bf6ec9 100644 --- a/lessons/install-editor/atom.html +++ b/lessons/install-editor/atom.html @@ -30,7 +30,7 @@

      Kontrola stylu zdrojového kódu dokáže postarat. Do příkazové řádky zadej následující:

      $ python -m pip install flake8
       

      A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber -„Soubor > Nastavení/File > Settings“ a v nabídce +„Soubor > Nastavení/File > Settings“ a v nabídce uprostřed okna vyber poslední položku „Instalovat/Install“. Do vyhledávacího pole zadej „linter-flake8“ a v seznamu nalezených pluginů klikni u položky stejného jména @@ -61,7 +61,8 @@

      Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

      (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

      +Zde, Výsosti. +

      (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

      Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

      Ofelie:
           Ach princi!
      @@ -72,7 +73,8 @@ 

      Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

      Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

      Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

      Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

      diff --git a/lessons/install-editor/gedit.html b/lessons/install-editor/gedit.html index edc59195..8d901bad 100644 --- a/lessons/install-editor/gedit.html +++ b/lessons/install-editor/gedit.html @@ -3,9 +3,14 @@

      Instalace Geditu

      Na Linuxu se Gedit instaluje jako ostatní programy:

      -
      Fedora
      $ sudo dnf install gedit
      -
      Ubuntu
      $ sudo apt-get install gedit
      -

      Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

      +
      Fedora
      +
      $ sudo dnf install gedit
      +
      +
      Ubuntu
      +
      $ sudo apt-get install gedit
      +
      + +

      Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

      Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

      Nastavení # @@ -13,21 +18,28 @@

      Nastavení

      Gedit se nastavuje v Předvolbách (Preferences).

      -
      Číslování řádků

      V sekci Zobrazit/View vyber +

      Číslování řádků
      +

      V sekci Zobrazit/View vyber Zobrazovat čísla řádků/Display Line Numbers.

      -
      Odsazování

      V sekci Editor vyber:

      +
      +
      Odsazování
      +

      V sekci Editor vyber:

      • Šířka tabulátorů/Tab width: 4
      • Vkládat mezery místo tabulátorů/Insert spaces instead of tabs
      • Povolit automatické odsazování/Enable automatic indentation

      -
      Obarvování

      Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +

      +
      Obarvování
      +

      Obarvování funguje automaticky, ale způsob obarvování se vybírá podle koncovky souboru – např. .py pro Python.

      Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

      -

      Nácvik odsazování + + +

      Nácvik odsazování #

      Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. @@ -52,7 +64,8 @@

      Nastavení měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

      (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

      +Zde, Výsosti. +

      (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

      Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

      Ofelie:
           Ach princi!
      @@ -63,7 +76,8 @@ 

      Nastavení Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

      Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

      Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

      Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

      diff --git a/lessons/install-editor/index.html b/lessons/install-editor/index.html index 4e139c73..1446978a 100644 --- a/lessons/install-editor/index.html +++ b/lessons/install-editor/index.html @@ -28,18 +28,23 @@

      Co programátorský editor umí nástroje. Aby se nám programy upravovaly pohodlněji, mají několik vychytávek:

      -
      Podpora více souborů

      Větší projekty sestávají z více souborů, které můžeš mít v editoru -otevřené všechny najednou.

      -
      Číslování řádků

      Před každým řádkem se ukazuje číslo. -To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.

      -
      Odsazování

      V Pythonu je důležité, kolika mezerami řádek začíná. -Správně nastavený editor nám odsazování značně zjednoduší.

      -
      Obarvování

      Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám +

      Podpora více souborů
      +
      Větší projekty sestávají z více souborů, které můžeš mít v editoru +otevřené všechny najednou.
      +
      Číslování řádků
      +
      Před každým řádkem se ukazuje číslo. +To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.
      +
      Odsazování
      +
      V Pythonu je důležité, kolika mezerami řádek začíná. +Správně nastavený editor nám odsazování značně zjednoduší.
      +
      Obarvování
      +
      Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám obarvením může napovědět, jak našim instrukcím bude počítač rozumět. Ale je to jenom nápověda: programátor s jinak nastaveným editorem může mít stejný soubor obarvený -docela jinak.

      -

      Pro ilustraci, takhle může v editoru vypadat kousek kódu:

      +docela jinak. + +

      Pro ilustraci, takhle může v editoru vypadat kousek kódu:

          1  @app.route('/courses/<course:course>/')
           2  def course_page(course):
           3      try:
      diff --git a/lessons/install-editor/kate.html b/lessons/install-editor/kate.html
      index 4b323670..36a0a058 100644
      --- a/lessons/install-editor/kate.html
      +++ b/lessons/install-editor/kate.html
      @@ -3,17 +3,24 @@ 

      Instalace Kate

      Na Linuxu se Kate instaluje jako ostatní programy:

      -
      Fedora
      $ sudo dnf install kate
      -
      Ubuntu
      $ sudo apt-get install kate
      -

      Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

      +
      Fedora
      +
      $ sudo dnf install kate
      +
      +
      Ubuntu
      +
      $ sudo apt-get install kate
      +
      + +

      Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

      Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

      Nastavení #

      -
      Číslování řádků

      V menu Pohled/View vyber -Ukazovat čísla řádek/Show Line Numbers.

      -
      Odsazování

      V Menu Nastavení/Settings vyber +

      Číslování řádků
      +
      V menu Pohled/View vyber +Ukazovat čísla řádek/Show Line Numbers.
      +
      Odsazování
      +

      V Menu Nastavení/Settings vyber Nastavit 'Kate'/Configure Kate.

      Tam v Úpravy/Editing vyber Odsazování/Indentation.

      @@ -25,19 +32,24 @@

      Nastavení
    • Odsadit pomocí/Indentation width: 4 znaky
    • Klávesa Backspace zpětně odsazuje v úvodních mezerách/Backspace key in leading blank space unindents
    -
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +

    +
    Obarvování
    +

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle koncovky souboru – např. .py pro Python.

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

    -
    Psaní < ve Windows

    Pokud používáš českou klávesnici, je možné, že ti ve výchozím nastavení +

    +
    Psaní < ve Windows
    +
    Pokud používáš českou klávesnici, je možné, že ti ve výchozím nastavení nepůjde v Kate napsat znak <. Při stisknutí kláves Ctrl+Alt+, nebo AltGr+, se místo napsání < zobrazí okno Nastavit klávesové zkratky/Configure keybord shortcuts. V tom případě v tomto okně najdi klávesovou zkratku pro Nastavit klávesové zkratky/Configure keybord shortcuts a změn ji na -Žádná/None.

    -

    Nácvik odsazování +Žádná/None. + +

    Nácvik odsazování #

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. @@ -62,7 +74,8 @@

    Nastavení měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -73,7 +86,8 @@ 

    Nastavení Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/lessons/install-editor/notepad-plus-plus.html b/lessons/install-editor/notepad-plus-plus.html index 9a3b24da..3f40c8e1 100644 --- a/lessons/install-editor/notepad-plus-plus.html +++ b/lessons/install-editor/notepad-plus-plus.html @@ -8,10 +8,12 @@

    Nastavení #

    -
    Odsazování

    V menu Nastavení zvol Předvolby a pak nastav -„Nastavení tabulátoru/Tab Settings“ na -„Zaměnit za mezery/Replace by Space“.

    -

    Obarvování bude fungovat automaticky v souborech s koncovkou .py +

    Odsazování
    +
    V menu Nastavení zvol Předvolby a pak nastav +„Nastavení tabulátoru/Tab Settings“ na +„Zaměnit za mezery/Replace by Space“.
    + +

    Obarvování bude fungovat automaticky v souborech s koncovkou .py (jako Python). V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, @@ -41,7 +43,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -52,7 +55,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/lessons/install-editor/others.html b/lessons/install-editor/others.html index 90afd615..b5c2bb0e 100644 --- a/lessons/install-editor/others.html +++ b/lessons/install-editor/others.html @@ -71,7 +71,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -82,7 +83,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/lessons/install-editor/vscode.html b/lessons/install-editor/vscode.html index a2f062f8..3d9ebd4b 100644 --- a/lessons/install-editor/vscode.html +++ b/lessons/install-editor/vscode.html @@ -47,7 +47,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -58,7 +59,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/lessons/install/linux.html b/lessons/install/linux.html index c7bc0189..846f26d4 100644 --- a/lessons/install/linux.html +++ b/lessons/install/linux.html @@ -21,9 +21,13 @@

    Instalace Pythonu 3 Konkrétní příkaz záleží na distribuci:

    • Fedora:
      $ sudo dnf install python3
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    @@ -41,9 +45,13 @@

    Kontrola Tkinter

    Jestli ne, modul tkinter ještě nainstaluj:

    • Fedora:
      $ sudo dnf install python3-tkinter
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      -
    • + + +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    @@ -64,7 +72,9 @@

    Doinstalování Virtualenv
    • Ubuntu:
      $ sudo apt-get install python3-virtualenv
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později diff --git a/lessons/install/windows.html b/lessons/install/windows.html index 99135c9e..59729749 100644 --- a/lessons/install/windows.html +++ b/lessons/install/windows.html @@ -9,20 +9,22 @@

    Zjisti, jestli už máš Pyth Teď se může stát několik různých věcí:

    1. Otevře se ti Microsoft Store → okno zavři a pokračuj v kroku Stažení
    2. -
    3. Zobrazí se ti text podobný tomuto níže?
      > python
      +
    4. Zobrazí se ti text podobný tomuto níže?
    5. +
    +
    > python
     Python 3.8.1 (...)
    -Type "help", "copyright", "credits" or "license" for more information.
    ->>>
    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou +Type "help", "copyright", "credits" or "license" for more information. +>>> +

    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou (např.Python 3.11.2 je 3.11, Python 3.8.1 je 3.8 atd.). -Třetí číslo za tečkou není tady podstatné.

      +Třetí číslo za tečkou není tady podstatné.

      +
      • Je verze 3.6 nebo novější? Výborně, máš instalaci hotovou! Okénko s příkazovou řádkou můžeš zavřít. Až ho budeš znovu potřebovat, můžeš otevřít nové. Pokračuj dále Nastavením prostředí. V opačném případě přejdi na Stažení
      - -

      Stažení # diff --git a/lessons/interfaces/index.html b/lessons/interfaces/index.html index a681ff19..2882412c 100644 --- a/lessons/interfaces/index.html +++ b/lessons/interfaces/index.html @@ -40,7 +40,8 @@

      Rozhraní funkce """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True nebo False dle stisknutého tlačítka.""" ... -

      Screenshot s tlačítky Ano a Ne

      +Screenshot s tlačítky Ano a Ne +

      Když zavoláš tuhle funkci, ano_nebo_ne('Chutná ti čokoláda?'), ukáže se okýnko se dvěma tlačítky. Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

      diff --git a/lessons/json/index.html b/lessons/json/index.html index cf9d0b91..b51f996f 100644 --- a/lessons/json/index.html +++ b/lessons/json/index.html @@ -47,12 +47,14 @@

      Kódování dat - Python věk: 26

      Nebo třeba Bencode:

      -
      d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

      Existují i netextové formáty jako +

      d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae
      +

      Existují i netextové formáty jako Pickle 3. Převedením do textu bys dostal/a „guláš“ jako:

      }q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X       ÄeÅ¡tinaqX
                                                                 angliÄtinaXPythonq       eXvÄq
      -K▒u.

      A nakonec uvedu JSON +K▒u. +

      A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:

      {
      diff --git a/lessons/local-run/index.html b/lessons/local-run/index.html
      index 46cf8971..ae0c7ea4 100644
      --- a/lessons/local-run/index.html
      +++ b/lessons/local-run/index.html
      @@ -68,13 +68,13 @@ 

      lessons/: Texty lekcí Každá lekce má vlastní adresář se dvěma soubory:

      • info.yml obsahuje metadata, například:

        -
          title: Vytvoření lokálního kurzu
        -  style: md
        -  attribution:
        -  - Napsal Mikuláš Poul, 2018
        -  - Napsal Petr Viktorin, 2022
        -  license: cc-by-sa-40
        -  license_code: cc0
        +
        title: Vytvoření lokálního kurzu
        +style: md
        +attribution:
        +- Napsal Mikuláš Poul, 2018
        +- Napsal Petr Viktorin, 2022
        +license: cc-by-sa-40
        +license_code: cc0
         
        • title je titulek stránky, který se objeví v obsahu.
        • style je typ obsahu: md pro Markdown nebo ipynb pro @@ -128,7 +128,7 @@

          .gith

          Tenhle soubor obsahuje instrukce pro GitHub Actions pomocí kterých se kurz publikuje. Obsahuje kromě instalace a cache tři hlavní kroky:

            -
          • "kompilaci" kurzu do HTML a JSON souborů v adresáři _compiled,
          • +
          • "kompilaci" kurzu do HTML a JSON souborů v adresáři _compiled,
          • přidání adresáře _compiled do Gitu (pomocí nástroje ghp_import),
          • notifikaci hooks.nauc.se,naucse.python.cz, aby se nová verze kurzu nasadila.
          @@ -241,43 +241,41 @@

          Definice lekce tedy jméno podsložky ve složce lessons. Identifikátor materiálu je <název kategorie>/<název materiálu z kategorie>. Takže například materiál `beginners/install by se zadal takto:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - lesson: beginners/install
          +
          sessions:
          +- slug: first-lesson
          +  title: Název první lekce
          +  date: 2018-03-07
          +  materials:
          +  - lesson: beginners/install
           

        • -
        -
        • Externí odkazy se definují pomocí klíčů url a title. Do url patří kompletní odkaz na materiál, do title patří název odkazu. Příklad použítí:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - title: Úvodní prezentace
          -      url: https://example.com/uvod.pdf
          -    - title: Tahák na příkazovou řádku
          -      url: https://example.com/tahak.pdf
          -      type: cheatsheet
          -    - title: Domácí projekty (PDF)
          -      url: https://example.com/ukol.pdf
          -      type: homework
          +
          sessions:
          +- slug: first-lesson
          +  title: Název první lekce
          +  date: 2018-03-07
          +  materials:
          +  - title: Úvodní prezentace
          +    url: https://example.com/uvod.pdf
          +  - title: Tahák na příkazovou řádku
          +    url: https://example.com/tahak.pdf
          +    type: cheatsheet
          +  - title: Domácí projekty (PDF)
          +    url: https://example.com/ukol.pdf
          +    type: homework
           
        • Materiály bez odkazu se definují stejně jako externí odkazy, jen se do klíče url dá hodnota null. Například:

          -
            sessions:
          -  - slug: last-lesson
          -    title: Název lekce
          -    date: 2019-03-07
          -    materials:
          -    - title: Přehlídka závěrečných projektů
          -      url: null
          -    - title: Předání diplomů
          -      url: null
          +
          sessions:
          +- slug: last-lesson
          +  title: Název lekce
          +  date: 2019-03-07
          +  materials:
          +  - title: Přehlídka závěrečných projektů
          +    url: null
          +  - title: Předání diplomů
          +    url: null
           

        U všech druhú materiálú lze nastavit typ, který určuje ikonku která se použije v seznamu materiálů vedle názvu.

        diff --git a/lessons/local-variables/index.html b/lessons/local-variables/index.html index 3c9b968e..6b9de467 100644 --- a/lessons/local-variables/index.html +++ b/lessons/local-variables/index.html @@ -128,29 +128,31 @@

        Řešení

      • pi je globální – nepřiřazuje se do ní ve funkci; +je „vidět“ v celém programu.
      • +
      • Proměnné obsah jsou v programu dvě – jedna globální, +a jedna je lokální pro funkci obsah_elipsy, +protože do ní tahle funkce přiřazuje.
      • +
      • Proměnné a jsou taky dvě, podobně jako obsah. +Tady byl chyták: příkaz a = a + 3 nemá žádný smysl; +do a se sice uloží větší číslo, ale vzápětí funkce obsah_elipsy skončí +a její lokální proměnná a přestane existovat.
      • +
      • Proměnná b je jenom lokální – jako parametr funkce obsah_elipsy.
      • +
      • Proměnná obsah_elipsy je globální (a je v ní funkce).
      • +
      +

      A pro úplnost

      +
        +
      • Klíčová slova from, import, def, return neoznačují proměnné.
      • +
      • Jméno modulu math taky neoznačuje proměnnou.
      • +
      • Proměnná print se dá považovat za globální. +(Ve skutečnosti existuje zvláštní kategorie zabudovaných (angl. builtin) +proměnných – ty jsou „ještě globálnější“.)
      • +
      +

      -

      Rada na závěr + + +

      Rada na závěr #

      Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších diff --git a/lessons/logic/index.html b/lessons/logic/index.html index 3b6b58ee..b145cfe2 100644 --- a/lessons/logic/index.html +++ b/lessons/logic/index.html @@ -55,7 +55,8 @@

      Rozhýbejme hada new_head = x+1, y snake.append(new_head) -pyglet.clock.schedule_interval(move, 1/6)

      Funguje? +pyglet.clock.schedule_interval(move, 1/6) +

      Funguje? Tak do téhle funkce ještě přidej del snake[0], aby had nerostl donekonečna. Víš co tenhle příkaz dělá? Jestli ne, koukni znovu na poznámky k seznamům!

      A had se hýbe… Jen ho ještě nejde ovládat.

      @@ -134,46 +135,48 @@

      Řešení

      -

      Ovládání + + +

      Ovládání #

      Nyní k onomu slíbenému ovládání. Respektive nejdřív k změnám směru.

      @@ -187,11 +190,13 @@

      Řešení

      -

      A co dolů?

      + + +

      A co dolů?

      Řešení

      @@ -199,10 +204,12 @@

      Řešení

      -

      Aby si had „pamatoval“ kam se zrovna plazí, je potřeba mít směr součástí stavu + + +

      Aby si had „pamatoval“ kam se zrovna plazí, je potřeba mít směr součástí stavu hry. Uložme ho tedy do atrubutu jménem snake_direction.

      Co tam ale přesně uložit? @@ -321,27 +328,29 @@

      Řešení

      -

      A pak nastav opravdovou velikost herní plochy. Jak? + + +

      A pak nastav opravdovou velikost herní plochy. Jak? V souboru se hrou (ui.py), hned po tom co vytvoříš stav (state) a okýnko (window) velikost nastav. Použij celočíselné dělení (se zbytkem), aby velikost byla v celých číslech:

      @@ -370,7 +379,8 @@

      Řešení

      3 3 bottom top 3 4 bottom top 3 5 bottom right -4 5 left head

      Jdeš-li podle návodu, tuhle funkci máš uloženou v souboru smery.py +4 5 left head +

      Jdeš-li podle návodu, tuhle funkci máš uloženou v souboru smery.py Oprav nejdřív tu, a řešení „transplantuj“ do hry.

      Řešení

      @@ -379,17 +389,19 @@

      Řešení

      -

      Jde to jednodušeji? Jde! + + +

      Jde to jednodušeji? Jde! Matematikové vymysleli operaci, která se jmenuje zbytek po dělení. Ta dělá přesně to, co potřebujeme – zbytek po dělení nové souřadnice velikostí hřiště dá souřadnici, která leží v hřišti. @@ -441,7 +453,9 @@

      Řešení

      -

      Vyzkoušej, jestli to funguje. Had by měl jíst jídlo.

      + + +

      Vyzkoušej, jestli to funguje. Had by měl jíst jídlo.

      Ještě ale zbývá zařídit, aby po každém soustu trochu povyrostl. Ale jak? Kterým směrem má růst?

      Tady je dobré se podívat na existující kód a uvědomit si, co dělá.

      @@ -468,24 +482,26 @@

      Řešení

      -

      Nové jídlo + + +

      Nové jídlo #

      Když už had umí jíst, je potřeba mu zajistit pravidelný přísun jídla. @@ -503,7 +519,7 @@

      Řešení

      Bylo by ale fajn, kdyby se nové jídlo objevilo vždycky jinde, na náhodném místě. Na to můžeme použít funkci random.randrange, která vrací náhodná celá čísla. -Vyzkoušej si ji (z jiného souboru, třeba `experiment.py):

      +Vyzkoušej si ji (z jiného souboru, třeba ``experiment.py`):

      import random
       
       print('Na kostce padlo:', random.randrange(6))
      @@ -521,13 +537,15 @@ 

      Řešení

      -

      Až to budeš testovat, asi zjistíš, že úplně náhodné políčko není ideální. + + +

      Až to budeš testovat, asi zjistíš, že úplně náhodné políčko není ideální. Občas se totiž jídlo objeví na políčku s hadem, nebo dokonce na jiném jídle. Je proto dobré tuhle situaci zkontrolovat, a když volba padne na plné políčko, jídlo nepřidávat:

      @@ -563,13 +581,15 @@

      Řešení

      -

      Konec + + +

      Konec #

      Had teď může narůst do obrovských rozměrů – a hru stále nelze prohrát. @@ -589,7 +609,9 @@

      Řešení

      -

      Lepší je hru „zapauzovat“ – ukázat hráči situaci, do které nešťastného hada + + +

      Lepší je hru „zapauzovat“ – ukázat hráči situaci, do které nešťastného hada dostal, aby se z ní mohl pro příště poučit.

      Aby to bylo možné, dáme do stavu hry další atribut: snake_alive. Ten bude nastavený na True, dokud bude had žít. @@ -616,16 +638,18 @@

      Řešení

    -

    Vylepšení ovládání + + +

    Vylepšení ovládání #

    Poslední úprava kódu!

    @@ -689,7 +713,7 @@

    Řešení

    Gratuluji, máš funkční a hratelnou hru! Doufám že jsi na sebe hrdý/á!

    Dej si něco sladkého, zasloužíš si to.

    -
    +

    Tady je moje řešení. To se touhle dobou od toho tvého může dost lišit – to je úplně normální. (A nedívej se sem dokud hada nenaprogramuješ sám/sama, @@ -702,130 +726,132 @@

    Řešení

    -

    Najdeš ještě nějaké další vylepšení, které by se dalo udělat?

    + + +

    Najdeš ještě nějaké další vylepšení, které by se dalo udělat?

    Zkus třeba následující rozšíření:

    • Každých 30 vteřin hry přibude samo od sebe nové jídlo, takže jich pak bude na hrací ploše víc.

    • Hra se bude postupně zrychlovat.
      -(Na to je nejlepší předělat funkci moveui.py, aby sama +(Na to je nejlepší předělat funkci moveui.py, aby *sama naplánovala, kdy se má příště zavolat. Volání schedule_interval tak už -nebude potřeba.)

      +nebude potřeba.)*

    • Hadi budou dva; druhý se ovládá klávesami W A S D.
      diff --git a/lessons/magic/index.html b/lessons/magic/index.html index 34222ed6..a34320c1 100644 --- a/lessons/magic/index.html +++ b/lessons/magic/index.html @@ -230,7 +230,8 @@

      Deskriptory

    To je trochu zjednodušený, ale užitečný model.

    Speciální metody, které se nevolají pomocí tečky, přeskakují první krok: metoda __add__ tedy musí být definována na třídě, aby se zavolala pro a + b.

    -

    (Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

    +
    +

    (Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

    Podívejme se teď na získávání atributu trošku podrobněji. Je to poměrně komplikovaný proces a existuje několik způsobů, jak ho přizpůsobit. Nejjednodušší je dvojice speciálních metod:

      @@ -253,7 +254,7 @@

      Deskriptory palette = Palette() print(palette.dark_red) -

      (Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

      +

      (Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

      Metoda __getattr__ je většinou tak trochu kanón na vrabce: ve většině případů nepotřebujeme nastavit chování všech neexistujících atributů, ale jenom jednoho nebo několika konkrétních. Například máme třídu pro 2D bod s atributy x a y a potřebujeme i atribut pro dvojici (x, y). Toto se často dělá pomocí dekorátoru property:

      @@ -585,7 +586,8 @@

      A další ... # Třeba v jiném modulu -print(ANSWER)

      Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy +print(ANSWER) +

      Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

      Úkol # diff --git a/lessons/micropython/index.html b/lessons/micropython/index.html index cca782df..e54082e3 100644 --- a/lessons/micropython/index.html +++ b/lessons/micropython/index.html @@ -29,10 +29,11 @@

      MicroPython na malém zařízení MicroPython.

      Teď, když destičku držíš v ruce, si pojďme projít její základní součásti.

      -


      +
      +

      Obrázek desky NodeMCU DevKit

      Nejdůležitější část vývojové desky je v oplechované -krabičce s logem "Wi-Fi" a "FCC": +krabičce s logem "Wi-Fi" a "FCC": mikroprocesor ESP8266. To je „mozek” celého zařízení, který – když je správně naprogramován – umí provádět pythonní @@ -61,7 +62,8 @@

      MicroPython na malém zařízení Zkontroluj si, jestli jsou všechny nožičky rovné; kdyby byla některá ohnutá, tak ji (nejlépe s pomocí kouče) narovnej nebo si vezmi jinou destičku.

      -


      +
      +

      Instalace #

      @@ -91,26 +93,26 @@

      Linux oprav ji podle následujícího návodu a zkus to znova. (Možná bude potřeba vyřešit víc než jednu chybu.)

        -
      • Nemáš-li příkaz picocom nainstalovaný, +
      • Nemáš-li příkaz picocom nainstalovaný, je potřeba ho nainstalovat (např. sudo dnf install picocom nebo -sudo apt-get install picocom).

      • -
      • Pokud picocom skončil s chybou +sudo apt-get install picocom).

        +
      • +
      • Pokud picocom skončil s chybou No such file or directory, pravděpodobně je potřeba k zařízení přistupovat přes jiný soubor. -Použij příkaz dmesg | tail, který vypíše něco jako:

      • -
      -
        $ dmesg | tail
      -  [703169.886296] ch341 1-1.1:1.0: device disconnected
      -  [703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
      -  [703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
      -  [703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
      -  [703177.059457] usb 1-1.1: Product: USB2.0-Serial
      -  [703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected
      -  [703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0
      +Použij příkaz dmesg | tail, který vypíše něco jako:

      +
      $ dmesg | tail
      +[703169.886296] ch341 1-1.1:1.0: device disconnected
      +[703176.972781] usb 1-1.1: new full-speed USB device number 45 using ehci-pci
      +[703177.059448] usb 1-1.1: New USB device found, idVendor=1a86, idProduct=7523
      +[703177.059454] usb 1-1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
      +[703177.059457] usb 1-1.1: Product: USB2.0-Serial
      +[703177.060474] ch341 1-1.1:1.0: ch341-uart converter detected
      +[703177.062781] usb 1-1.1: ch341-uart converter now attached to ttyUSB0
       

      Máš-li místo ttyUSB0 něco jiného, v příkazu picocom to použij místo - ttyUSB0.

      -
        +ttyUSB0.

        +
      • Pokud picocom skončil s chybou Permission denied, potřebuješ získat přístup k souboru zařízení. To znamená přidat se do příslušné skupiny:

        @@ -319,13 +321,15 @@

        Řešení

      -

      Pouštění kódu ze souboru + + +

      Pouštění kódu ze souboru #

      Jak začneš psát trochu složitější programy, @@ -435,47 +439,16 @@

      Tóny a melodie

      Nebo některou z těchto frekvencí? Hz – Hertz – je jednotka frekvence; „49 Hz“ znamená „49× za sekundu“.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Nota Frekvence
      C132,70 Hz
      D36,71 Hz
      E41,20 Hz
      F43,65 Hz
      G49,00 Hz
      A55,00 Hz
      H61,74 Hz
      C265,41 Hz
      +

      | Nota | Frekvence | +|:-----|----------:| +| C1 | 32,70 Hz | +| D | 36,71 Hz | +| E | 41,20 Hz | +| F | 43,65 Hz | +| G | 49,00 Hz | +| A | 55,00 Hz | +| H | 61,74 Hz | +| C2 | 65,41 Hz |

      Naprogramuj písničku! Potřebuješ-li víc not, pusť si program, který vypočítá další frekvence.

      Další ovládání @@ -511,8 +484,9 @@

      Rotace střída (duty) – poměr mezi dobou kdy dioda svítí a kdy nesvítí, u servomotoru rozhoduje tzv. šířka pulzu: jak dlouho se napětí udrží -na 3,3 V, než se přepne zpátky na 0 V. -

      +na 3,3 V, než se přepne zpátky na 0 V.

      + +

      V praxi to znamená, že můžeš nastavit freq na 50 Hz, a duty měnit cca od 35 (úplně vlevo) přes 77 (uprostřed) po 120 (úplně vpravo).

      @@ -561,7 +535,8 @@

      Poznámka o napájení a napětí nejčastěji takhle:

      USB-TTL adapter

      K modulu pak tento převodník a zdroj napětí připojíš takto:

      -

      + +
      • GND na převodníku – G na desce
      • RX na převodníku – TX (!) na desce
      • @@ -647,7 +622,9 @@

        Barevná světýlka np = NeoPixel(pin, POCET_LED) np[0] = (255, 255, 255) np.write() -

        Co znamenají ta čísla (0 a 255), na to už jistě přijdeš sama. + + +

        Co znamenají ta čísla (0 a 255), na to už jistě přijdeš sama. Jen při experimentování nezapomeň zavolat np.write(), tím se informace pošlou do LED pásku.

        Zvládneš naprogramovat semafor?

        \ No newline at end of file diff --git a/lessons/mini-workshop/index.html b/lessons/mini-workshop/index.html index 984e8f81..44f9a54f 100644 --- a/lessons/mini-workshop/index.html +++ b/lessons/mini-workshop/index.html @@ -17,7 +17,8 @@

        Otevření příkazové řádky #

        -

        + +

        Klikni na Activities; potom vyber z levého panelu Terminal (ikonka černého okýnka).

        Objeví se příkazová řádka – černé okýnko s bílým textem, @@ -49,9 +50,13 @@

        Otevření komunikačního kanálu omap is : emap is : crcrlf,delbs, -Terminal ready

        Pak stiskni Enter. +Terminal ready +

        Pak stiskni Enter. Měly by se objevit tři zobáčky, kterými MicroPython prosí o instrukce:

        -
        >>>

        Kalkulačka +
        >>>
        +
        + +

        Kalkulačka #

        Za tři zobáčky můžeš zadat nějaký matematický příklad. MicroPython ho spočítá. @@ -110,7 +115,9 @@

        Výrazy

        Nekonečný cyklus se opakuje donekonečna. Je ale způsob jak ho přerušit, až tě omrzí: zmáčkni Ctrl+C.

        -

        Motorek +
        + +

        Motorek #

        Další objekt, který můžeš použít, je servo. @@ -154,10 +161,13 @@

        Barvy pošle do LED pásku. Až budeš experimentovat, nezapomeň na strip.write() – bez toho se barvy neukážou.

        -

        Program +
        + +

        Program #

        -

        + +

        Teď si přestaneme jen tak hrát a začneme psát program.

        Spusť editor: Klikni na Activities; potom vyber z levého panelu Text Editor (ikonka zápisníku s tužkou).

        @@ -204,7 +214,8 @@

        Blikání

        Semafor #

        -

        + +

        Dokážeš naprogramovat semafor?

        Se závorou?

        Cyklus s podmínkou diff --git a/lessons/mini-workshop/organizers.html b/lessons/mini-workshop/organizers.html index 9f74204a..544798ea 100644 --- a/lessons/mini-workshop/organizers.html +++ b/lessons/mini-workshop/organizers.html @@ -7,88 +7,58 @@

        Nákupní seznam #

        -
        NodeMCU Devkit v2

        Dá se koupit z Číny, např. -z Aliexpressu.

        -
        Malé nepájivé pole (Mini Breadboard)

        Dá se koupit z Číny, např. -z Aliexpressu.

        -
        Modul s tlačítkem

        Dá se koupit z Číny, např. -z Aliexpressu.

        -
        Modrá LED (Uf=3,3V)

        Dá se koupit z Číny, nebo např. -v GME.

        -
        Pásek s 8 LED moduly WS2812 s konektorem

        Dá se koupit po metrech z Číny, např. +

        NodeMCU Devkit v2
        +
        Dá se koupit z Číny, např. +z Aliexpressu.
        +
        Malé nepájivé pole (Mini Breadboard)
        +
        Dá se koupit z Číny, např. +z Aliexpressu.
        +
        Modul s tlačítkem
        +
        Dá se koupit z Číny, např. +z Aliexpressu.
        +
        Modrá LED (Uf=3,3V)
        +
        Dá se koupit z Číny, nebo např. +v GME.
        +
        Pásek s 8 LED moduly WS2812 s konektorem
        +
        Dá se koupit po metrech z Číny, např. v Aliexpressu, rozstříhat, a napájet na konektory – opět např. -z Aliexpressu.

        -
        Malý servomotor, např. TowerPro SG92R

        Dá se koupit z Číny, např. -v Aliexpressu.

        -
        Spojovací drátky

        Opět se dají koupit z Číny, např. +z Aliexpressu.

        +
        Malý servomotor, např. TowerPro SG92R
        +
        Dá se koupit z Číny, např. +v Aliexpressu.
        +
        Spojovací drátky
        +
        Opět se dají koupit z Číny, např. v Aliexpressu.
        Jsou potřeba takové, aby se jimi dal připojit LED pásek a motorek -k nepájivému poli.

        -
        MicroUSB kabel

        Jak pro mobil. Doporučuji koupit kvalitní datový kabel. +k nepájivému poli.

        +
        MicroUSB kabel
        +
        Jak pro mobil. Doporučuji koupit kvalitní datový kabel. Případně si můžou účastníci donést vlastní, je ale dobré jich mít pár -v zásobě, kdyby si přinesli nedatový kabel od nabíječky.

        -
        Počítač

        Je potřeba i „velký“ počítač – hlavně kvůli obrazovce a klávesnici. -Viz nastavení níže.

        -

        Příprava hardwaru +v zásobě, kdyby si přinesli nedatový kabel od nabíječky. +
        Počítač
        +
        Je potřeba i „velký“ počítač – hlavně kvůli obrazovce a klávesnici. +Viz nastavení níže.
        + +

        Příprava hardwaru #

        NodeMCU zasuň do nepájivého pole, aby na každé delší straně zbyla řada dírek. Do nich zapoj komponenty:

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Pin– Součástka
        D1– Anoda LED (delší nožička)
        D2– Katoda LED (kratší nožička)
        3V3VCC tlačítka
        GNDGND tlačítka
        D5OUT tlačítka
        D6DI LED pásku
        D8Data servomotoru
        GNDGND servomotoru
        3V3VCC servomotoru
        GNDGND LED pásku
        Vin+5V LED pásku
        +

        | Pin | – Součástka | +| --: | :---------------------------- | +| D1 | – Anoda LED (delší nožička) | +| D2 | – Katoda LED (kratší nožička) | +| 3V3 | – VCC tlačítka | +| GND | – GND tlačítka | +| D5 | – OUT tlačítka | +| D6 | – DI LED pásku | +| D8 | – Data servomotoru | +| GND | – GND servomotoru | +| 3V3 | – VCC servomotoru | +| GND | – GND LED pásku | +| Vin | – +5V LED pásku |

        Nejsou-li vstupy servomotorku označené, bývá červený VCC, hnědý GND, zbylý Data.

        Fotografie modulu s veškerým příslušenstvím

        diff --git a/lessons/notebook/index.html b/lessons/notebook/index.html index 7a0b01d4..35ec0474 100644 --- a/lessons/notebook/index.html +++ b/lessons/notebook/index.html @@ -2,7 +2,7 @@

        Jupyter Notebook -# +#

        Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

        Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -17,97 +17,70 @@

        Jupyter Notebook
        $ python -m notebook
         

        V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

        Jak na Notebook -# +#

        Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

        Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

        Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

        str.l<TAB>
         ! ls -a<SHIFT+ENTER>
        -str.lower?<SHIFT+ENTER>

        Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

        +str.lower?<SHIFT+ENTER> +

        Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

        -
        In [2]:
        +
        In [2]:
        -
        -
        1+1  # Nevypíše se (není poslední příkaz)
        +
        +
        1+1  # Nevypíše se (není poslední příkaz)
         2+2  # Vypíše se
         
        - -
        - +
        - -
        - -
        Out[2]:
        - - - - +
        Out[2]:
        4
        -
        -
        -
        -
        In [3]:
        +
        In [3]:
        -
        -
        seznam = [5, 6, 3, 2]
        +
        +
        seznam = [5, 6, 3, 2]
         print(seznam)  # print() funguje
         seznam.sort()
         seznam         # Poslední výraz se vypíše
         
        - -
        - +
        - -
        - -
        - - +
        [5, 6, 3, 2]
         
        -
        - -
        Out[3]:
        - - - - +
        Out[3]:
        [2, 3, 5, 6]
        -
        -
        -
        @@ -116,5 +89,3 @@

        Jak na Notebook

        - - diff --git a/lessons/numpy/index.html b/lessons/numpy/index.html index 46cd5a2b..34bf4508 100644 --- a/lessons/numpy/index.html +++ b/lessons/numpy/index.html @@ -24,7 +24,7 @@
        -
        +
        @@ -32,7 +32,7 @@

        NumPy -# +#

        @@ -44,7 +44,7 @@

        NumPy

        Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

        Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

        Nejednoznačnost a zkratky -# +#

        Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. Na obojí se používají podobné nástroje. @@ -62,40 +62,28 @@

        Nejednoznačnost a zkratky
        -
        In [1]:
        +
        In [1]:
        -
        -
        import numpy
        +
        +
        import numpy
         array = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
         array
         
        - -
        - +
        - -
        - -
        Out[1]:
        - - - - +
        Out[1]:
        array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
        -
        -
        -
        @@ -106,69 +94,45 @@

        Nejednoznačnost a zkratky

        -
        In [2]:
        +
        In [2]:
        -
        -
        array.shape
        +
        +
        array.shape
         
        - -
        - +
        - -
        - -
        Out[2]:
        - - - - +
        Out[2]:
        (3, 3)
        -
        -
        -
        -
        In [3]:
        +
        In [3]:
        -
        -
        array.dtype
        +
        +
        array.dtype
         
        - -
        - +
        - -
        - -
        Out[3]:
        - - - - +
        Out[3]:
        -
        dtype('int64')
        +
        dtype('int64')
        -
        -
        -
        @@ -180,40 +144,27 @@

        Nejednoznačnost a zkratky

        -
        In [4]:
        +
        In [4]:
        -
        -
        cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
        +
        +
        cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
         print(cube.shape)
         cube
         
        - -
        - +
        - -
        - -
        - - +
        (2, 2, 2)
         
        -
        - -
        Out[4]:
        - - - - +
        Out[4]:
        array([[[1, 2],
                 [3, 4]],
        @@ -221,18 +172,15 @@ 

        Nejednoznačnost a zkratky [[5, 6], [7, 8]]])

        -
        -
        -

        Základní operace -# +#

        @@ -246,143 +194,95 @@

        Základní operace

        -
        In [5]:
        +
        In [5]:
        -
        -
        array
        +
        +
        array
         
        - -
        - +
        - -
        - -
        Out[5]:
        - - - - +
        Out[5]:
        array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
        -
        -
        -
        -
        In [6]:
        +
        In [6]:
        -
        -
        array - 1
        +
        +
        array - 1
         
        - -
        - +
        - -
        - -
        Out[6]:
        - - - - +
        Out[6]:
        array([[0, 1, 2],
                [3, 4, 5],
                [6, 7, 8]])
        -
        -
        -
        -
        In [7]:
        +
        In [7]:
        -
        -
        array / 2
        +
        +
        array / 2
         
        - -
        - +
        - -
        - -
        Out[7]:
        - - - - +
        Out[7]:
        array([[0.5, 1. , 1.5],
                [2. , 2.5, 3. ],
                [3.5, 4. , 4.5]])
        -
        -
        -
        -
        In [8]:
        +
        In [8]:
        -
        -
        -(array % 4)
        +
        +
        -(array % 4)
         
        - -
        - +
        - -
        - -
        Out[8]:
        - - - - +
        Out[8]:
        array([[-1, -2, -3],
                [ 0, -1, -2],
                [-3,  0, -1]])
        -
        -
        -
        @@ -393,38 +293,26 @@

        Základní operace

        -
        In [9]:
        +
        In [9]:
        -
        -
        array > 5
        +
        +
        array > 5
         
        - -
        - +
        - -
        - -
        Out[9]:
        - - - - +
        Out[9]:
        array([[False, False, False],
                [False, False,  True],
                [ True,  True,  True]])
        -
        -
        -
        @@ -435,38 +323,26 @@

        Základní operace

        -
        In [10]:
        +
        In [10]:
        -
        -
        (array > 3) & (array < 7)
        +
        +
        (array > 3) & (array < 7)
         
        - -
        - +
        - -
        - -
        Out[10]:
        - - - - +
        Out[10]:
        array([[False, False, False],
                [ True,  True,  True],
                [False, False, False]])
        -
        -
        -
        @@ -477,73 +353,49 @@

        Základní operace

        -
        In [11]:
        +
        In [11]:
        -
        -
        array + array
        +
        +
        array + array
         
        - -
        - +
        - -
        - -
        Out[11]:
        - - - - +
        Out[11]:
        array([[ 2,  4,  6],
                [ 8, 10, 12],
                [14, 16, 18]])
        -
        -
        -
        -
        In [12]:
        +
        In [12]:
        -
        -
        array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
        +
        +
        array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
         
        - -
        - +
        - -
        - -
        Out[12]:
        - - - - +
        Out[12]:
        array([[0, 2, 0],
                [4, 0, 6],
                [0, 8, 0]])
        -
        -
        -
        @@ -554,44 +406,32 @@

        Základní operace

        -
        In [13]:
        +
        In [13]:
        -
        -
        array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
        +
        +
        array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
         
        - -
        - +
        - -
        - -
        Out[13]:
        - - - - +
        Out[13]:
        array([[0, 2, 0],
                [4, 0, 6],
                [0, 8, 0]])
        -
        -
        -

        Indexování -# +#

        @@ -605,138 +445,90 @@

        Indexování

        -
        In [14]:
        +
        In [14]:
        -
        -
        array
        +
        +
        array
         
        - -
        - +
        - -
        - -
        Out[14]:
        - - - - +
        Out[14]:
        array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
        -
        -
        -
        -
        In [15]:
        +
        In [15]:
        -
        -
        array[0]
        +
        +
        array[0]
         
        - -
        - +
        - -
        - -
        Out[15]:
        - - - - +
        Out[15]:
        array([1, 2, 3])
        -
        -
        -
        -
        In [16]:
        +
        In [16]:
        -
        -
        array[0:-1]
        +
        +
        array[0:-1]
         
        - -
        - +
        - -
        - -
        Out[16]:
        - - - - +
        Out[16]:
        array([[1, 2, 3],
                [4, 5, 6]])
        -
        -
        -
        -
        In [17]:
        +
        In [17]:
        -
        -
        array[0][1]
        +
        +
        array[0][1]
         
        - -
        - +
        - -
        - -
        Out[17]:
        - - - - +
        Out[17]:
        2
        -
        -
        -
        @@ -747,70 +539,46 @@

        Indexování

        -
        In [18]:
        +
        In [18]:
        -
        -
        array[0, 1]
        +
        +
        array[0, 1]
         
        - -
        - +
        - -
        - -
        Out[18]:
        - - - - +
        Out[18]:
        2
        -
        -
        -
        -
        In [19]:
        +
        In [19]:
        -
        -
        array[0:-1, 1:]
        +
        +
        array[0:-1, 1:]
         
        - -
        - +
        - -
        - -
        Out[19]:
        - - - - +
        Out[19]:
        array([[2, 3],
                [5, 6]])
        -
        -
        -
        @@ -821,36 +589,24 @@

        Indexování

        -
        In [20]:
        +
        In [20]:
        -
        -
        array[:, 2]
        +
        +
        array[:, 2]
         
        - -
        - +
        - -
        - -
        Out[20]:
        - - - - +
        Out[20]:
        array([3, 6, 9])
        -
        -
        -
        @@ -862,38 +618,26 @@

        Indexování

        -
        In [21]:
        +
        In [21]:
        -
        -
        array > 4
        +
        +
        array > 4
         
        - -
        - +
        - -
        - -
        Out[21]:
        - - - - +
        Out[21]:
        array([[False, False, False],
                [False,  True,  True],
                [ True,  True,  True]])
        -
        -
        -
        @@ -904,36 +648,24 @@

        Indexování

        -
        In [22]:
        +
        In [22]:
        -
        -
        array[array > 4]
        +
        +
        array[array > 4]
         
        - -
        - +
        - -
        - -
        Out[22]:
        - - - - +
        Out[22]:
        array([5, 6, 7, 8, 9])
        -
        -
        -
        @@ -951,74 +683,50 @@

        Indexování

        -
        In [23]:
        +
        In [23]:
        -
        -
        array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
        +
        +
        array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
         
        - -
        - +
        - -
        - -
        Out[23]:
        - - - - +
        Out[23]:
        array([[1, 2, 3],
                [7, 8, 9],
                [4, 5, 6],
                [4, 5, 6]])
        -
        -
        -
        -
        In [24]:
        +
        In [24]:
        -
        -
        array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
        +
        +
        array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
         
        - -
        - +
        - -
        - -
        Out[24]:
        - - - - +
        Out[24]:
        array([[3, 3, 1, 1],
                [6, 6, 4, 4],
                [9, 9, 7, 7]])
        -
        -
        -
        @@ -1029,36 +737,24 @@

        Indexování

        -
        In [25]:
        +
        In [25]:
        -
        -
        array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
        +
        +
        array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
         
        - -
        - +
        - -
        - -
        Out[25]:
        - - - - +
        Out[25]:
        array([2, 6, 7])
        -
        -
        -
        @@ -1069,27 +765,18 @@

        Indexování

        -
        In [26]:
        +
        In [26]:
        -
        -
        cube
        +
        +
        cube
         
        - -
        - +
        - -
        - -
        Out[26]:
        - - - - +
        Out[26]:
        array([[[1, 2],
                 [3, 4]],
        @@ -1097,114 +784,75 @@ 

        Indexování [[5, 6], [7, 8]]])

        -
        -
        -
        -
        In [27]:
        +
        In [27]:
        -
        -
        cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
        +
        +
        cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
         
        - -
        - +
        - -
        - -
        Out[27]:
        - - - - +
        Out[27]:
        array([[1, 2],
                [3, 4]])
        -
        -
        -
        -
        In [28]:
        +
        In [28]:
        -
        -
        cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
        +
        +
        cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
         
        - -
        - +
        - -
        - -
        Out[28]:
        - - - - +
        Out[28]:
        array([[1, 2],
                [5, 6]])
        -
        -
        -
        -
        In [29]:
        +
        In [29]:
        -
        -
        cube[:, :, 0]  # První sloupce
        +
        +
        cube[:, :, 0]  # První sloupce
         
        - -
        - +
        - -
        - -
        Out[29]:
        - - - - +
        Out[29]:
        array([[1, 3],
                [5, 7]])
        -
        -
        -
        @@ -1215,43 +863,31 @@

        Indexování

        -
        In [30]:
        +
        In [30]:
        -
        -
        cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
        +
        +
        cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
         
        - -
        - +
        - -
        - -
        Out[30]:
        - - - - +
        Out[30]:
        array([[1, 3],
                [5, 7]])
        -
        -
        -

        Broadcasting a změny -# +#

        @@ -1265,108 +901,72 @@

        Broadcasting a změny

        -
        In [31]:
        +
        In [31]:
        -
        -
        array
        +
        +
        array
         
        - -
        - +
        - -
        - -
        Out[31]:
        - - - - +
        Out[31]:
        array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
        -
        -
        -
        -
        In [32]:
        +
        In [32]:
        -
        -
        array * 3
        +
        +
        array * 3
         
        - -
        - +
        - -
        - -
        Out[32]:
        - - - - +
        Out[32]:
        array([[ 3,  6,  9],
                [12, 15, 18],
                [21, 24, 27]])
        -
        -
        -
        -
        In [33]:
        +
        In [33]:
        -
        -
        array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
        +
        +
        array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
         
        - -
        - +
        - -
        - -
        Out[33]:
        - - - - +
        Out[33]:
        array([[0, 2, 0],
                [4, 0, 6],
                [0, 8, 0]])
        -
        -
        -
        @@ -1378,73 +978,49 @@

        Broadcasting a změny

        -
        In [34]:
        +
        In [34]:
        -
        -
        array
        +
        +
        array
         
        - -
        - +
        - -
        - -
        Out[34]:
        - - - - +
        Out[34]:
        array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
        -
        -
        -
        -
        In [35]:
        +
        In [35]:
        -
        -
        array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
        +
        +
        array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
         
        - -
        - +
        - -
        - -
        Out[35]:
        - - - - +
        Out[35]:
        array([[ 0,  2, 30],
                [ 0,  5, 60],
                [ 0,  8, 90]])
        -
        -
        -
        @@ -1455,38 +1031,26 @@

        Broadcasting a změny

        -
        In [36]:
        +
        In [36]:
        -
        -
        array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
        +
        +
        array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
         
        - -
        - +
        - -
        - -
        Out[36]:
        - - - - +
        Out[36]:
        array([[ 0,  0,  0],
                [ 4,  5,  6],
                [70, 80, 90]])
        -
        -
        -
        @@ -1497,39 +1061,27 @@

        Broadcasting a změny

        -
        In [37]:
        +
        In [37]:
        -
        -
        array[0, 0] = 123
        +
        +
        array[0, 0] = 123
         array
         
        - -
        - +
        - -
        - -
        Out[37]:
        - - - - +
        Out[37]:
        array([[123,   2,   3],
                [  4,   5,   6],
                [  7,   8,   9]])
        -
        -
        -
        @@ -1540,75 +1092,51 @@

        Broadcasting a změny

        -
        In [38]:
        +
        In [38]:
        -
        -
        array[0] = 123
        +
        +
        array[0] = 123
         array
         
        - -
        - +
        - -
        - -
        Out[38]:
        - - - - +
        Out[38]:
        array([[123, 123, 123],
                [  4,   5,   6],
                [  7,   8,   9]])
        -
        -
        -
        -
        In [39]:
        +
        In [39]:
        -
        -
        array[:] = 123
        +
        +
        array[:] = 123
         array
         
        - -
        - -
        -
        - - -
        - -
        Out[39]:
        - - - - +
        +
        +
        +
        +
        Out[39]:
        array([[123, 123, 123],
                [123, 123, 123],
                [123, 123, 123]])
        -
        -
        -
        @@ -1619,39 +1147,27 @@

        Broadcasting a změny

        -
        In [40]:
        +
        In [40]:
        -
        -
        array[(1, 2, 0), (0, 2, 1)] = 0
        +
        +
        array[(1, 2, 0), (0, 2, 1)] = 0
         array
         
        - -
        - +
        - -
        - -
        Out[40]:
        - - - - +
        Out[40]:
        array([[123,   0, 123],
                [  0, 123, 123],
                [123, 123,   0]])
        -
        -
        -
        @@ -1662,39 +1178,27 @@

        Broadcasting a změny

        -
        In [41]:
        +
        In [41]:
        -
        -
        array *= 2
        +
        +
        array *= 2
         array
         
        - -
        - +
        - -
        - -
        Out[41]:
        - - - - +
        Out[41]:
        array([[246,   0, 246],
                [  0, 246, 246],
                [246, 246,   0]])
        -
        -
        -
        @@ -1713,43 +1217,34 @@

        Broadcasting a změny

        -
        In [42]:
        +
        In [42]:
        -
        -
        try:
        +
        +
        try:
             array /= 2
         except Exception as e:
             print("Chyba!!", type(e), e)
         
        - -
        - +
        - -
        - -
        - - +
        -
        Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
        +
        Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
         
        -
        -

        Tvoření matic, část 2 -# +#

        @@ -1763,183 +1258,123 @@

        Tvoření matic, část 2

        -
        In [43]:
        +
        In [43]:
        -
        -
        numpy.zeros((4, 4))
        +
        +
        numpy.zeros((4, 4))
         
        - -
        - +
        - -
        - -
        Out[43]:
        - - - - +
        Out[43]:
        array([[0., 0., 0., 0.],
                [0., 0., 0., 0.],
                [0., 0., 0., 0.],
                [0., 0., 0., 0.]])
        -
        -
        -
        -
        In [44]:
        +
        In [44]:
        -
        -
        numpy.ones((4, 4))
        +
        +
        numpy.ones((4, 4))
         
        - -
        - +
        - -
        - -
        Out[44]:
        - - - - +
        Out[44]:
        array([[1., 1., 1., 1.],
                [1., 1., 1., 1.],
                [1., 1., 1., 1.],
                [1., 1., 1., 1.]])
        -
        -
        -
        -
        In [45]:
        +
        In [45]:
        -
        -
        numpy.full((4, 4), 12.34)
        +
        +
        numpy.full((4, 4), 12.34)
         
        - -
        - +
        - -
        - -
        Out[45]:
        - - - - +
        Out[45]:
        array([[12.34, 12.34, 12.34, 12.34],
                [12.34, 12.34, 12.34, 12.34],
                [12.34, 12.34, 12.34, 12.34],
                [12.34, 12.34, 12.34, 12.34]])
        -
        -
        -
        -
        In [46]:
        +
        In [46]:
        -
        -
        numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
        +
        +
        numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
         
        - -
        - +
        - -
        - -
        Out[46]:
        - - - - +
        Out[46]:
        array([[1., 0., 0., 0.],
                [0., 1., 0., 0.],
                [0., 0., 1., 0.],
                [0., 0., 0., 1.]])
        -
        -
        -
        -
        In [47]:
        +
        In [47]:
        -
        -
        numpy.diag([1, 2, 3, 4])  # Diagonální matice
        +
        +
        numpy.diag([1, 2, 3, 4])  # Diagonální matice
         
        - -
        - +
        - -
        - -
        Out[47]:
        - - - - +
        Out[47]:
        array([[1, 0, 0, 0],
                [0, 2, 0, 0],
                [0, 0, 3, 0],
                [0, 0, 0, 4]])
        -
        -
        -
        @@ -1950,52 +1385,36 @@

        Tvoření matic, část 2

        -
        In [48]:
        +
        In [48]:
        -
        -
        int_zeros = numpy.zeros((4, 4), dtype='int8')
        +
        +
        int_zeros = numpy.zeros((4, 4), dtype='int8')
         print(int_zeros.dtype)
         int_zeros
         
        - -
        - +
        - -
        - -
        - - +
        int8
         
        -
        - -
        Out[48]:
        - - - - +
        Out[48]:
        array([[0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0]], dtype=int8)
        -
        -
        -
        @@ -2006,38 +1425,26 @@

        Tvoření matic, část 2

        -
        In [49]:
        +
        In [49]:
        -
        -
        numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
        +
        +
        numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
         
        - -
        - +
        - -
        - -
        Out[49]:
        - - - - +
        Out[49]:
        array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
                34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
        -
        -
        -
        @@ -2048,36 +1455,24 @@

        Tvoření matic, část 2

        -
        In [50]:
        +
        In [50]:
        -
        -
        numpy.arange(0.0, 50.0, 0.3)[-1]
        +
        +
        numpy.arange(0.0, 50.0, 0.3)[-1]
         
        - -
        - +
        - -
        - -
        Out[50]:
        - - - - +
        Out[50]:
        49.799999999999997
        -
        -
        -
        @@ -2088,42 +1483,30 @@

        Tvoření matic, část 2

        -
        In [51]:
        +
        In [51]:
        -
        -
        numpy.linspace(0, 50, num=11)  # vždy 11 prvků
        +
        +
        numpy.linspace(0, 50, num=11)  # vždy 11 prvků
         
        - -
        - +
        - -
        - -
        Out[51]:
        - - - - +
        Out[51]:
        array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])
        -
        -
        -

        Reshape -# +#

        @@ -2138,73 +1521,49 @@

        Reshape

        -
        In [52]:
        +
        In [52]:
        -
        -
        array = numpy.arange(12)
        +
        +
        array = numpy.arange(12)
         array
         
        - -
        - +
        - -
        - -
        Out[52]:
        - - - - +
        Out[52]:
        array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
        -
        -
        -
        -
        In [53]:
        +
        In [53]:
        -
        -
        reshaped = array.reshape((3, 4))
        +
        +
        reshaped = array.reshape((3, 4))
         reshaped
         
        - -
        - +
        - -
        - -
        Out[53]:
        - - - - +
        Out[53]:
        array([[ 0,  1,  2,  3],
                [ 4,  5,  6,  7],
                [ 8,  9, 10, 11]])
        -
        -
        -
        @@ -2215,72 +1574,48 @@

        Reshape

        -
        In [54]:
        +
        In [54]:
        -
        -
        reshaped[2, 2] = -99
        +
        +
        reshaped[2, 2] = -99
         reshaped
         
        - -
        - +
        - -
        - -
        Out[54]:
        - - - - +
        Out[54]:
        array([[  0,   1,   2,   3],
                [  4,   5,   6,   7],
                [  8,   9, -99,  11]])
        -
        -
        -
        -
        In [55]:
        +
        In [55]:
        -
        -
        array
        +
        +
        array
         
        - -
        - +
        - -
        - -
        Out[55]:
        - - - - +
        Out[55]:
        array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9, -99,  11])
        -
        -
        -
        @@ -2291,39 +1626,27 @@

        Reshape

        -
        In [56]:
        +
        In [56]:
        -
        -
        a_slice = array[2:4]
        +
        +
        a_slice = array[2:4]
         a_slice[:] = -99, -99
         
         array
         
        - -
        - +
        - -
        - -
        Out[56]:
        - - - - +
        Out[56]:
        array([  0,   1, -99, -99,   4,   5,   6,   7,   8,   9, -99,  11])
        -
        -
        -
        @@ -2334,38 +1657,26 @@

        Reshape

        -
        In [57]:
        +
        In [57]:
        -
        -
        array.reshape((3, 4)).copy()
        +
        +
        array.reshape((3, 4)).copy()
         
        - -
        - +
        - -
        - -
        Out[57]:
        - - - - +
        Out[57]:
        array([[  0,   1, -99, -99],
                [  4,   5,   6,   7],
                [  8,   9, -99,  11]])
        -
        -
        -
        @@ -2376,39 +1687,27 @@

        Reshape

        -
        In [58]:
        +
        In [58]:
        -
        -
        reshaped.T
        +
        +
        reshaped.T
         
        - -
        - +
        - -
        - -
        Out[58]:
        - - - - +
        Out[58]:
        array([[  0,   4,   8],
                [  1,   5,   9],
                [-99,   6, -99],
                [-99,   7,  11]])
        -
        -
        -
        @@ -2421,7 +1720,7 @@

        Reshape

        Datové typy -# +#

        @@ -2435,102 +1734,66 @@

        Datové typy

        -
        In [59]:
        +
        In [59]:
        -
        -
        numpy.zeros(4, dtype=int)
        +
        +
        numpy.zeros(4, dtype=int)
         
        - -
        - +
        - -
        - -
        Out[59]:
        - - - - +
        Out[59]:
        array([0, 0, 0, 0])
        -
        -
        -
        -
        In [60]:
        +
        In [60]:
        -
        -
        numpy.zeros(4, dtype=float)
        +
        +
        numpy.zeros(4, dtype=float)
         
        - -
        - +
        - -
        - -
        Out[60]:
        - - - - +
        Out[60]:
        array([0., 0., 0., 0.])
        -
        -
        -
        -
        In [61]:
        +
        In [61]:
        -
        -
        numpy.zeros(4, dtype=bool)
        +
        +
        numpy.zeros(4, dtype=bool)
         
        - -
        - +
        - -
        - -
        Out[61]:
        - - - - +
        Out[61]:
        array([False, False, False, False])
        -
        -
        -
        @@ -2541,36 +1804,24 @@

        Datové typy

        -
        In [62]:
        +
        In [62]:
        -
        -
        numpy.array([0, 1.3, "foobar"], dtype=object)
        +
        +
        numpy.array([0, 1.3, "foobar"], dtype=object)
         
        - -
        - +
        - -
        - -
        Out[62]:
        - - - - +
        Out[62]:
        -
        array([0, 1.3, 'foobar'], dtype=object)
        +
        array([0, 1.3, 'foobar'], dtype=object)
        -
        -
        -
        @@ -2581,36 +1832,24 @@

        Datové typy

        -
        In [63]:
        +
        In [63]:
        -
        -
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
        +
        +
        numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
         
        - -
        - +
        - -
        - -
        Out[63]:
        - - - - +
        Out[63]:
        array([  1,   8, -12], dtype=int8)
        -
        -
        -
        @@ -2621,36 +1860,24 @@

        Datové typy

        -
        In [64]:
        +
        In [64]:
        -
        -
        numpy.zeros(4, dtype='<I')
        +
        +
        numpy.zeros(4, dtype='<I')
         
        - -
        - +
        - -
        - -
        Out[64]:
        - - - - +
        Out[64]:
        array([0, 0, 0, 0], dtype=uint32)
        -
        -
        -
        @@ -2661,69 +1888,45 @@

        Datové typy

        -
        In [65]:
        +
        In [65]:
        -
        -
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
        +
        +
        numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
         
        - -
        - +
        - -
        - -
        Out[65]:
        - - - - +
        Out[65]:
        -
        array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
        +
        array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
        -
        -
        -
        -
        In [66]:
        +
        In [66]:
        -
        -
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
        +
        +
        numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
         
        - -
        - +
        - -
        - -
        Out[66]:
        - - - - +
        Out[66]:
        -
        array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
        +
        array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
        -
        -
        -
        @@ -2734,44 +1937,32 @@

        Datové typy

        -
        In [67]:
        +
        In [67]:
        -
        -
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
        +
        +
        record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
         numpy.array([(1, 2, 'abc')] * 4, record_type)
         
        - -
        - +
        - -
        - -
        Out[67]:
        - - - - +
        Out[67]:
        -
        array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
        -      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
        +
        array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
        +      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
        -
        -
        -

        Maticové násobení -# +#

        @@ -2792,40 +1983,28 @@

        Maticové násobení

        -
        In [68]:
        +
        In [68]:
        -
        -
        array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
        +
        +
        array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
         array2 = numpy.array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])
         array1 @ array2
         
        - -
        - +
        - -
        - -
        Out[68]:
        - - - - +
        Out[68]:
        array([[ 1,  4,  9],
                [ 4, 10, 18],
                [ 7, 16, 27]])
        -
        -
        -
        @@ -2857,7 +2036,7 @@

        Maticové násobení

        Booleovské hodnoty polí -# +#

        @@ -2871,38 +2050,29 @@

        Booleovské hodnoty polí

        -
        In [69]:
        +
        In [69]:
        -
        -
        try:
        +
        +
        try:
             if numpy.eye(3):
                 pass
         except ValueError as e:
             print("Chyba!", type(e), e)
         
        - -
        - +
        - -
        - -
        - - +
        -
        Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
        +
        Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
         
        -
        -
        @@ -2913,40 +2083,31 @@

        Booleovské hodnoty polí

        -
        In [70]:
        +
        In [70]:
        -
        -
        if numpy.eye(3).any():
        +
        +
        if numpy.eye(3).any():
             print('Alespoň jeden prvek je nenulový')
         if numpy.eye(3).all():
             print('Všechny prvky jsou nenulové')
         if numpy.eye(3).size:
             print('Pole obsahuje nějaké prvky')
         
        - -
        - +
        - -
        - -
        - - +
        Alespoň jeden prvek je nenulový
         Pole obsahuje nějaké prvky
         
        -
        -
        @@ -2957,75 +2118,57 @@

        Booleovské hodnoty polí

        -
        In [71]:
        +
        In [71]:
        -
        -
        if numpy.ones((1, 1, 1, 1)):
        +
        +
        if numpy.ones((1, 1, 1, 1)):
             print('Ano')
         if numpy.zeros((1, 1, 1, 1)):
             print('Ne')
         
        - -
        - +
        - -
        - -
        - - +
        Ano
         
        -
        -
        -
        In [72]:
        +
        In [72]:
        -
        -
        if numpy.ones((0, 0)):
        +
        +
        if numpy.ones((0, 0)):
             print('Ano')
         
        - -
        - +
        - -
        - -
        - - +
        DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
         
        -
        -

        Další operace -# +#

        @@ -3039,73 +2182,49 @@

        Další operace

        -
        In [73]:
        +
        In [73]:
        -
        -
        array = numpy.linspace(0, numpy.pi, num=1000)
        +
        +
        array = numpy.linspace(0, numpy.pi, num=1000)
         array[:10]
         
        - -
        - +
        - -
        - -
        Out[73]:
        - - - - +
        Out[73]:
        array([0.        , 0.00314474, 0.00628947, 0.00943421, 0.01257895,
                0.01572369, 0.01886842, 0.02201316, 0.0251579 , 0.02830264])
        -
        -
        -
        -
        In [74]:
        +
        In [74]:
        -
        -
        sine = numpy.sin(array)
        +
        +
        sine = numpy.sin(array)
         sine[:10]
         
        - -
        - +
        - -
        - -
        Out[74]:
        - - - - +
        Out[74]:
        array([0.        , 0.00314473, 0.00628943, 0.00943407, 0.01257862,
                0.01572304, 0.0188673 , 0.02201138, 0.02515525, 0.02829886])
        -
        -
        -
        @@ -3118,7 +2237,7 @@

        Další operace

        Příklady použití -# +#

        @@ -3134,7 +2253,7 @@

        Příklady použití

        Matematika a grafy -# +#

        @@ -3150,19 +2269,17 @@

        Matematika a grafy

        -
        In [75]:
        +
        In [75]:
        -
        -
        from matplotlib import pyplot
        +
        +
        from matplotlib import pyplot
         
         # Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
         %matplotlib inline
         
        - -
        - +
        @@ -3173,61 +2290,41 @@

        Matematika a grafy

        -
        In [76]:
        +
        In [76]:
        -
        -
        x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
        +
        +
        x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
         y = numpy.sin(x)                      # odpovídající hodnoty funkce
         
         pyplot.plot(x, y)
         
        - -
        - +
        - -
        - -
        Out[76]:
        - - - - +
        Out[76]:
        [<matplotlib.lines.Line2D at 0x7fab9ebd62d0>]
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        -
        In [77]:
        +
        In [77]:
        -
        -
        s = numpy.linspace(-10, 10, num=100)
        +
        +
        s = numpy.linspace(-10, 10, num=100)
         
         # meshgrid vrátí dvě 100×100 matice:
         # - jednu, kde v každém řádku jsou čísla od -10 do 10,
        @@ -3243,53 +2340,33 @@ 

        Matematika a grafy # přidáme legendu pyplot.colorbar()

        - -
        - +
        - -
        - -
        Out[77]:
        - - - - +
        Out[77]:
        <matplotlib.colorbar.Colorbar at 0x7fab9e6e56d0>
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        -
        In [78]:
        +
        In [78]:
        -
        -
        # Ta samá data můžeme vykreslit i ve 3D
        +
        +
        # Ta samá data můžeme vykreslit i ve 3D
         from mpl_toolkits.mplot3d import Axes3D
         
         fig = pyplot.figure()
        @@ -3297,39 +2374,26 @@ 

        Matematika a grafy surf = axes.plot_surface(x, y, z, cmap='viridis')

        - -
        - +
        - -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -

        Obrázky -# +#

        @@ -3347,29 +2411,20 @@

        Obrázky

        -
        In [79]:
        +
        In [79]:
        -
        -
        import imageio
        +
        +
        import imageio
         img = imageio.imread('static/python.jpg')
         img
         
        - -
        - +
        -
        - - +
        - -
        Out[79]:
        - - - - +
        Out[79]:
        Array([[[172, 173, 165],
                 [173, 174, 166],
        @@ -3421,12 +2476,9 @@ 

        Obrázky [201, 202, 196], [201, 202, 196]]], dtype=uint8)

        -
        -
        -
        @@ -3437,51 +2489,31 @@

        Obrázky

        -
        In [80]:
        +
        In [80]:
        -
        -
        pyplot.imshow(img)
        +
        +
        pyplot.imshow(img)
         
        - -
        - +
        - -
        - -
        Out[80]:
        - - - - +
        Out[80]:
        <matplotlib.image.AxesImage at 0x7fabd75fcc50>
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -3492,36 +2524,24 @@

        Obrázky

        -
        In [81]:
        +
        In [81]:
        -
        -
        img.shape
        +
        +
        img.shape
         
        - -
        - +
        - -
        - -
        Out[81]:
        - - - - +
        Out[81]:
        (887, 1037, 3)
        -
        -
        -
        @@ -3541,52 +2561,32 @@

        Obrázky

        -
        In [82]:
        +
        In [82]:
        -
        -
        blue_channel = img[..., -1]
        +
        +
        blue_channel = img[..., -1]
         pyplot.imshow(blue_channel, cmap='gray')
         
        - -
        - +
        - -
        - -
        Out[82]:
        - - - - +
        Out[82]:
        <matplotlib.image.AxesImage at 0x7fabd75bfc50>
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -3598,18 +2598,16 @@

        Obrázky

        -
        In [83]:
        +
        In [83]:
        -
        -
        secret = imageio.imread('static/secret.png', pilmode='L')
        +
        +
        secret = imageio.imread('static/secret.png', pilmode='L')
         
         img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
         
        - -
        - +
        @@ -3620,51 +2618,31 @@

        Obrázky

        -
        In [84]:
        +
        In [84]:
        -
        -
        pyplot.imshow(img)
        +
        +
        pyplot.imshow(img)
         
        - -
        - +
        - -
        - -
        Out[84]:
        - - - - +
        Out[84]:
        <matplotlib.image.AxesImage at 0x7fabd75813d0>
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -3675,51 +2653,31 @@

        Obrázky

        -
        In [85]:
        +
        In [85]:
        -
        -
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
        +
        +
        pyplot.imshow(img[..., -1] & 1, cmap='gray')
         
        - -
        - +
        - -
        - -
        Out[85]:
        - - - - +
        Out[85]:
        <matplotlib.image.AxesImage at 0x7fab9c631d90>
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -3730,22 +2688,20 @@

        Obrázky

        -
        In [86]:
        +
        In [86]:
        -
        -
        imageio.imsave('python.png', img)
        +
        +
        imageio.imsave('python.png', img)
         
        - -
        - +

        Zvuk -# +#

        @@ -3759,41 +2715,28 @@

        Zvuk

        -
        In [87]:
        +
        In [87]:
        -
        -
        import scipy.io.wavfile
        +
        +
        import scipy.io.wavfile
         sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
         print(sample_rate)
         sound
         
        - -
        - +
        - -
        - -
        - - +
        48000
         
        -
        - -
        Out[87]:
        - - - - +
        Out[87]:
        array([[ -58,  -88],
                [ -65,  -49],
        @@ -3803,12 +2746,9 @@ 

        Zvuk [ -85, 234], [-118, 212]], dtype=int16)

        -
        -
        -
        @@ -3819,52 +2759,32 @@

        Zvuk

        -
        In [88]:
        +
        In [88]:
        -
        -
        channel = sound[..., 1]
        +
        +
        channel = sound[..., 1]
         pyplot.plot(channel)
         
        - -
        - +
        - -
        - -
        Out[88]:
        - - - - +
        Out[88]:
        [<matplotlib.lines.Line2D at 0x7fab9c051b90>]
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -3875,36 +2795,27 @@

        Zvuk

        -
        In [89]:
        +
        In [89]:
        -
        -
        from IPython.display import Audio
        +
        +
        from IPython.display import Audio
         Audio(data=channel, rate=sample_rate)
         print('(Zkuste si to sami; tento print vymažte)')
         
        - -
        - +
        - -
        - -
        - - +
        (Zkuste si to sami; tento print vymažte)
         
        -
        -
        @@ -3915,88 +2826,57 @@

        Zvuk

        -
        In [90]:
        +
        In [90]:
        -
        -
        segment = channel[50000:55000]
        +
        +
        segment = channel[50000:55000]
         pyplot.plot(segment)
         
        - -
        - +
        - -
        - -
        Out[90]:
        - - - - +
        Out[90]:
        [<matplotlib.lines.Line2D at 0x7fab96685510>]
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        -
        In [91]:
        +
        In [91]:
        -
        -
        from IPython.display import Audio
        +
        +
        from IPython.display import Audio
         Audio(data=segment, rate=sample_rate)
         
        - -
        - +
        - -
        - -
        Out[91]:
        - - - +
        Out[91]:
        -
        -
        -
        - +
        @@ -4008,54 +2888,34 @@

        Zvuk

        -
        In [92]:
        +
        In [92]:
        -
        -
        spectrum = numpy.fft.fft(segment)
        +
        +
        spectrum = numpy.fft.fft(segment)
         freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
         pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs, numpy.abs(spectrum))
         
        - -
        - +
        - -
        - -
        Out[92]:
        - - - - +
        Out[92]:
        [<matplotlib.lines.Line2D at 0x7fab965a4ad0>]
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -4066,52 +2926,32 @@

        Zvuk

        -
        In [93]:
        +
        In [93]:
        -
        -
        pyplot.xlabel('Frekvence (Hz)')
        +
        +
        pyplot.xlabel('Frekvence (Hz)')
         pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
         
        - -
        - +
        - -
        - -
        Out[93]:
        - - - - +
        Out[93]:
        [<matplotlib.lines.Line2D at 0x7fab96514910>]
        -
        -
        - -
        - - - - -
        - +
        +
        +No description has been provided for this image
        -
        -
        -
        @@ -4122,37 +2962,25 @@

        Zvuk

        -
        In [94]:
        +
        In [94]:
        -
        -
        amax = numpy.argmax(abs(spectrum))
        +
        +
        amax = numpy.argmax(abs(spectrum))
         amax
         
        - -
        - +
        - -
        - -
        Out[94]:
        - - - - +
        Out[94]:
        13
        -
        -
        -
        @@ -4163,36 +2991,24 @@

        Zvuk

        -
        In [95]:
        +
        In [95]:
        -
        -
        freqs[amax]
        +
        +
        freqs[amax]
         
        - -
        - +
        - -
        - -
        Out[95]:
        - - - - +
        Out[95]:
        124.80000000000001
        -
        -
        -
        @@ -4201,5 +3017,3 @@

        Zvuk

        - - diff --git a/lessons/pandas/index.html b/lessons/pandas/index.html index 960dd862..ffa0d921 100644 --- a/lessons/pandas/index.html +++ b/lessons/pandas/index.html @@ -10,7 +10,7 @@ actors.csv a spouses.csv.

        A až bude nainstalováno, spusťte si nový Notebook. (Viz lekce o Notebooku.)

        -
        +
        @@ -18,14 +18,14 @@

        Analýza dat v Pythonu -# +#

        Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

        Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

        Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

        Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

        Proces analýzy dat -# +#

        Práce datového analytika se většinou drží následujícího postupu:

          @@ -36,7 +36,7 @@

          Proces analýzy dat
        • Zkoumání dat
        • Publikace výsledků
        -

        *(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*

        +

        (založeno na diagramu z knihy *Data Wrangling in Python od Jacqueline Kazil & Katharine Jarmul, str. 3)*

        S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: json, csv, případně doinstalovat requests, lxml pro XML či xlwt/openpyxl na excelové soubory.

        Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.

        @@ -46,7 +46,7 @@

        Proces analýzy dat

        Pandas -# +#

        Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

        @@ -61,22 +61,20 @@

        Pandas

        -
        In [1]:
        +
        In [1]:
        -
        -
        import pandas
        +
        +
        import pandas
         
        - -
        - +

        Tabulky -# +#

        @@ -98,27 +96,19 @@

        Tabulky

        -
        In [2]:
        +
        In [2]:
        -
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        - -
        - +
        - -
        - -
        Out[2]:
        - - - +
        Out[2]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        -
        -
        -
        @@ -198,30 +185,22 @@

        Tabulky

        -
        In [3]:
        +
        In [3]:
        -
        -
        items = pandas.DataFrame([
        +
        +
        items = pandas.DataFrame([
             ["Book", 123],
             ["Computer", 2185],
         ])
         items
         
        - -
        - +
        - -
        - -
        Out[3]:
        - - - +
        Out[3]:
        - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
        01
        0Book123
        1Computer2185
        01
        0Book123
        1Computer2185
        -
        -
        -
        @@ -274,30 +250,22 @@

        Tabulky

        -
        In [4]:
        +
        In [4]:
        -
        -
        items = pandas.DataFrame([
        +
        +
        items = pandas.DataFrame([
             {"name": "Book", "price": 123},
             {"name": "Computer", "price": 2185},
         ])
         items
         
        - -
        - +
        - -
        - -
        Out[4]:
        - - - +
        Out[4]:
        - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
        nameprice
        0Book123
        1Computer2185
        nameprice
        0Book123
        1Computer2185
        -
        -
        -
        @@ -351,25 +316,18 @@

        Tabulky

        -
        In [5]:
        +
        In [5]:
        -
        -
        print(actors)
        +
        +
        print(actors)
         
        - -
        - +
        - -
        - -
        - - +
              name  birth  alive
         0    Terry   1942  False
        @@ -381,10 +339,8 @@ 

        Tabulky

        -
        -
        @@ -395,27 +351,20 @@

        Tabulky

        -
        In [6]:
        +
        In [6]:
        -
        -
        actors.info()
        +
        +
        actors.info()
         
        - -
        - +
        - -
        - -
        - - +
        -
        <class 'pandas.core.frame.DataFrame'>
        +
        <class 'pandas.core.frame.DataFrame'>
         RangeIndex: 6 entries, 0 to 5
         Data columns (total 3 columns):
         name     6 non-null object
        @@ -426,10 +375,8 @@ 

        Tabulky

        -
        -
        @@ -452,7 +399,7 @@

        Tabulky

        Sloupce -# +#

        @@ -466,28 +413,19 @@

        Sloupce

        -
        In [7]:
        +
        In [7]:
        -
        -
        birth_years = actors['birth']
        +
        +
        birth_years = actors['birth']
         birth_years
         
        - -
        - +
        - -
        - -
        Out[7]:
        - - - - +
        Out[7]:
        0    1942
         1    1943
        @@ -497,144 +435,93 @@ 

        Sloupce 5 1939 Name: birth, dtype: int64

        -
        -
        -
        -
        In [8]:
        +
        In [8]:
        -
        -
        type(birth_years)
        +
        +
        type(birth_years)
         
        - -
        - +
        - -
        - -
        Out[8]:
        - - - - +
        Out[8]:
        pandas.core.series.Series
        -
        -
        -
        -
        In [9]:
        +
        In [9]:
        -
        -
        birth_years.name
        +
        +
        birth_years.name
         
        - -
        - +
        - -
        - -
        Out[9]:
        - - - - +
        Out[9]:
        -
        'birth'
        +
        'birth'
        -
        -
        -
        -
        In [10]:
        +
        In [10]:
        -
        -
        birth_years.index
        +
        +
        birth_years.index
         
        - -
        - +
        - -
        - -
        Out[10]:
        - - - - +
        Out[10]:
        RangeIndex(start=0, stop=6, step=1)
        -
        -
        -
        -
        In [11]:
        +
        In [11]:
        -
        -
        birth_years.dtype
        +
        +
        birth_years.dtype
         
        - -
        - +
        - -
        - -
        Out[11]:
        - - - - +
        Out[11]:
        -
        dtype('int64')
        +
        dtype('int64')
        -
        -
        -
        @@ -646,28 +533,19 @@

        Sloupce

        -
        In [12]:
        +
        In [12]:
        -
        -
        ages = 2016 - birth_years
        +
        +
        ages = 2016 - birth_years
         ages
         
        - -
        - +
        - -
        - -
        Out[12]:
        - - - - +
        Out[12]:
        0    74
         1    73
        @@ -677,37 +555,25 @@ 

        Sloupce 5 77 Name: birth, dtype: int64

        -
        -
        -
        -
        In [13]:
        +
        In [13]:
        -
        -
        century = birth_years // 100 + 1
        +
        +
        century = birth_years // 100 + 1
         century
         
        - -
        - +
        - -
        - -
        Out[13]:
        - - - - +
        Out[13]:
        0    20
         1    20
        @@ -717,12 +583,9 @@ 

        Sloupce 5 20 Name: birth, dtype: int64

        -
        -
        -
        @@ -733,27 +596,18 @@

        Sloupce

        -
        In [14]:
        +
        In [14]:
        -
        -
        birth_years > 1940
        +
        +
        birth_years > 1940
         
        - -
        - +
        - -
        - -
        Out[14]:
        - - - - +
        Out[14]:
        0     True
         1     True
        @@ -763,36 +617,24 @@ 

        Sloupce 5 False Name: birth, dtype: bool

        -
        -
        -
        -
        In [15]:
        +
        In [15]:
        -
        -
        birth_years == 1940
        +
        +
        birth_years == 1940
         
        - -
        - +
        - -
        - -
        Out[15]:
        - - - - +
        Out[15]:
        0    False
         1    False
        @@ -802,12 +644,9 @@ 

        Sloupce 5 False Name: birth, dtype: bool

        -
        -
        -
        @@ -818,27 +657,18 @@

        Sloupce

        -
        In [16]:
        +
        In [16]:
        -
        -
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
        +
        +
        actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
         
        - -
        - +
        - -
        - -
        Out[16]:
        - - - - +
        Out[16]:
        0      Terry (1)
         1    Michael (2)
        @@ -848,12 +678,9 @@ 

        Sloupce 5 John (6) Name: name, dtype: object

        -
        -
        -
        @@ -864,27 +691,18 @@

        Sloupce

        -
        In [17]:
        +
        In [17]:
        -
        -
        actors['name'].str.upper()
        +
        +
        actors['name'].str.upper()
         
        - -
        - +
        - -
        - -
        Out[17]:
        - - - - +
        Out[17]:
        0      TERRY
         1    MICHAEL
        @@ -894,12 +712,9 @@ 

        Sloupce 5 JOHN Name: name, dtype: object

        -
        -
        -
        @@ -917,71 +732,47 @@

        Sloupce

        -
        In [18]:
        +
        In [18]:
        -
        -
        birth_years[2]
        +
        +
        birth_years[2]
         
        - -
        - +
        - -
        - -
        Out[18]:
        - - - - +
        Out[18]:
        1943
        -
        -
        -
        -
        In [19]:
        +
        In [19]:
        -
        -
        birth_years[2:-2]
        +
        +
        birth_years[2:-2]
         
        - -
        - +
        - -
        - -
        Out[19]:
        - - - - +
        Out[19]:
        2    1943
         3    1941
         Name: birth, dtype: int64
        -
        -
        -
        @@ -992,28 +783,19 @@

        Sloupce

        -
        In [20]:
        +
        In [20]:
        -
        -
        # Roky narození po roce 1940
        +
        +
        # Roky narození po roce 1940
         birth_years[birth_years > 1940]
         
        - -
        - +
        - -
        - -
        Out[20]:
        - - - - +
        Out[20]:
        0    1942
         1    1943
        @@ -1021,12 +803,9 @@ 

        Sloupce 3 1941 Name: birth, dtype: int64

        -
        -
        -
        @@ -1037,39 +816,27 @@

        Sloupce

        -
        In [21]:
        +
        In [21]:
        -
        -
        # Roky narození v daném rozmezí
        +
        +
        # Roky narození v daném rozmezí
         birth_years[(birth_years > 1940) & (birth_years < 1943)]
         
        - -
        - +
        - -
        - -
        Out[21]:
        - - - - +
        Out[21]:
        0    1942
         3    1941
         Name: birth, dtype: int64
        -
        -
        -
        @@ -1080,29 +847,22 @@

        Sloupce

        -
        In [22]:
        +
        In [22]:
        -
        -
        print('Součet: ', birth_years.sum())
        +
        +
        print('Součet: ', birth_years.sum())
         print('Průměr: ', birth_years.mean())
         print('Medián: ', birth_years.median())
         print('Počet unikátních hodnot: ', birth_years.nunique())
         print('Koeficient špičatosti: ', birth_years.kurtosis())
         
        - -
        - +
        - -
        - -
        - - +
        Součet:  11648
         Průměr:  1941.3333333333333
        @@ -1112,10 +872,8 @@ 

        Sloupce

        -
        -
        @@ -1126,27 +884,18 @@

        Sloupce

        -
        In [23]:
        +
        In [23]:
        -
        -
        actors['name'].apply(lambda x: ''.join(reversed(x)))
        +
        +
        actors['name'].apply(lambda x: ''.join(reversed(x)))
         
        - -
        - +
        - -
        - -
        Out[23]:
        - - - - +
        Out[23]:
        0      yrreT
         1    leahciM
        @@ -1156,36 +905,24 @@ 

        Sloupce 5 nhoJ Name: name, dtype: object

        -
        -
        -
        -
        In [24]:
        +
        In [24]:
        -
        -
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
        +
        +
        actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
         
        - -
        - +
        - -
        - -
        Out[24]:
        - - - - +
        Out[24]:
        0    deceased
         1       alive
        @@ -1195,18 +932,15 @@ 

        Sloupce 5 alive Name: alive, dtype: object

        -
        -
        -

        Tabulky a vybírání prvků -# +#

        @@ -1220,27 +954,18 @@

        Tabulky a vybírání prvků

        -
        In [25]:
        +
        In [25]:
        -
        -
        actors['name']  # Jméno sloupce
        +
        +
        actors['name']  # Jméno sloupce
         
        - -
        - +
        - -
        - -
        Out[25]:
        - - - - +
        Out[25]:
        0      Terry
         1    Michael
        @@ -1250,35 +975,24 @@ 

        Tabulky a vybírání prvků 5 John Name: name, dtype: object

        -
        -
        -
        -
        In [26]:
        +
        In [26]:
        -
        -
        actors[1:-1]  # Interval řádků
        +
        +
        actors[1:-1]  # Interval řádků
         
        - -
        - +
        - -
        - -
        Out[26]:
        - - - +
        Out[26]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        namebirthalive
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        -
        -
        -
        -
        In [27]:
        +
        In [27]:
        -
        -
        actors[['name', 'alive']]  # Seznam sloupců
        +
        +
        actors[['name', 'alive']]  # Seznam sloupců
         
        - -
        - +
        - -
        - -
        Out[27]:
        - - - +
        Out[27]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namealive
        0TerryFalse
        1MichaelTrue
        2EricTrue
        3GrahamFalse
        4TerryTrue
        5JohnTrue
        namealive
        0TerryFalse
        1MichaelTrue
        2EricTrue
        3GrahamFalse
        4TerryTrue
        5JohnTrue
        -
        -
        -
        @@ -1435,7 +1135,7 @@

        Tabulky a vybírání prvků

        Indexer loc -# +#

        @@ -1449,26 +1149,18 @@

        Indexer loc

        -
        In [28]:
        +
        In [28]:
        -
        -
        actors
        +
        +
        actors
         
        - -
        - +
        - -
        - -
        Out[28]:
        - - - +
        Out[28]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        -
        -
        -
        -
        In [29]:
        +
        In [29]:
        -
        -
        actors.loc[2]
        +
        +
        actors.loc[2]
         
        - -
        - +
        - -
        - -
        Out[29]:
        - - - - +
        Out[29]:
        name     Eric
         birth    1943
         alive    True
         Name: 2, dtype: object
        -
        -
        -
        @@ -1591,36 +1268,24 @@

        Indexer loc

        -
        In [30]:
        +
        In [30]:
        -
        -
        actors.loc[2, 'birth']
        +
        +
        actors.loc[2, 'birth']
         
        - -
        - +
        - -
        - -
        Out[30]:
        - - - - +
        Out[30]:
        1943
        -
        -
        -
        @@ -1631,26 +1296,18 @@

        Indexer loc

        -
        In [31]:
        +
        In [31]:
        -
        -
        actors.loc[2:4, 'birth':'alive']
        +
        +
        actors.loc[2:4, 'birth':'alive']
         
        - -
        - +
        - -
        - -
        Out[31]:
        - - - +
        Out[31]:
        - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
        birthalive
        21943True
        31941False
        41940True
        birthalive
        21943True
        31941False
        41940True
        -
        -
        -
        @@ -1708,62 +1362,42 @@

        Indexer loc

        -
        In [32]:
        +
        In [32]:
        -
        -
        actors.loc[2:4, 'name']
        +
        +
        actors.loc[2:4, 'name']
         
        - -
        - +
        - -
        - -
        Out[32]:
        - - - - +
        Out[32]:
        2      Eric
         3    Graham
         4     Terry
         Name: name, dtype: object
        -
        -
        -
        -
        In [33]:
        +
        In [33]:
        -
        -
        actors.loc[2:4, 'name':'name']
        +
        +
        actors.loc[2:4, 'name':'name']
         
        - -
        - +
        - -
        - -
        Out[33]:
        - - - +
        Out[33]:
        - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
        name
        2Eric
        3Graham
        4Terry
        name
        2Eric
        3Graham
        4Terry
        -
        -
        -
        @@ -1817,27 +1448,18 @@

        Indexer loc

        -
        In [34]:
        +
        In [34]:
        -
        -
        actors.loc[:, 'alive']
        +
        +
        actors.loc[:, 'alive']
         
        - -
        - +
        - -
        - -
        Out[34]:
        - - - - +
        Out[34]:
        0    False
         1     True
        @@ -1847,12 +1469,9 @@ 

        Indexer loc 5 True Name: alive, dtype: bool

        -
        -
        -
        @@ -1863,26 +1482,18 @@

        Indexer loc

        -
        In [35]:
        +
        In [35]:
        -
        -
        actors.loc[:, ['name', 'alive']]
        +
        +
        actors.loc[:, ['name', 'alive']]
         
        - -
        - +
        - -
        - -
        Out[35]:
        - - - +
        Out[35]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namealive
        0TerryFalse
        1MichaelTrue
        2EricTrue
        3GrahamFalse
        4TerryTrue
        5JohnTrue
        namealive
        0TerryFalse
        1MichaelTrue
        2EricTrue
        3GrahamFalse
        4TerryTrue
        5JohnTrue
        -
        -
        -
        -
        In [36]:
        +
        In [36]:
        -
        -
        actors.loc[[3, 2, 4, 4], :]
        +
        +
        actors.loc[[3, 2, 4, 4], :]
         
        - -
        - +
        - -
        - -
        Out[36]:
        - - - +
        Out[36]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        3Graham1941False
        2Eric1943True
        4Terry1940True
        4Terry1940True
        namebirthalive
        3Graham1941False
        2Eric1943True
        4Terry1940True
        4Terry1940True
        -
        -
        -

        Indexer iloc -# +#

        @@ -2044,26 +1641,18 @@

        Indexer iloc

        -
        In [37]:
        +
        In [37]:
        -
        -
        actors
        +
        +
        actors
         
        - -
        - +
        - -
        - -
        Out[37]:
        - - - +
        Out[37]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        -
        -
        -
        -
        In [38]:
        +
        In [38]:
        -
        -
        actors.iloc[0, 0]
        +
        +
        actors.iloc[0, 0]
         
        - -
        - +
        - -
        - -
        Out[38]:
        - - - - +
        Out[38]:
        -
        'Terry'
        +
        'Terry'
        -
        -
        -
        @@ -2176,59 +1750,39 @@

        Indexer iloc

        -
        In [39]:
        +
        In [39]:
        -
        -
        actors.iloc[-1, 1]
        +
        +
        actors.iloc[-1, 1]
         
        - -
        - +
        - -
        - -
        Out[39]:
        - - - - +
        Out[39]:
        1939
        -
        -
        -
        -
        In [40]:
        +
        In [40]:
        -
        -
        actors.iloc[:, 0:1]
        +
        +
        actors.iloc[:, 0:1]
         
        - -
        - +
        - -
        - -
        Out[40]:
        - - - +
        Out[40]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        name
        0Terry
        1Michael
        2Eric
        3Graham
        4Terry
        5John
        name
        0Terry
        1Michael
        2Eric
        3Graham
        4Terry
        5John
        -
        -
        -
        @@ -2294,26 +1845,18 @@

        Indexer iloc

        -
        In [41]:
        +
        In [41]:
        -
        -
        actors.iloc[[0, -1, 3], [-1, 1, 0]]
        +
        +
        actors.iloc[[0, -1, 3], [-1, 1, 0]]
         
        - -
        - +
        - -
        - -
        Out[41]:
        - - - +
        Out[41]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alivebirthname
        0False1942Terry
        5True1939John
        3False1941Graham
        alivebirthname
        0False1942Terry
        5True1939John
        3False1941Graham
        -
        -
        -
        @@ -2375,42 +1915,30 @@

        Indexer iloc

        -
        In [42]:
        +
        In [42]:
        -
        -
        actors.iloc[-1].loc['name']
        +
        +
        actors.iloc[-1].loc['name']
         
        - -
        - +
        - -
        - -
        Out[42]:
        - - - - +
        Out[42]:
        -
        'John'
        +
        'John'
        -
        -
        -

        Indexy -# +#

        @@ -2425,27 +1953,19 @@

        Indexy

        -
        In [43]:
        +
        In [43]:
        -
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        - -
        - +
        - -
        - -
        Out[43]:
        - - - +
        Out[43]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        -
        -
        -
        @@ -2525,69 +2042,45 @@

        Indexy

        -
        In [44]:
        +
        In [44]:
        -
        -
        actors.index
        +
        +
        actors.index
         
        - -
        - +
        - -
        - -
        Out[44]:
        - - - - +
        Out[44]:
        RangeIndex(start=0, stop=6, step=1)
        -
        -
        -
        -
        In [45]:
        +
        In [45]:
        -
        -
        actors.columns
        +
        +
        actors.columns
         
        - -
        - +
        - -
        - -
        Out[45]:
        - - - - +
        Out[45]:
        -
        Index(['name', 'birth', 'alive'], dtype='object')
        +
        Index(['name', 'birth', 'alive'], dtype='object')
        -
        -
        -
        @@ -2598,27 +2091,19 @@

        Indexy

        -
        In [46]:
        +
        In [46]:
        -
        -
        actors.index = actors['name']
        +
        +
        actors.index = actors['name']
         actors
         
        - -
        - +
        - -
        - -
        Out[46]:
        - - - +
        Out[46]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        name
        TerryTerry1942False
        MichaelMichael1943True
        EricEric1943True
        GrahamGraham1941False
        TerryTerry1940True
        JohnJohn1939True
        namebirthalive
        name
        TerryTerry1942False
        MichaelMichael1943True
        EricEric1943True
        GrahamGraham1941False
        TerryTerry1940True
        JohnJohn1939True
        -
        -
        -
        -
        In [47]:
        +
        In [47]:
        -
        -
        actors.index
        +
        +
        actors.index
         
        - -
        - +
        - -
        - -
        Out[47]:
        - - - - +
        Out[47]:
        -
        Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
        +
        Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
        -
        -
        -
        @@ -2737,27 +2207,19 @@

        Indexy

        -
        In [48]:
        +
        In [48]:
        -
        -
        actors = actors.sort_index()
        +
        +
        actors = actors.sort_index()
         actors
         
        - -
        - +
        -
        - - -
        - -
        Out[48]:
        - - - +
        +
        +
        Out[48]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        name
        EricEric1943True
        GrahamGraham1941False
        JohnJohn1939True
        MichaelMichael1943True
        TerryTerry1942False
        TerryTerry1940True
        namebirthalive
        name
        EricEric1943True
        GrahamGraham1941False
        JohnJohn1939True
        MichaelMichael1943True
        TerryTerry1942False
        TerryTerry1940True
        -
        -
        -
        -
        In [49]:
        +
        In [49]:
        -
        -
        actors.loc[['Eric', 'Graham']]
        +
        +
        actors.loc[['Eric', 'Graham']]
         
        - -
        - +
        - -
        - -
        Out[49]:
        - - - +
        Out[49]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        name
        EricEric1943True
        GrahamGraham1941False
        namebirthalive
        name
        EricEric1943True
        GrahamGraham1941False
        -
        -
        -
        @@ -2917,26 +2365,18 @@

        Indexy

        -
        In [50]:
        +
        In [50]:
        -
        -
        actors.loc['Terry']
        +
        +
        actors.loc['Terry']
         
        - -
        - +
        - -
        - -
        Out[50]:
        - - - +
        Out[50]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        name
        TerryTerry1942False
        TerryTerry1940True
        namebirthalive
        name
        TerryTerry1942False
        TerryTerry1940True
        -
        -
        -
        @@ -2999,27 +2436,19 @@

        Indexy

        -
        In [51]:
        +
        In [51]:
        -
        -
        indexed_actors = actors.set_index(['name', 'birth'])
        +
        +
        indexed_actors = actors.set_index(['name', 'birth'])
         indexed_actors
         
        - -
        - +
        - -
        - -
        Out[51]:
        - - - +
        Out[51]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alive
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942False
        1940True
        alive
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942False
        1940True
        -
        -
        -
        @@ -3096,38 +2522,26 @@

        Indexy

        -
        In [52]:
        +
        In [52]:
        -
        -
        indexed_actors.index
        +
        +
        indexed_actors.index
         
        - -
        - +
        - -
        - -
        Out[52]:
        - - - - +
        Out[52]:
        -
        MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
        +
        MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
                    labels=[[0, 1, 2, 3, 4, 4], [4, 2, 0, 4, 3, 1]],
        -           names=['name', 'birth'])
        + names=['name', 'birth'])
        -
        -
        -
        @@ -3138,26 +2552,18 @@

        Indexy

        -
        In [53]:
        +
        In [53]:
        -
        -
        indexed_actors.loc['Terry']
        +
        +
        indexed_actors.loc['Terry']
         
        - -
        - +
        - -
        - -
        Out[53]:
        - - - +
        Out[53]:
        - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
        alive
        birth
        1942False
        1940True
        alive
        birth
        1942False
        1940True
        -
        -
        -
        -
        In [54]:
        +
        In [54]:
        -
        -
        indexed_actors.loc['Terry'].loc[1940]
        +
        +
        indexed_actors.loc['Terry'].loc[1940]
         
        - -
        - +
        - -
        - -
        Out[54]:
        - - - - +
        Out[54]:
        alive    True
         Name: 1940, dtype: bool
        -
        -
        -
        -
        In [55]:
        +
        In [55]:
        -
        -
        indexed_actors.loc[('Terry', 1942)]
        +
        +
        indexed_actors.loc[('Terry', 1942)]
         
        - -
        - +
        - -
        - -
        Out[55]:
        - - - - +
        Out[55]:
        alive    False
         Name: (Terry, 1942), dtype: bool
        -
        -
        -
        @@ -3279,26 +2658,18 @@

        Indexy

        -
        In [56]:
        +
        In [56]:
        -
        -
        indexed_actors
        +
        +
        indexed_actors
         
        - -
        - +
        - -
        - -
        Out[56]:
        - - - +
        Out[56]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alive
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942False
        1940True
        alive
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942False
        1940True
        -
        -
        -
        -
        In [57]:
        +
        In [57]:
        -
        -
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
        +
        +
        last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
                                    index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
         last_names
         
        - -
        - +
        - -
        - -
        Out[57]:
        - - - - +
        Out[57]:
        (Terry, 1940)      Gilliam
         (Terry, 1942)        Jones
         (Carol, 1942)    Cleveland
         dtype: object
        -
        -
        -
        -
        In [58]:
        +
        In [58]:
        -
        -
        indexed_actors['last_name'] = last_names
        +
        +
        indexed_actors['last_name'] = last_names
         indexed_actors
         
        - -
        - +
        - -
        - -
        Out[58]:
        - - - +
        Out[58]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alivelast_name
        namebirth
        Eric1943TrueNaN
        Graham1941FalseNaN
        John1939TrueNaN
        Michael1943TrueNaN
        Terry1942FalseJones
        1940TrueGilliam
        alivelast_name
        namebirth
        Eric1943TrueNaN
        Graham1941FalseNaN
        John1939TrueNaN
        Michael1943TrueNaN
        Terry1942FalseJones
        1940TrueGilliam
        -
        -
        -

        NaN neboli NULL či N/A -# +#

        @@ -3520,27 +2865,18 @@

        NaN neboli NULL či N/A

        -
        In [59]:
        +
        In [59]:
        -
        -
        '(' + indexed_actors['last_name'] + ')'
        +
        +
        '(' + indexed_actors['last_name'] + ')'
         
        - -
        - +
        - -
        - -
        Out[59]:
        - - - - +
        Out[59]:
        name     birth
         Eric     1943           NaN
        @@ -3551,12 +2887,9 @@ 

        NaN neboli NULL či N/A 1940 (Gilliam) Name: last_name, dtype: object

        -
        -
        -
        @@ -3567,27 +2900,18 @@

        NaN neboli NULL či N/A

        -
        In [60]:
        +
        In [60]:
        -
        -
        indexed_actors['last_name'].isnull()
        +
        +
        indexed_actors['last_name'].isnull()
         
        - -
        - +
        - -
        - -
        Out[60]:
        - - - - +
        Out[60]:
        name     birth
         Eric     1943      True
        @@ -3598,12 +2922,9 @@ 

        NaN neboli NULL či N/A 1940 False Name: last_name, dtype: bool

        -
        -
        -
        @@ -3614,26 +2935,18 @@

        NaN neboli NULL či N/A

        -
        In [61]:
        +
        In [61]:
        -
        -
        indexed_actors.fillna('')
        +
        +
        indexed_actors.fillna('')
         
        - -
        - +
        - -
        - -
        Out[61]:
        - - - +
        Out[61]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alivelast_name
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942FalseJones
        1940TrueGilliam
        alivelast_name
        namebirth
        Eric1943True
        Graham1941False
        John1939True
        Michael1943True
        Terry1942FalseJones
        1940TrueGilliam
        -
        -
        -
        @@ -3718,26 +3028,18 @@

        NaN neboli NULL či N/A

        -
        In [62]:
        +
        In [62]:
        -
        -
        indexed_actors.dropna()
        +
        +
        indexed_actors.dropna()
         
        - -
        - +
        - -
        - -
        Out[62]:
        - - - +
        Out[62]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
        alivelast_name
        namebirth
        Terry1942FalseJones
        1940TrueGilliam
        alivelast_name
        namebirth
        Terry1942FalseJones
        1940TrueGilliam
        -
        -
        -
        @@ -3800,7 +3099,7 @@

        NaN neboli NULL či N/A

        Merge -# +#

        Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

        @@ -3808,27 +3107,19 @@

        Merge

        -
        In [63]:
        +
        In [63]:
        -
        -
        actors = pandas.read_csv('static/actors.csv', index_col=None)
        +
        +
        actors = pandas.read_csv('static/actors.csv', index_col=None)
         actors
         
        - -
        - +
        - -
        - -
        Out[63]:
        - - - +
        Out[63]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        namebirthalive
        0Terry1942False
        1Michael1943True
        2Eric1943True
        3Graham1941False
        4Terry1940True
        5John1939True
        -
        -
        -
        -
        In [64]:
        +
        In [64]:
        -
        -
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
        +
        +
        spouses = pandas.read_csv('static/spouses.csv', index_col=None)
         spouses
         
        - -
        - +
        - -
        - -
        Out[64]:
        - - - +
        Out[64]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthspouse_name
        0Graham1941David Sherlock
        1John1939Connie Booth
        2John1939Barbara Trentham
        3John1939Alyce Eichelberger
        4John1939Jennifer Wade
        5Terry1940Maggie Westo
        6Eric1943Lyn Ashley
        7Eric1943Tania Kosevich
        8Terry1942Alison Telfer
        9Terry1942Anna Söderström
        10Michael1943Helen Gibbins
        namebirthspouse_name
        0Graham1941David Sherlock
        1John1939Connie Booth
        2John1939Barbara Trentham
        3John1939Alyce Eichelberger
        4John1939Jennifer Wade
        5Terry1940Maggie Westo
        6Eric1943Lyn Ashley
        7Eric1943Tania Kosevich
        8Terry1942Alison Telfer
        9Terry1942Anna Söderström
        10Michael1943Helen Gibbins
        -
        -
        -
        -
        In [65]:
        +
        In [65]:
        -
        -
        actors.merge(spouses)
        +
        +
        actors.merge(spouses)
         
        - -
        - +
        - -
        - -
        Out[65]:
        - - - +
        Out[65]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namebirthalivespouse_name
        0Terry1942FalseAlison Telfer
        1Terry1942FalseAnna Söderström
        2Michael1943TrueHelen Gibbins
        3Eric1943TrueLyn Ashley
        4Eric1943TrueTania Kosevich
        5Graham1941FalseDavid Sherlock
        6Terry1940TrueMaggie Westo
        7John1939TrueConnie Booth
        8John1939TrueBarbara Trentham
        9John1939TrueAlyce Eichelberger
        10John1939TrueJennifer Wade
        namebirthalivespouse_name
        0Terry1942FalseAlison Telfer
        1Terry1942FalseAnna Söderström
        2Michael1943TrueHelen Gibbins
        3Eric1943TrueLyn Ashley
        4Eric1943TrueTania Kosevich
        5Graham1941FalseDavid Sherlock
        6Terry1940TrueMaggie Westo
        7John1939TrueConnie Booth
        8John1939TrueBarbara Trentham
        9John1939TrueAlyce Eichelberger
        10John1939TrueJennifer Wade
        -
        -
        -
        @@ -4168,7 +3434,7 @@

        Merge

        Přesýpání dat -# +#

        @@ -4183,10 +3449,10 @@

        Přesýpání dat

        -
        In [66]:
        +
        In [66]:
        -
        -
        import itertools
        +
        +
        import itertools
         import random
         random.seed(0)
         
        @@ -4196,11 +3462,9 @@ 

        Přesýpání dat for a, b in itertools.product(months, categories) if random.randrange(20) > 0])

        - -
        - +
        @@ -4211,27 +3475,19 @@

        Přesýpání dat

        -
        In [67]:
        +
        In [67]:
        -
        -
        # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
        +
        +
        # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
         data.head()
         
        - -
        - +
        - -
        - -
        Out[67]:
        - - - +
        Out[67]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        categorymonthsales
        0Electronics2015-01-315890
        1Power Tools2015-01-313242
        2Clothing2015-01-316961
        3Electronics2015-02-283969
        4Power Tools2015-02-284866
        categorymonthsales
        0Electronics2015-01-315890
        1Power Tools2015-01-313242
        2Clothing2015-01-316961
        3Electronics2015-02-283969
        4Power Tools2015-02-284866
        -
        -
        -
        -
        In [68]:
        +
        In [68]:
        -
        -
        # Celkový počet řádků
        +
        +
        # Celkový počet řádků
         len(data)
         
        - -
        - +
        - -
        - -
        Out[68]:
        - - - - +
        Out[68]:
        67
        -
        -
        -
        -
        In [69]:
        +
        In [69]:
        -
        -
        data['sales'].describe()
        +
        +
        data['sales'].describe()
         
        - -
        - +
        - -
        - -
        Out[69]:
        - - - - +
        Out[69]:
        count      67.000000
         mean     4795.552239
        @@ -4364,12 +3596,9 @@ 

        Přesýpání dat max 9817.000000 Name: sales, dtype: float64

        -
        -
        -
        @@ -4380,27 +3609,19 @@

        Přesýpání dat

        -
        In [70]:
        +
        In [70]:
        -
        -
        indexed = data.set_index(['category', 'month'])
        +
        +
        indexed = data.set_index(['category', 'month'])
         indexed.head()
         
        - -
        - +
        - -
        - -
        Out[70]:
        - - - +
        Out[70]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        categorymonth
        Electronics2015-01-315890
        Power Tools2015-01-313242
        Clothing2015-01-316961
        Electronics2015-02-283969
        Power Tools2015-02-284866
        sales
        categorymonth
        Electronics2015-01-315890
        Power Tools2015-01-313242
        Clothing2015-01-316961
        Electronics2015-02-283969
        Power Tools2015-02-284866
        -
        -
        -
        @@ -4474,27 +3692,19 @@

        Přesýpání dat

        -
        In [71]:
        +
        In [71]:
        -
        -
        unstacked = indexed.unstack('month')
        +
        +
        unstacked = indexed.unstack('month')
         unstacked
         
        - -
        - +
        - -
        - -
        Out[71]:
        - - - +
        Out[71]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
        category
        Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
        Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
        Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
        sales
        month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
        category
        Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
        Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
        Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0

        3 rows × 23 columns

        -
        -
        -
        @@ -4657,27 +3864,19 @@

        Přesýpání dat

        -
        In [72]:
        +
        In [72]:
        -
        -
        unstacked.columns = unstacked.columns.droplevel()
        +
        +
        unstacked.columns = unstacked.columns.droplevel()
         unstacked
         
        - -
        - +
        - -
        - -
        Out[72]:
        - - - +
        Out[72]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
        category
        Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
        Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
        Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
        month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
        category
        Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
        Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
        Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0

        3 rows × 23 columns

        -
        -
        -
        @@ -4836,36 +4032,24 @@

        Přesýpání dat

        -
        In [73]:
        +
        In [73]:
        -
        -
        unstacked.loc['Electronics'].sum()
        +
        +
        unstacked.loc['Electronics'].sum()
         
        - -
        - +
        - -
        - -
        Out[73]:
        - - - - +
        Out[73]:
        103742.0
        -
        -
        -
        @@ -4876,26 +4060,18 @@

        Přesýpání dat

        -
        In [74]:
        +
        In [74]:
        -
        -
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
        +
        +
        unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
         
        - -
        - +
        - -
        - -
        Out[74]:
        - - - +
        Out[74]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
        category
        Electronics2966.09039.01450.0
        Power Tools2012.06807.0314.0
        month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
        category
        Electronics2966.09039.01450.0
        Power Tools2012.06807.0314.0
        -
        -
        -
        @@ -4957,27 +4130,18 @@

        Přesýpání dat

        -
        In [75]:
        +
        In [75]:
        -
        -
        unstacked.loc['Clothing']
        +
        +
        unstacked.loc['Clothing']
         
        - -
        - +
        - -
        - -
        Out[75]:
        - - - - +
        Out[75]:
        month
         2015-01-31    6961.0
        @@ -5005,12 +4169,9 @@ 

        Přesýpání dat 2016-11-30 -259.0 Name: Clothing, dtype: float64

        -
        -
        -
        @@ -5023,7 +4184,7 @@

        Přesýpání dat

        Grafy -# +#

        @@ -5038,19 +4199,17 @@

        Grafy

        -
        In [76]:
        +
        In [76]:
        -
        -
        import matplotlib
        +
        +
        import matplotlib
         
         # Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):
         %matplotlib inline
         
        - -
        - +
        @@ -5061,42 +4220,26 @@

        Grafy

        -
        In [77]:
        +
        In [77]:
        -
        -
        unstacked.loc['Clothing'].dropna().plot()
        +
        +
        unstacked.loc['Clothing'].dropna().plot()
         
        - -
        - +
        - -
        - -
        Out[77]:
        - - - - +
        Out[77]:
        <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab57c0470>
        -
        -
        - -
        - - - - -
        -
        +
        +No description has been provided for this imageGrafy S237vATegIORNe6SvPRr3PfvlXbOcJDGDXvpdIPnjnrq/q4EtOlHM5z7yfgp/afjpD9lOEjT3VBv CduUiJZJ3reM/6CWmaR/z12KNN0FcFlKeQDWwPm2wUlW/Q/tR+oFMrPf/0RpGruySpIalpUkSQ3D QZLUMBwkSQ3DQZLUMBwkSQ3DQZLUMBwkSQ3DQZLU+AJEtyR17cKllgAAAABJRU5ErkJggg== -" -> +"/>
        -
        -
        -
        @@ -5458,9 +4597,9 @@

        Grafy import matplotlib.pyplot # Plot -unstacked.loc['Clothing'].plot() +unstacked.loc['Clothing'].plot() matplotlib.pyplot.show() -matplotlib.pyplot.savefig('graph.png') +matplotlib.pyplot.savefig('graph.png')

        Funkce show a savefig pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce savefig aktuální graf zahodí; před dalším show nebo savefig je potřeba ho vykreslit znovu.

        @@ -5474,45 +4613,29 @@

        Grafy

        -
        In [78]:
        +
        In [78]:
        -
        -
        # Jak se postupně vyvíjely zisky z oblečení?
        +
        +
        # Jak se postupně vyvíjely zisky z oblečení?
         # `.T` udělá transpozici tabulky (vymění řádky a sloupce)
         # `cumsum()` spočítá průběžný součet po sloupcích
         unstacked.T.fillna(0).cumsum().plot()
         
        - -
        - +
        - -
        - -
        Out[78]:
        - - - - +
        Out[78]:
        <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5733160>
        -
        -
        - -
        - - - - -
        -
        +
        +No description has been provided for this imageGrafy s6RhTPUdr/C4vMLzcpzee2Wnkk7O11Oxbhnn7+17up0xDcqShjF17xtgLJw61ZRdxToZR3BOVxnj 8+yvF2Pq3rM4q+ilAIWcnua8Uqp62L2QvhX4DFhe/yEaUzM2y60xxhiP2ekpY4wxHrOkYYwxxmOW NIwxxnjMkoYxxhiPWdIwxhjjMUsaxhhjPGZJwxhjjMf+H0VCpa8qrD5ZAAAAAElFTkSuQmCC -" -> +"/>
        -
        -
        -
        -
        In [79]:
        +
        In [79]:
        -
        -
        # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
        +
        +
        # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
         unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
         
        - -
        - +
        - -
        - -
        Out[79]:
        - - - - +
        Out[79]:
        <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab567ae10>
        -
        -
        - -
        - - - - -
        -
        +
        +No description has been provided for this imageGrafy +P8HZnnwyNnAP1bVHVvoIz0oPAksbYUkOwL3VtX6JM8C3l9VT51tvRm281ngtKo6f96LlGbhOQBp 6+wPnN2P578HeP1cVk6yB91ewjf98NdQ3AOQpEZ5DkCSGmUASFKjDABJapQBIEmNMgAkqVH/H5Hp 1WkeGrroAAAAAElFTkSuQmCC -" -> +"/>
        -
        -
        -
        @@ -6048,7 +5147,7 @@

        Grafy

        Groupby -# +#

        Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

        @@ -6056,26 +5155,18 @@

        Groupby

        -
        In [80]:
        +
        In [80]:
        -
        -
        data.head()
        +
        +
        data.head()
         
        - -
        - +
        - -
        - -
        Out[80]:
        - - - +
        Out[80]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        categorymonthsales
        0Electronics2015-01-315890
        1Power Tools2015-01-313242
        2Clothing2015-01-316961
        3Electronics2015-02-283969
        4Power Tools2015-02-284866
        categorymonthsales
        0Electronics2015-01-315890
        1Power Tools2015-01-313242
        2Clothing2015-01-316961
        3Electronics2015-02-283969
        4Power Tools2015-02-284866
        -
        -
        -
        @@ -6149,36 +5237,24 @@

        Groupby

        -
        In [81]:
        +
        In [81]:
        -
        -
        data.groupby('category')
        +
        +
        data.groupby('category')
         
        - -
        - +
        - -
        - -
        Out[81]:
        - - - - +
        Out[81]:
        <pandas.core.groupby.DataFrameGroupBy object at 0x7f4ab8363f28>
        -
        -
        -
        @@ -6189,26 +5265,18 @@

        Groupby

        -
        In [82]:
        +
        In [82]:
        -
        -
        data.groupby('category').sum()
        +
        +
        data.groupby('category').sum()
         
        - -
        - +
        - -
        - -
        Out[82]:
        - - - +
        Out[82]:
        - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        category
        Clothing112701
        Electronics103742
        Power Tools104859
        sales
        category
        Clothing112701
        Electronics103742
        Power Tools104859
        -
        -
        -
        @@ -6266,26 +5331,18 @@

        Groupby

        -
        In [83]:
        +
        In [83]:
        -
        -
        data.groupby('category').count()
        +
        +
        data.groupby('category').count()
         
        - -
        - +
        - -
        - -
        Out[83]:
        - - - +
        Out[83]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        monthsales
        category
        Clothing2222
        Electronics2222
        Power Tools2323
        monthsales
        category
        Clothing2222
        Electronics2222
        Power Tools2323
        -
        -
        -
        @@ -6348,26 +5402,18 @@

        Groupby

        -
        In [84]:
        +
        In [84]:
        -
        -
        data.groupby(['category', 'month']).sum().head()
        +
        +
        data.groupby(['category', 'month']).sum().head()
         
        - -
        - +
        - -
        - -
        Out[84]:
        - - - +
        Out[84]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        categorymonth
        Clothing2015-01-316961
        2015-02-282578
        2015-03-319131
        2015-04-30618
        2015-05-314796
        sales
        categorymonth
        Clothing2015-01-316961
        2015-02-282578
        2015-03-319131
        2015-04-30618
        2015-05-314796
        -
        -
        -
        @@ -6436,26 +5479,18 @@

        Groupby

        -
        In [85]:
        +
        In [85]:
        -
        -
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
        +
        +
        data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
         
        - -
        - +
        - -
        - -
        Out[85]:
        - - - +
        Out[85]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        meanmediansumkurt
        category
        Clothing5122.7727276185.5112701-1.298035
        Electronics4715.5454554294.5103742-1.353210
        Power Tools4559.0869573769.0104859-1.044767
        sales
        meanmediansumkurt
        category
        Clothing5122.7727276185.5112701-1.298035
        Electronics4715.5454554294.5103742-1.353210
        Power Tools4559.0869573769.0104859-1.044767
        -
        -
        -
        @@ -6532,27 +5564,19 @@

        Groupby

        -
        In [86]:
        +
        In [86]:
        -
        -
        g = data.groupby('month')
        +
        +
        g = data.groupby('month')
         g.describe()
         
        - -
        - +
        - -
        - -
        Out[86]:
        - - - +
        Out[86]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        countmeanstdmin25%50%75%max
        month
        2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
        2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
        2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
        2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
        2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
        2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
        2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
        2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
        2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
        2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
        2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
        2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
        2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
        2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
        2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
        2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
        2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
        2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
        2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
        2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
        2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
        2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
        2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
        sales
        countmeanstdmin25%50%75%max
        month
        2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
        2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
        2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
        2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
        2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
        2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
        2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
        2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
        2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
        2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
        2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
        2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
        2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
        2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
        2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
        2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
        2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
        2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
        2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
        2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
        2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
        2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
        2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
        -
        -
        -
        @@ -6869,29 +5890,21 @@

        Groupby

        -
        In [87]:
        +
        In [87]:
        -
        -
        bin_size = 10000
        +
        +
        bin_size = 10000
         by_month = data.groupby('month').sum()
         by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
         by_thousands
         
        - -
        - +
        - -
        - -
        Out[87]:
        - - - +
        Out[87]:
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        sales
        countsum
        sales
        0530651
        1000015218870
        20000371781
        sales
        countsum
        sales
        0530651
        1000015218870
        20000371781
        -
        -
        -
        -
        In [88]:
        +
        In [88]:
        -
        -
        by_thousands[('sales', 'sum')].plot()
        +
        +
        by_thousands[('sales', 'sum')].plot()
         
        - -
        - +
        - -
        - -
        Out[88]:
        - - - - +
        Out[88]:
        <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5588240>
        -
        -
        - -
        - - - - -
        -
        +
        +No description has been provided for this imageGroupby tmSMKb3zgedFJA9vOu8IvJeiTQM24Y1EP4mqnnCnMo92x3AqAy/hTQ+e7sYEeFFV9wflVRgTQJbC bIwxJmBsd5kxxpiAsSZjjDEmYKzJGGOMCRhrMsYYYwLGmowxxpiAsSZjjDEmYKzJGGOMCRhrMsYY YwLm/wFs+GhAV4F94AAAAABJRU5ErkJggg== -" -> +"/>
        -
        -
        -
        - - diff --git a/lessons/pong/index.html b/lessons/pong/index.html index 38c56cc8..462b0b0f 100644 --- a/lessons/pong/index.html +++ b/lessons/pong/index.html @@ -3,7 +3,9 @@

        Pong

        -

        Dnes si prohloubíme znalosti programování grafických aplikací, +

        + +

        Dnes si prohloubíme znalosti programování grafických aplikací, které jsme získali na lekci o Pygletu, na reálném problému.

        Naprogramujeme si s pomocí knihovny Pyglet @@ -150,15 +152,17 @@

        Řešení

        -

        Po míčku zkus vykreslit obě pálky. +

        + +

        Po míčku zkus vykreslit obě pálky. V proměnné pozice_palek máme vertikální polohu první a druhé pálky, ale horizontální poloha je konstantní. Jaké souřadnice musíš předat funkci @@ -172,21 +176,23 @@

        Řešení

        -

        Přehlednosti hry pomůže půlící čára +

        + +

        Přehlednosti hry pomůže půlící čára uprostřed. Jak ji ale namalovat? Nebudeme vymýšlet zbytečné složitosti. Namalujme ji jako sérii obdélníčků táhnoucích se odshora @@ -201,17 +207,19 @@

        Řešení

        -

        Co nám ještě chybí? Počítadlo skóre pro oba hráče. +

        + +

        Co nám ještě chybí? Počítadlo skóre pro oba hráče. K tomu se musíme naučit vykreslovat v Pygletu text. V Pygletu je modul text, který obsahuje objekt Label (Nápis). Ten se hodí k vykreslení hodnoty @@ -241,24 +249,26 @@

        Řešení

        -

        Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

        +
        + +

        Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

        Dynamika hry #

        @@ -307,31 +317,33 @@

        Řešení

        -

        Proč vlastně používáme k odebrání n-tice metodu +

        + +

        Proč vlastně používáme k odebrání n-tice metodu discard() místo metody remove(), kterou známe ze seznamů a množiny ji také mají? Nezpůsobí totiž chybu, když se pokusíme odebrat @@ -419,24 +431,26 @@

        Řešení

        -

        Nic se zatím ale nestane, protože funkce +

        + +

        Nic se zatím ale nestane, protože funkce obnov_stav(dt) zatím nepracuje se změnou rychlosti. Musíme v ní tedy nastavit proměnnou poloha_micku podle současné rychlosti míčku diff --git a/lessons/print/index.html b/lessons/print/index.html index 06b74940..cb3a346d 100644 --- a/lessons/print/index.html +++ b/lessons/print/index.html @@ -56,7 +56,9 @@

        Další příkazy print(V míse je maso.) ^ SyntaxError: invalid syntax -

        Při chybě Python napřed zmíní jméno souboru a + + +

        Při chybě Python napřed zmíní jméno souboru a číslo řádku, na kterém si chyby všimnul. Potom vypíše celý řádek s chybou a nakonec oznámí druh chyby diff --git a/lessons/pyglet/index.html b/lessons/pyglet/index.html index eb6828b4..80929663 100644 --- a/lessons/pyglet/index.html +++ b/lessons/pyglet/index.html @@ -211,7 +211,8 @@

        Čas ⏲

        Vykreslování 🖌 #

        -

        + +

        Program, který vypisuje na terminál spoustu čísel, není asi zas tak zajímavý. Téma téhle stránky je ale grafika, tak se začněme od @@ -313,7 +314,8 @@

        Animace

        Zavolej později #

        -

        + +

        Pyglet umí kromě opakovaného „tikání“ zavolat funkci jednorázově, za určitou dobu.

        Stáhni si (nebo vytvoř) druhý obrázek. Já mám druhého diff --git a/lessons/pyqt/index.html b/lessons/pyqt/index.html index 1238638c..e94e4096 100644 --- a/lessons/pyqt/index.html +++ b/lessons/pyqt/index.html @@ -23,7 +23,7 @@

        PyQt5

        Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů (návod).

        První aplikace níže by vám měla fungovat.

        -

        Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

        +

        Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

        Qt5 Designer #

        @@ -204,7 +204,7 @@

        Qt Designer známých mj. ze starých her.

        Aplikace bude mít část s mapou, paletu pro výběr dlaždice ke kreslení a navíc menu a panel nástrojů pro akce jako ukládání a otevírání souborů:

        -

        Obrázek aplikace

        +

        Obrázek aplikace

        Vytvářet GUI v kódu je poměrně neefektivní, a tak existuje nástroj, kde si okna můžeme „naklikat“. Jmenuje se Qt Designer a měli byste ho mít nainstalovaný. Na školních počítačích se spouští příkazem designer -qt=5.

        diff --git a/lessons/reassignment/index.html b/lessons/reassignment/index.html index 6548d02f..f94650c1 100644 --- a/lessons/reassignment/index.html +++ b/lessons/reassignment/index.html @@ -69,28 +69,28 @@

        Řešení

        Příkaz celkem = celkem + delka_trasy vypočítá hodnotu +celkem + delka_trasy, tedy přičte aktuální číslo k součtu. +Výsledek uloží opět do proměnné celkem. +Nová hodnota celkem se pak použije v dalším průchodu cyklem.

        +

        Na začátku je celkem 0 a na konci se celkový součet všech čísel vypíše.

        \ No newline at end of file diff --git a/lessons/recursion/index.html b/lessons/recursion/index.html index 66d87b39..f5c58a0c 100644 --- a/lessons/recursion/index.html +++ b/lessons/recursion/index.html @@ -23,12 +23,10 @@

        Rekurze
      • Zavolá funkci rekurzivni_funkce:
        • Vypočítá výsledek
        • Zavolá funkci rekurzivni_funkce:
            -
          • ...
              -
            • ... - po stovkách opakování si Python všimne, že tohle asi - nikam nevede, a skončí s chybou.
            • -
            -
          • +
          • ... +* ... +* po stovkách opakování si Python všimne, že tohle asi +nikam nevede, a skončí s chybou.
        @@ -42,16 +40,17 @@

        Rekurze

      Tomu odpovídá chybová hláška:

      Traceback (most recent call last):
      -  File "/tmp/ukazka.py", line 4, in <module>
      +  File "/tmp/ukazka.py", line 4, in <module>
           rekurzivni_funkce()
      -  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
      +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
           return rekurzivni_funkce()
      -  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
      +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
           return rekurzivni_funkce()
      -  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
      +  File "/tmp/ukazka.py", line 2, in rekurzivni_funkce
           return rekurzivni_funkce()
         [Previous line repeated 996 more times]
      -RecursionError: maximum recursion depth exceeded

      Hláška je zkrácená – dva řádky by se správně měly opakovat 999×, ale novější +RecursionError: maximum recursion depth exceeded +

      Hláška je zkrácená – dva řádky by se správně měly opakovat 999×, ale novější verze Pythonu je vypíšou jen třikrát.

      Kontrolované zanoření # @@ -100,10 +99,9 @@

      Kontrolované zanoření
    • Zkontroluje, že 20 ≥ 30 (což neplatí)
    • Vypíše Zanořuju se (z 20 m)
      • Zavolá funkci pruzkum s hloubkou 30 m:
          -
        • Zkontroluje, že 30 ≥ 30 (což platí! konečně!)
            -
          • Vypíše Už toho bylo dost! a skončí
          • -
          -
        • +
        • Zkontroluje, že 30 ≥ 30 (což platí! konečně!) +* Vypíše Už toho bylo dost! +* a skončí
      diff --git a/lessons/requests/index.html b/lessons/requests/index.html index 5c8180a9..078857f1 100644 --- a/lessons/requests/index.html +++ b/lessons/requests/index.html @@ -96,7 +96,7 @@

      Použití session většinou přidává specifické hlavičky (jak je tomu i zde). Lze ji nastavit buďto na celé session nebo předat argumentem auth s každým požadavkem.

      -

      Existují předpřipravené funkce v modulu requests.auth, například +

      Existují předpřipravené funkce v modulu requests.auth, například requests.auth.HTTPBasicAuth provádí základní HTTP přihlášení. Dle specifikace zakóduje jméno a heslo pomocí algoritmu base64 a přidá hlavičku Authorization.

      @@ -147,9 +147,7 @@

      Chraňte své tokeny >>> config['github']['token'] 'd7313dab254b7fd0d0f3ec3cbf754b3abce462d5'

      Do souboru .gitignore pak musíte přidat název ignorovaného souboru, např.:

      -
      auth.cfg
      -
      -

      Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže +

      auth.cfg

      Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže ve výstupu git status.

      Jelikož ostatní tento konfigurační soubor neuvidí, je vhodné jim vysvětlit, jak takový soubor (s jejich údaji) vytvořit. diff --git a/lessons/snake/index.html b/lessons/snake/index.html index dbe4578c..6289855d 100644 --- a/lessons/snake/index.html +++ b/lessons/snake/index.html @@ -30,7 +30,7 @@

      Hra typu Had dohromady. Doporučuji začít s čistým souborem v prázdné složce a do hotových programů se koukat jen v případě potřeby.

      Jak postupovat, aby se projekt nezdál nedosažitelný už na začátku? Třeba takto:

      -
        +
        1. Promysli si, jak bude hra fungovat a jak přeneseme mřížku s hadem z příkazové řádky do grafického okna.
        2. Vykresli hada do grafického okna (ve formě barevných čtverců)
        3. @@ -182,7 +182,8 @@

          Načtení všech obrázků ze složky 'right-top': <ImageData 64x64>, 'left-bottom': <ImageData 64x64>, 'tail-left': <ImageData 64x64>, 'bottom-tongue': <ImageData 64x64>, 'left-top': <ImageData 64x64>, 'bottom-bottom': <ImageData 64x64>, - ...

          Pokud je tohle pro tebe příliš mnoho nových věcí najednou a nedaří se ti to + ... +

          Pokud je tohle pro tebe příliš mnoho nových věcí najednou a nedaří se ti to vyřešit, zkus to ještě jednou a pak se můžeš podívat na řešení.

          Řešení

          @@ -191,19 +192,21 @@

          Řešení

          -

          Housenka + + +

          Housenka #

          Než se začneme zabývat různými obrázky, uděláme pokus k ověření, že nám vše stále funguje. diff --git a/lessons/str-index-slice/index.html b/lessons/str-index-slice/index.html index e1e830e3..c72acbb0 100644 --- a/lessons/str-index-slice/index.html +++ b/lessons/str-index-slice/index.html @@ -26,7 +26,9 @@

          Řešení

          -

          Jak sis možná už všiml/a, programátoři počítají od nuly. + + +

          Jak sis možná už všiml/a, programátoři počítají od nuly. „První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.

          Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, druhé jedna, ... a osmé písmeno má číslo sedm.

          @@ -41,7 +43,8 @@

          Řešení

          ╭───┬───┬───┬───┬───┬───┬───┬───╮ │ Č │ o │ k │ o │ l │ á │ d │ a │ - ╰───┴───┴───┴───┴───┴───┴───┴───╯

          A když už jsme u divných čísel, + ╰───┴───┴───┴───┴───┴───┴───┴───╯ +

          A když už jsme u divných čísel, co se asi stane, když budu vybírat písmena pomocí záporných čísel?

          Řešení

          @@ -50,17 +53,20 @@

          Řešení

          Záporná čísla vybírají písmenka od konce.

          +
             [0] [1] [2] [3] [4] [5] [6] [7]
          +   [-8][-7][-6][-5][-4][-3][-2][-1]
          +  ╭───┬───┬───┬───┬───┬───┬───┬───╮
          +  │ Č │ o │ k │ o │ l │ á │ d │ a │
          +  ╰───┴───┴───┴───┴───┴───┴───┴───╯
          +
          -

          Sekání řetězců + + +

          Sekání řetězců #

          Kromě jednotlivých znaků můžeme vybírat i delší části – odborně @@ -77,7 +83,9 @@

          Řešení

          -

          Dá se použít i retezec[:5], + + +

          Dá se použít i retezec[:5], který vybere všechno až po znak číslo 5. Ne však znak 5 samotný, což je možná trochu zarážející, ale je potřeba s tím počítat. @@ -101,15 +109,17 @@

          Řešení

          -

          Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

          + + +

          Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

          U sekání (s :) pomáhá očíslovat si „hranice“ mezi znaky, abys v tom měl/a lepší přehled:

          @@ -127,7 +137,8 @@

          Řešení

          'čokoláda'[2:6] == 'kolá' ╰───────────╯ - 'čokoláda'[-3:] == 'áda'

          Cvičení + 'čokoláda'[-3:] == 'áda' +

          Cvičení #

          Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za @@ -145,12 +156,16 @@

          Řešení

          Které písmeno zaměnit (od nuly)? 3 Nové písmeno: u čokuláda -
          +
          + +
           Slovo: kočka
           Které písmeno zaměnit (od nuly)? 1
           Nové písmeno: a
           kačka
          -

          Pozor na to, že řetězce v Pythonu nelze měnit. + + +

          Pozor na to, že řetězce v Pythonu nelze měnit. Nemůžeš v existujícím řetězci zaměnit jeden znak za jiný; musíš vytvořit nový řetězec poskládaný z částí toho starého.

          @@ -160,14 +175,14 @@

          Řešení

          \ No newline at end of file diff --git a/lessons/str-methods/index.html b/lessons/str-methods/index.html index 13105d5a..f31d3e4b 100644 --- a/lessons/str-methods/index.html +++ b/lessons/str-methods/index.html @@ -25,7 +25,9 @@

          Řetězcové funkce a metody Opak x in r 'dub' not in 'čokoláda -

          Řetězce vždy berou v potaz velikost písmen, + + +

          Řetězce vždy berou v potaz velikost písmen, takže např. 'ČOKO' in 'čokoláda' je False. Kdybys chtěl/a porovnávat bez ohledu na velikost písmen, musel/a bys oba řetězce převést třeba na malá písmena @@ -67,20 +69,22 @@

          Řešení

          Způsobů, jak takový program napsat, je více. +Lze například zavolat upper() dvakrát – zvlášť na jméno a zvlášť na příjmení.

          +

          Nebo to jde zapsat i takto – +metoda se dá volat na výsledku jakéhokoli výrazu:

          +
          jmeno = input('Zadej jméno: ')
          +prijmeni = input('Zadej příjmení ')
          +print('Iniciály:', (jmeno[0] + prijmeni[0]).upper())
          +

          Doporučuji spíš první způsob, ten se smysluplnými názvy proměnných. +Je sice delší, ale mnohem přehlednější.

          -

          A další + + +

          A další #

          Řetězcových metod je celá řada. diff --git a/lessons/str/index.html b/lessons/str/index.html index f558caca..d6c03eb3 100644 --- a/lessons/str/index.html +++ b/lessons/str/index.html @@ -48,7 +48,7 @@

          Znaky

          K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. Není mezi nimi rozdíl. Podobně 4.0 a 4.000 jsou dva zápisy téhož čísla, -tak 'slovo' a "slovo" pro Python označuje stejnou +tak 'slovo' a "slovo" pro Python označuje stejnou hodnotu, skládající se ze stejných pěti písmen.

          Použité uvozovky nejsou součástí hodnoty – python si „nepamatuje“, jakým způsobem byl řetězec uvozen. @@ -86,12 +86,12 @@

          Sekvence se zpětným lomítkem #

          Co dělat, když v řetězci potřebuješ oba druhy uvozovek, -jako ve větě Vtom vnuk křik': "Hleď!"?

          +jako ve větě Vtom vnuk křik': "Hleď!"?

          Můžeš si pomoci tím, že spojíš dva řetězce:

          >>> print("Vtom vnuk křik': " + '"Hleď!"')
           Vtom vnuk křik': "Hleď!"
           

          Ale lepší způsob je použít speciální zápis se zpětným lomítkem. -Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou +Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou uvozovku.

          >>> print("Vtom vnuk křik': \"Hleď!\"")
           Vtom vnuk křik': "Hleď!"
          @@ -111,14 +111,16 @@ 

          Řešení

          -

          Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. + + +

          Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. Jedna ze zajímavějších je \t, představující tabulátor – jediný znak, který se, když ho vypíšeš, „roztáhne“ na víc mezer.

          >>> print("a\tb")   # Výpis "pro lidi"
          @@ -155,7 +157,7 @@ 

          Řešení

          nemůžeš použít přímo \. Musíš použít speciální sekvenci \\ – tedy lomítko zdvojit:

          print('C:\\PyLadies\\Nový adresář')
          -

          Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ +

          Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ je zápis pro jedno zpětné lomítko.

          Nový řádek # @@ -204,24 +206,25 @@

          Nový řádek

          Jaká je délka těchto řetězců?

          Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

          print(len('ahoj'))
          -print(len("""Ahoj!"""))
          +print(len("""Ahoj!"""))
           print(len('a b'))
           print(len( ' a b ' ))
           print(len('\N{SNOWMAN}ové'))
           print(len('a\nb'))
           print(len('a\tb'))
          -print(len('"\'"'))
          +print(len('"\'"'))
           
           
          -print(len("""
          -abc"""))
          +print(len("""
          +abc"""))
           
           
           if True:
          -    print(len("""a
          -    b"""))
          +    print(len("""a
          +    b"""))
           
           
           print(len('C:\new_dir'))
           
          -print(len(f'{print}'))
          \ No newline at end of file +print(len(f'{print}')) + \ No newline at end of file diff --git a/lessons/submitting-a-run/index.html b/lessons/submitting-a-run/index.html index e0bd6bde..6d2f18ac 100644 --- a/lessons/submitting-a-run/index.html +++ b/lessons/submitting-a-run/index.html @@ -26,7 +26,9 @@

          Nahrání do vlastního forku Na stránce repozitáře vpravo nahoře na to je tlačítko Fork.

          Tlačítko na vytvoření forku repozitáře -

          Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, + + +

          Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, jestli fork bude pod tvým účtem nebo pod organizací. Děláš-li kurz pro organizaci, použij tu, abyste do materiálů mohli přispívat všichni. @@ -38,7 +40,9 @@

          Nahrání do vlastního forku Vyber „View all branches“ vseznamu větví:

          Odkaz na seznam všech větví -

          A smaž větve začínající compiled.

          + + +

          A smaž větve začínající compiled.

          Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno pod kterým fork je, a nazevrepa za název repozitáře):

          diff --git a/lessons/testing/index.1.html b/lessons/testing/index.1.html index e60305ce..218ae782 100644 --- a/lessons/testing/index.1.html +++ b/lessons/testing/index.1.html @@ -442,14 +442,15 @@

          Varování

          Komprimované citlivé údaje #

          -

          Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle +

          Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní -chování, viz dokumentace). -V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit -hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, +chování, viz dokumentace). +V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit +hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, compress ani deflate:

          -
          betamax_session.headers.update({'Accept-Encoding': 'identity'})

          Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou -nijak transformována, více viz Wikipedia +

          betamax_session.headers.update({'Accept-Encoding': 'identity'})
          +

          Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou +nijak transformována, více viz Wikipedia a specifikace HTTP)

          Které HTTP požadavky jsou stejné? # @@ -506,7 +507,8 @@

          Testování aplikací v clicku appmodule.py tests/ test_app.py - ...

          nebo do něj:

          + ... +

          nebo do něj:

          setup.py
           mypkg/
               __init__.py
          @@ -514,7 +516,8 @@ 

          Testování aplikací v clicku ... test/ test_app.py - ...

          První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. + ... +

          První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný Pythonní modul, ale jen sada souborů s testy.

          Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné @@ -544,7 +547,8 @@

          Spouštění testů pomocí )

          a přidat následující sekci do setup.cfg:

          [aliases]
          -test=pytest

          Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude +test=pytest +

          Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude podporovat další argumenty pytestu (jako -v). Na to uživatel spustí pytest samotný.

          Další informace jsou v dokumentaci pytestu.

          diff --git a/lessons/tuple/index.html b/lessons/tuple/index.html index 9eb9c80e..d929c62e 100644 --- a/lessons/tuple/index.html +++ b/lessons/tuple/index.html @@ -3,7 +3,7 @@

          N-tice

          Když už známe seznam, podívejme se na jeho sestřičku: takzvanou n-tici (angl. tuple).

          -

          N-tice může, podobně jako seznam, obsahovat n prvků. +

          N-tice může, podobně jako seznam, obsahovat n prvků. N-tice se dvěma prvky je dvojice neboli pár (angl. pair); se třemi prvky trojice (angl. 3-tuple), diff --git a/lessons/turtle/index.html b/lessons/turtle/index.html index fc90c873..b56be61a 100644 --- a/lessons/turtle/index.html +++ b/lessons/turtle/index.html @@ -81,7 +81,7 @@

          Čtverec #

          Nakresli čtverec.

          -

          Želví čtverec

          +

          Želví čtverec

          Čtverec má čtyři rovné strany a čtyři rohy po 90°.

          @@ -91,25 +91,27 @@

          Řešení

          -

          Obdélník + + +

          Obdélník #

          Nakresli obdélník.

          Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

          -

          Želví obdélník

          +

          Želví obdélník

          Řešení

          @@ -117,24 +119,26 @@

          Řešení

          -

          Tři čtverce + + +

          Tři čtverce #

          Nakresli tři čtverce, každý otočený třeba o 20°.

          -

          Tři želví čtverce

          +

          Tři želví čtverce

          Řešení

          @@ -142,42 +146,44 @@

          Řešení

          -

          Tolik kódu! Tohle musí jít nějak zjednodušit!

          + + +

          Tolik kódu! Tohle musí jít nějak zjednodušit!

          Jde. Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

          Jak opakovat – a neopakovat se @@ -188,7 +194,7 @@

          Jak opakovat – a neopakovat sePrvní opakovací program, který napíšeš, bude dělat tohle:

          • Stokrát po sobě:
              -
            • Napiš "Nikdy nebudu odsazovat o tři mezery!"
            • +
            • Napiš "Nikdy nebudu odsazovat o tři mezery!"
          @@ -207,7 +213,7 @@

          Výčet

          Zkus napsat ještě jeden vzorový program, který v češtině zní:

            -
          • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
              +
            • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
              • Vypiš pozdrav a za ním vykřičník.
            • @@ -266,24 +272,26 @@

              Řešení

              -

              Funkce range(n) vrací sekvenci čísel. + + +

              Funkce range(n) vrací sekvenci čísel. Začíná od 0 a čísel v ní je přesně n. (Na samotné n se tedy už nedostane.)

              Často budeš potřebovat Pythonu říct, ať něco „n-krát zopakuje“. @@ -326,7 +334,7 @@

              Řešení

              exitonclick()

              Zkus nakreslit dlouhou přerušovanou čáru.

              -

              Želva a přerušovaná čára

              +

              Želva a přerušovaná čára

              Řešení

              @@ -334,19 +342,21 @@

              Řešení

              -

              Pak zkus zařídit, aby jednotlivé čárky byly postupně + + +

              Pak zkus zařídit, aby jednotlivé čárky byly postupně větší a větší.

              -

              Želva a přerušovaná čára

              +

              Želva a přerušovaná čára

              Nápověda

              První čárka je dlouhá 1 jednotku, druhá 2 jednotky, třetí 3, atd.

              Dokonce můžeš na začátek dát prázdnou čárku (0 jednotek) @@ -359,17 +369,19 @@

              Řešení

              -

              Čtverec II + + +

              Čtverec II #

              A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

              @@ -381,7 +393,7 @@

              Řešení

          -

          Želví čtverec

          +

          Želví čtverec

          Řešení

          @@ -389,21 +401,23 @@

          Řešení

          -

          Tři čtverce + + +

          Tři čtverce #

          Nakonec nakresli 3 čtverce, každý otočený o 20°. Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu for, ne kopírováním kódu.

          -

          Tři želví čtverce

          +

          Tři želví čtverce

          • Třikrát:
            • Nakresli čtverec (viz jedna z předchozích úloh)
            • @@ -418,25 +432,27 @@

              Řešení

              -

              Úkol navíc + + +

              Úkol navíc #

              Máš-li hotovo, zkus nakreslit schody:

              -

              Želví schody

              +

              Želví schody

              A máš-li i schody, zkus nakreslit těchto šest (nebo sedm?) šestiúhelníků:

              -

              Želví plástev

              \ No newline at end of file +

              Želví plástev

              \ No newline at end of file diff --git a/lessons/variables/index.html b/lessons/variables/index.html index 67bf65fc..e235c0d3 100644 --- a/lessons/variables/index.html +++ b/lessons/variables/index.html @@ -9,7 +9,8 @@

              Čtverec se stranou 356 cm.

              Po spuštění by se mělo vypsat něco jako:

              Obvod čtverce se stranou 356 cm je 1424 cm
              -Obsah čtverce se stranou 356 cm je 126736 cm2

              Pro připomenutí, obvod čtverce se stranou a +Obsah čtverce se stranou 356 cm je 126736 cm2 +

              Pro připomenutí, obvod čtverce se stranou a se dá vypočítat jako O = 4a a obsah jako S = a².

              Matematika!

              @@ -41,11 +42,13 @@

              Řešení

              -

              Menší čtverec + + +

              Menší čtverec #

              Jestli všechno funguje, zkus změnit program tak, @@ -57,10 +60,12 @@

              Řešení

              -

              Proměnné + + +

              Proměnné #

              Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? @@ -152,7 +157,7 @@

              Řešení

              promenna = float(input('Zadej číslo: '))
               
            -

            Místo textu 'Zadej …' se dá napsat i jiná výzva. +

            Místo textu 'Zadej …' se dá napsat i jiná výzva. A výsledek se samozřejmě dá uložit i do jiné proměnné než promenna.

            Hotový program může vypadat takto:

            # Tento program počítá obvod a obsah čtverce.
            diff --git a/lessons/venv-setup/index.html b/lessons/venv-setup/index.html
            index 151e1443..3f7546b0 100644
            --- a/lessons/venv-setup/index.html
            +++ b/lessons/venv-setup/index.html
            @@ -60,16 +60,16 @@ 

            Přepnutí

            Unix (Linux, macOS)

            $ pwd
             /home/helena/naucse-python
             
            -$ ls
            +

            $ ls 00

            -

            Windows

            > cd
            -C:\Users\Helena\naucse-python
            -
            -> dir
            +

            Windows

            > cd
            +C:\Users\Helena\naucse-python

            +

            > dir Directory of C:\Users\Helena\naucse-python 05/08/2014 07:28 PM <DIR> 00 -

            Virtuální prostředí +

            +

            Virtuální prostředí #

            Teď si vytvoříš virtuální prostředí pro Python.

            @@ -87,24 +87,24 @@

            Windows

            > <
             
            • Linux:

              Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

              -
               $ python3 -m venv venv
              +příkazů.
              +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
              +takže nejdřív zkus:

              +
              $ python3 -m venv venv
               

              A jestli dostaneš chybu No module named venv, zkus místo toho:

              -
               $ virtualenv -p python3 venv
              +
              $ virtualenv -p python3 venv
               
            • macOS:

              -
               $ python3 -m venv venv
              +
              $ python3 -m venv venv
               
            • Windows:

              Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

              -
               > py -3 -m venv venv
              +příkazů.
              +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
              +takže nejdřív zkus:

              +
              > py -3 -m venv venv
               

              A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

              -
               > python3 -m venv venv
              +
              > python3 -m venv venv
               

            Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. @@ -119,7 +119,9 @@

            Windows

            > <
              Directory of C:\Users\Helena\naucse-python
             05/08/2014 07:28 PM <DIR>  00
             05/08/2014 07:38 PM <DIR>  venv
            -

            V grafickém prohlížeči souborů to vypadá např. takto:

            + + +

            V grafickém prohlížeči souborů to vypadá např. takto:

            (adresáře '00' a 'venv' vedle sebe)

            Aktivace virtuálního prostředí # @@ -133,7 +135,9 @@

            Windows

            > <
             je příkaz pro Windows složitější:

            > &powershell -ExecutionPolicy bypass
             > venv/Scripts/Activate.ps1
            -

            Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky + + +

            Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

            Aktivační příkaz si zapiš.

            diff --git a/lessons/while/index.html b/lessons/while/index.html index 37dce985..5f0615db 100644 --- a/lessons/while/index.html +++ b/lessons/while/index.html @@ -77,26 +77,26 @@

            Řešení

            \ No newline at end of file diff --git a/lessons/zip-enumerate/index.html b/lessons/zip-enumerate/index.html index e102c6ce..d6dc42d1 100644 --- a/lessons/zip-enumerate/index.html +++ b/lessons/zip-enumerate/index.html @@ -96,26 +96,29 @@

            Rozbalování v cyklu for 4. Čt 5. Pá 6. So -7. Ne
            +7. Ne +

            Řešení

            To je trošku kostrbaté, ale dá se to zjednodušit: buď jako +f'{index + 1}. {den}', nebo můžeš funkci enumerate předat +pojmenovaný argument start, pomocí kterého umí sama +počítat od jiného začátku než od nuly:

            +
            dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']
            +for index, den in enumerate(dny, start=1):
            +    print(f'{index}. {den}')
            +
            -

            Zip: Víc iterací najednou + + +

            Zip: Víc iterací najednou #

            Další iterátor n-tic je funkce zip, která umí projít dvě sekvence @@ -165,7 +168,9 @@

            Řešení

            -

            Občas je potřeba projít všechny záznamy. + + +

            Občas je potřeba projít všechny záznamy. Na to slouží funkce zip_longest z modulu itertools:

            from itertools import zip_longest
             for vec, barva in zip_longest(veci, barvy, fillvalue='(nevím)'):
            diff --git a/meta/branching/index.html b/meta/branching/index.html
            index 15403799..5943df35 100644
            --- a/meta/branching/index.html
            +++ b/meta/branching/index.html
            @@ -24,7 +24,8 @@ 

            Větvení v Gitu

            Podívej se, jaké máš větve ve svém repozitáři. K tomu slouží příkaz git branch:

            $ git branch
            -* master

            Je tam jenom jedna a jmenuje se master +* master +

            Je tam jenom jedna a jmenuje se master – to je tradičně jméno „hlavní” větve.

            K vytvoření nové větve znovu použiješ git branch, jen tomu příkazu dáš navíc @@ -34,7 +35,8 @@

            Větvení v Gitu
            $ git branch doplneni-autora
             $ git branch
               doplneni-autora
            -* master

            Tenhle příkaz sice udělal novou větev, +* master +

            Tenhle příkaz sice udělal novou větev, ale nepřepnul do ní. Hvězdička ve výstupu z git branch ukazuje, že stále pracuješ v master. @@ -43,7 +45,8 @@

            Větvení v Gitu Switched to branch 'doplneni-autora' $ git branch * doplneni-autora - master

            Tak. Teď jsi „ve” větvi doplneni-autora. + master +

            Tak. Teď jsi „ve” větvi doplneni-autora. Doplň nějaké jméno na začátek souboru basnicka.txt, a pomocí git add a git commit udělej novou revizi. Pak koukni na gitk --all, jak to vypadá:

            @@ -63,7 +66,8 @@

            Větvení v Gitu $ git branch doplneni-autora * doplneni-jmena - master

            Doplň jméno básně na začátek souboru (tedy na stejné místo, + master +

            Doplň jméno básně na začátek souboru (tedy na stejné místo, jako je v druhé větvi název) a pomocí git add, git commit ulož revizi. Všechno zkontroluj přes gitk --all.

            @@ -98,7 +102,8 @@

            Sloučení Updating 1fcd654..5c9bf93 Fast-forward basnicka.txt | 3 +++ - 1 file changed, 3 insertions(+)

            Sloučeno! Ono „Fast-forward” znamená, že + 1 file changed, 3 insertions(+) +

            Sloučeno! Ono „Fast-forward” znamená, že vlastně nebylo co slučovat – jen se do větve master přidaly nové změny. Zkontroluj v gitk --all, jak to vypadá.

            @@ -109,7 +114,8 @@

            Sloučení
            $ git merge doplneni-autora
             Auto-merging basnicka.txt
             CONFLICT (content): Merge conflict in basnicka.txt
            -Automatic merge failed; fix conflicts and then commit the result.

            A když ne?

            +Automatic merge failed; fix conflicts and then commit the result. +

            A když ne?

            Jestli se konflikt neobjevil, Git změny sloučil sám. Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti někdy „podaří“ konflikt udělat.

            @@ -123,9 +129,10 @@

            Sloučení Unmerged paths: (use "git add <file>..." to mark resolution) - both modified: basnicka.txt + both modified: basnicka.txt -no changes added to commit (use "git add" and/or "git commit -a")

            V tom případě se na soubor podívej v editoru: objeví +no changes added to commit (use "git add" and/or "git commit -a") +

            V tom případě se na soubor podívej v editoru: objeví se v něm obsah z obou konfliktních verzí, společně se značkami <<<<<<<, ======= a >>>>>>>, které upozorňují na místo kde konflikt nastal.

            @@ -143,7 +150,8 @@

            Sloučení ++>>>>>>> doplneni-autora Holka modrooká - Nesedávej u potoka

            Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu + Nesedávej u potoka +

            Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu jako Python chybové hlášky: tedy aby ti co nejvíce pomohl. Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se ti řešení konfliktu co nejvíc usnadnit.

            @@ -157,7 +165,8 @@

            Sloučení Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.

            $ git add basnicka.txt
             $ git commit
            -[master 884b30a] Merge branch 'doplneni-autora'

            Povedlo se?

            +[master 884b30a] Merge branch 'doplneni-autora' +

            Povedlo se?

            Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master

            Pokud ano, můžeš staré větve vymazat – všechny jejich změny jsou v master a nemá na nich cenu @@ -167,4 +176,5 @@

            Sloučení $ git branch --delete doplneni-jmena Deleted branch doplneni-jmena (was 5c9bf93). $ git branch -* master

            Gratuluji, už umíš větvení a slučování!

            \ No newline at end of file +* master +

            Gratuluji, už umíš větvení a slučování!

            \ No newline at end of file diff --git a/meta/cmdline/index.html b/meta/cmdline/index.html index 6454ba49..fcc6b4bf 100644 --- a/meta/cmdline/index.html +++ b/meta/cmdline/index.html @@ -40,12 +40,15 @@

            Příkazová řádka

            Unix (Linux, macOS)

            $
             

            Windows

            >
            -

            Podle systému se potom liší i samotné příkazy, které budeš zadávat: + + +

            Podle systému se potom liší i samotné příkazy, které budeš zadávat: Unixové systémy (Linux a macOS) rozumí jiným příkazům než Windows.

            Velikost písma

            Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. -V záložce Písmo si pak můžeš vybrat větší font. -

            +V záložce Písmo si pak můžeš vybrat větší font.

            + +

            Screenshot menu příkazové řádky

            Na ostatních systémech hledej v nastavení, nebo zkus Ctrl++ a @@ -63,7 +66,9 @@

            Unix

            $ 
             

            Windows

            > whoami
             pocitac\Helena
            -

            Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš +

            + +

            Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš příkaz do příkazové řádky. Vypíše ho počítač, většinou ještě s něčím před ním, takže ho nepiš sám/sama! Zadej jen whoami a Enter.

            @@ -83,7 +88,9 @@

            Unix

            $ 
             

            Windows

            > cd
             C:\Users\helena
            -

            Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem + + +

            Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem $ nebo >. Ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a. Občas totiž bývá vypsaný zkráceně. @@ -114,7 +121,9 @@

            Windows

            > <
             05/08/2014 07:28 PM <DIR>  Downloads
             05/08/2014 07:28 PM <DIR>  Music
             
            -

            Změna aktuálního adresáře + + +

            Změna aktuálního adresáře #

            Aktuální adresář se dá změnit pomocí příkazu cd @@ -134,7 +143,9 @@

            Unix

            $ 
                             

            Windows

            > cd Desktop
             > cd
             C:\Users\helena\Desktop
            -

            Poznámka pro Windows

            +
            + +

            Poznámka pro Windows

            Pokud přecházíš do adresáře na jiném disku, například D: místo C:, je potřeba kromě cd zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

            @@ -149,7 +160,9 @@

            Windows

            > <
                             

            Unix

            $ mkdir zkouska
             

            Windows

            > mkdir zkouska
            -

            Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. + + +

            Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

            Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

            @@ -157,7 +170,9 @@

            Windows

            > <
                             

            Unix

            $ cd zkouska
             

            Windows

            > cd zkouska
            -

            V grafickém hledátku + + +

            V grafickém hledátku #

            Často nebudeš pracovat jenom s příkazovou řádkou. @@ -178,7 +193,9 @@

            macOS

            Windows

            Screenshot průzkumníka na Windows -

            Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je + + +

            Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je aktivní v příkazové řádce. V budoucnu to ale bude složitější, takže bude dobré si vyzkoušet kopírovat text z příkazové řádky a vložit ho do prohlížeče souborů.

            @@ -194,7 +211,9 @@

            Unix

            $ 
             

            Windows

            > cd
             C:\Users\helena\Desktop\zkouska
            -

            Kopírování z příkazové řádky + + +

            Kopírování z příkazové řádky #

            Na Linuxu vyber text myší a pak buď:

            @@ -237,9 +256,9 @@

            Vkládání do příkazové řádky
          • macOS: ⌘ Command+V
          • Windows: Menu EditPaste
          -

          Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, +

          Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš -", např:

          +", např:

          $ cd "můj super adresář"
           

          Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

          Pozorování změn @@ -274,7 +293,9 @@

          Unix

          $ 
                           

          Windows

          > cd ..
           > cd
           C:\Users\helena\Desktop
          -

          Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem + + +

          Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

          Konec # @@ -332,5 +353,7 @@

          Přehled ukončení exit -

          Další příkazy jako python nebo git si vysvětlíme až budou potřeba, + + +

          Další příkazy jako python nebo git si vysvětlíme až budou potřeba, po tom, co si je nainstaluješ.

          \ No newline at end of file diff --git a/meta/course.json b/meta/course.json index e63d89ad..46356413 100644 --- a/meta/course.json +++ b/meta/course.json @@ -25,7 +25,7 @@ "index": { "attribution": [ "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", - "Založeno na tutoriálu Django Girls." + "Založeno na tutoriálu [Django Girls].\n[Django Girls]: https://tutorial.djangogirls.org/en/intro_to_command_line/" ], "content": { "path": "cmdline/index.html" diff --git a/meta/git-collaboration-2in1/index.html b/meta/git-collaboration-2in1/index.html index 6830dfc9..746e95f7 100644 --- a/meta/git-collaboration-2in1/index.html +++ b/meta/git-collaboration-2in1/index.html @@ -4,13 +4,13 @@

          Spolupráce a Git

          „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat stejné části (soubory) programu?

          -

          Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +

          Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

          -

          Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. -Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +

          Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

          -

          Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +

          Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

          Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

          @@ -23,34 +23,34 @@

          Git a GitHub Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

          A co víc – Git vám dovoluje sdílet kód s ostatními programátory. Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. -S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře -a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

          -

          Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. -Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. -Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +

          Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). Zkuste se po nich podívat, ušetříte práci sobě i autorům.

          -

          Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +

          Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn (místo posílání mailů stačí zmáčknout tlačítko).

          Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

          -

          Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +

          Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, kam správce projektu dává aktuální „oficiální verzi”. Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv (nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). A třetí kopii repozitáře máte u sebe na počítači.

          -

          Git workflow

          +

          Git workflow

          Práce s lokálním repozitářem #

          Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. -Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

          1. Git bude sledovat změny, které ve složce uděláme.
          2. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
          3. -
          4. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
          5. +
          6. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.

          Pozor

          Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. @@ -75,7 +75,7 @@

          Stav repozitáře (git status<

          První revize (git commit) #

          -

          Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +

          Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

          Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt @@ -102,7 +102,7 @@

          První revize (git commit) new file: magdalena_rettigova.txt

          To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

          $ git commit
          -

          Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +

          Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). @@ -113,7 +113,7 @@

          První revize (git commit) (use "git push" to publish your local commits) nothing to commit, working tree clean

          Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

          -

          Git workflow

          +

          Git workflow

          Log (git log) #

          @@ -146,7 +146,7 @@

          Open-source a Free software 50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

          -

          Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +

          Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval Richard Stallman GNU Manifesto, kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. To prosazuje 4 následujících svobody (převzato z Wikipedie):

          @@ -156,17 +156,17 @@

          Open-source a Free software
        4. svoboda redistribuovat kopie programu,
        5. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
        -

        Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +

        Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

        Pozor

        Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

        Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – -protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. A bohužel, ne všechny projekty mají přátelské autory.

        -

        Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +

        Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, ale každý může i zkontrolovat, jestli dělají to, co dělat mají. -Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), -ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní a lidé časem začnou používat opravenou verzi.

        Některé příklady populárních open-source projektů:

          @@ -179,12 +179,12 @@

          Open-source a Free software
        • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
        • Materiály k tomuto kurzu
        -

        A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +

        A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: všechno know-how je sdílené a budeme rádi, když se zapojíte.

        Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

        Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. -Licence projektu většinou najdete v souboru LICENCE. +Licence projektu většinou najdete v souboru LICENCE. Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

        Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

        Spolupráce na projektu @@ -194,16 +194,16 @@

        Spolupráce na projektu

        Posílání změn (git push) #

        -

        Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +

        Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, vizte obrázek na začátku.

        Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, -kterou jste použili pro git clone. +kterou jste použili pro git clone. Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

        -

        A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, -odkud se dají stahovat a kam se dají posílat změny. +

        A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

        $ git remote -v
         origin  https://github.com/asgeirrr/prezencka (fetch)
        @@ -226,10 +226,10 @@ 

        Posílání změn (git push

        Žádost o začlenění (pull request) #

        -

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +

        Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

        Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) -by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

        Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. (Diskutovat se dá na stránce pull requestu nebo přes mail.)

        @@ -243,7 +243,7 @@

        Žádost o začlenění (pull request)
        $ git pull origin master
         

        stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

        -

        Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +

        Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

        Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, ale nechme si to na pokračovací srazy nebo workshop.

        \ No newline at end of file diff --git a/meta/install/linux.html b/meta/install/linux.html index c7bc0189..846f26d4 100644 --- a/meta/install/linux.html +++ b/meta/install/linux.html @@ -21,9 +21,13 @@

        Instalace Pythonu 3 Konkrétní příkaz záleží na distribuci:

        • Fedora:
          $ sudo dnf install python3
          -
        • +

        + +
      1. Ubuntu:
        $ sudo apt-get install python3
        -
      2. + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    @@ -41,9 +45,13 @@

    Kontrola Tkinter

    Jestli ne, modul tkinter ještě nainstaluj:

    • Fedora:
      $ sudo dnf install python3-tkinter
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      -
    • + + +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    @@ -64,7 +72,9 @@

    Doinstalování Virtualenv
    • Ubuntu:
      $ sudo apt-get install python3-virtualenv
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později diff --git a/meta/install/windows.html b/meta/install/windows.html index 99135c9e..59729749 100644 --- a/meta/install/windows.html +++ b/meta/install/windows.html @@ -9,20 +9,22 @@

    Zjisti, jestli už máš Pyth Teď se může stát několik různých věcí:

    1. Otevře se ti Microsoft Store → okno zavři a pokračuj v kroku Stažení
    2. -
    3. Zobrazí se ti text podobný tomuto níže?
      > python
      +
    4. Zobrazí se ti text podobný tomuto níže?
    5. +
    +
    > python
     Python 3.8.1 (...)
    -Type "help", "copyright", "credits" or "license" for more information.
    ->>>
    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou +Type "help", "copyright", "credits" or "license" for more information. +>>> +

    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou (např.Python 3.11.2 je 3.11, Python 3.8.1 je 3.8 atd.). -Třetí číslo za tečkou není tady podstatné.

      +Třetí číslo za tečkou není tady podstatné.

      +
      • Je verze 3.6 nebo novější? Výborně, máš instalaci hotovou! Okénko s příkazovou řádkou můžeš zavřít. Až ho budeš znovu potřebovat, můžeš otevřít nové. Pokračuj dále Nastavením prostředí. V opačném případě přejdi na Stažení
      - -

      Stažení # diff --git a/meta/local-run/index.html b/meta/local-run/index.html index 46cf8971..ae0c7ea4 100644 --- a/meta/local-run/index.html +++ b/meta/local-run/index.html @@ -68,13 +68,13 @@

      lessons/: Texty lekcí Každá lekce má vlastní adresář se dvěma soubory:

      • info.yml obsahuje metadata, například:

        -
          title: Vytvoření lokálního kurzu
        -  style: md
        -  attribution:
        -  - Napsal Mikuláš Poul, 2018
        -  - Napsal Petr Viktorin, 2022
        -  license: cc-by-sa-40
        -  license_code: cc0
        +
        title: Vytvoření lokálního kurzu
        +style: md
        +attribution:
        +- Napsal Mikuláš Poul, 2018
        +- Napsal Petr Viktorin, 2022
        +license: cc-by-sa-40
        +license_code: cc0
         
        • title je titulek stránky, který se objeví v obsahu.
        • style je typ obsahu: md pro Markdown nebo ipynb pro @@ -128,7 +128,7 @@

          .gith

          Tenhle soubor obsahuje instrukce pro GitHub Actions pomocí kterých se kurz publikuje. Obsahuje kromě instalace a cache tři hlavní kroky:

            -
          • "kompilaci" kurzu do HTML a JSON souborů v adresáři _compiled,
          • +
          • "kompilaci" kurzu do HTML a JSON souborů v adresáři _compiled,
          • přidání adresáře _compiled do Gitu (pomocí nástroje ghp_import),
          • notifikaci hooks.nauc.se,naucse.python.cz, aby se nová verze kurzu nasadila.
          @@ -241,43 +241,41 @@

          Definice lekce tedy jméno podsložky ve složce lessons. Identifikátor materiálu je <název kategorie>/<název materiálu z kategorie>. Takže například materiál `beginners/install by se zadal takto:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - lesson: beginners/install
          +
          sessions:
          +- slug: first-lesson
          +  title: Název první lekce
          +  date: 2018-03-07
          +  materials:
          +  - lesson: beginners/install
           

        • -
        -
        • Externí odkazy se definují pomocí klíčů url a title. Do url patří kompletní odkaz na materiál, do title patří název odkazu. Příklad použítí:

          -
            sessions:
          -  - slug: first-lesson
          -    title: Název první lekce
          -    date: 2018-03-07
          -    materials:
          -    - title: Úvodní prezentace
          -      url: https://example.com/uvod.pdf
          -    - title: Tahák na příkazovou řádku
          -      url: https://example.com/tahak.pdf
          -      type: cheatsheet
          -    - title: Domácí projekty (PDF)
          -      url: https://example.com/ukol.pdf
          -      type: homework
          +
          sessions:
          +- slug: first-lesson
          +  title: Název první lekce
          +  date: 2018-03-07
          +  materials:
          +  - title: Úvodní prezentace
          +    url: https://example.com/uvod.pdf
          +  - title: Tahák na příkazovou řádku
          +    url: https://example.com/tahak.pdf
          +    type: cheatsheet
          +  - title: Domácí projekty (PDF)
          +    url: https://example.com/ukol.pdf
          +    type: homework
           
        • Materiály bez odkazu se definují stejně jako externí odkazy, jen se do klíče url dá hodnota null. Například:

          -
            sessions:
          -  - slug: last-lesson
          -    title: Název lekce
          -    date: 2019-03-07
          -    materials:
          -    - title: Přehlídka závěrečných projektů
          -      url: null
          -    - title: Předání diplomů
          -      url: null
          +
          sessions:
          +- slug: last-lesson
          +  title: Název lekce
          +  date: 2019-03-07
          +  materials:
          +  - title: Přehlídka závěrečných projektů
          +    url: null
          +  - title: Předání diplomů
          +    url: null
           

        U všech druhú materiálú lze nastavit typ, který určuje ikonku která se použije v seznamu materiálů vedle názvu.

        diff --git a/meta/notebook/index.html b/meta/notebook/index.html index 7a0b01d4..35ec0474 100644 --- a/meta/notebook/index.html +++ b/meta/notebook/index.html @@ -2,7 +2,7 @@

        Jupyter Notebook -# +#

        Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

        Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -17,97 +17,70 @@

        Jupyter Notebook
        $ python -m notebook
         

        V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

        Jak na Notebook -# +#

        Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

        Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

        Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

        str.l<TAB>
         ! ls -a<SHIFT+ENTER>
        -str.lower?<SHIFT+ENTER>

        Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

        +str.lower?<SHIFT+ENTER> +

        Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

        -
        In [2]:
        +
        In [2]:
        -
        -
        1+1  # Nevypíše se (není poslední příkaz)
        +
        +
        1+1  # Nevypíše se (není poslední příkaz)
         2+2  # Vypíše se
         
        - -
        - +
        - -
        - -
        Out[2]:
        - - - - +
        Out[2]:
        4
        -
        -
        -
        -
        In [3]:
        +
        In [3]:
        -
        -
        seznam = [5, 6, 3, 2]
        +
        +
        seznam = [5, 6, 3, 2]
         print(seznam)  # print() funguje
         seznam.sort()
         seznam         # Poslední výraz se vypíše
         
        - -
        - +
        - -
        - -
        - - +
        [5, 6, 3, 2]
         
        -
        - -
        Out[3]:
        - - - - +
        Out[3]:
        [2, 3, 5, 6]
        -
        -
        -
        @@ -116,5 +89,3 @@

        Jak na Notebook

        - - diff --git a/meta/submitting-a-run/index.html b/meta/submitting-a-run/index.html index e0bd6bde..6d2f18ac 100644 --- a/meta/submitting-a-run/index.html +++ b/meta/submitting-a-run/index.html @@ -26,7 +26,9 @@

        Nahrání do vlastního forku Na stránce repozitáře vpravo nahoře na to je tlačítko Fork.

        Tlačítko na vytvoření forku repozitáře -

        Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, +

        + +

        Jsi-li na GitHubu v nějaké organizaci (např. PyLadiesCZ), můžeš vybrat, jestli fork bude pod tvým účtem nebo pod organizací. Děláš-li kurz pro organizaci, použij tu, abyste do materiálů mohli přispívat všichni. @@ -38,7 +40,9 @@

        Nahrání do vlastního forku Vyber „View all branches“ vseznamu větví:

        Odkaz na seznam všech větví -

        A smaž větve začínající compiled.

        + + +

        A smaž větve začínající compiled.

        Tvůj fork si teď potřebuješ přidat do lokálního repozitáře jako referenci, abys tam pak mohl/a poslat svůj kurz. To uděláš pomocí příkazu (nahraď obě uzivatelskejmeno za uživatelské jméno pod kterým fork je, a nazevrepa za název repozitáře):

        diff --git a/meta/venv-setup/index.html b/meta/venv-setup/index.html index 151e1443..3f7546b0 100644 --- a/meta/venv-setup/index.html +++ b/meta/venv-setup/index.html @@ -60,16 +60,16 @@

        Přepnutí

        Unix (Linux, macOS)

        $ pwd
         /home/helena/naucse-python
         
        -$ ls
        +

        $ ls 00

        -

        Windows

        > cd
        -C:\Users\Helena\naucse-python
        -
        -> dir
        +

        Windows

        > cd
        +C:\Users\Helena\naucse-python

        +

        > dir Directory of C:\Users\Helena\naucse-python 05/08/2014 07:28 PM <DIR> 00 -

        Virtuální prostředí +

        +

        Virtuální prostředí #

        Teď si vytvoříš virtuální prostředí pro Python.

        @@ -87,24 +87,24 @@

        Windows

        > <
         
        • Linux:

          Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

          -
           $ python3 -m venv venv
          +příkazů.
          +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
          +takže nejdřív zkus:

          +
          $ python3 -m venv venv
           

          A jestli dostaneš chybu No module named venv, zkus místo toho:

          -
           $ virtualenv -p python3 venv
          +
          $ virtualenv -p python3 venv
           
        • macOS:

          -
           $ python3 -m venv venv
          +
          $ python3 -m venv venv
           
        • Windows:

          Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

          -
           > py -3 -m venv venv
          +příkazů.
          +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
          +takže nejdřív zkus:

          +
          > py -3 -m venv venv
           

          A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

          -
           > python3 -m venv venv
          +
          > python3 -m venv venv
           

        Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. @@ -119,7 +119,9 @@

        Windows

        > <
          Directory of C:\Users\Helena\naucse-python
         05/08/2014 07:28 PM <DIR>  00
         05/08/2014 07:38 PM <DIR>  venv
        -

        V grafickém prohlížeči souborů to vypadá např. takto:

        + + +

        V grafickém prohlížeči souborů to vypadá např. takto:

        (adresáře '00' a 'venv' vedle sebe)

        Aktivace virtuálního prostředí # @@ -133,7 +135,9 @@

        Windows

        > <
         je příkaz pro Windows složitější:

        > &powershell -ExecutionPolicy bypass
         > venv/Scripts/Activate.ps1
        -

        Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky + + +

        Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

        Aktivační příkaz si zapiš.

        diff --git a/mi-pyt/async/index.html b/mi-pyt/async/index.html index ce80a4f3..bc539019 100644 --- a/mi-pyt/async/index.html +++ b/mi-pyt/async/index.html @@ -6,10 +6,10 @@

        Nejde-li to, nevadí – nezbytné dnes PyQt nebude.

        Navíc si nainstalujte knihovnu aiohttp:

        $ python -m pip install aiohttp
        -

        +

        V minulosti byly na této stránce popsány i generátory. Neovládáte-li je ještě, přečtěte si o nich.

        -

        +

        AsyncIO #

        @@ -74,7 +74,7 @@

        Souběžnost v Pythonu

        Jeden standard #

        -

        xkcd 927

        +

        xkcd 927

        Komiks xkcd, © Randall Munroe, CC-BY-NC

        Podobně jako přístup k různým SQL databázím je v Pythonu standardizovaný (knihovny pro SQLite, Postgres, MySQL atd. všechny podporují API definované diff --git a/mi-pyt/click/index.html b/mi-pyt/click/index.html index 2106c538..fea9b096 100644 --- a/mi-pyt/click/index.html +++ b/mi-pyt/click/index.html @@ -145,20 +145,20 @@

        Argumenty for file in files: print(file.read(), end='')

        Existuje i varianta click.Path(), -která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto +která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře. Click takto poskytuje i jiné další typy.

        Validace vstupů #

        -

        Vstupy získané z přepínačů i argumentů lze ověřit pomocí +

        Vstupy získané z přepínačů i argumentů lze ověřit pomocí vlastních podmínek a podle toho naprogramovat chování včetně -chybových hlášek. Click však opět nabízí pohodlnější způsob, +chybových hlášek. Click však opět nabízí pohodlnější způsob, a to pomocí callback. V rámci callback funkce můžete ověřit libovolně hodnotu a/nebo -ji vhodně transformovat. Pokud hodnota neodpovídá požadavkům, +ji vhodně transformovat. Pokud hodnota neodpovídá požadavkům, můžete použít vyjímku click.UsageError nebo click.BadParameter -(vztahuje-li se přímo ke konkrétnímu parametru). Click se pak +(vztahuje-li se přímo ke konkrétnímu parametru). Click se pak sám postará o případné ukončení programu s odpovídající chybovou hláškou a kódem.

        def validate_username(ctx, param, value):
        diff --git a/mi-pyt/cmdline/index.html b/mi-pyt/cmdline/index.html
        index 6454ba49..fcc6b4bf 100644
        --- a/mi-pyt/cmdline/index.html
        +++ b/mi-pyt/cmdline/index.html
        @@ -40,12 +40,15 @@ 

        Příkazová řádka

        Unix (Linux, macOS)

        $
         

        Windows

        >
        -

        Podle systému se potom liší i samotné příkazy, které budeš zadávat: + + +

        Podle systému se potom liší i samotné příkazy, které budeš zadávat: Unixové systémy (Linux a macOS) rozumí jiným příkazům než Windows.

        Velikost písma

        Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. -V záložce Písmo si pak můžeš vybrat větší font. -

        +V záložce Písmo si pak můžeš vybrat větší font.

        + +

        Screenshot menu příkazové řádky

        Na ostatních systémech hledej v nastavení, nebo zkus Ctrl++ a @@ -63,7 +66,9 @@

        Unix

        $ 
         

        Windows

        > whoami
         pocitac\Helena
        -

        Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš +

        + +

        Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš příkaz do příkazové řádky. Vypíše ho počítač, většinou ještě s něčím před ním, takže ho nepiš sám/sama! Zadej jen whoami a Enter.

        @@ -83,7 +88,9 @@

        Unix

        $ 
         

        Windows

        > cd
         C:\Users\helena
        -

        Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem + + +

        Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem $ nebo >. Ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a. Občas totiž bývá vypsaný zkráceně. @@ -114,7 +121,9 @@

        Windows

        > <
         05/08/2014 07:28 PM <DIR>  Downloads
         05/08/2014 07:28 PM <DIR>  Music
         
        -

        Změna aktuálního adresáře + + +

        Změna aktuálního adresáře #

        Aktuální adresář se dá změnit pomocí příkazu cd @@ -134,7 +143,9 @@

        Unix

        $ 
                         

        Windows

        > cd Desktop
         > cd
         C:\Users\helena\Desktop
        -

        Poznámka pro Windows

        +
        + +

        Poznámka pro Windows

        Pokud přecházíš do adresáře na jiném disku, například D: místo C:, je potřeba kromě cd zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

        @@ -149,7 +160,9 @@

        Windows

        > <
                         

        Unix

        $ mkdir zkouska
         

        Windows

        > mkdir zkouska
        -

        Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. + + +

        Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

        Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

        @@ -157,7 +170,9 @@

        Windows

        > <
                         

        Unix

        $ cd zkouska
         

        Windows

        > cd zkouska
        -

        V grafickém hledátku + + +

        V grafickém hledátku #

        Často nebudeš pracovat jenom s příkazovou řádkou. @@ -178,7 +193,9 @@

        macOS

        Windows

        Screenshot průzkumníka na Windows -

        Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je + + +

        Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je aktivní v příkazové řádce. V budoucnu to ale bude složitější, takže bude dobré si vyzkoušet kopírovat text z příkazové řádky a vložit ho do prohlížeče souborů.

        @@ -194,7 +211,9 @@

        Unix

        $ 
         

        Windows

        > cd
         C:\Users\helena\Desktop\zkouska
        -

        Kopírování z příkazové řádky + + +

        Kopírování z příkazové řádky #

        Na Linuxu vyber text myší a pak buď:

        @@ -237,9 +256,9 @@

        Vkládání do příkazové řádky
      • macOS: ⌘ Command+V
      • Windows: Menu EditPaste
      -

      Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, +

      Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš -", např:

      +", např:

      $ cd "můj super adresář"
       

      Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

      Pozorování změn @@ -274,7 +293,9 @@

      Unix

      $ 
                       

      Windows

      > cd ..
       > cd
       C:\Users\helena\Desktop
      -

      Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem + + +

      Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

      Konec # @@ -332,5 +353,7 @@

      Přehled ukončení exit -

      Další příkazy jako python nebo git si vysvětlíme až budou potřeba, + + +

      Další příkazy jako python nebo git si vysvětlíme až budou potřeba, po tom, co si je nainstaluješ.

      \ No newline at end of file diff --git a/mi-pyt/course.json b/mi-pyt/course.json index 23baa627..ffb82472 100644 --- a/mi-pyt/course.json +++ b/mi-pyt/course.json @@ -63,7 +63,7 @@ "index": { "attribution": [ "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.", - "Založeno na tutoriálu Django Girls." + "Založeno na tutoriálu [Django Girls].\n[Django Girls]: https://tutorial.djangogirls.org/en/intro_to_command_line/" ], "content": { "path": "cmdline/index.html" diff --git a/mi-pyt/cython/index.html b/mi-pyt/cython/index.html index 3b1f7797..7c92d0c0 100644 --- a/mi-pyt/cython/index.html +++ b/mi-pyt/cython/index.html @@ -9,7 +9,7 @@
    • Na Windows se řiďte instrukcemi pro vaši verzi Pythonu na Python wiki.
    -
    +

    C API #

    @@ -198,7 +198,7 @@

    PyObject

    Podívejme se teď na základní mechanismy interpretu CPython.

    Základní datová struktura, která reprezentuje jakýkoli objekt Pythonu, je PyObject -(dokumentace, +(dokumentace, definice). Skládá se ze dvou prvků:

    typedef struct _object {
    @@ -490,13 +490,9 @@ 

    Používání NumPy způsoby: dekorátorem:

    @cython.boundscheck(False)
     cpdef funkce():
    -    ...
    -
    -

    ... nebo příkazem with:

    + ...

    ... nebo příkazem with:

    with cython.boundscheck(False):
    -    ...
    -
    -

    ... případně i pro celý soubor, viz dokumentace.

    + ...

    ... případně i pro celý soubor, viz dokumentace.

    Další zajímavá direktiva je cython.wraparound(False), která podobným způsobem vypíná pythonní způsob indexování zápornými čísly: místo indexování od konce s ní dostaneme nedefinované chování.

    diff --git a/mi-pyt/deployment/pythonanywhere.html b/mi-pyt/deployment/pythonanywhere.html index 5644dd1a..4cbc292c 100644 --- a/mi-pyt/deployment/pythonanywhere.html +++ b/mi-pyt/deployment/pythonanywhere.html @@ -7,7 +7,7 @@

    Deployment webových apl

    Potom se zaregistrujte na www.pythonanywhere.com a vyberte Beginner Account. -Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. +Po přihlášení se ukáže záložka Consoles, kde vytvořte "Bash" konzoli. V té vytvořte a aktivujte virtuální prostředí a nainstalujte Flask (plus případně další závislosti nebo jiný webový framework).

    PythonAnywhere používá specificky nastavený Linux, @@ -29,7 +29,7 @@

    Deployment webových apl
    $ ssh-keygen  # (zeptá se na hesla ke klíči)
     $ cat ~/.ssh/id_rsa.pub
     

    Obsah souboru ~/.ssh/id_rsa.pub je pak potřeba přidat na GitHub v osobním -nastavení v sekci "SSH and GPG Keys". +nastavení v sekci "SSH and GPG Keys". Pak můžete klonovat přes SSH:

    $ git clone git@github.com:<github-username>/<github-repo>.git
     

    Zbývá nastavit, aby PythonAnywhere tento kód spustil jako webovou aplikaci.

    @@ -39,7 +39,7 @@

    Deployment webových apl (Volby jiné než Manual Configuration automaticky vytvoří kostru aplikace. Vy ale už aplikaci máte hotovou, takže je nepotřebujete.)

    V konfiguraci vzniklé webové aplikace je potřeba nastavit Virtualenv -na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/__venv__), +na cestu k virtuálnímu prostředí (/home/<uživatelské-jméno>/venv), a obsah WSGI Configuration File přepsat. To jde buď kliknutím na odkaz v konfiguraci (otevře se webový editor) nebo zpět v bashové konzoli pomocí editoru jako vi nebo nano.

    diff --git a/mi-pyt/distribution/index.html b/mi-pyt/distribution/index.html index 3ecbfc69..3ef4ada4 100644 --- a/mi-pyt/distribution/index.html +++ b/mi-pyt/distribution/index.html @@ -87,7 +87,8 @@

    setup.py do kterého se tradičně píšou základní informace o projektu. Můžeme jej vytvořit a uložit jako README přímo v kořenovém adresáři projektu, tedy tam, kde byste jej nejspíš čekali.

    -
    Czech public holiday checker...

    Poté spustíme setup.py sdist znovu:

    +
    Czech public holiday checker...
    +

    Poté spustíme setup.py sdist znovu:

    (__venv__)$ python setup.py sdist
     

    V adresáři dist najdete archiv, jeho obsah můžete zkontrolovat. Měl by tam být i soubor README.

    @@ -98,7 +99,8 @@

    setup.py nebude. Je to proto, že se standardně do archivu přidávají jen některé soubory. Další soubory lze přidat pomocí souboru MANIFEST.in, dle dokumentace.

    V našem případě bude MANIFEST.in vypadat takto:

    -
    include LICENSE

    Při dalším spuštění už setup.py přidá i soubor LICENSE. +

    include LICENSE
    +

    Při dalším spuštění už setup.py přidá i soubor LICENSE. To můžete zkontrolovat i ve výsledném archivu.

    (__venv__)$ python setup.py sdist
     ...
    @@ -306,7 +308,8 @@ 

    Programy pro příkazovou řádku tranzitivních – t.j. závisí-li náš balíček na Flask a Flask na Jinja2, najdeme v requirements.txt mimo jiné například řádky:

    Flask==0.11.1
    -Jinja2==2.8

    Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde +Jinja2==2.8 +

    Tento soubor se používá, když je potřeba přesně replikovat prostředí, kde program běží, například mezi testovacím strojem a produkčním nasazením webové aplikace. Tento soubor se dá vygenerovat z aktuálního prostředí zadáním diff --git a/mi-pyt/docs/index.html b/mi-pyt/docs/index.html index c64dc311..a45c1172 100644 --- a/mi-pyt/docs/index.html +++ b/mi-pyt/docs/index.html @@ -39,7 +39,8 @@

    Sphinx ... -Finished: An initial directory structure has been created.

    Průvodce vytvoří ve složce docs několik souborů:

    +Finished: An initial directory structure has been created. +

    Průvodce vytvoří ve složce docs několik souborů:

    • conf.py – konfigurační soubor,
    • index.rst – vlastní text dokumantace,
    • @@ -110,7 +111,8 @@

      Textový obsah v dokumentaci K čemu dokumentace vlastně je?

      Dobrá dokumentace vysvětluje, proč a jak by váš projekt měl někdo používat. Jak říká Eric Holscher v jedné své prezentaci,

      -

      Když lidi neví, že váš projekt existuje,
      +

      +

      Když lidi neví, že váš projekt existuje,
      nebudou ho používat.
      Když lidi nepřijdou na to, jak váš projekt nainstalovat,
      nebudou ho používat.
      @@ -335,7 +337,8 @@

      Kompletní příklad

      Projekt pak lze nainstalovat pomocí .[dev] (tedy jméno balíčku a za ním jméno extras v hranatých závorkách):

      install:
      -- python -m pip install .[dev]

      autodoc +- python -m pip install .[dev] +

      autodoc #

      Pro dokumentaci API lze použít sphinx.ext.autodoc, další rozšíření Sphinxu, diff --git a/mi-pyt/flask/index.html b/mi-pyt/flask/index.html index 75905d00..1c37ba22 100644 --- a/mi-pyt/flask/index.html +++ b/mi-pyt/flask/index.html @@ -175,7 +175,7 @@

      Šablony pro většinu stránek se obejdete s doplněním hodnoty ({{ promenna }}) a podmíněným obsahem ({% if %}) jako výše, případně s cyklem: {% for %}/{% endfor %}. Ve větších -aplikacích se pak hodí použití {% include ... %}, {% extends ... %} +aplikacích se pak hodí použití {% include ... %}, {% extends ... %} a případně také tvorba maker {% macro ... %}/{% endmacro %}.

      Veškerý kontext (proměnné) do šablony musí přijít z volání render_template(). Navíc můžete použít vybrané funkce, např. url_for(). @@ -214,7 +214,7 @@

      Escaping mají v HTML speciální význam. Zabraňuje se tak bezpečnostním rizikům, kdy se vstup od uživatele interpretuje jako HTML.

      -

      Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, +

      Například když v aplikaci výše navštívíme URL /hello/<script>alert("Foo")/, bude výsledné HTML vypadat takto:

      <!doctype html>
       <title>Hello from Flask</title>
      @@ -252,17 +252,17 @@ 

      Statické soubory

      Logování #

      -

      Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím +

      Při vytváření webové aplikace chcete často komunikovat nejen prostřednictvím HTTP odpovědí na dotazy (ať už ve formě webové stránky, JSON odpovědi či jiného formatu), ale také vypisovat různé chybové, informační či ladící hlášky na -straně serveru. Možností je použít například funkci print, ale ta není -dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní -s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování -logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření +straně serveru. Možností je použít například funkci print, ale ta není +dostatečně flexibilní. Brzy narazíte na problémy, jako že výstup není konzistentní +s jinými hláškami z Flasku, že pro různé typy výpisů, časová razítka, přesměrování +logu do souboru a další potřebujete vytvářet spoustu logiky kolem namísto vytváření samotné webové aplikace.

      -

      Řešením je použít standardní logovací modul logging, který řeší vše potřebné +

      Řešením je použít standardní logovací modul logging, který řeší vše potřebné (úrovně zpráv, filtry, formátování časového razítka a dalších meta-informací o -běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci +běhu programu) a výstup bude konzistentní s jinými aplikacemi (jiní správci vaší webové aplikace pak nebudou z formátu výstupů zmatení). Protože používáme Flask a ten také loguje tímto modulem, stačí použít předpřipravený app.logger.

      @@ -275,30 +275,30 @@

      Statické soubory def index(): app.logger.warning('Someone is accessing the index page!') return 'Index Page' -

      Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, +

      Ve výchozím nastavení se loguje pouze od úrovně upozornění výše (warning, error, critical). Při spuštění aplikace v ladícím režimu se loguje vše (navíc i debug a info). Aktuální úroveň je možné také změnit pomocí metody setLevel, viz dokumentace modulu logging.

      Větší Flask aplikace #

      -

      Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze -použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet +

      Flask je sice označován jako mikroframework, to ale neznamená, že jej nelze +použít na větší a složitější webové aplikace. Pokud chcete vytvářet vytvářet aplikaci s databází a ORM modely, je nutné propojit Flask s dalšími knihovnami -(například flask-sqlalchemy, +(například flask-sqlalchemy, nebo flask-pymongo).

      Jiné frameworky postavené nad Model-View-Controller paradigmatem mají tyto vlastnosti již zabudovány v sobě (například Django).

      -

      Následující sekce popisují některé zajímavé techniky, které se mohou u větších +

      Následující sekce popisují některé zajímavé techniky, které se mohou u větších a složitějších aplikací hodit.

      create_app factory #

      Mimo vytváření Flask aplikace přímo v modulu, je možné aplikaci tvořit pomocí -funkce, tzv. application_factory, -standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se +funkce, tzv. application_factory, +standardně pojmenované create_app. Takový přístup má výhodu, že aplikace se neinicializuje hned při importu modulu, ale až při zavolání funkce. Voláním funkce -můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu +můžete navíc předat i konfigurační parametry (typicky cesta ke konfiguračnímu souboru). Díky tomu lze snadněji vytvářet Flask aplikace s různými konfiguracemi pro testování nebo dokonce vytvářet více Flask aplikací v rámci jednoho Python skriptu.

      def create_app(config=None):
      @@ -313,11 +313,11 @@ 

      create_app factory #

      Ve velkých webových aplikacích je již vhodné seskupovat jednotlivé pohledy do -samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky +samostatných celků. K tomuto účelu slouží ve Flasku blueprinty (hezky česky „modrotisk” nebo také „modrák”). Výhodou je, že můžete vytvořit blueprint (instanci -třídy Blueprint) s několika views, vlastní templates složkou a dalším -nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový +třídy Blueprint) s několika views, vlastní templates složkou a dalším +nastavením nezávisle na tom, v jaké Flask aplikaci pak bude použitý. Takový blueprint pak můžete využívat i v několika různých aplikacích a snadno tak dosáhnout znovupouželnosti.

      from flask import Blueprint
      @@ -336,7 +336,7 @@ 

      create_app factory def user_link(username): ...

      Blueprint pak stačí ve Flask aplikaci registrovat -a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo +a je jedno, zda ji vytváříte pomocí create_app nebo napřímo. Navíc můžete mimo jiné přidat i prefix pro všechny cesty v blueprintu.

      from flask import Flask
       from auth.views import auth
      @@ -349,8 +349,8 @@ 

      create_app factory

      Vlastní podtřída Flask #

      -

      Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat -výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které +

      Třída Flask je uzpůsobena k tomu, aby bylo možné snadno rozšiřovat a přepisovat +výchozí chování. Mimo přidávání vlastních metod lze například měnit třídy, které budou použity pro HTTP požadavky a odpovědi, měnit výchozí konfiguraci flask a spoustu dalšího. Nezapomeňte volat konstruktor nadtřídy.

      from flask import current_app, Flask, Response
      @@ -390,6 +390,6 @@ 

      create_app factory

      Flask umí i další věci – například zpracování formulářů, chybové stránky nebo přesměrování. Také existuje i řada rozšíření, které mohou ušetřit práci s běžnými úkony jako například správa uživatelů, - tvorba REST API nebo integrace s různými službami.

      +tvorba REST API nebo integrace s různými službami.

      Všechno to najdete v dokumentaci.

      \ No newline at end of file diff --git a/mi-pyt/generators/index.html b/mi-pyt/generators/index.html index 13adebe9..b1fd83e2 100644 --- a/mi-pyt/generators/index.html +++ b/mi-pyt/generators/index.html @@ -250,4 +250,5 @@

      Vracení hodnot z generátorů Got 3 Got 5 Got 8 -LOG: Generated 6 numbers

      Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

      \ No newline at end of file +LOG: Generated 6 numbers +

      Kromě toho yield from deleguje hodnoty poslané pomocí send() či throw().

      \ No newline at end of file diff --git a/mi-pyt/git-collaboration-2in1/index.html b/mi-pyt/git-collaboration-2in1/index.html index 6830dfc9..746e95f7 100644 --- a/mi-pyt/git-collaboration-2in1/index.html +++ b/mi-pyt/git-collaboration-2in1/index.html @@ -4,13 +4,13 @@

      Spolupráce a Git

      „Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat stejné části (soubory) programu?

      -

      Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. +

      Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

      -

      Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. -Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. +

      Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. +Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

      -

      Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. +

      Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

      Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

      @@ -23,34 +23,34 @@

      Git a GitHub Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

      A co víc – Git vám dovoluje sdílet kód s ostatními programátory. Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. -S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře -a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). +S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře +a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

      -

      Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. -Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. -Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. +

      Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. +Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. +Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). Zkuste se po nich podívat, ušetříte práci sobě i autorům.

      -

      Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn +

      Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn (místo posílání mailů stačí zmáčknout tlačítko).

      Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

      -

      Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, +

      Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, kam správce projektu dává aktuální „oficiální verzi”. Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv (nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). A třetí kopii repozitáře máte u sebe na počítači.

      -

      Git workflow

      +

      Git workflow

      Práce s lokálním repozitářem #

      Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. -Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, +Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

      1. Git bude sledovat změny, které ve složce uděláme.
      2. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
      3. -
      4. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.
      5. +
      6. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.

      Pozor

      Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. @@ -75,7 +75,7 @@

      Stav repozitáře (git status<

      První revize (git commit) #

      -

      Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? +

      Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

      Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt @@ -102,7 +102,7 @@

      První revize (git commit) new file: magdalena_rettigova.txt

      To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

      $ git commit
      -

      Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, +

      Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). @@ -113,7 +113,7 @@

      První revize (git commit) (use "git push" to publish your local commits) nothing to commit, working tree clean

      Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

      -

      Git workflow

      +

      Git workflow

      Log (git log) #

      @@ -146,7 +146,7 @@

      Open-source a Free software 50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

      -

      Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval +

      Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval Richard Stallman GNU Manifesto, kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. To prosazuje 4 následujících svobody (převzato z Wikipedie):

      @@ -156,17 +156,17 @@

      Open-source a Free software
    • svoboda redistribuovat kopie programu,
    • svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
    • -

      Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. +

      Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

      Pozor

      Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

      Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – -protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. +protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. A bohužel, ne všechny projekty mají přátelské autory.

      -

      Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, +

      Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, ale každý může i zkontrolovat, jestli dělají to, co dělat mají. -Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), -ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní +Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), +ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní a lidé časem začnou používat opravenou verzi.

      Některé příklady populárních open-source projektů:

        @@ -179,12 +179,12 @@

        Open-source a Free software
      • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
      • Materiály k tomuto kurzu
      -

      A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: +

      A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: všechno know-how je sdílené a budeme rádi, když se zapojíte.

      Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

      Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. -Licence projektu většinou najdete v souboru LICENCE. +Licence projektu většinou najdete v souboru LICENCE. Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

      Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

      Spolupráce na projektu @@ -194,16 +194,16 @@

      Spolupráce na projektu

      Posílání změn (git push) #

      -

      Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu +

      Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, vizte obrázek na začátku.

      Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, -kterou jste použili pro git clone. +kterou jste použili pro git clone. Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

      -

      A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, -odkud se dají stahovat a kam se dají posílat změny. +

      A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, +odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

      $ git remote -v
       origin  https://github.com/asgeirrr/prezencka (fetch)
      @@ -226,10 +226,10 @@ 

      Posílání změn (git push

      Žádost o začlenění (pull request) #

      -

      Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. +

      Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

      Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) -by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. +by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

      Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. (Diskutovat se dá na stránce pull requestu nebo přes mail.)

      @@ -243,7 +243,7 @@

      Žádost o začlenění (pull request)
      $ git pull origin master
       

      stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

      -

      Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. +

      Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

      Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, ale nechme si to na pokračovací srazy nebo workshop.

      \ No newline at end of file diff --git a/mi-pyt/http/index.html b/mi-pyt/http/index.html index 98df17b0..92a6e05b 100644 --- a/mi-pyt/http/index.html +++ b/mi-pyt/http/index.html @@ -33,7 +33,8 @@

      Webové adresy

      Jak taková komunikace vypadá si ukážeme na příkladu – co se stane, když do prohlížeče zadám tuhle adresu:

      -
      http://naucse.python.cz/lessons/fast-track/http/

      Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, +

      http://naucse.python.cz/lessons/fast-track/http/
      +

      Taková webová adresa – technicky zvaná URL (Uniform Resource Locator, „jednotná adresa zdroje“) přesně určuje, jak se má prohlížeč dostat k informacím, které má zobrazit.

      http://naucse.python.cz/lessons/fast-track/http/

      diff --git a/mi-pyt/install/linux.html b/mi-pyt/install/linux.html index c7bc0189..846f26d4 100644 --- a/mi-pyt/install/linux.html +++ b/mi-pyt/install/linux.html @@ -21,9 +21,13 @@

      Instalace Pythonu 3 Konkrétní příkaz záleží na distribuci:

      • Fedora:
        $ sudo dnf install python3
        -
      • +

      + +
    • Ubuntu:
      $ sudo apt-get install python3
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    @@ -41,9 +45,13 @@

    Kontrola Tkinter

    Jestli ne, modul tkinter ještě nainstaluj:

    • Fedora:
      $ sudo dnf install python3-tkinter
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      -
    • + + +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    @@ -64,7 +72,9 @@

    Doinstalování Virtualenv
    • Ubuntu:
      $ sudo apt-get install python3-virtualenv
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později diff --git a/mi-pyt/install/windows.html b/mi-pyt/install/windows.html index 99135c9e..59729749 100644 --- a/mi-pyt/install/windows.html +++ b/mi-pyt/install/windows.html @@ -9,20 +9,22 @@

    Zjisti, jestli už máš Pyth Teď se může stát několik různých věcí:

    1. Otevře se ti Microsoft Store → okno zavři a pokračuj v kroku Stažení
    2. -
    3. Zobrazí se ti text podobný tomuto níže?
      > python
      +
    4. Zobrazí se ti text podobný tomuto níže?
    5. +
    +
    > python
     Python 3.8.1 (...)
    -Type "help", "copyright", "credits" or "license" for more information.
    ->>>
    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou +Type "help", "copyright", "credits" or "license" for more information. +>>> +

    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou (např.Python 3.11.2 je 3.11, Python 3.8.1 je 3.8 atd.). -Třetí číslo za tečkou není tady podstatné.

      +Třetí číslo za tečkou není tady podstatné.

      +
      • Je verze 3.6 nebo novější? Výborně, máš instalaci hotovou! Okénko s příkazovou řádkou můžeš zavřít. Až ho budeš znovu potřebovat, můžeš otevřít nové. Pokračuj dále Nastavením prostředí. V opačném případě přejdi na Stažení
      - -

      Stažení # diff --git a/mi-pyt/magic/index.html b/mi-pyt/magic/index.html index 34222ed6..a34320c1 100644 --- a/mi-pyt/magic/index.html +++ b/mi-pyt/magic/index.html @@ -230,7 +230,8 @@

      Deskriptory

    To je trochu zjednodušený, ale užitečný model.

    Speciální metody, které se nevolají pomocí tečky, přeskakují první krok: metoda __add__ tedy musí být definována na třídě, aby se zavolala pro a + b.

    -

    (Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

    +
    +

    (Poznámka navíc pro ty, kdo čtou tento text podruhé: na metatřídě se atribut nehledá; např. existuje-li type.mro, najde se str.mro, ale už ne "".mro)

    Podívejme se teď na získávání atributu trošku podrobněji. Je to poměrně komplikovaný proces a existuje několik způsobů, jak ho přizpůsobit. Nejjednodušší je dvojice speciálních metod:

      @@ -253,7 +254,7 @@

      Deskriptory palette = Palette() print(palette.dark_red) -

      (Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

      +

      (Předpokládám že znáte funkci getattr; kdyby ne: getattr(foo, "bar") dělá totéž co foo.bar – jen je jméno atributu předáno jako řetězec, takže může být např. v proměnné. Podobně existují setattr(instance, attr_name, new_value) a delattr(instance, attr_name).)

      Metoda __getattr__ je většinou tak trochu kanón na vrabce: ve většině případů nepotřebujeme nastavit chování všech neexistujících atributů, ale jenom jednoho nebo několika konkrétních. Například máme třídu pro 2D bod s atributy x a y a potřebujeme i atribut pro dvojici (x, y). Toto se často dělá pomocí dekorátoru property:

      @@ -585,7 +586,8 @@

      A další ... # Třeba v jiném modulu -print(ANSWER)

      Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy +print(ANSWER) +

      Tímto způsobem se dají i předefinovat vestavěné funkce, což může být někdy užitečné pro ladění. V produkčním kódu to ale, prosím, nedělejte.

      Úkol # diff --git a/mi-pyt/notebook/index.html b/mi-pyt/notebook/index.html index 7a0b01d4..35ec0474 100644 --- a/mi-pyt/notebook/index.html +++ b/mi-pyt/notebook/index.html @@ -2,7 +2,7 @@

      Jupyter Notebook -# +#

      Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

      Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). @@ -17,97 +17,70 @@

      Jupyter Notebook
      $ python -m notebook
       

      V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

      Jak na Notebook -# +#

      Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

      Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

      Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

      str.l<TAB>
       ! ls -a<SHIFT+ENTER>
      -str.lower?<SHIFT+ENTER>

      Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

      +str.lower?<SHIFT+ENTER> +

      Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

      -
      In [2]:
      +
      In [2]:
      -
      -
      1+1  # Nevypíše se (není poslední příkaz)
      +
      +
      1+1  # Nevypíše se (není poslední příkaz)
       2+2  # Vypíše se
       
      - -
      - +
      - -
      - -
      Out[2]:
      - - - - +
      Out[2]:
      4
      -
      -
      -
      -
      In [3]:
      +
      In [3]:
      -
      -
      seznam = [5, 6, 3, 2]
      +
      +
      seznam = [5, 6, 3, 2]
       print(seznam)  # print() funguje
       seznam.sort()
       seznam         # Poslední výraz se vypíše
       
      - -
      - +
      - -
      - -
      - - +
      [5, 6, 3, 2]
       
      -
      - -
      Out[3]:
      - - - - +
      Out[3]:
      [2, 3, 5, 6]
      -
      -
      -
      @@ -116,5 +89,3 @@

      Jak na Notebook

      - - diff --git a/mi-pyt/numpy/index.html b/mi-pyt/numpy/index.html index 46cd5a2b..34bf4508 100644 --- a/mi-pyt/numpy/index.html +++ b/mi-pyt/numpy/index.html @@ -24,7 +24,7 @@
      -
      +
      @@ -32,7 +32,7 @@

      NumPy -# +#

      @@ -44,7 +44,7 @@

      NumPy

      Téměř všechny knihovny, kde se objevují větší matice či tabulky, jsou buď postavené na NumPy, nebo podporují numpy.array: od pandas pro datovou analýzu a matplotlib pro grafy, přes scipy, kde najdete základní algoritmy pro interpolaci, integraci aj., astrofyzikální astropy, librosa pro analýzu hudby, až po integraci v knihovnách jako Pillow nebo Tensorflow.

      Podobně jako „Djangonauti” kolem webového frameworku Django tvoří vědci a datoví analytici podskupinu pythonní komunity s vlastními konferencemi (PyData), organizacemi (NumFocus, Continuum Analytics) a knihovnami jako NumPy, Pandas, SciPy, Matplotlib či Astropy. Potřeby této komunity se samozřejmě odrážejí i v Pythonu samotném (např. ... a @, které si ukážeme dále, byly do jazyka přidány pro ulehčení výpočtů) a naopak (na rozdíl od specializovaných jazyků jako R nebo Matlab se tu stále indexuje od nuly). Většina těchto knihoven ale má jednu zvláštnost, kterou ve zbytku pythonního světa tolik nevidíme: důraz na použití v interaktivním režimu.

      Nejednoznačnost a zkratky -# +#

      Čísla můžeme buď prozkoumávat, hrát si s nimi, zjišťovat zajímavé souvislosti; anebo můžeme připravovat programy, které nějaké výpočty provedou automaticky. Na obojí se používají podobné nástroje. @@ -62,40 +62,28 @@

      Nejednoznačnost a zkratky
      -
      In [1]:
      +
      In [1]:
      -
      -
      import numpy
      +
      +
      import numpy
       array = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
       array
       
      - -
      - +
      - -
      - -
      Out[1]:
      - - - - +
      Out[1]:
      array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
      -
      -
      -
      @@ -106,69 +94,45 @@

      Nejednoznačnost a zkratky

      -
      In [2]:
      +
      In [2]:
      -
      -
      array.shape
      +
      +
      array.shape
       
      - -
      - +
      - -
      - -
      Out[2]:
      - - - - +
      Out[2]:
      (3, 3)
      -
      -
      -
      -
      In [3]:
      +
      In [3]:
      -
      -
      array.dtype
      +
      +
      array.dtype
       
      - -
      - +
      - -
      - -
      Out[3]:
      - - - - +
      Out[3]:
      -
      dtype('int64')
      +
      dtype('int64')
      -
      -
      -
      @@ -180,40 +144,27 @@

      Nejednoznačnost a zkratky

      -
      In [4]:
      +
      In [4]:
      -
      -
      cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
      +
      +
      cube = numpy.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
       print(cube.shape)
       cube
       
      - -
      - +
      - -
      - -
      - - +
      (2, 2, 2)
       
      -
      - -
      Out[4]:
      - - - - +
      Out[4]:
      array([[[1, 2],
               [3, 4]],
      @@ -221,18 +172,15 @@ 

      Nejednoznačnost a zkratky [[5, 6], [7, 8]]])

      -
      -
      -

      Základní operace -# +#

      @@ -246,143 +194,95 @@

      Základní operace

      -
      In [5]:
      +
      In [5]:
      -
      -
      array
      +
      +
      array
       
      - -
      - +
      - -
      - -
      Out[5]:
      - - - - +
      Out[5]:
      array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
      -
      -
      -
      -
      In [6]:
      +
      In [6]:
      -
      -
      array - 1
      +
      +
      array - 1
       
      - -
      - +
      - -
      - -
      Out[6]:
      - - - - +
      Out[6]:
      array([[0, 1, 2],
              [3, 4, 5],
              [6, 7, 8]])
      -
      -
      -
      -
      In [7]:
      +
      In [7]:
      -
      -
      array / 2
      +
      +
      array / 2
       
      - -
      - +
      - -
      - -
      Out[7]:
      - - - - +
      Out[7]:
      array([[0.5, 1. , 1.5],
              [2. , 2.5, 3. ],
              [3.5, 4. , 4.5]])
      -
      -
      -
      -
      In [8]:
      +
      In [8]:
      -
      -
      -(array % 4)
      +
      +
      -(array % 4)
       
      - -
      - +
      - -
      - -
      Out[8]:
      - - - - +
      Out[8]:
      array([[-1, -2, -3],
              [ 0, -1, -2],
              [-3,  0, -1]])
      -
      -
      -
      @@ -393,38 +293,26 @@

      Základní operace

      -
      In [9]:
      +
      In [9]:
      -
      -
      array > 5
      +
      +
      array > 5
       
      - -
      - +
      - -
      - -
      Out[9]:
      - - - - +
      Out[9]:
      array([[False, False, False],
              [False, False,  True],
              [ True,  True,  True]])
      -
      -
      -
      @@ -435,38 +323,26 @@

      Základní operace

      -
      In [10]:
      +
      In [10]:
      -
      -
      (array > 3) & (array < 7)
      +
      +
      (array > 3) & (array < 7)
       
      - -
      - +
      - -
      - -
      Out[10]:
      - - - - +
      Out[10]:
      array([[False, False, False],
              [ True,  True,  True],
              [False, False, False]])
      -
      -
      -
      @@ -477,73 +353,49 @@

      Základní operace

      -
      In [11]:
      +
      In [11]:
      -
      -
      array + array
      +
      +
      array + array
       
      - -
      - +
      - -
      - -
      Out[11]:
      - - - - +
      Out[11]:
      array([[ 2,  4,  6],
              [ 8, 10, 12],
              [14, 16, 18]])
      -
      -
      -
      -
      In [12]:
      +
      In [12]:
      -
      -
      array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
      +
      +
      array * numpy.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
       
      - -
      - +
      - -
      - -
      Out[12]:
      - - - - +
      Out[12]:
      array([[0, 2, 0],
              [4, 0, 6],
              [0, 8, 0]])
      -
      -
      -
      @@ -554,44 +406,32 @@

      Základní operace

      -
      In [13]:
      +
      In [13]:
      -
      -
      array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
      +
      +
      array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
       
      - -
      - +
      - -
      - -
      Out[13]:
      - - - - +
      Out[13]:
      array([[0, 2, 0],
              [4, 0, 6],
              [0, 8, 0]])
      -
      -
      -

      Indexování -# +#

      @@ -605,138 +445,90 @@

      Indexování

      -
      In [14]:
      +
      In [14]:
      -
      -
      array
      +
      +
      array
       
      - -
      - +
      - -
      - -
      Out[14]:
      - - - - +
      Out[14]:
      array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
      -
      -
      -
      -
      In [15]:
      +
      In [15]:
      -
      -
      array[0]
      +
      +
      array[0]
       
      - -
      - +
      - -
      - -
      Out[15]:
      - - - - +
      Out[15]:
      array([1, 2, 3])
      -
      -
      -
      -
      In [16]:
      +
      In [16]:
      -
      -
      array[0:-1]
      +
      +
      array[0:-1]
       
      - -
      - +
      - -
      - -
      Out[16]:
      - - - - +
      Out[16]:
      array([[1, 2, 3],
              [4, 5, 6]])
      -
      -
      -
      -
      In [17]:
      +
      In [17]:
      -
      -
      array[0][1]
      +
      +
      array[0][1]
       
      - -
      - +
      - -
      - -
      Out[17]:
      - - - - +
      Out[17]:
      2
      -
      -
      -
      @@ -747,70 +539,46 @@

      Indexování

      -
      In [18]:
      +
      In [18]:
      -
      -
      array[0, 1]
      +
      +
      array[0, 1]
       
      - -
      - +
      - -
      - -
      Out[18]:
      - - - - +
      Out[18]:
      2
      -
      -
      -
      -
      In [19]:
      +
      In [19]:
      -
      -
      array[0:-1, 1:]
      +
      +
      array[0:-1, 1:]
       
      - -
      - +
      - -
      - -
      Out[19]:
      - - - - +
      Out[19]:
      array([[2, 3],
              [5, 6]])
      -
      -
      -
      @@ -821,36 +589,24 @@

      Indexování

      -
      In [20]:
      +
      In [20]:
      -
      -
      array[:, 2]
      +
      +
      array[:, 2]
       
      - -
      - +
      - -
      - -
      Out[20]:
      - - - - +
      Out[20]:
      array([3, 6, 9])
      -
      -
      -
      @@ -862,38 +618,26 @@

      Indexování

      -
      In [21]:
      +
      In [21]:
      -
      -
      array > 4
      +
      +
      array > 4
       
      - -
      - +
      - -
      - -
      Out[21]:
      - - - - +
      Out[21]:
      array([[False, False, False],
              [False,  True,  True],
              [ True,  True,  True]])
      -
      -
      -
      @@ -904,36 +648,24 @@

      Indexování

      -
      In [22]:
      +
      In [22]:
      -
      -
      array[array > 4]
      +
      +
      array[array > 4]
       
      - -
      - +
      - -
      - -
      Out[22]:
      - - - - +
      Out[22]:
      array([5, 6, 7, 8, 9])
      -
      -
      -
      @@ -951,74 +683,50 @@

      Indexování

      -
      In [23]:
      +
      In [23]:
      -
      -
      array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
      +
      +
      array[[0, 2, 1, 1]]  # Řádky 0, 2, 1 a 1
       
      - -
      - +
      - -
      - -
      Out[23]:
      - - - - +
      Out[23]:
      array([[1, 2, 3],
              [7, 8, 9],
              [4, 5, 6],
              [4, 5, 6]])
      -
      -
      -
      -
      In [24]:
      +
      In [24]:
      -
      -
      array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
      +
      +
      array[:, [2, 2, 0, 0]]  # Podobně pro sloupce
       
      - -
      - +
      - -
      - -
      Out[24]:
      - - - - +
      Out[24]:
      array([[3, 3, 1, 1],
              [6, 6, 4, 4],
              [9, 9, 7, 7]])
      -
      -
      -
      @@ -1029,36 +737,24 @@

      Indexování

      -
      In [25]:
      +
      In [25]:
      -
      -
      array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
      +
      +
      array[(0, 1, 2), (1, 2, 0)]  # Vybere prvky (0, 1), (1, 2), (2, 0)
       
      - -
      - +
      - -
      - -
      Out[25]:
      - - - - +
      Out[25]:
      array([2, 6, 7])
      -
      -
      -
      @@ -1069,27 +765,18 @@

      Indexování

      -
      In [26]:
      +
      In [26]:
      -
      -
      cube
      +
      +
      cube
       
      - -
      - +
      - -
      - -
      Out[26]:
      - - - - +
      Out[26]:
      array([[[1, 2],
               [3, 4]],
      @@ -1097,114 +784,75 @@ 

      Indexování [[5, 6], [7, 8]]])

      -
      -
      -
      -
      In [27]:
      +
      In [27]:
      -
      -
      cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
      +
      +
      cube[0, :, :]  # První „vrstva“ - to samé jako cube[0]
       
      - -
      - +
      - -
      - -
      Out[27]:
      - - - - +
      Out[27]:
      array([[1, 2],
              [3, 4]])
      -
      -
      -
      -
      In [28]:
      +
      In [28]:
      -
      -
      cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
      +
      +
      cube[:, 0, :]  # První řádky - to samé jako cube[:, 0]
       
      - -
      - +
      - -
      - -
      Out[28]:
      - - - - +
      Out[28]:
      array([[1, 2],
              [5, 6]])
      -
      -
      -
      -
      In [29]:
      +
      In [29]:
      -
      -
      cube[:, :, 0]  # První sloupce
      +
      +
      cube[:, :, 0]  # První sloupce
       
      - -
      - +
      - -
      - -
      Out[29]:
      - - - - +
      Out[29]:
      array([[1, 3],
              [5, 7]])
      -
      -
      -
      @@ -1215,43 +863,31 @@

      Indexování

      -
      In [30]:
      +
      In [30]:
      -
      -
      cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
      +
      +
      cube[..., 0]  # První sloupce – ekvivalent [:, :, 0]
       
      - -
      - +
      - -
      - -
      Out[30]:
      - - - - +
      Out[30]:
      array([[1, 3],
              [5, 7]])
      -
      -
      -

      Broadcasting a změny -# +#

      @@ -1265,108 +901,72 @@

      Broadcasting a změny

      -
      In [31]:
      +
      In [31]:
      -
      -
      array
      +
      +
      array
       
      - -
      - +
      - -
      - -
      Out[31]:
      - - - - +
      Out[31]:
      array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
      -
      -
      -
      -
      In [32]:
      +
      In [32]:
      -
      -
      array * 3
      +
      +
      array * 3
       
      - -
      - +
      - -
      - -
      Out[32]:
      - - - - +
      Out[32]:
      array([[ 3,  6,  9],
              [12, 15, 18],
              [21, 24, 27]])
      -
      -
      -
      -
      In [33]:
      +
      In [33]:
      -
      -
      array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
      +
      +
      array * [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
       
      - -
      - +
      - -
      - -
      Out[33]:
      - - - - +
      Out[33]:
      array([[0, 2, 0],
              [4, 0, 6],
              [0, 8, 0]])
      -
      -
      -
      @@ -1378,73 +978,49 @@

      Broadcasting a změny

      -
      In [34]:
      +
      In [34]:
      -
      -
      array
      +
      +
      array
       
      - -
      - +
      - -
      - -
      Out[34]:
      - - - - +
      Out[34]:
      array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
      -
      -
      -
      -
      In [35]:
      +
      In [35]:
      -
      -
      array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
      +
      +
      array * [0, 1, 10]   # vynásobí 1. sloupec nulou, 2. jedničkou, 3. deseti
       
      - -
      - +
      - -
      - -
      Out[35]:
      - - - - +
      Out[35]:
      array([[ 0,  2, 30],
              [ 0,  5, 60],
              [ 0,  8, 90]])
      -
      -
      -
      @@ -1455,38 +1031,26 @@

      Broadcasting a změny

      -
      In [36]:
      +
      In [36]:
      -
      -
      array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
      +
      +
      array * [[0], [1], [10]]  # vynásobí 1. *řádek* nulou, atd.
       
      - -
      - +
      - -
      - -
      Out[36]:
      - - - - +
      Out[36]:
      array([[ 0,  0,  0],
              [ 4,  5,  6],
              [70, 80, 90]])
      -
      -
      -
      @@ -1497,39 +1061,27 @@

      Broadcasting a změny

      -
      In [37]:
      +
      In [37]:
      -
      -
      array[0, 0] = 123
      +
      +
      array[0, 0] = 123
       array
       
      - -
      - +
      - -
      - -
      Out[37]:
      - - - - +
      Out[37]:
      array([[123,   2,   3],
              [  4,   5,   6],
              [  7,   8,   9]])
      -
      -
      -
      @@ -1540,75 +1092,51 @@

      Broadcasting a změny

      -
      In [38]:
      +
      In [38]:
      -
      -
      array[0] = 123
      +
      +
      array[0] = 123
       array
       
      - -
      - +
      - -
      - -
      Out[38]:
      - - - - +
      Out[38]:
      array([[123, 123, 123],
              [  4,   5,   6],
              [  7,   8,   9]])
      -
      -
      -
      -
      In [39]:
      +
      In [39]:
      -
      -
      array[:] = 123
      +
      +
      array[:] = 123
       array
       
      - -
      - -
      -
      - - -
      - -
      Out[39]:
      - - - - +
      +
      +
      +
      +
      Out[39]:
      array([[123, 123, 123],
              [123, 123, 123],
              [123, 123, 123]])
      -
      -
      -
      @@ -1619,39 +1147,27 @@

      Broadcasting a změny

      -
      In [40]:
      +
      In [40]:
      -
      -
      array[(1, 2, 0), (0, 2, 1)] = 0
      +
      +
      array[(1, 2, 0), (0, 2, 1)] = 0
       array
       
      - -
      - +
      - -
      - -
      Out[40]:
      - - - - +
      Out[40]:
      array([[123,   0, 123],
              [  0, 123, 123],
              [123, 123,   0]])
      -
      -
      -
      @@ -1662,39 +1178,27 @@

      Broadcasting a změny

      -
      In [41]:
      +
      In [41]:
      -
      -
      array *= 2
      +
      +
      array *= 2
       array
       
      - -
      - +
      - -
      - -
      Out[41]:
      - - - - +
      Out[41]:
      array([[246,   0, 246],
              [  0, 246, 246],
              [246, 246,   0]])
      -
      -
      -
      @@ -1713,43 +1217,34 @@

      Broadcasting a změny

      -
      In [42]:
      +
      In [42]:
      -
      -
      try:
      +
      +
      try:
           array /= 2
       except Exception as e:
           print("Chyba!!", type(e), e)
       
      - -
      - +
      - -
      - -
      - - +
      -
      Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
      +
      Chyba!! <class 'TypeError'> No loop matching the specified signature and casting was found for ufunc true_divide
       
      -
      -

      Tvoření matic, část 2 -# +#

      @@ -1763,183 +1258,123 @@

      Tvoření matic, část 2

      -
      In [43]:
      +
      In [43]:
      -
      -
      numpy.zeros((4, 4))
      +
      +
      numpy.zeros((4, 4))
       
      - -
      - +
      - -
      - -
      Out[43]:
      - - - - +
      Out[43]:
      array([[0., 0., 0., 0.],
              [0., 0., 0., 0.],
              [0., 0., 0., 0.],
              [0., 0., 0., 0.]])
      -
      -
      -
      -
      In [44]:
      +
      In [44]:
      -
      -
      numpy.ones((4, 4))
      +
      +
      numpy.ones((4, 4))
       
      - -
      - +
      - -
      - -
      Out[44]:
      - - - - +
      Out[44]:
      array([[1., 1., 1., 1.],
              [1., 1., 1., 1.],
              [1., 1., 1., 1.],
              [1., 1., 1., 1.]])
      -
      -
      -
      -
      In [45]:
      +
      In [45]:
      -
      -
      numpy.full((4, 4), 12.34)
      +
      +
      numpy.full((4, 4), 12.34)
       
      - -
      - +
      - -
      - -
      Out[45]:
      - - - - +
      Out[45]:
      array([[12.34, 12.34, 12.34, 12.34],
              [12.34, 12.34, 12.34, 12.34],
              [12.34, 12.34, 12.34, 12.34],
              [12.34, 12.34, 12.34, 12.34]])
      -
      -
      -
      -
      In [46]:
      +
      In [46]:
      -
      -
      numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
      +
      +
      numpy.eye(4)  # Jednotková matice (je čtvercová – n×n)
       
      - -
      - +
      - -
      - -
      Out[46]:
      - - - - +
      Out[46]:
      array([[1., 0., 0., 0.],
              [0., 1., 0., 0.],
              [0., 0., 1., 0.],
              [0., 0., 0., 1.]])
      -
      -
      -
      -
      In [47]:
      +
      In [47]:
      -
      -
      numpy.diag([1, 2, 3, 4])  # Diagonální matice
      +
      +
      numpy.diag([1, 2, 3, 4])  # Diagonální matice
       
      - -
      - +
      - -
      - -
      Out[47]:
      - - - - +
      Out[47]:
      array([[1, 0, 0, 0],
              [0, 2, 0, 0],
              [0, 0, 3, 0],
              [0, 0, 0, 4]])
      -
      -
      -
      @@ -1950,52 +1385,36 @@

      Tvoření matic, část 2

      -
      In [48]:
      +
      In [48]:
      -
      -
      int_zeros = numpy.zeros((4, 4), dtype='int8')
      +
      +
      int_zeros = numpy.zeros((4, 4), dtype='int8')
       print(int_zeros.dtype)
       int_zeros
       
      - -
      - +
      - -
      - -
      - - +
      int8
       
      -
      - -
      Out[48]:
      - - - - +
      Out[48]:
      array([[0, 0, 0, 0],
              [0, 0, 0, 0],
              [0, 0, 0, 0],
              [0, 0, 0, 0]], dtype=int8)
      -
      -
      -
      @@ -2006,38 +1425,26 @@

      Tvoření matic, část 2

      -
      In [49]:
      +
      In [49]:
      -
      -
      numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
      +
      +
      numpy.arange(50)  # Celočíselné – argumenty jako range() v Pythonu
       
      - -
      - +
      - -
      - -
      Out[49]:
      - - - - +
      Out[49]:
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
              17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
              34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
      -
      -
      -
      @@ -2048,36 +1455,24 @@

      Tvoření matic, část 2

      -
      In [50]:
      +
      In [50]:
      -
      -
      numpy.arange(0.0, 50.0, 0.3)[-1]
      +
      +
      numpy.arange(0.0, 50.0, 0.3)[-1]
       
      - -
      - +
      - -
      - -
      Out[50]:
      - - - - +
      Out[50]:
      49.799999999999997
      -
      -
      -
      @@ -2088,42 +1483,30 @@

      Tvoření matic, část 2

      -
      In [51]:
      +
      In [51]:
      -
      -
      numpy.linspace(0, 50, num=11)  # vždy 11 prvků
      +
      +
      numpy.linspace(0, 50, num=11)  # vždy 11 prvků
       
      - -
      - +
      - -
      - -
      Out[51]:
      - - - - +
      Out[51]:
      array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])
      -
      -
      -

      Reshape -# +#

      @@ -2138,73 +1521,49 @@

      Reshape

      -
      In [52]:
      +
      In [52]:
      -
      -
      array = numpy.arange(12)
      +
      +
      array = numpy.arange(12)
       array
       
      - -
      - +
      - -
      - -
      Out[52]:
      - - - - +
      Out[52]:
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
      -
      -
      -
      -
      In [53]:
      +
      In [53]:
      -
      -
      reshaped = array.reshape((3, 4))
      +
      +
      reshaped = array.reshape((3, 4))
       reshaped
       
      - -
      - +
      - -
      - -
      Out[53]:
      - - - - +
      Out[53]:
      array([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11]])
      -
      -
      -
      @@ -2215,72 +1574,48 @@

      Reshape

      -
      In [54]:
      +
      In [54]:
      -
      -
      reshaped[2, 2] = -99
      +
      +
      reshaped[2, 2] = -99
       reshaped
       
      - -
      - +
      - -
      - -
      Out[54]:
      - - - - +
      Out[54]:
      array([[  0,   1,   2,   3],
              [  4,   5,   6,   7],
              [  8,   9, -99,  11]])
      -
      -
      -
      -
      In [55]:
      +
      In [55]:
      -
      -
      array
      +
      +
      array
       
      - -
      - +
      - -
      - -
      Out[55]:
      - - - - +
      Out[55]:
      array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9, -99,  11])
      -
      -
      -
      @@ -2291,39 +1626,27 @@

      Reshape

      -
      In [56]:
      +
      In [56]:
      -
      -
      a_slice = array[2:4]
      +
      +
      a_slice = array[2:4]
       a_slice[:] = -99, -99
       
       array
       
      - -
      - +
      - -
      - -
      Out[56]:
      - - - - +
      Out[56]:
      array([  0,   1, -99, -99,   4,   5,   6,   7,   8,   9, -99,  11])
      -
      -
      -
      @@ -2334,38 +1657,26 @@

      Reshape

      -
      In [57]:
      +
      In [57]:
      -
      -
      array.reshape((3, 4)).copy()
      +
      +
      array.reshape((3, 4)).copy()
       
      - -
      - +
      - -
      - -
      Out[57]:
      - - - - +
      Out[57]:
      array([[  0,   1, -99, -99],
              [  4,   5,   6,   7],
              [  8,   9, -99,  11]])
      -
      -
      -
      @@ -2376,39 +1687,27 @@

      Reshape

      -
      In [58]:
      +
      In [58]:
      -
      -
      reshaped.T
      +
      +
      reshaped.T
       
      - -
      - +
      - -
      - -
      Out[58]:
      - - - - +
      Out[58]:
      array([[  0,   4,   8],
              [  1,   5,   9],
              [-99,   6, -99],
              [-99,   7,  11]])
      -
      -
      -
      @@ -2421,7 +1720,7 @@

      Reshape

      Datové typy -# +#

      @@ -2435,102 +1734,66 @@

      Datové typy

      -
      In [59]:
      +
      In [59]:
      -
      -
      numpy.zeros(4, dtype=int)
      +
      +
      numpy.zeros(4, dtype=int)
       
      - -
      - +
      - -
      - -
      Out[59]:
      - - - - +
      Out[59]:
      array([0, 0, 0, 0])
      -
      -
      -
      -
      In [60]:
      +
      In [60]:
      -
      -
      numpy.zeros(4, dtype=float)
      +
      +
      numpy.zeros(4, dtype=float)
       
      - -
      - +
      - -
      - -
      Out[60]:
      - - - - +
      Out[60]:
      array([0., 0., 0., 0.])
      -
      -
      -
      -
      In [61]:
      +
      In [61]:
      -
      -
      numpy.zeros(4, dtype=bool)
      +
      +
      numpy.zeros(4, dtype=bool)
       
      - -
      - +
      - -
      - -
      Out[61]:
      - - - - +
      Out[61]:
      array([False, False, False, False])
      -
      -
      -
      @@ -2541,36 +1804,24 @@

      Datové typy

      -
      In [62]:
      +
      In [62]:
      -
      -
      numpy.array([0, 1.3, "foobar"], dtype=object)
      +
      +
      numpy.array([0, 1.3, "foobar"], dtype=object)
       
      - -
      - +
      - -
      - -
      Out[62]:
      - - - - +
      Out[62]:
      -
      array([0, 1.3, 'foobar'], dtype=object)
      +
      array([0, 1.3, 'foobar'], dtype=object)
      -
      -
      -
      @@ -2581,36 +1832,24 @@

      Datové typy

      -
      In [63]:
      +
      In [63]:
      -
      -
      numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
      +
      +
      numpy.array([1, 8, 500], dtype='int8')  # 8bitové celé číslo
       
      - -
      - +
      - -
      - -
      Out[63]:
      - - - - +
      Out[63]:
      array([  1,   8, -12], dtype=int8)
      -
      -
      -
      @@ -2621,36 +1860,24 @@

      Datové typy

      -
      In [64]:
      +
      In [64]:
      -
      -
      numpy.zeros(4, dtype='<I')
      +
      +
      numpy.zeros(4, dtype='<I')
       
      - -
      - +
      - -
      - -
      Out[64]:
      - - - - +
      Out[64]:
      array([0, 0, 0, 0], dtype=uint32)
      -
      -
      -
      @@ -2661,69 +1888,45 @@

      Datové typy

      -
      In [65]:
      +
      In [65]:
      -
      -
      numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
      +
      +
      numpy.full(4, 'abcdef', dtype=('U', 10))  # Unicode
       
      - -
      - +
      - -
      - -
      Out[65]:
      - - - - +
      Out[65]:
      -
      array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
      +
      array(['abcdef', 'abcdef', 'abcdef', 'abcdef'], dtype='<U10')
      -
      -
      -
      -
      In [66]:
      +
      In [66]:
      -
      -
      numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
      +
      +
      numpy.full(4, 'abcdef', dtype=('a', 3))  # "ASCII"
       
      - -
      - +
      - -
      - -
      Out[66]:
      - - - - +
      Out[66]:
      -
      array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
      +
      array([b'abc', b'abc', b'abc', b'abc'], dtype='|S3')
      -
      -
      -
      @@ -2734,44 +1937,32 @@

      Datové typy

      -
      In [67]:
      +
      In [67]:
      -
      -
      record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
      +
      +
      record_type = numpy.dtype([('a', int), ('b', float), ('c', ('U', 3))])
       numpy.array([(1, 2, 'abc')] * 4, record_type)
       
      - -
      - +
      - -
      - -
      Out[67]:
      - - - - +
      Out[67]:
      -
      array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
      -      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
      +
      array([(1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc'), (1, 2., 'abc')],
      +      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<U3')])
      -
      -
      -

      Maticové násobení -# +#

      @@ -2792,40 +1983,28 @@

      Maticové násobení

      -
      In [68]:
      +
      In [68]:
      -
      -
      array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
      +
      +
      array1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
       array2 = numpy.array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])
       array1 @ array2
       
      - -
      - +
      - -
      - -
      Out[68]:
      - - - - +
      Out[68]:
      array([[ 1,  4,  9],
              [ 4, 10, 18],
              [ 7, 16, 27]])
      -
      -
      -
      @@ -2857,7 +2036,7 @@

      Maticové násobení

      Booleovské hodnoty polí -# +#

      @@ -2871,38 +2050,29 @@

      Booleovské hodnoty polí

      -
      In [69]:
      +
      In [69]:
      -
      -
      try:
      +
      +
      try:
           if numpy.eye(3):
               pass
       except ValueError as e:
           print("Chyba!", type(e), e)
       
      - -
      - +
      - -
      - -
      - - +
      -
      Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
      +
      Chyba! <class 'ValueError'> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
       
      -
      -
      @@ -2913,40 +2083,31 @@

      Booleovské hodnoty polí

      -
      In [70]:
      +
      In [70]:
      -
      -
      if numpy.eye(3).any():
      +
      +
      if numpy.eye(3).any():
           print('Alespoň jeden prvek je nenulový')
       if numpy.eye(3).all():
           print('Všechny prvky jsou nenulové')
       if numpy.eye(3).size:
           print('Pole obsahuje nějaké prvky')
       
      - -
      - +
      - -
      - -
      - - +
      Alespoň jeden prvek je nenulový
       Pole obsahuje nějaké prvky
       
      -
      -
      @@ -2957,75 +2118,57 @@

      Booleovské hodnoty polí

      -
      In [71]:
      +
      In [71]:
      -
      -
      if numpy.ones((1, 1, 1, 1)):
      +
      +
      if numpy.ones((1, 1, 1, 1)):
           print('Ano')
       if numpy.zeros((1, 1, 1, 1)):
           print('Ne')
       
      - -
      - +
      - -
      - -
      - - +
      Ano
       
      -
      -
      -
      In [72]:
      +
      In [72]:
      -
      -
      if numpy.ones((0, 0)):
      +
      +
      if numpy.ones((0, 0)):
           print('Ano')
       
      - -
      - +
      - -
      - -
      - - +
      DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
       
      -
      -

      Další operace -# +#

      @@ -3039,73 +2182,49 @@

      Další operace

      -
      In [73]:
      +
      In [73]:
      -
      -
      array = numpy.linspace(0, numpy.pi, num=1000)
      +
      +
      array = numpy.linspace(0, numpy.pi, num=1000)
       array[:10]
       
      - -
      - +
      - -
      - -
      Out[73]:
      - - - - +
      Out[73]:
      array([0.        , 0.00314474, 0.00628947, 0.00943421, 0.01257895,
              0.01572369, 0.01886842, 0.02201316, 0.0251579 , 0.02830264])
      -
      -
      -
      -
      In [74]:
      +
      In [74]:
      -
      -
      sine = numpy.sin(array)
      +
      +
      sine = numpy.sin(array)
       sine[:10]
       
      - -
      - +
      - -
      - -
      Out[74]:
      - - - - +
      Out[74]:
      array([0.        , 0.00314473, 0.00628943, 0.00943407, 0.01257862,
              0.01572304, 0.0188673 , 0.02201138, 0.02515525, 0.02829886])
      -
      -
      -
      @@ -3118,7 +2237,7 @@

      Další operace

      Příklady použití -# +#

      @@ -3134,7 +2253,7 @@

      Příklady použití

      Matematika a grafy -# +#

      @@ -3150,19 +2269,17 @@

      Matematika a grafy

      -
      In [75]:
      +
      In [75]:
      -
      -
      from matplotlib import pyplot
      +
      +
      from matplotlib import pyplot
       
       # Zapnutí integrace s notebookem – `%` je "magický" příkaz IPythonu, podobně jako `!` pro shell
       %matplotlib inline
       
      - -
      - +
      @@ -3173,61 +2290,41 @@

      Matematika a grafy

      -
      In [76]:
      +
      In [76]:
      -
      -
      x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
      +
      +
      x = numpy.linspace(0, numpy.pi * 4)   # definiční obor
       y = numpy.sin(x)                      # odpovídající hodnoty funkce
       
       pyplot.plot(x, y)
       
      - -
      - +
      - -
      - -
      Out[76]:
      - - - - +
      Out[76]:
      [<matplotlib.lines.Line2D at 0x7fab9ebd62d0>]
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      -
      In [77]:
      +
      In [77]:
      -
      -
      s = numpy.linspace(-10, 10, num=100)
      +
      +
      s = numpy.linspace(-10, 10, num=100)
       
       # meshgrid vrátí dvě 100×100 matice:
       # - jednu, kde v každém řádku jsou čísla od -10 do 10,
      @@ -3243,53 +2340,33 @@ 

      Matematika a grafy # přidáme legendu pyplot.colorbar()

      - -
      - +
      - -
      - -
      Out[77]:
      - - - - +
      Out[77]:
      <matplotlib.colorbar.Colorbar at 0x7fab9e6e56d0>
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      -
      In [78]:
      +
      In [78]:
      -
      -
      # Ta samá data můžeme vykreslit i ve 3D
      +
      +
      # Ta samá data můžeme vykreslit i ve 3D
       from mpl_toolkits.mplot3d import Axes3D
       
       fig = pyplot.figure()
      @@ -3297,39 +2374,26 @@ 

      Matematika a grafy surf = axes.plot_surface(x, y, z, cmap='viridis')

      - -
      - +
      - -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -

      Obrázky -# +#

      @@ -3347,29 +2411,20 @@

      Obrázky

      -
      In [79]:
      +
      In [79]:
      -
      -
      import imageio
      +
      +
      import imageio
       img = imageio.imread('static/python.jpg')
       img
       
      - -
      - +
      -
      - - +
      - -
      Out[79]:
      - - - - +
      Out[79]:
      Array([[[172, 173, 165],
               [173, 174, 166],
      @@ -3421,12 +2476,9 @@ 

      Obrázky [201, 202, 196], [201, 202, 196]]], dtype=uint8)

      -
      -
      -
      @@ -3437,51 +2489,31 @@

      Obrázky

      -
      In [80]:
      +
      In [80]:
      -
      -
      pyplot.imshow(img)
      +
      +
      pyplot.imshow(img)
       
      - -
      - +
      - -
      - -
      Out[80]:
      - - - - +
      Out[80]:
      <matplotlib.image.AxesImage at 0x7fabd75fcc50>
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -3492,36 +2524,24 @@

      Obrázky

      -
      In [81]:
      +
      In [81]:
      -
      -
      img.shape
      +
      +
      img.shape
       
      - -
      - +
      - -
      - -
      Out[81]:
      - - - - +
      Out[81]:
      (887, 1037, 3)
      -
      -
      -
      @@ -3541,52 +2561,32 @@

      Obrázky

      -
      In [82]:
      +
      In [82]:
      -
      -
      blue_channel = img[..., -1]
      +
      +
      blue_channel = img[..., -1]
       pyplot.imshow(blue_channel, cmap='gray')
       
      - -
      - +
      - -
      - -
      Out[82]:
      - - - - +
      Out[82]:
      <matplotlib.image.AxesImage at 0x7fabd75bfc50>
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -3598,18 +2598,16 @@

      Obrázky

      -
      In [83]:
      +
      In [83]:
      -
      -
      secret = imageio.imread('static/secret.png', pilmode='L')
      +
      +
      secret = imageio.imread('static/secret.png', pilmode='L')
       
       img[..., -1] = (img[..., -1] & 0b11111110) + (secret.astype(bool))
       
      - -
      - +
      @@ -3620,51 +2618,31 @@

      Obrázky

      -
      In [84]:
      +
      In [84]:
      -
      -
      pyplot.imshow(img)
      +
      +
      pyplot.imshow(img)
       
      - -
      - +
      - -
      - -
      Out[84]:
      - - - - +
      Out[84]:
      <matplotlib.image.AxesImage at 0x7fabd75813d0>
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -3675,51 +2653,31 @@

      Obrázky

      -
      In [85]:
      +
      In [85]:
      -
      -
      pyplot.imshow(img[..., -1] & 1, cmap='gray')
      +
      +
      pyplot.imshow(img[..., -1] & 1, cmap='gray')
       
      - -
      - +
      - -
      - -
      Out[85]:
      - - - - +
      Out[85]:
      <matplotlib.image.AxesImage at 0x7fab9c631d90>
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -3730,22 +2688,20 @@

      Obrázky

      -
      In [86]:
      +
      In [86]:
      -
      -
      imageio.imsave('python.png', img)
      +
      +
      imageio.imsave('python.png', img)
       
      - -
      - +

      Zvuk -# +#

      @@ -3759,41 +2715,28 @@

      Zvuk

      -
      In [87]:
      +
      In [87]:
      -
      -
      import scipy.io.wavfile
      +
      +
      import scipy.io.wavfile
       sample_rate, sound = scipy.io.wavfile.read('static/sample.wav')
       print(sample_rate)
       sound
       
      - -
      - +
      - -
      - -
      - - +
      48000
       
      -
      - -
      Out[87]:
      - - - - +
      Out[87]:
      array([[ -58,  -88],
              [ -65,  -49],
      @@ -3803,12 +2746,9 @@ 

      Zvuk [ -85, 234], [-118, 212]], dtype=int16)

      -
      -
      -
      @@ -3819,52 +2759,32 @@

      Zvuk

      -
      In [88]:
      +
      In [88]:
      -
      -
      channel = sound[..., 1]
      +
      +
      channel = sound[..., 1]
       pyplot.plot(channel)
       
      - -
      - +
      - -
      - -
      Out[88]:
      - - - - +
      Out[88]:
      [<matplotlib.lines.Line2D at 0x7fab9c051b90>]
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -3875,36 +2795,27 @@

      Zvuk

      -
      In [89]:
      +
      In [89]:
      -
      -
      from IPython.display import Audio
      +
      +
      from IPython.display import Audio
       Audio(data=channel, rate=sample_rate)
       print('(Zkuste si to sami; tento print vymažte)')
       
      - -
      - +
      - -
      - -
      - - +
      (Zkuste si to sami; tento print vymažte)
       
      -
      -
      @@ -3915,88 +2826,57 @@

      Zvuk

      -
      In [90]:
      +
      In [90]:
      -
      -
      segment = channel[50000:55000]
      +
      +
      segment = channel[50000:55000]
       pyplot.plot(segment)
       
      - -
      - +
      - -
      - -
      Out[90]:
      - - - - +
      Out[90]:
      [<matplotlib.lines.Line2D at 0x7fab96685510>]
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      -
      In [91]:
      +
      In [91]:
      -
      -
      from IPython.display import Audio
      +
      +
      from IPython.display import Audio
       Audio(data=segment, rate=sample_rate)
       
      - -
      - +
      - -
      - -
      Out[91]:
      - - - +
      Out[91]:
      -
      -
      -
      - +
      @@ -4008,54 +2888,34 @@

      Zvuk

      -
      In [92]:
      +
      In [92]:
      -
      -
      spectrum = numpy.fft.fft(segment)
      +
      +
      spectrum = numpy.fft.fft(segment)
       freqs = numpy.fft.fftfreq(len(spectrum), 1/sample_rate)
       pyplot.xlabel('Frekvence (Hz)')
       pyplot.plot(freqs, numpy.abs(spectrum))
       
      - -
      - +
      - -
      - -
      Out[92]:
      - - - - +
      Out[92]:
      [<matplotlib.lines.Line2D at 0x7fab965a4ad0>]
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -4066,52 +2926,32 @@

      Zvuk

      -
      In [93]:
      +
      In [93]:
      -
      -
      pyplot.xlabel('Frekvence (Hz)')
      +
      +
      pyplot.xlabel('Frekvence (Hz)')
       pyplot.plot(freqs[:100], numpy.abs(spectrum[:100]))
       
      - -
      - +
      - -
      - -
      Out[93]:
      - - - - +
      Out[93]:
      [<matplotlib.lines.Line2D at 0x7fab96514910>]
      -
      -
      - -
      - - - - -
      - +
      +
      +No description has been provided for this image
      -
      -
      -
      @@ -4122,37 +2962,25 @@

      Zvuk

      -
      In [94]:
      +
      In [94]:
      -
      -
      amax = numpy.argmax(abs(spectrum))
      +
      +
      amax = numpy.argmax(abs(spectrum))
       amax
       
      - -
      - +
      - -
      - -
      Out[94]:
      - - - - +
      Out[94]:
      13
      -
      -
      -
      @@ -4163,36 +2991,24 @@

      Zvuk

      -
      In [95]:
      +
      In [95]:
      -
      -
      freqs[amax]
      +
      +
      freqs[amax]
       
      - -
      - +
      - -
      - -
      Out[95]:
      - - - - +
      Out[95]:
      124.80000000000001
      -
      -
      -
      @@ -4201,5 +3017,3 @@

      Zvuk

      - - diff --git a/mi-pyt/pandas/index.html b/mi-pyt/pandas/index.html index 960dd862..ffa0d921 100644 --- a/mi-pyt/pandas/index.html +++ b/mi-pyt/pandas/index.html @@ -10,7 +10,7 @@ actors.csv a spouses.csv.

      A až bude nainstalováno, spusťte si nový Notebook. (Viz lekce o Notebooku.)

      -
      +
      @@ -18,14 +18,14 @@

      Analýza dat v Pythonu -# +#

      Jedna z oblastí, kde popularita Pythonu neustále roste, je analýza dat. Co tenhle termín znamená?

      Máme nějaká data; je jich moc a jsou nepřehledná. Datový analytik je zpracuje, přeskládá, najde v nich smysl, vytvoří shrnutí toho nejdůležitějšího nebo barevnou infografiku.

      Ze statistických údajů o obyvatelstvu zjistíme, jak souvisí příjmy s dostupností škol. Zpracováním měření z fyzikálního experimentu ověříme, jestli platí hypotéza. Z log přístupů na webovou službu určíme, co uživatelé čtou a kde stránky opouštějí.

      Na podobné úkoly je možné použít jazyky vyvinuté přímo pro analýzu dat, jako R, které takovým úkolům svojí syntaxí a filozofií odpovídají víc. Python jako obecný programovací jazyk sice místy vyžaduje krkolomnější zápis, ale zato nabízí možnost data spojit s jinými oblastmi – od získávání informací z webových stránek po tvoření webových či desktopových rozhraní.

      Proces analýzy dat -# +#

      Práce datového analytika se většinou drží následujícího postupu:

        @@ -36,7 +36,7 @@

        Proces analýzy dat
      • Zkoumání dat
      • Publikace výsledků
      -

      *(založeno na diagramu z knihy *Data Wrangling in Python* od Jacqueline Kazil & Katharine Jarmul, str. 3)*

      +

      (založeno na diagramu z knihy *Data Wrangling in Python od Jacqueline Kazil & Katharine Jarmul, str. 3)*

      S prvními dvěma kroky Python příliš nepomůže; k těm jen poznamenám, že „Co zajímavého se z těch dat dá vyčíst?” je validní otázka. Na druhé dva kroky se dá s úspěchem použít pythonní standardní knihovna: json, csv, případně doinstalovat requests, lxml pro XML či xlwt/openpyxl na excelové soubory.

      Na zkoumání dat a přípravu výsledků pak použijeme specializovanou „datovou” knihovnu – Pandas.

      @@ -46,7 +46,7 @@

      Proces analýzy dat

      Pandas -# +#

      Pandas slouží pro analýzu dat, které lze reprezentovat 2D tabulkou. Tento „tvar” dat najdeme v SQL databázích, souborech CSV nebo tabulkových procesorech. Stručně řečeno, co jde dělat v Excelu, jde dělat i v Pandas. (Pandas má samozřejmě funkce navíc, a hlavně umožňuje analýzu automatizovat.)

      @@ -61,22 +61,20 @@

      Pandas

      -
      In [1]:
      +
      In [1]:
      -
      -
      import pandas
      +
      +
      import pandas
       
      - -
      - +

      Tabulky -# +#

      @@ -98,27 +96,19 @@

      Tabulky

      -
      In [2]:
      +
      In [2]:
      -
      -
      actors = pandas.read_csv('static/actors.csv', index_col=None)
      +
      +
      actors = pandas.read_csv('static/actors.csv', index_col=None)
       actors
       
      - -
      - +
      - -
      - -
      Out[2]:
      - - - +
      Out[2]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      -
      -
      -
      @@ -198,30 +185,22 @@

      Tabulky

      -
      In [3]:
      +
      In [3]:
      -
      -
      items = pandas.DataFrame([
      +
      +
      items = pandas.DataFrame([
           ["Book", 123],
           ["Computer", 2185],
       ])
       items
       
      - -
      - +
      - -
      - -
      Out[3]:
      - - - +
      Out[3]:
      - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
      01
      0Book123
      1Computer2185
      01
      0Book123
      1Computer2185
      -
      -
      -
      @@ -274,30 +250,22 @@

      Tabulky

      -
      In [4]:
      +
      In [4]:
      -
      -
      items = pandas.DataFrame([
      +
      +
      items = pandas.DataFrame([
           {"name": "Book", "price": 123},
           {"name": "Computer", "price": 2185},
       ])
       items
       
      - -
      - +
      - -
      - -
      Out[4]:
      - - - +
      Out[4]:
      - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
      nameprice
      0Book123
      1Computer2185
      nameprice
      0Book123
      1Computer2185
      -
      -
      -
      @@ -351,25 +316,18 @@

      Tabulky

      -
      In [5]:
      +
      In [5]:
      -
      -
      print(actors)
      +
      +
      print(actors)
       
      - -
      - +
      - -
      - -
      - - +
            name  birth  alive
       0    Terry   1942  False
      @@ -381,10 +339,8 @@ 

      Tabulky

      -
      -
      @@ -395,27 +351,20 @@

      Tabulky

      -
      In [6]:
      +
      In [6]:
      -
      -
      actors.info()
      +
      +
      actors.info()
       
      - -
      - +
      - -
      - -
      - - +
      -
      <class 'pandas.core.frame.DataFrame'>
      +
      <class 'pandas.core.frame.DataFrame'>
       RangeIndex: 6 entries, 0 to 5
       Data columns (total 3 columns):
       name     6 non-null object
      @@ -426,10 +375,8 @@ 

      Tabulky

      -
      -
      @@ -452,7 +399,7 @@

      Tabulky

      Sloupce -# +#

      @@ -466,28 +413,19 @@

      Sloupce

      -
      In [7]:
      +
      In [7]:
      -
      -
      birth_years = actors['birth']
      +
      +
      birth_years = actors['birth']
       birth_years
       
      - -
      - +
      - -
      - -
      Out[7]:
      - - - - +
      Out[7]:
      0    1942
       1    1943
      @@ -497,144 +435,93 @@ 

      Sloupce 5 1939 Name: birth, dtype: int64

      -
      -
      -
      -
      In [8]:
      +
      In [8]:
      -
      -
      type(birth_years)
      +
      +
      type(birth_years)
       
      - -
      - +
      - -
      - -
      Out[8]:
      - - - - +
      Out[8]:
      pandas.core.series.Series
      -
      -
      -
      -
      In [9]:
      +
      In [9]:
      -
      -
      birth_years.name
      +
      +
      birth_years.name
       
      - -
      - +
      - -
      - -
      Out[9]:
      - - - - +
      Out[9]:
      -
      'birth'
      +
      'birth'
      -
      -
      -
      -
      In [10]:
      +
      In [10]:
      -
      -
      birth_years.index
      +
      +
      birth_years.index
       
      - -
      - +
      - -
      - -
      Out[10]:
      - - - - +
      Out[10]:
      RangeIndex(start=0, stop=6, step=1)
      -
      -
      -
      -
      In [11]:
      +
      In [11]:
      -
      -
      birth_years.dtype
      +
      +
      birth_years.dtype
       
      - -
      - +
      - -
      - -
      Out[11]:
      - - - - +
      Out[11]:
      -
      dtype('int64')
      +
      dtype('int64')
      -
      -
      -
      @@ -646,28 +533,19 @@

      Sloupce

      -
      In [12]:
      +
      In [12]:
      -
      -
      ages = 2016 - birth_years
      +
      +
      ages = 2016 - birth_years
       ages
       
      - -
      - +
      - -
      - -
      Out[12]:
      - - - - +
      Out[12]:
      0    74
       1    73
      @@ -677,37 +555,25 @@ 

      Sloupce 5 77 Name: birth, dtype: int64

      -
      -
      -
      -
      In [13]:
      +
      In [13]:
      -
      -
      century = birth_years // 100 + 1
      +
      +
      century = birth_years // 100 + 1
       century
       
      - -
      - +
      - -
      - -
      Out[13]:
      - - - - +
      Out[13]:
      0    20
       1    20
      @@ -717,12 +583,9 @@ 

      Sloupce 5 20 Name: birth, dtype: int64

      -
      -
      -
      @@ -733,27 +596,18 @@

      Sloupce

      -
      In [14]:
      +
      In [14]:
      -
      -
      birth_years > 1940
      +
      +
      birth_years > 1940
       
      - -
      - +
      - -
      - -
      Out[14]:
      - - - - +
      Out[14]:
      0     True
       1     True
      @@ -763,36 +617,24 @@ 

      Sloupce 5 False Name: birth, dtype: bool

      -
      -
      -
      -
      In [15]:
      +
      In [15]:
      -
      -
      birth_years == 1940
      +
      +
      birth_years == 1940
       
      - -
      - +
      - -
      - -
      Out[15]:
      - - - - +
      Out[15]:
      0    False
       1    False
      @@ -802,12 +644,9 @@ 

      Sloupce 5 False Name: birth, dtype: bool

      -
      -
      -
      @@ -818,27 +657,18 @@

      Sloupce

      -
      In [16]:
      +
      In [16]:
      -
      -
      actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
      +
      +
      actors['name'] + [' (1)', ' (2)', ' (3)', ' (4)', ' (5)', ' (6)']
       
      - -
      - +
      - -
      - -
      Out[16]:
      - - - - +
      Out[16]:
      0      Terry (1)
       1    Michael (2)
      @@ -848,12 +678,9 @@ 

      Sloupce 5 John (6) Name: name, dtype: object

      -
      -
      -
      @@ -864,27 +691,18 @@

      Sloupce

      -
      In [17]:
      +
      In [17]:
      -
      -
      actors['name'].str.upper()
      +
      +
      actors['name'].str.upper()
       
      - -
      - +
      - -
      - -
      Out[17]:
      - - - - +
      Out[17]:
      0      TERRY
       1    MICHAEL
      @@ -894,12 +712,9 @@ 

      Sloupce 5 JOHN Name: name, dtype: object

      -
      -
      -
      @@ -917,71 +732,47 @@

      Sloupce

      -
      In [18]:
      +
      In [18]:
      -
      -
      birth_years[2]
      +
      +
      birth_years[2]
       
      - -
      - +
      - -
      - -
      Out[18]:
      - - - - +
      Out[18]:
      1943
      -
      -
      -
      -
      In [19]:
      +
      In [19]:
      -
      -
      birth_years[2:-2]
      +
      +
      birth_years[2:-2]
       
      - -
      - +
      - -
      - -
      Out[19]:
      - - - - +
      Out[19]:
      2    1943
       3    1941
       Name: birth, dtype: int64
      -
      -
      -
      @@ -992,28 +783,19 @@

      Sloupce

      -
      In [20]:
      +
      In [20]:
      -
      -
      # Roky narození po roce 1940
      +
      +
      # Roky narození po roce 1940
       birth_years[birth_years > 1940]
       
      - -
      - +
      - -
      - -
      Out[20]:
      - - - - +
      Out[20]:
      0    1942
       1    1943
      @@ -1021,12 +803,9 @@ 

      Sloupce 3 1941 Name: birth, dtype: int64

      -
      -
      -
      @@ -1037,39 +816,27 @@

      Sloupce

      -
      In [21]:
      +
      In [21]:
      -
      -
      # Roky narození v daném rozmezí
      +
      +
      # Roky narození v daném rozmezí
       birth_years[(birth_years > 1940) & (birth_years < 1943)]
       
      - -
      - +
      - -
      - -
      Out[21]:
      - - - - +
      Out[21]:
      0    1942
       3    1941
       Name: birth, dtype: int64
      -
      -
      -
      @@ -1080,29 +847,22 @@

      Sloupce

      -
      In [22]:
      +
      In [22]:
      -
      -
      print('Součet: ', birth_years.sum())
      +
      +
      print('Součet: ', birth_years.sum())
       print('Průměr: ', birth_years.mean())
       print('Medián: ', birth_years.median())
       print('Počet unikátních hodnot: ', birth_years.nunique())
       print('Koeficient špičatosti: ', birth_years.kurtosis())
       
      - -
      - +
      - -
      - -
      - - +
      Součet:  11648
       Průměr:  1941.3333333333333
      @@ -1112,10 +872,8 @@ 

      Sloupce

      -
      -
      @@ -1126,27 +884,18 @@

      Sloupce

      -
      In [23]:
      +
      In [23]:
      -
      -
      actors['name'].apply(lambda x: ''.join(reversed(x)))
      +
      +
      actors['name'].apply(lambda x: ''.join(reversed(x)))
       
      - -
      - +
      - -
      - -
      Out[23]:
      - - - - +
      Out[23]:
      0      yrreT
       1    leahciM
      @@ -1156,36 +905,24 @@ 

      Sloupce 5 nhoJ Name: name, dtype: object

      -
      -
      -
      -
      In [24]:
      +
      In [24]:
      -
      -
      actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
      +
      +
      actors['alive'].apply({True: 'alive', False: 'deceased'}.get)
       
      - -
      - +
      - -
      - -
      Out[24]:
      - - - - +
      Out[24]:
      0    deceased
       1       alive
      @@ -1195,18 +932,15 @@ 

      Sloupce 5 alive Name: alive, dtype: object

      -
      -
      -

      Tabulky a vybírání prvků -# +#

      @@ -1220,27 +954,18 @@

      Tabulky a vybírání prvků

      -
      In [25]:
      +
      In [25]:
      -
      -
      actors['name']  # Jméno sloupce
      +
      +
      actors['name']  # Jméno sloupce
       
      - -
      - +
      - -
      - -
      Out[25]:
      - - - - +
      Out[25]:
      0      Terry
       1    Michael
      @@ -1250,35 +975,24 @@ 

      Tabulky a vybírání prvků 5 John Name: name, dtype: object

      -
      -
      -
      -
      In [26]:
      +
      In [26]:
      -
      -
      actors[1:-1]  # Interval řádků
      +
      +
      actors[1:-1]  # Interval řádků
       
      - -
      - +
      - -
      - -
      Out[26]:
      - - - +
      Out[26]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      namebirthalive
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      -
      -
      -
      -
      In [27]:
      +
      In [27]:
      -
      -
      actors[['name', 'alive']]  # Seznam sloupců
      +
      +
      actors[['name', 'alive']]  # Seznam sloupců
       
      - -
      - +
      - -
      - -
      Out[27]:
      - - - +
      Out[27]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namealive
      0TerryFalse
      1MichaelTrue
      2EricTrue
      3GrahamFalse
      4TerryTrue
      5JohnTrue
      namealive
      0TerryFalse
      1MichaelTrue
      2EricTrue
      3GrahamFalse
      4TerryTrue
      5JohnTrue
      -
      -
      -
      @@ -1435,7 +1135,7 @@

      Tabulky a vybírání prvků

      Indexer loc -# +#

      @@ -1449,26 +1149,18 @@

      Indexer loc

      -
      In [28]:
      +
      In [28]:
      -
      -
      actors
      +
      +
      actors
       
      - -
      - +
      - -
      - -
      Out[28]:
      - - - +
      Out[28]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      -
      -
      -
      -
      In [29]:
      +
      In [29]:
      -
      -
      actors.loc[2]
      +
      +
      actors.loc[2]
       
      - -
      - +
      - -
      - -
      Out[29]:
      - - - - +
      Out[29]:
      name     Eric
       birth    1943
       alive    True
       Name: 2, dtype: object
      -
      -
      -
      @@ -1591,36 +1268,24 @@

      Indexer loc

      -
      In [30]:
      +
      In [30]:
      -
      -
      actors.loc[2, 'birth']
      +
      +
      actors.loc[2, 'birth']
       
      - -
      - +
      - -
      - -
      Out[30]:
      - - - - +
      Out[30]:
      1943
      -
      -
      -
      @@ -1631,26 +1296,18 @@

      Indexer loc

      -
      In [31]:
      +
      In [31]:
      -
      -
      actors.loc[2:4, 'birth':'alive']
      +
      +
      actors.loc[2:4, 'birth':'alive']
       
      - -
      - +
      - -
      - -
      Out[31]:
      - - - +
      Out[31]:
      - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
      birthalive
      21943True
      31941False
      41940True
      birthalive
      21943True
      31941False
      41940True
      -
      -
      -
      @@ -1708,62 +1362,42 @@

      Indexer loc

      -
      In [32]:
      +
      In [32]:
      -
      -
      actors.loc[2:4, 'name']
      +
      +
      actors.loc[2:4, 'name']
       
      - -
      - +
      - -
      - -
      Out[32]:
      - - - - +
      Out[32]:
      2      Eric
       3    Graham
       4     Terry
       Name: name, dtype: object
      -
      -
      -
      -
      In [33]:
      +
      In [33]:
      -
      -
      actors.loc[2:4, 'name':'name']
      +
      +
      actors.loc[2:4, 'name':'name']
       
      - -
      - +
      - -
      - -
      Out[33]:
      - - - +
      Out[33]:
      - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
      name
      2Eric
      3Graham
      4Terry
      name
      2Eric
      3Graham
      4Terry
      -
      -
      -
      @@ -1817,27 +1448,18 @@

      Indexer loc

      -
      In [34]:
      +
      In [34]:
      -
      -
      actors.loc[:, 'alive']
      +
      +
      actors.loc[:, 'alive']
       
      - -
      - +
      - -
      - -
      Out[34]:
      - - - - +
      Out[34]:
      0    False
       1     True
      @@ -1847,12 +1469,9 @@ 

      Indexer loc 5 True Name: alive, dtype: bool

      -
      -
      -
      @@ -1863,26 +1482,18 @@

      Indexer loc

      -
      In [35]:
      +
      In [35]:
      -
      -
      actors.loc[:, ['name', 'alive']]
      +
      +
      actors.loc[:, ['name', 'alive']]
       
      - -
      - +
      - -
      - -
      Out[35]:
      - - - +
      Out[35]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namealive
      0TerryFalse
      1MichaelTrue
      2EricTrue
      3GrahamFalse
      4TerryTrue
      5JohnTrue
      namealive
      0TerryFalse
      1MichaelTrue
      2EricTrue
      3GrahamFalse
      4TerryTrue
      5JohnTrue
      -
      -
      -
      -
      In [36]:
      +
      In [36]:
      -
      -
      actors.loc[[3, 2, 4, 4], :]
      +
      +
      actors.loc[[3, 2, 4, 4], :]
       
      - -
      - +
      - -
      - -
      Out[36]:
      - - - +
      Out[36]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      3Graham1941False
      2Eric1943True
      4Terry1940True
      4Terry1940True
      namebirthalive
      3Graham1941False
      2Eric1943True
      4Terry1940True
      4Terry1940True
      -
      -
      -

      Indexer iloc -# +#

      @@ -2044,26 +1641,18 @@

      Indexer iloc

      -
      In [37]:
      +
      In [37]:
      -
      -
      actors
      +
      +
      actors
       
      - -
      - +
      - -
      - -
      Out[37]:
      - - - +
      Out[37]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      -
      -
      -
      -
      In [38]:
      +
      In [38]:
      -
      -
      actors.iloc[0, 0]
      +
      +
      actors.iloc[0, 0]
       
      - -
      - +
      - -
      - -
      Out[38]:
      - - - - +
      Out[38]:
      -
      'Terry'
      +
      'Terry'
      -
      -
      -
      @@ -2176,59 +1750,39 @@

      Indexer iloc

      -
      In [39]:
      +
      In [39]:
      -
      -
      actors.iloc[-1, 1]
      +
      +
      actors.iloc[-1, 1]
       
      - -
      - +
      - -
      - -
      Out[39]:
      - - - - +
      Out[39]:
      1939
      -
      -
      -
      -
      In [40]:
      +
      In [40]:
      -
      -
      actors.iloc[:, 0:1]
      +
      +
      actors.iloc[:, 0:1]
       
      - -
      - +
      - -
      - -
      Out[40]:
      - - - +
      Out[40]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      name
      0Terry
      1Michael
      2Eric
      3Graham
      4Terry
      5John
      name
      0Terry
      1Michael
      2Eric
      3Graham
      4Terry
      5John
      -
      -
      -
      @@ -2294,26 +1845,18 @@

      Indexer iloc

      -
      In [41]:
      +
      In [41]:
      -
      -
      actors.iloc[[0, -1, 3], [-1, 1, 0]]
      +
      +
      actors.iloc[[0, -1, 3], [-1, 1, 0]]
       
      - -
      - +
      - -
      - -
      Out[41]:
      - - - +
      Out[41]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alivebirthname
      0False1942Terry
      5True1939John
      3False1941Graham
      alivebirthname
      0False1942Terry
      5True1939John
      3False1941Graham
      -
      -
      -
      @@ -2375,42 +1915,30 @@

      Indexer iloc

      -
      In [42]:
      +
      In [42]:
      -
      -
      actors.iloc[-1].loc['name']
      +
      +
      actors.iloc[-1].loc['name']
       
      - -
      - +
      - -
      - -
      Out[42]:
      - - - - +
      Out[42]:
      -
      'John'
      +
      'John'
      -
      -
      -

      Indexy -# +#

      @@ -2425,27 +1953,19 @@

      Indexy

      -
      In [43]:
      +
      In [43]:
      -
      -
      actors = pandas.read_csv('static/actors.csv', index_col=None)
      +
      +
      actors = pandas.read_csv('static/actors.csv', index_col=None)
       actors
       
      - -
      - +
      - -
      - -
      Out[43]:
      - - - +
      Out[43]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      -
      -
      -
      @@ -2525,69 +2042,45 @@

      Indexy

      -
      In [44]:
      +
      In [44]:
      -
      -
      actors.index
      +
      +
      actors.index
       
      - -
      - +
      - -
      - -
      Out[44]:
      - - - - +
      Out[44]:
      RangeIndex(start=0, stop=6, step=1)
      -
      -
      -
      -
      In [45]:
      +
      In [45]:
      -
      -
      actors.columns
      +
      +
      actors.columns
       
      - -
      - +
      - -
      - -
      Out[45]:
      - - - - +
      Out[45]:
      -
      Index(['name', 'birth', 'alive'], dtype='object')
      +
      Index(['name', 'birth', 'alive'], dtype='object')
      -
      -
      -
      @@ -2598,27 +2091,19 @@

      Indexy

      -
      In [46]:
      +
      In [46]:
      -
      -
      actors.index = actors['name']
      +
      +
      actors.index = actors['name']
       actors
       
      - -
      - +
      - -
      - -
      Out[46]:
      - - - +
      Out[46]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      name
      TerryTerry1942False
      MichaelMichael1943True
      EricEric1943True
      GrahamGraham1941False
      TerryTerry1940True
      JohnJohn1939True
      namebirthalive
      name
      TerryTerry1942False
      MichaelMichael1943True
      EricEric1943True
      GrahamGraham1941False
      TerryTerry1940True
      JohnJohn1939True
      -
      -
      -
      -
      In [47]:
      +
      In [47]:
      -
      -
      actors.index
      +
      +
      actors.index
       
      - -
      - +
      - -
      - -
      Out[47]:
      - - - - +
      Out[47]:
      -
      Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
      +
      Index(['Terry', 'Michael', 'Eric', 'Graham', 'Terry', 'John'], dtype='object', name='name')
      -
      -
      -
      @@ -2737,27 +2207,19 @@

      Indexy

      -
      In [48]:
      +
      In [48]:
      -
      -
      actors = actors.sort_index()
      +
      +
      actors = actors.sort_index()
       actors
       
      - -
      - +
      -
      - - -
      - -
      Out[48]:
      - - - +
      +
      +
      Out[48]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      name
      EricEric1943True
      GrahamGraham1941False
      JohnJohn1939True
      MichaelMichael1943True
      TerryTerry1942False
      TerryTerry1940True
      namebirthalive
      name
      EricEric1943True
      GrahamGraham1941False
      JohnJohn1939True
      MichaelMichael1943True
      TerryTerry1942False
      TerryTerry1940True
      -
      -
      -
      -
      In [49]:
      +
      In [49]:
      -
      -
      actors.loc[['Eric', 'Graham']]
      +
      +
      actors.loc[['Eric', 'Graham']]
       
      - -
      - +
      - -
      - -
      Out[49]:
      - - - +
      Out[49]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      name
      EricEric1943True
      GrahamGraham1941False
      namebirthalive
      name
      EricEric1943True
      GrahamGraham1941False
      -
      -
      -
      @@ -2917,26 +2365,18 @@

      Indexy

      -
      In [50]:
      +
      In [50]:
      -
      -
      actors.loc['Terry']
      +
      +
      actors.loc['Terry']
       
      - -
      - +
      - -
      - -
      Out[50]:
      - - - +
      Out[50]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      name
      TerryTerry1942False
      TerryTerry1940True
      namebirthalive
      name
      TerryTerry1942False
      TerryTerry1940True
      -
      -
      -
      @@ -2999,27 +2436,19 @@

      Indexy

      -
      In [51]:
      +
      In [51]:
      -
      -
      indexed_actors = actors.set_index(['name', 'birth'])
      +
      +
      indexed_actors = actors.set_index(['name', 'birth'])
       indexed_actors
       
      - -
      - +
      - -
      - -
      Out[51]:
      - - - +
      Out[51]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alive
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942False
      1940True
      alive
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942False
      1940True
      -
      -
      -
      @@ -3096,38 +2522,26 @@

      Indexy

      -
      In [52]:
      +
      In [52]:
      -
      -
      indexed_actors.index
      +
      +
      indexed_actors.index
       
      - -
      - +
      - -
      - -
      Out[52]:
      - - - - +
      Out[52]:
      -
      MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
      +
      MultiIndex(levels=[['Eric', 'Graham', 'John', 'Michael', 'Terry'], [1939, 1940, 1941, 1942, 1943]],
                  labels=[[0, 1, 2, 3, 4, 4], [4, 2, 0, 4, 3, 1]],
      -           names=['name', 'birth'])
      + names=['name', 'birth'])
      -
      -
      -
      @@ -3138,26 +2552,18 @@

      Indexy

      -
      In [53]:
      +
      In [53]:
      -
      -
      indexed_actors.loc['Terry']
      +
      +
      indexed_actors.loc['Terry']
       
      - -
      - +
      - -
      - -
      Out[53]:
      - - - +
      Out[53]:
      - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
      alive
      birth
      1942False
      1940True
      alive
      birth
      1942False
      1940True
      -
      -
      -
      -
      In [54]:
      +
      In [54]:
      -
      -
      indexed_actors.loc['Terry'].loc[1940]
      +
      +
      indexed_actors.loc['Terry'].loc[1940]
       
      - -
      - +
      - -
      - -
      Out[54]:
      - - - - +
      Out[54]:
      alive    True
       Name: 1940, dtype: bool
      -
      -
      -
      -
      In [55]:
      +
      In [55]:
      -
      -
      indexed_actors.loc[('Terry', 1942)]
      +
      +
      indexed_actors.loc[('Terry', 1942)]
       
      - -
      - +
      - -
      - -
      Out[55]:
      - - - - +
      Out[55]:
      alive    False
       Name: (Terry, 1942), dtype: bool
      -
      -
      -
      @@ -3279,26 +2658,18 @@

      Indexy

      -
      In [56]:
      +
      In [56]:
      -
      -
      indexed_actors
      +
      +
      indexed_actors
       
      - -
      - +
      - -
      - -
      Out[56]:
      - - - +
      Out[56]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alive
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942False
      1940True
      alive
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942False
      1940True
      -
      -
      -
      -
      In [57]:
      +
      In [57]:
      -
      -
      last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
      +
      +
      last_names = pandas.Series(['Gilliam', 'Jones', 'Cleveland'],
                                  index=[('Terry', 1940), ('Terry', 1942), ('Carol', 1942)])
       last_names
       
      - -
      - +
      - -
      - -
      Out[57]:
      - - - - +
      Out[57]:
      (Terry, 1940)      Gilliam
       (Terry, 1942)        Jones
       (Carol, 1942)    Cleveland
       dtype: object
      -
      -
      -
      -
      In [58]:
      +
      In [58]:
      -
      -
      indexed_actors['last_name'] = last_names
      +
      +
      indexed_actors['last_name'] = last_names
       indexed_actors
       
      - -
      - +
      - -
      - -
      Out[58]:
      - - - +
      Out[58]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alivelast_name
      namebirth
      Eric1943TrueNaN
      Graham1941FalseNaN
      John1939TrueNaN
      Michael1943TrueNaN
      Terry1942FalseJones
      1940TrueGilliam
      alivelast_name
      namebirth
      Eric1943TrueNaN
      Graham1941FalseNaN
      John1939TrueNaN
      Michael1943TrueNaN
      Terry1942FalseJones
      1940TrueGilliam
      -
      -
      -

      NaN neboli NULL či N/A -# +#

      @@ -3520,27 +2865,18 @@

      NaN neboli NULL či N/A

      -
      In [59]:
      +
      In [59]:
      -
      -
      '(' + indexed_actors['last_name'] + ')'
      +
      +
      '(' + indexed_actors['last_name'] + ')'
       
      - -
      - +
      - -
      - -
      Out[59]:
      - - - - +
      Out[59]:
      name     birth
       Eric     1943           NaN
      @@ -3551,12 +2887,9 @@ 

      NaN neboli NULL či N/A 1940 (Gilliam) Name: last_name, dtype: object

      -
      -
      -
      @@ -3567,27 +2900,18 @@

      NaN neboli NULL či N/A

      -
      In [60]:
      +
      In [60]:
      -
      -
      indexed_actors['last_name'].isnull()
      +
      +
      indexed_actors['last_name'].isnull()
       
      - -
      - +
      - -
      - -
      Out[60]:
      - - - - +
      Out[60]:
      name     birth
       Eric     1943      True
      @@ -3598,12 +2922,9 @@ 

      NaN neboli NULL či N/A 1940 False Name: last_name, dtype: bool

      -
      -
      -
      @@ -3614,26 +2935,18 @@

      NaN neboli NULL či N/A

      -
      In [61]:
      +
      In [61]:
      -
      -
      indexed_actors.fillna('')
      +
      +
      indexed_actors.fillna('')
       
      - -
      - +
      - -
      - -
      Out[61]:
      - - - +
      Out[61]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alivelast_name
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942FalseJones
      1940TrueGilliam
      alivelast_name
      namebirth
      Eric1943True
      Graham1941False
      John1939True
      Michael1943True
      Terry1942FalseJones
      1940TrueGilliam
      -
      -
      -
      @@ -3718,26 +3028,18 @@

      NaN neboli NULL či N/A

      -
      In [62]:
      +
      In [62]:
      -
      -
      indexed_actors.dropna()
      +
      +
      indexed_actors.dropna()
       
      - -
      - +
      - -
      - -
      Out[62]:
      - - - +
      Out[62]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
      alivelast_name
      namebirth
      Terry1942FalseJones
      1940TrueGilliam
      alivelast_name
      namebirth
      Terry1942FalseJones
      1940TrueGilliam
      -
      -
      -
      @@ -3800,7 +3099,7 @@

      NaN neboli NULL či N/A

      Merge -# +#

      Někdy se stane, že máme více souvisejících tabulek, které je potřeba spojit dohromady. Na to mají DataFrame metodu merge(), která umí podobné operace jako JOIN v SQL.

      @@ -3808,27 +3107,19 @@

      Merge

      -
      In [63]:
      +
      In [63]:
      -
      -
      actors = pandas.read_csv('static/actors.csv', index_col=None)
      +
      +
      actors = pandas.read_csv('static/actors.csv', index_col=None)
       actors
       
      - -
      - +
      - -
      - -
      Out[63]:
      - - - +
      Out[63]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      namebirthalive
      0Terry1942False
      1Michael1943True
      2Eric1943True
      3Graham1941False
      4Terry1940True
      5John1939True
      -
      -
      -
      -
      In [64]:
      +
      In [64]:
      -
      -
      spouses = pandas.read_csv('static/spouses.csv', index_col=None)
      +
      +
      spouses = pandas.read_csv('static/spouses.csv', index_col=None)
       spouses
       
      - -
      - +
      - -
      - -
      Out[64]:
      - - - +
      Out[64]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthspouse_name
      0Graham1941David Sherlock
      1John1939Connie Booth
      2John1939Barbara Trentham
      3John1939Alyce Eichelberger
      4John1939Jennifer Wade
      5Terry1940Maggie Westo
      6Eric1943Lyn Ashley
      7Eric1943Tania Kosevich
      8Terry1942Alison Telfer
      9Terry1942Anna Söderström
      10Michael1943Helen Gibbins
      namebirthspouse_name
      0Graham1941David Sherlock
      1John1939Connie Booth
      2John1939Barbara Trentham
      3John1939Alyce Eichelberger
      4John1939Jennifer Wade
      5Terry1940Maggie Westo
      6Eric1943Lyn Ashley
      7Eric1943Tania Kosevich
      8Terry1942Alison Telfer
      9Terry1942Anna Söderström
      10Michael1943Helen Gibbins
      -
      -
      -
      -
      In [65]:
      +
      In [65]:
      -
      -
      actors.merge(spouses)
      +
      +
      actors.merge(spouses)
       
      - -
      - +
      - -
      - -
      Out[65]:
      - - - +
      Out[65]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      namebirthalivespouse_name
      0Terry1942FalseAlison Telfer
      1Terry1942FalseAnna Söderström
      2Michael1943TrueHelen Gibbins
      3Eric1943TrueLyn Ashley
      4Eric1943TrueTania Kosevich
      5Graham1941FalseDavid Sherlock
      6Terry1940TrueMaggie Westo
      7John1939TrueConnie Booth
      8John1939TrueBarbara Trentham
      9John1939TrueAlyce Eichelberger
      10John1939TrueJennifer Wade
      namebirthalivespouse_name
      0Terry1942FalseAlison Telfer
      1Terry1942FalseAnna Söderström
      2Michael1943TrueHelen Gibbins
      3Eric1943TrueLyn Ashley
      4Eric1943TrueTania Kosevich
      5Graham1941FalseDavid Sherlock
      6Terry1940TrueMaggie Westo
      7John1939TrueConnie Booth
      8John1939TrueBarbara Trentham
      9John1939TrueAlyce Eichelberger
      10John1939TrueJennifer Wade
      -
      -
      -
      @@ -4168,7 +3434,7 @@

      Merge

      Přesýpání dat -# +#

      @@ -4183,10 +3449,10 @@

      Přesýpání dat

      -
      In [66]:
      +
      In [66]:
      -
      -
      import itertools
      +
      +
      import itertools
       import random
       random.seed(0)
       
      @@ -4196,11 +3462,9 @@ 

      Přesýpání dat for a, b in itertools.product(months, categories) if random.randrange(20) > 0])

      - -
      - +
      @@ -4211,27 +3475,19 @@

      Přesýpání dat

      -
      In [67]:
      +
      In [67]:
      -
      -
      # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
      +
      +
      # Prvních pár řádků (dá se použít i např. head(10), bylo by jich víc)
       data.head()
       
      - -
      - +
      - -
      - -
      Out[67]:
      - - - +
      Out[67]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      categorymonthsales
      0Electronics2015-01-315890
      1Power Tools2015-01-313242
      2Clothing2015-01-316961
      3Electronics2015-02-283969
      4Power Tools2015-02-284866
      categorymonthsales
      0Electronics2015-01-315890
      1Power Tools2015-01-313242
      2Clothing2015-01-316961
      3Electronics2015-02-283969
      4Power Tools2015-02-284866
      -
      -
      -
      -
      In [68]:
      +
      In [68]:
      -
      -
      # Celkový počet řádků
      +
      +
      # Celkový počet řádků
       len(data)
       
      - -
      - +
      - -
      - -
      Out[68]:
      - - - - +
      Out[68]:
      67
      -
      -
      -
      -
      In [69]:
      +
      In [69]:
      -
      -
      data['sales'].describe()
      +
      +
      data['sales'].describe()
       
      - -
      - +
      - -
      - -
      Out[69]:
      - - - - +
      Out[69]:
      count      67.000000
       mean     4795.552239
      @@ -4364,12 +3596,9 @@ 

      Přesýpání dat max 9817.000000 Name: sales, dtype: float64

      -
      -
      -
      @@ -4380,27 +3609,19 @@

      Přesýpání dat

      -
      In [70]:
      +
      In [70]:
      -
      -
      indexed = data.set_index(['category', 'month'])
      +
      +
      indexed = data.set_index(['category', 'month'])
       indexed.head()
       
      - -
      - +
      - -
      - -
      Out[70]:
      - - - +
      Out[70]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      categorymonth
      Electronics2015-01-315890
      Power Tools2015-01-313242
      Clothing2015-01-316961
      Electronics2015-02-283969
      Power Tools2015-02-284866
      sales
      categorymonth
      Electronics2015-01-315890
      Power Tools2015-01-313242
      Clothing2015-01-316961
      Electronics2015-02-283969
      Power Tools2015-02-284866
      -
      -
      -
      @@ -4474,27 +3692,19 @@

      Přesýpání dat

      -
      In [71]:
      +
      In [71]:
      -
      -
      unstacked = indexed.unstack('month')
      +
      +
      unstacked = indexed.unstack('month')
       unstacked
       
      - -
      - +
      - -
      - -
      Out[71]:
      - - - +
      Out[71]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
      category
      Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
      Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
      Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
      sales
      month2015-01-312015-02-282015-03-312015-04-302015-05-312015-06-302015-07-312015-08-312015-09-302015-10-31...2016-02-292016-03-312016-04-302016-05-312016-06-302016-07-312016-08-312016-09-302016-10-312016-11-30
      category
      Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
      Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
      Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0

      3 rows × 23 columns

      -
      -
      -
      @@ -4657,27 +3864,19 @@

      Přesýpání dat

      -
      In [72]:
      +
      In [72]:
      -
      -
      unstacked.columns = unstacked.columns.droplevel()
      +
      +
      unstacked.columns = unstacked.columns.droplevel()
       unstacked
       
      - -
      - +
      - -
      - -
      Out[72]:
      - - - +
      Out[72]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
      category
      Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
      Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
      Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0
      month2015-01-31 00:00:002015-02-28 00:00:002015-03-31 00:00:002015-04-30 00:00:002015-05-31 00:00:002015-06-30 00:00:002015-07-31 00:00:002015-08-31 00:00:002015-09-30 00:00:002015-10-31 00:00:00...2016-02-29 00:00:002016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:002016-06-30 00:00:002016-07-31 00:00:002016-08-31 00:00:002016-09-30 00:00:002016-10-31 00:00:002016-11-30 00:00:00
      category
      Clothing6961.02578.09131.0618.04796.08052.07989.0NaN31.07896.0...4194.02059.0471.05410.08663.09817.06969.0-735.04448.0-259.0
      Electronics5890.03969.01281.07725.04409.04180.06253.0NaN7086.08298.0...6290.02966.09039.01450.03515.08497.0349.09324.0919.018.0
      Power Tools3242.04866.01289.01407.08171.09492.03267.05534.02996.02909.0...8769.02012.06807.0314.02858.06382.09039.02119.05095.01397.0

      3 rows × 23 columns

      -
      -
      -
      @@ -4836,36 +4032,24 @@

      Přesýpání dat

      -
      In [73]:
      +
      In [73]:
      -
      -
      unstacked.loc['Electronics'].sum()
      +
      +
      unstacked.loc['Electronics'].sum()
       
      - -
      - +
      - -
      - -
      Out[73]:
      - - - - +
      Out[73]:
      103742.0
      -
      -
      -
      @@ -4876,26 +4060,18 @@

      Přesýpání dat

      -
      In [74]:
      +
      In [74]:
      -
      -
      unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
      +
      +
      unstacked.loc[['Electronics', 'Power Tools'], '2016-03':'2016-05']
       
      - -
      - +
      - -
      - -
      Out[74]:
      - - - +
      Out[74]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
      category
      Electronics2966.09039.01450.0
      Power Tools2012.06807.0314.0
      month2016-03-31 00:00:002016-04-30 00:00:002016-05-31 00:00:00
      category
      Electronics2966.09039.01450.0
      Power Tools2012.06807.0314.0
      -
      -
      -
      @@ -4957,27 +4130,18 @@

      Přesýpání dat

      -
      In [75]:
      +
      In [75]:
      -
      -
      unstacked.loc['Clothing']
      +
      +
      unstacked.loc['Clothing']
       
      - -
      - +
      - -
      - -
      Out[75]:
      - - - - +
      Out[75]:
      month
       2015-01-31    6961.0
      @@ -5005,12 +4169,9 @@ 

      Přesýpání dat 2016-11-30 -259.0 Name: Clothing, dtype: float64

      -
      -
      -
      @@ -5023,7 +4184,7 @@

      Přesýpání dat

      Grafy -# +#

      @@ -5038,19 +4199,17 @@

      Grafy

      -
      In [76]:
      +
      In [76]:
      -
      -
      import matplotlib
      +
      +
      import matplotlib
       
       # Zapnout zobrazování grafů (procento uvozuje „magickou” zkratku IPythonu):
       %matplotlib inline
       
      - -
      - +
      @@ -5061,42 +4220,26 @@

      Grafy

      -
      In [77]:
      +
      In [77]:
      -
      -
      unstacked.loc['Clothing'].dropna().plot()
      +
      +
      unstacked.loc['Clothing'].dropna().plot()
       
      - -
      - +
      - -
      - -
      Out[77]:
      - - - - +
      Out[77]:
      <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab57c0470>
      -
      -
      - -
      - - - - -
      -
      +
      +No description has been provided for this imageGrafy S237vATegIORNe6SvPRr3PfvlXbOcJDGDXvpdIPnjnrq/q4EtOlHM5z7yfgp/afjpD9lOEjT3VBv CduUiJZJ3reM/6CWmaR/z12KNN0FcFlKeQDWwPm2wUlW/Q/tR+oFMrPf/0RpGruySpIalpUkSQ3D QZLUMBwkSQ3DQZLUMBwkSQ3DQZLUMBwkSQ3DQZLU+AJEtyR17cKllgAAAABJRU5ErkJggg== -" -> +"/>
      -
      -
      -
      @@ -5458,9 +4597,9 @@

      Grafy import matplotlib.pyplot # Plot -unstacked.loc['Clothing'].plot() +unstacked.loc['Clothing'].plot() matplotlib.pyplot.show() -matplotlib.pyplot.savefig('graph.png') +matplotlib.pyplot.savefig('graph.png')

      Funkce show a savefig pracují s „aktuálním” grafem – typicky posledním, který se vykreslil. Pozor na to, že funkce savefig aktuální graf zahodí; před dalším show nebo savefig je potřeba ho vykreslit znovu.

      @@ -5474,45 +4613,29 @@

      Grafy

      -
      In [78]:
      +
      In [78]:
      -
      -
      # Jak se postupně vyvíjely zisky z oblečení?
      +
      +
      # Jak se postupně vyvíjely zisky z oblečení?
       # `.T` udělá transpozici tabulky (vymění řádky a sloupce)
       # `cumsum()` spočítá průběžný součet po sloupcích
       unstacked.T.fillna(0).cumsum().plot()
       
      - -
      - +
      - -
      - -
      Out[78]:
      - - - - +
      Out[78]:
      <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5733160>
      -
      -
      - -
      - - - - -
      -
      +
      +No description has been provided for this imageGrafy s6RhTPUdr/C4vMLzcpzee2Wnkk7O11Oxbhnn7+17up0xDcqShjF17xtgLJw61ZRdxToZR3BOVxnj 8+yvF2Pq3rM4q+ilAIWcnua8Uqp62L2QvhX4DFhe/yEaUzM2y60xxhiP2ekpY4wxHrOkYYwxxmOW NIwxxnjMkoYxxhiPWdIwxhjjMUsaxhhjPGZJwxhjjMf+H0VCpa8qrD5ZAAAAAElFTkSuQmCC -" -> +"/>
      -
      -
      -
      -
      In [79]:
      +
      In [79]:
      -
      -
      # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
      +
      +
      # Jak si proti sobě stály jednotlivé kategorie v březnu, dubnu a květnu 2016?
       unstacked.loc[:, '2016-03':'2016-05'].plot.bar(legend=False)
       
      - -
      - +
      - -
      - -
      Out[79]:
      - - - - +
      Out[79]:
      <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab567ae10>
      -
      -
      - -
      - - - - -
      -
      +
      +No description has been provided for this imageGrafy +P8HZnnwyNnAP1bVHVvoIz0oPAksbYUkOwL3VtX6JM8C3l9VT51tvRm281ngtKo6f96LlGbhOQBp 6+wPnN2P578HeP1cVk6yB91ewjf98NdQ3AOQpEZ5DkCSGmUASFKjDABJapQBIEmNMgAkqVH/H5Hp 1WkeGrroAAAAAElFTkSuQmCC -" -> +"/>
      -
      -
      -
      @@ -6048,7 +5147,7 @@

      Grafy

      Groupby -# +#

      Často používaná operace pro zjednodušení tabulky je groupby, která sloučí dohromady řádky se stejnou hodnotou v některém sloupci a sloučená data nějak agreguje.

      @@ -6056,26 +5155,18 @@

      Groupby

      -
      In [80]:
      +
      In [80]:
      -
      -
      data.head()
      +
      +
      data.head()
       
      - -
      - +
      - -
      - -
      Out[80]:
      - - - +
      Out[80]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      categorymonthsales
      0Electronics2015-01-315890
      1Power Tools2015-01-313242
      2Clothing2015-01-316961
      3Electronics2015-02-283969
      4Power Tools2015-02-284866
      categorymonthsales
      0Electronics2015-01-315890
      1Power Tools2015-01-313242
      2Clothing2015-01-316961
      3Electronics2015-02-283969
      4Power Tools2015-02-284866
      -
      -
      -
      @@ -6149,36 +5237,24 @@

      Groupby

      -
      In [81]:
      +
      In [81]:
      -
      -
      data.groupby('category')
      +
      +
      data.groupby('category')
       
      - -
      - +
      - -
      - -
      Out[81]:
      - - - - +
      Out[81]:
      <pandas.core.groupby.DataFrameGroupBy object at 0x7f4ab8363f28>
      -
      -
      -
      @@ -6189,26 +5265,18 @@

      Groupby

      -
      In [82]:
      +
      In [82]:
      -
      -
      data.groupby('category').sum()
      +
      +
      data.groupby('category').sum()
       
      - -
      - +
      - -
      - -
      Out[82]:
      - - - +
      Out[82]:
      - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      category
      Clothing112701
      Electronics103742
      Power Tools104859
      sales
      category
      Clothing112701
      Electronics103742
      Power Tools104859
      -
      -
      -
      @@ -6266,26 +5331,18 @@

      Groupby

      -
      In [83]:
      +
      In [83]:
      -
      -
      data.groupby('category').count()
      +
      +
      data.groupby('category').count()
       
      - -
      - +
      - -
      - -
      Out[83]:
      - - - +
      Out[83]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      monthsales
      category
      Clothing2222
      Electronics2222
      Power Tools2323
      monthsales
      category
      Clothing2222
      Electronics2222
      Power Tools2323
      -
      -
      -
      @@ -6348,26 +5402,18 @@

      Groupby

      -
      In [84]:
      +
      In [84]:
      -
      -
      data.groupby(['category', 'month']).sum().head()
      +
      +
      data.groupby(['category', 'month']).sum().head()
       
      - -
      - +
      - -
      - -
      Out[84]:
      - - - +
      Out[84]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      categorymonth
      Clothing2015-01-316961
      2015-02-282578
      2015-03-319131
      2015-04-30618
      2015-05-314796
      sales
      categorymonth
      Clothing2015-01-316961
      2015-02-282578
      2015-03-319131
      2015-04-30618
      2015-05-314796
      -
      -
      -
      @@ -6436,26 +5479,18 @@

      Groupby

      -
      In [85]:
      +
      In [85]:
      -
      -
      data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
      +
      +
      data.groupby('category').agg(['mean', 'median', sum, pandas.Series.kurtosis])
       
      - -
      - +
      - -
      - -
      Out[85]:
      - - - +
      Out[85]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      meanmediansumkurt
      category
      Clothing5122.7727276185.5112701-1.298035
      Electronics4715.5454554294.5103742-1.353210
      Power Tools4559.0869573769.0104859-1.044767
      sales
      meanmediansumkurt
      category
      Clothing5122.7727276185.5112701-1.298035
      Electronics4715.5454554294.5103742-1.353210
      Power Tools4559.0869573769.0104859-1.044767
      -
      -
      -
      @@ -6532,27 +5564,19 @@

      Groupby

      -
      In [86]:
      +
      In [86]:
      -
      -
      g = data.groupby('month')
      +
      +
      g = data.groupby('month')
       g.describe()
       
      - -
      - +
      - -
      - -
      Out[86]:
      - - - +
      Out[86]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      countmeanstdmin25%50%75%max
      month
      2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
      2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
      2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
      2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
      2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
      2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
      2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
      2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
      2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
      2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
      2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
      2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
      2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
      2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
      2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
      2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
      2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
      2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
      2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
      2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
      2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
      2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
      2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
      sales
      countmeanstdmin25%50%75%max
      month
      2015-01-313.05364.3333331914.4148803242.04566.05890.06425.56961.0
      2015-02-283.03804.3333331152.8539952578.03273.53969.04417.54866.0
      2015-03-313.03900.3333334529.8919781281.01285.01289.05210.09131.0
      2015-04-303.03250.0000003895.490855618.01012.51407.04566.07725.0
      2015-05-313.05792.0000002069.3412004409.04602.54796.06483.58171.0
      2015-06-303.07241.3333332747.2206564180.06116.08052.08772.09492.0
      2015-07-313.05836.3333332388.4156533267.04760.06253.07121.07989.0
      2015-08-311.05534.000000NaN5534.05534.05534.05534.05534.0
      2015-09-303.03371.0000003542.41796031.01513.52996.05041.07086.0
      2015-10-313.06367.6666673002.0297022909.05402.57896.08097.08298.0
      2015-11-303.03917.6666673273.148688494.02368.54243.05629.57016.0
      2015-12-313.05225.3333332377.5870823769.03853.53938.05953.57969.0
      2016-01-313.08453.666667536.4311087852.08239.58627.08754.58882.0
      2016-02-293.06417.6666672290.1703724194.05242.06290.07529.58769.0
      2016-03-313.02345.666667537.7381642012.02035.52059.02512.52966.0
      2016-04-303.05439.0000004444.797408471.03639.06807.07923.09039.0
      2016-05-313.02391.3333332675.235566314.0882.01450.03430.05410.0
      2016-06-303.05012.0000003178.8776322858.03186.53515.06089.08663.0
      2016-07-313.08232.0000001732.7651316382.07439.58497.09157.09817.0
      2016-08-313.05452.3333334539.188621349.03659.06969.08004.09039.0
      2016-09-303.03569.3333335183.962802-735.0692.02119.05721.59324.0
      2016-10-313.03487.3333332247.644174919.02683.54448.04771.55095.0
      2016-11-303.0385.333333887.008643-259.0-120.518.0707.51397.0
      -
      -
      -
      @@ -6869,29 +5890,21 @@

      Groupby

      -
      In [87]:
      +
      In [87]:
      -
      -
      bin_size = 10000
      +
      +
      bin_size = 10000
       by_month = data.groupby('month').sum()
       by_thousands = by_month.groupby(by_month['sales'] // bin_size * bin_size).agg(['count', 'sum'])
       by_thousands
       
      - -
      - +
      - -
      - -
      Out[87]:
      - - - +
      Out[87]:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      sales
      countsum
      sales
      0530651
      1000015218870
      20000371781
      sales
      countsum
      sales
      0530651
      1000015218870
      20000371781
      -
      -
      -
      -
      In [88]:
      +
      In [88]:
      -
      -
      by_thousands[('sales', 'sum')].plot()
      +
      +
      by_thousands[('sales', 'sum')].plot()
       
      - -
      - +
      - -
      - -
      Out[88]:
      - - - - +
      Out[88]:
      <matplotlib.axes._subplots.AxesSubplot at 0x7f4ab5588240>
      -
      -
      - -
      - - - - -
      -
      +
      +No description has been provided for this imageGroupby tmSMKb3zgedFJA9vOu8IvJeiTQM24Y1EP4mqnnCnMo92x3AqAy/hTQ+e7sYEeFFV9wflVRgTQJbC bIwxJmBsd5kxxpiAsSZjjDEmYKzJGGOMCRhrMsYYYwLGmowxxpiAsSZjjDEmYKzJGGOMCRhrMsYY YwLm/wFs+GhAV4F94AAAAABJRU5ErkJggg== -" -> +"/>
      -
      -
      -
      - - diff --git a/mi-pyt/pyqt/index.html b/mi-pyt/pyqt/index.html index 1238638c..e94e4096 100644 --- a/mi-pyt/pyqt/index.html +++ b/mi-pyt/pyqt/index.html @@ -23,7 +23,7 @@

      PyQt5

      Pokud nic z toho nepomůže, můžete zkusit přeložit PyQt5 ze zdrojových souborů (návod).

      První aplikace níže by vám měla fungovat.

      -

      Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

      +

      Pokud narazíte na chybu Could not find or load the Qt platform plugin "xcb", podívejte se do naší issue.

      Qt5 Designer #

      @@ -204,7 +204,7 @@

      Qt Designer známých mj. ze starých her.

      Aplikace bude mít část s mapou, paletu pro výběr dlaždice ke kreslení a navíc menu a panel nástrojů pro akce jako ukládání a otevírání souborů:

      -

      Obrázek aplikace

      +

      Obrázek aplikace

      Vytvářet GUI v kódu je poměrně neefektivní, a tak existuje nástroj, kde si okna můžeme „naklikat“. Jmenuje se Qt Designer a měli byste ho mít nainstalovaný. Na školních počítačích se spouští příkazem designer -qt=5.

      diff --git a/mi-pyt/requests/index.html b/mi-pyt/requests/index.html index 5c8180a9..078857f1 100644 --- a/mi-pyt/requests/index.html +++ b/mi-pyt/requests/index.html @@ -96,7 +96,7 @@

      Použití session většinou přidává specifické hlavičky (jak je tomu i zde). Lze ji nastavit buďto na celé session nebo předat argumentem auth s každým požadavkem.

      -

      Existují předpřipravené funkce v modulu requests.auth, například +

      Existují předpřipravené funkce v modulu requests.auth, například requests.auth.HTTPBasicAuth provádí základní HTTP přihlášení. Dle specifikace zakóduje jméno a heslo pomocí algoritmu base64 a přidá hlavičku Authorization.

      @@ -147,9 +147,7 @@

      Chraňte své tokeny >>> config['github']['token'] 'd7313dab254b7fd0d0f3ec3cbf754b3abce462d5'

      Do souboru .gitignore pak musíte přidat název ignorovaného souboru, např.:

      -
      auth.cfg
      -
      -

      Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže +

      auth.cfg

      Ověřte si, že git soubor auth.cfg opravdu ignoruje, t.j. soubor se neukáže ve výstupu git status.

      Jelikož ostatní tento konfigurační soubor neuvidí, je vhodné jim vysvětlit, jak takový soubor (s jejich údaji) vytvořit. diff --git a/mi-pyt/testing/index.1.html b/mi-pyt/testing/index.1.html index e60305ce..218ae782 100644 --- a/mi-pyt/testing/index.1.html +++ b/mi-pyt/testing/index.1.html @@ -442,14 +442,15 @@

      Varování

      Komprimované citlivé údaje #

      -

      Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle +

      Problém může nastat, pokud je token či jiná citlivá informace uložena jako část v těle odpovědi (případně i požadavku) a zároveň je toto tělo zprávy zkomprimováno (defaultní -chování, viz dokumentace). -V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit -hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, +chování, viz dokumentace). +V takovém případě je potřeba k tomu, aby šlo v kazetě nahradit citlivé údaje, upravit +hlavičku Accept-Encoding v betamax_session tak, aby neobsahovala *, gzip, compress ani deflate:

      -
      betamax_session.headers.update({'Accept-Encoding': 'identity'})

      Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou -nijak transformována, více viz Wikipedia +

      betamax_session.headers.update({'Accept-Encoding': 'identity'})
      +

      Kódování 'identity' má shodné chování jako '' a to, že data ve zprávě nejsou +nijak transformována, více viz Wikipedia a specifikace HTTP)

      Které HTTP požadavky jsou stejné? # @@ -506,7 +507,8 @@

      Testování aplikací v clicku appmodule.py tests/ test_app.py - ...

      nebo do něj:

      + ... +

      nebo do něj:

      setup.py
       mypkg/
           __init__.py
      @@ -514,7 +516,8 @@ 

      Testování aplikací v clicku ... test/ test_app.py - ...

      První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. + ... +

      První způsob je preferovaný, protože pomáhá udržovat kód a testy oddělené. Pokud ho použijete, nedávejte do něj __init__.py – není to importovatelný Pythonní modul, ale jen sada souborů s testy.

      Ve druhém případě mějte na paměti, že pytest pouští testy jako samostatné @@ -544,7 +547,8 @@

      Spouštění testů pomocí )

      a přidat následující sekci do setup.cfg:

      [aliases]
      -test=pytest

      Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude +test=pytest +

      Příkaz python setup.py test by měl fungovat, ale neočekává se, že bude podporovat další argumenty pytestu (jako -v). Na to uživatel spustí pytest samotný.

      Další informace jsou v dokumentaci pytestu.

      diff --git a/mi-pyt/venv-setup/index.html b/mi-pyt/venv-setup/index.html index 151e1443..3f7546b0 100644 --- a/mi-pyt/venv-setup/index.html +++ b/mi-pyt/venv-setup/index.html @@ -60,16 +60,16 @@

      Přepnutí

      Unix (Linux, macOS)

      $ pwd
       /home/helena/naucse-python
       
      -$ ls
      +

      $ ls 00

      -

      Windows

      > cd
      -C:\Users\Helena\naucse-python
      -
      -> dir
      +

      Windows

      > cd
      +C:\Users\Helena\naucse-python

      +

      > dir Directory of C:\Users\Helena\naucse-python 05/08/2014 07:28 PM <DIR> 00 -

      Virtuální prostředí +

      +

      Virtuální prostředí #

      Teď si vytvoříš virtuální prostředí pro Python.

      @@ -87,24 +87,24 @@

      Windows

      > <
       
      • Linux:

        Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

        -
         $ python3 -m venv venv
        +příkazů.
        +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
        +takže nejdřív zkus:

        +
        $ python3 -m venv venv
         

        A jestli dostaneš chybu No module named venv, zkus místo toho:

        -
         $ virtualenv -p python3 venv
        +
        $ virtualenv -p python3 venv
         
      • macOS:

        -
         $ python3 -m venv venv
        +
        $ python3 -m venv venv
         
      • Windows:

        Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

        -
         > py -3 -m venv venv
        +příkazů.
        +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
        +takže nejdřív zkus:

        +
        > py -3 -m venv venv
         

        A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

        -
         > python3 -m venv venv
        +
        > python3 -m venv venv
         

      Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. @@ -119,7 +119,9 @@

      Windows

      > <
        Directory of C:\Users\Helena\naucse-python
       05/08/2014 07:28 PM <DIR>  00
       05/08/2014 07:38 PM <DIR>  venv
      -

      V grafickém prohlížeči souborů to vypadá např. takto:

      +
      + +

      V grafickém prohlížeči souborů to vypadá např. takto:

      (adresáře '00' a 'venv' vedle sebe)

      Aktivace virtuálního prostředí # @@ -133,7 +135,9 @@

      Windows

      > <
       je příkaz pro Windows složitější:

      > &powershell -ExecutionPolicy bypass
       > venv/Scripts/Activate.ps1
      -

      Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky +

      + +

      Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

      Aktivační příkaz si zapiš.

      diff --git a/pyladies/and-or/index.html b/pyladies/and-or/index.html index 5c7fb6d3..da4a94e4 100644 --- a/pyladies/and-or/index.html +++ b/pyladies/and-or/index.html @@ -26,7 +26,9 @@

      Nebo anebo a not False
      not 5 < 3 „ne“ -

      Například, chceš-li zjistit, jestli je kterékoli z dvou čísel záporné, + + +

      Například, chceš-li zjistit, jestli je kterékoli z dvou čísel záporné, můžeš napsat:

      a = float(input("Zadej první stranu obdélníka: "))
       b = float(input("Zadej druhou stranu obdélníka: "))
      diff --git a/pyladies/asteroids/index.html b/pyladies/asteroids/index.html
      index 1bbd9eb5..02f48ff7 100644
      --- a/pyladies/asteroids/index.html
      +++ b/pyladies/asteroids/index.html
      @@ -22,15 +22,19 @@ 

      Hra typu Asteroids

      První krok bude naprogramovat vesmírnou loď, která půjde ovládat klávesnicí.

        -
      • Vesmírnou loď bude reprezentovat objekt třídy Spaceship.
      • -
      • Každá loď má vlastní atributy x a y (pozice), +
      • Vesmírnou loď bude reprezentovat objekt třídy Spaceship.

        +
      • +
      • Každá loď má vlastní atributy x a y (pozice), x_speed a y_speed (rychlost), rotation (úhel natočení) a -sprite (2D objekt v Pygletu s polohou, rotací a obrázkem).

      • -
      • Loď má metodu tick, která obstarává -mechaniku týkající se lodi – posouvání, natáčení a ovládání.
      • -
      • Všechny objekty ve hře si budeme dávat do globálního seznamu objects. -Zatím tam bude jenom vesmírná loď.
      • -
      • Co se ovládání týče, stisknuté klávesy si uchovávej v množině (angl. set), +sprite (2D objekt v Pygletu s polohou, rotací a obrázkem).

        +
      • +
      • Loď má metodu tick, která obstarává +mechaniku týkající se lodi – posouvání, natáčení a ovládání.

        +
      • +
      • Všechny objekty ve hře si budeme dávat do globálního seznamu objects. +Zatím tam bude jenom vesmírná loď.

        +
      • +
      • Co se ovládání týče, stisknuté klávesy si uchovávej v množině (angl. set), což je datový typ podobný seznamu, jen nemá dané pořadí prvků a každý prvek v ní může být pouze jednou. (Na množinu se dá dívat i jako na slovník bez hodnot.) @@ -39,10 +43,12 @@

        Hra typu Asteroids tutoriál i podrobný popis. Vesmírná loď se pak do množiny „podívá” v rámci -své metody tick.

      • -
      • Můžeš použít sadu obrázků, +své metody tick.

        +
      • +
      • Můžeš použít sadu obrázků, které nakreslil Kenney Vleugels -a zpřístupnil je zadarmo komukoli. Nebo si nakresli/stáhni vlastní!

      • +a zpřístupnil je zadarmo komukoli. Nebo si nakresli/stáhni vlastní!

        +
      • Ve hře později použijeme velké množství Sprite-ů a vykreslovat je jeden po druhém by trvalo docela dlouho. Všechny Sprite-y proto přidej do kolekce @@ -72,23 +78,23 @@

        Hra typu Asteroids
      • Základní pohyb raketky je jednoduchý: k x-ové souřadnici se přičte x-ová rychlost krát uplynulý čas a to samé v y-ové souřadnici i pro úhel otočení:

        -
          self.x = self.x + dt * self.x_speed
        -  self.y = self.y + dt * self.y_speed
        -  self.rotation = self.rotation + dt * rotation_speed
        +
        self.x = self.x + dt * self.x_speed
        +self.y = self.y + dt * self.y_speed
        +self.rotation = self.rotation + dt * rotation_speed
         

        Rychlost otáčení závisí na stisknutých šipkách (doleva nebo doprava). - V jednom případě je záporná, v druhém kladná. Vhodnou hodnotu zvol - experimentováním – začni třeba u 4 radiánů za sekundu. - Všechny podobné „magické hodnoty“ je vhodné definovat - jako konstanty – tedy proměnné, které na začátku nastavíš a nikdy - je neměníš. Bývá zvykem je označovat velkými písmeny a dávat je na - začátek souboru, hned za importy:

        -
          ROTATION_SPEED = 4  # radians per second
        +V jednom případě je záporná, v druhém kladná. Vhodnou hodnotu zvol
        +experimentováním – začni třeba u 4 radiánů za sekundu.
        +Všechny podobné „magické hodnoty“ je vhodné definovat
        +jako konstanty – tedy proměnné, které na začátku nastavíš a nikdy
        +je neměníš. Bývá zvykem je označovat velkými písmeny a dávat je na
        +začátek souboru, hned za importy:

        +
        ROTATION_SPEED = 4  # radians per second
         
      • Zrychlení je trochu složitější: k x-ové rychlosti se přičte kosinus úhlu otočení krát uplynulý čas. U y-ové osy se použije sinus.

        -
          self.x_speed += dt * ACCELERATION * math.cos(self.rotation)
        -  self.y_speed += dt * ACCELERATION * math.sin(self.rotation)
        +
        self.x_speed += dt * ACCELERATION * math.cos(self.rotation)
        +self.y_speed += dt * ACCELERATION * math.sin(self.rotation)
         

        Všimni si v příkladu konstanty ACCELERATION. Tu opět zvol podle uvážení.

      • Když máš hodnoty self.x, self.y a self.rotation spočítané, nezapomeň @@ -97,17 +103,16 @@

        Hra typu Asteroids kdežto pyglet používá pro Sprite.rotation stupně. (A k tomu je navíc 0° jinde, a otáčí se na opačnou stranu.) Pro sprite je tedy potřeba úhel převést:

        -
          self.sprite.rotation = 90 - math.degrees(self.rotation)
        -  self.sprite.x = self.x
        -  self.sprite.y = self.y
        +
        self.sprite.rotation = 90 - math.degrees(self.rotation)
        +self.sprite.x = self.x
        +self.sprite.y = self.y
         

      • -
      • Když raketka vyletí z okýnka ven, vrať +
      • Když raketka vyletí z okýnka ven, vrať ji zpátky do hry na druhé straně okýnka. -(Zkontroluj si, že to funguje na všech čtyřech stranách.)

      • -

      +(Zkontroluj si, že to funguje na všech čtyřech stranách.)

    -
      +
    • Bonus 1: Zkus si přidat několik raketek, každou trochu jinak natočenou.

      Každý jednotlivý objekt třídy Spaceship @@ -169,7 +174,7 @@

      Asteroidy a ke každému asteroidu se přiřadí náhodně vybraný obrázek. (V Asteroidech je levý a pravý okraj v podstatě - to samé; a stejně tak horní a spodní.)

    • +to samé; a stejně tak horní a spodní.)
    • A pak pár asterojdíků různých velikostí přidej na začátku do hry.
    @@ -182,11 +187,12 @@

    Kolize

    Naše asteroidy jsou zatím docela neškodné. Pojďme to změnit.

      -
    • V této sekci bude tvým úkolem zjistit, kdy +
    • V této sekci bude tvým úkolem zjistit, kdy loď narazila do asteroidu. Pro zjednodušení si každý objekt nahradíme kolečkem a budeme počítat, kdy se srazí kolečka. -Každý objekt bude potřebovat mít poloměr – atribut radius.

    • +Každý objekt bude potřebovat mít poloměr – atribut radius.

      +
    • Aby bylo vidět co si hra o objektech „myslí”, nakresli si nad každým objektem příslušné kolečko. Pyglet na to má třídu Circle v modulu @@ -199,13 +205,14 @@

      Kolize zbytkem vesmíru.

      Až to bude všechno fungovat, můžeš kolečka dát pryč.

    • -
    • Když asteroid narazí do lodi, loď exploduje a zmizí. +
    • Když asteroid narazí do lodi, loď exploduje a zmizí. Explozi necháme na později, teď je důležité odebrání objektu ze hry. Dej ho do metody SpaceObject.delete, protože vyndávat ze hry se dá jakýkoli objekt. V této metodě musíš objekt jednak odstranit ze seznamu objects a pak zrušit jeho Sprite, aby se už v rámci -batch nevykresloval.

    • +batch nevykresloval.

      +
    • A jak udělat ono narážení? V rámci Spaceship.tick projdi každý objekt, zjisti jestli vzdálenost mezi lodí @@ -247,25 +254,29 @@

      Útok

      Teď zkusíme asteroidy rozbíjet.

        -
      • Raketka umí jednou za 0,3 s vystřelit laser. +
      • Raketka umí jednou za 0,3 s vystřelit laser. Ulož si pro každou raketku (jako atribut) číslo, které po každém výstřelu nastav na 0,3 a pak ho v metodě tick nech klesat o 1 za vteřinu. -Když bude záporné, může hráč vystřelit znovu.

      • -
      • Když hráč drží mezerník a může vystřelit, vystřelí. +Když bude záporné, může hráč vystřelit znovu.

        +
      • +
      • Když hráč drží mezerník a může vystřelit, vystřelí. Ve hře se to projeví tak, že se přidá objekt nové třídy Laser. Začne na souřadnicích raketky, s natočením raketky -a s rychlostí raketky plus něco navíc ve směru natočení.

      • -
      • Každý objekt třídy Laser si „pamatuje“, +a s rychlostí raketky plus něco navíc ve směru natočení.

        +
      • +
      • Každý objekt třídy Laser si „pamatuje“, jak dlouho ještě bude ve hře. Na začátku se tohle číslo nastaví tak, aby přeletěl zhruba něco víc než jednu obrazovku. -Když dojde čas, Laser zmizí.

      • -
      • Ve své metodě tick laser projde +Když dojde čas, Laser zmizí.

        +
      • +
      • Ve své metodě tick laser projde všechny objekty, a pokud se s některým překrývá, tak na něm zavolá metodu hit_by_laser. U většiny objektů tahle metoda nedělá nic, -jen asteroidy bude rozbíjet.

      • +jen asteroidy bude rozbíjet.

        +
      • Když se laser dotkne asteroidu, asteroid se rozdělí na dva menší (nebo, je-li už příliš malý, zmizí úplně).

        Rychlosti nových asteroidů si můžeš nastavit @@ -273,7 +284,8 @@

        Útok asteroid letěl jinam. Většinou bývají nové asteroidy rychlejší než ten původní.

      • -
      • A to je vše! Máš funkční hru!
      • +
      • A to je vše! Máš funkční hru!

        +

      Povedlo se? Dá se i vyhrát? Čas to všechno dát do Gitu!

      Dokončení a rozšíření diff --git a/pyladies/basic-functions/index.html b/pyladies/basic-functions/index.html index df9120df..e18f7411 100644 --- a/pyladies/basic-functions/index.html +++ b/pyladies/basic-functions/index.html @@ -42,11 +42,13 @@

      Řešení

      -

      Převádění typů + + +

      Převádění typů #

      Co ale když nechceme pracovat s řetězcem, ale třeba s číslem? diff --git a/pyladies/basics/index.html b/pyladies/basics/index.html index c4698f26..cabf3d32 100644 --- a/pyladies/basics/index.html +++ b/pyladies/basics/index.html @@ -43,7 +43,8 @@

      Repozitář Pak vytvoř gitový repozitář (angl. repository) pomocí příkazu git init:

      $ git init
      -Initialized empty Git repository in .../.git/

      Na první pohled to vypadá, že se nic nestalo. +Initialized empty Git repository in .../.git/ +

      Na první pohled to vypadá, že se nic nestalo. Tenhle příkaz totiž vytvořil skrytý adresář .git, do kterého uložil nějaké informace. Přesvědč se příkazem ls -a (Linux) nebo dir /a (Windows). @@ -57,7 +58,8 @@

      Repozitář No commits yet -nothing to commit (create/copy files and use "git add" to track)

      „On branch master” říká něco o větvích, k tomu se vrátíme později. +nothing to commit (create/copy files and use "git add" to track) +

      „On branch master” říká něco o větvích, k tomu se vrátíme později. „No commits yet” říká, že zatím nemáš uloženou žádnou revizi. A „nothing to commit” říká, že je adresář prázdný – nejsou tu žádné soubory k verzování.

      @@ -79,12 +81,14 @@

      První revize Untracked files: (use "git add <file>..." to include in what will be committed) - basnicka.txt + basnicka.txt -nothing added to commit but untracked files present (use "git add" to track)

      U každého nového souboru musíme Gitu říct, že +nothing added to commit but untracked files present (use "git add" to track) +

      U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveď to se svojí básničkou:

      -
      $ git add basnicka.txt

      a znovu zkontroluj stav repozitáře:

      +
      $ git add basnicka.txt
      +

      a znovu zkontroluj stav repozitáře:

      $ git status
       On branch master
       
      @@ -92,14 +96,17 @@ 

      První revize Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: basnicka.txt

      To, co je zelené („changes to be committed“), + new file: basnicka.txt + +

      To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříš. Pojď tedy vytvořit revizi:

      $ git commit
       [master (root-commit) eb0fcd9] První revize
        1 file changed, 6 insertions(+)
      - create mode 100644 basnicka.txt

      Po zadání tohoto příkazu se otevře editor, + create mode 100644 basnicka.txt +

      Po zadání tohoto příkazu se otevře editor, do kterého musíš napsat nějaký popisek, abys věděl/a, co tahle revize obsahuje za změny. Pro začátek napiš jen První revize. @@ -129,7 +136,8 @@

      První revize

      Znovu zkus vypsat stav repozitáře:

      $ git status
       On branch master
      -nothing to commit, working tree clean

      Tenhle krátký výstup znamená, že od poslední revize +nothing to commit, working tree clean +

      Tenhle krátký výstup znamená, že od poslední revize se nic nezměnilo. Což dává smysl – poslední revizi jsi právě vytvořil/a!

      A co všechno je v téhle první/poslední revizi? @@ -152,7 +160,8 @@

      První revize + +V potoce je hastrmánek +Zatahá tě za copánek -+Holka modrooká, nesedávej tam

      Vidíš unikátní ++Holka modrooká, nesedávej tam +

      Vidíš unikátní označení revize, pomocí kterého se vždy bude dát dostat k této konkrétní verzi projektu. @@ -179,9 +188,10 @@

      První revize Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) - modified: basnicka.txt + modified: basnicka.txt -no changes added to commit (use "git add" and/or "git commit -a")

      Soubor je opět červený! Něco se v něm změnilo! +no changes added to commit (use "git add" and/or "git commit -a") +

      Soubor je opět červený! Něco se v něm změnilo! Ale co? Na to nám odpoví příkaz git diff.

      $ git diff
      @@ -201,7 +211,8 @@ 

      První revize Zatahá tě za copánek -Holka modrooká, nesedávej tam +Holka modrooká -+Nesedávej tam

      Změny se ukazují po řádcích. ++Nesedávej tam +

      Změny se ukazují po řádcích. Červeně, s -, jsou ukázány odebrané řádky; zeleně s + řádky přidané.

      @@ -219,13 +230,16 @@

      První revize opět od 1. řádku, ale narostl na 9).

      Jsi-li se změnami spokojen/a, řekni Gitu, ať je použije v další revizi:

      -
      $ git add basnicka.txt

      A pro úplnost se znovu koukni, co říká +

      $ git add basnicka.txt
      +

      A pro úplnost se znovu koukni, co říká status – co je zelené, přidá se do další revize.

      On branch master
       Changes to be committed:
         (use "git restore --staged <file>..." to unstage)
      -    modified:   basnicka.txt

      Než uděláš druhou revizi, ještě řeknu něco o tom, + modified: basnicka.txt + +

      Než uděláš druhou revizi, ještě řeknu něco o tom, jak správně psát k revizím popisky. Na to je totiž úzus, který téměř všichni programátoři respektují: na prvním řádku je krátké shrnutí změn, @@ -242,10 +256,11 @@

      První revize Verše básně se většinou píšou na jednotlivé řádky. Myslím, že takhle se to líp čte. (Ale, co si budeme povídat, hlavní -důvod je ukázat co dělá git diff.)

      Nebude-li se ti někdy dařit shrnout změnu +důvod je ukázat co dělá git diff.) +

      Nebude-li se ti někdy dařit shrnout změnu v 70 znacích, zamysli se, jestli neděláš moc velkou -změnu najednou – např. "změna řetězce X -a dopsání nového cyklu Y" by bylo lepší uložit +změnu najednou – např. "změna řetězce X +a dopsání nového cyklu Y" by bylo lepší uložit jako dvě různé revize.

      Pomocí git commit vytvoř druhou revizi. Pak ji zkontroluj:

      @@ -276,7 +291,8 @@

      První revize Zatahá tě za copánek -Holka modrooká, nesedávej tam +Holka modrooká -+Nesedávej tam

      Diagram ++Nesedávej tam +

      Diagram #

      Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém @@ -304,7 +320,8 @@

      Log Author: Adéla Novotná <adela.novotna@example.cz> Date: Mon May 18 16:18:40 2020 +0200 - První revize

      Git log vypíše všechny revize od té nejnovější až po + První revize +

      Git log vypíše všechny revize od té nejnovější až po úplný začátek projektu.

      Až budeš mít verzí tolik, že se nevejdou najednou na obrazovku, můžeš se v logu pohybovat pomocí šipek a diff --git a/pyladies/branching/index.html b/pyladies/branching/index.html index 15403799..5943df35 100644 --- a/pyladies/branching/index.html +++ b/pyladies/branching/index.html @@ -24,7 +24,8 @@

      Větvení v Gitu

      Podívej se, jaké máš větve ve svém repozitáři. K tomu slouží příkaz git branch:

      $ git branch
      -* master

      Je tam jenom jedna a jmenuje se master +* master +

      Je tam jenom jedna a jmenuje se master – to je tradičně jméno „hlavní” větve.

      K vytvoření nové větve znovu použiješ git branch, jen tomu příkazu dáš navíc @@ -34,7 +35,8 @@

      Větvení v Gitu
      $ git branch doplneni-autora
       $ git branch
         doplneni-autora
      -* master

      Tenhle příkaz sice udělal novou větev, +* master +

      Tenhle příkaz sice udělal novou větev, ale nepřepnul do ní. Hvězdička ve výstupu z git branch ukazuje, že stále pracuješ v master. @@ -43,7 +45,8 @@

      Větvení v Gitu Switched to branch 'doplneni-autora' $ git branch * doplneni-autora - master

      Tak. Teď jsi „ve” větvi doplneni-autora. + master +

      Tak. Teď jsi „ve” větvi doplneni-autora. Doplň nějaké jméno na začátek souboru basnicka.txt, a pomocí git add a git commit udělej novou revizi. Pak koukni na gitk --all, jak to vypadá:

      @@ -63,7 +66,8 @@

      Větvení v Gitu $ git branch doplneni-autora * doplneni-jmena - master

      Doplň jméno básně na začátek souboru (tedy na stejné místo, + master +

      Doplň jméno básně na začátek souboru (tedy na stejné místo, jako je v druhé větvi název) a pomocí git add, git commit ulož revizi. Všechno zkontroluj přes gitk --all.

      @@ -98,7 +102,8 @@

      Sloučení Updating 1fcd654..5c9bf93 Fast-forward basnicka.txt | 3 +++ - 1 file changed, 3 insertions(+)

      Sloučeno! Ono „Fast-forward” znamená, že + 1 file changed, 3 insertions(+) +

      Sloučeno! Ono „Fast-forward” znamená, že vlastně nebylo co slučovat – jen se do větve master přidaly nové změny. Zkontroluj v gitk --all, jak to vypadá.

      @@ -109,7 +114,8 @@

      Sloučení
      $ git merge doplneni-autora
       Auto-merging basnicka.txt
       CONFLICT (content): Merge conflict in basnicka.txt
      -Automatic merge failed; fix conflicts and then commit the result.

      A když ne?

      +Automatic merge failed; fix conflicts and then commit the result. +

      A když ne?

      Jestli se konflikt neobjevil, Git změny sloučil sám. Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti někdy „podaří“ konflikt udělat.

      @@ -123,9 +129,10 @@

      Sloučení Unmerged paths: (use "git add <file>..." to mark resolution) - both modified: basnicka.txt + both modified: basnicka.txt -no changes added to commit (use "git add" and/or "git commit -a")

      V tom případě se na soubor podívej v editoru: objeví +no changes added to commit (use "git add" and/or "git commit -a") +

      V tom případě se na soubor podívej v editoru: objeví se v něm obsah z obou konfliktních verzí, společně se značkami <<<<<<<, ======= a >>>>>>>, které upozorňují na místo kde konflikt nastal.

      @@ -143,7 +150,8 @@

      Sloučení ++>>>>>>> doplneni-autora Holka modrooká - Nesedávej u potoka

      Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu + Nesedávej u potoka +

      Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu jako Python chybové hlášky: tedy aby ti co nejvíce pomohl. Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se ti řešení konfliktu co nejvíc usnadnit.

      @@ -157,7 +165,8 @@

      Sloučení Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.

      $ git add basnicka.txt
       $ git commit
      -[master 884b30a] Merge branch 'doplneni-autora'

      Povedlo se?

      +[master 884b30a] Merge branch 'doplneni-autora' +

      Povedlo se?

      Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master

      Pokud ano, můžeš staré větve vymazat – všechny jejich změny jsou v master a nemá na nich cenu @@ -167,4 +176,5 @@

      Sloučení $ git branch --delete doplneni-jmena Deleted branch doplneni-jmena (was 5c9bf93). $ git branch -* master

      Gratuluji, už umíš větvení a slučování!

      \ No newline at end of file +* master +

      Gratuluji, už umíš větvení a slučování!

      \ No newline at end of file diff --git a/pyladies/class/index.html b/pyladies/class/index.html index 40358206..5e85d80b 100644 --- a/pyladies/class/index.html +++ b/pyladies/class/index.html @@ -31,8 +31,8 @@

      Hodnoty a objekty #

      Data každého objektu jsou specifická pro konkrétní -objekt ("abc" obsahuje jiné znaky než -"def"), ale funkčnost – metody – bývají +objekt ("abc" obsahuje jiné znaky než +"def"), ale funkčnost – metody – bývají společné pro všechny objekty daného typu. Třeba řetězcová metoda count() by se dala napsat zhruba jako:

      diff --git a/pyladies/cmdline/index.html b/pyladies/cmdline/index.html index 6454ba49..fcc6b4bf 100644 --- a/pyladies/cmdline/index.html +++ b/pyladies/cmdline/index.html @@ -40,12 +40,15 @@

      Příkazová řádka

      Unix (Linux, macOS)

      $
       

      Windows

      >
      -

      Podle systému se potom liší i samotné příkazy, které budeš zadávat: + + +

      Podle systému se potom liší i samotné příkazy, které budeš zadávat: Unixové systémy (Linux a macOS) rozumí jiným příkazům než Windows.

      Velikost písma

      Je-li ve Windows moc malé písmo, klikni na ikonku okna a vyber Možnosti. -V záložce Písmo si pak můžeš vybrat větší font. -

      +V záložce Písmo si pak můžeš vybrat větší font.

      + +

      Screenshot menu příkazové řádky

      Na ostatních systémech hledej v nastavení, nebo zkus Ctrl++ a @@ -63,7 +66,9 @@

      Unix

      $ 
       

      Windows

      > whoami
       pocitac\Helena
      -

      Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš +

      + +

      Znak $ nebo > je v ukázce jen proto, aby bylo jasné že zadáváš příkaz do příkazové řádky. Vypíše ho počítač, většinou ještě s něčím před ním, takže ho nepiš sám/sama! Zadej jen whoami a Enter.

      @@ -83,7 +88,9 @@

      Unix

      $ 
       

      Windows

      > cd
       C:\Users\helena
      -

      Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem + + +

      Aktuální adresář se většinou ukazuje i ve výzvě příkazové řádky, před znakem $ nebo >. Ale je dobré pwd/cd znát, kdyby ses náhodou ztratil/a. Občas totiž bývá vypsaný zkráceně. @@ -114,7 +121,9 @@

      Windows

      > <
       05/08/2014 07:28 PM <DIR>  Downloads
       05/08/2014 07:28 PM <DIR>  Music
       
      -

      Změna aktuálního adresáře + + +

      Změna aktuálního adresáře #

      Aktuální adresář se dá změnit pomocí příkazu cd @@ -134,7 +143,9 @@

      Unix

      $ 
                       

      Windows

      > cd Desktop
       > cd
       C:\Users\helena\Desktop
      -

      Poznámka pro Windows

      +
      + +

      Poznámka pro Windows

      Pokud přecházíš do adresáře na jiném disku, například D: místo C:, je potřeba kromě cd zadat jméno disku s dvojtečkou jako zvláštní příkaz (např. D:).

      @@ -149,7 +160,9 @@

      Windows

      > <
                       

      Unix

      $ mkdir zkouska
       

      Windows

      > mkdir zkouska
      -

      Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. + + +

      Vypiš si teď obsah aktuálního adresáře pomocí ls nebo dir. Jeden z vypsaných adresářů bude zkouska.

      Když je adresář vytvořený, můžeš do něj přejít podobně jako jsi před chvílí přešel/přešla na Desktop nebo Plocha:

      @@ -157,7 +170,9 @@

      Windows

      > <
                       

      Unix

      $ cd zkouska
       

      Windows

      > cd zkouska
      -

      V grafickém hledátku + + +

      V grafickém hledátku #

      Často nebudeš pracovat jenom s příkazovou řádkou. @@ -178,7 +193,9 @@

      macOS

      Windows

      Screenshot průzkumníka na Windows -

      Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je + + +

      Možná umíš v tomhle programu klikáním „donavigovat“ do adresáře, který je aktivní v příkazové řádce. V budoucnu to ale bude složitější, takže bude dobré si vyzkoušet kopírovat text z příkazové řádky a vložit ho do prohlížeče souborů.

      @@ -194,7 +211,9 @@

      Unix

      $ 
       

      Windows

      > cd
       C:\Users\helena\Desktop\zkouska
      -

      Kopírování z příkazové řádky + + +

      Kopírování z příkazové řádky #

      Na Linuxu vyber text myší a pak buď:

      @@ -237,9 +256,9 @@

      Vkládání do příkazové řádky
    • macOS: ⌘ Command+V
    • Windows: Menu EditPaste
    -

    Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, +

    Pokud jsou ve jménu mezery nebo jiné speciální znaky jako *#$%^()><;"?, musíš ho v příkazové řádce ještě uzavřít do uvozovek: před a za jméno napiš -", např:

    +", např:

    $ cd "můj super adresář"
     

    Lepší je ale mezery a zvláštní znaky ve jménech souborů nepoužívat.

    Pozorování změn @@ -274,7 +293,9 @@

    Unix

    $ 
                     

    Windows

    > cd ..
     > cd
     C:\Users\helena\Desktop
    -

    Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem + + +

    Další cd .. by tě přesunulo do dalšího nadřazeného adresáře – v našem příkladu helena.

    Konec # @@ -332,5 +353,7 @@

    Přehled ukončení exit -

    Další příkazy jako python nebo git si vysvětlíme až budou potřeba, + + +

    Další příkazy jako python nebo git si vysvětlíme až budou potřeba, po tom, co si je nainstaluješ.

    \ No newline at end of file diff --git a/pyladies/collaboration/index.html b/pyladies/collaboration/index.html index d15b81dd..3198a583 100644 --- a/pyladies/collaboration/index.html +++ b/pyladies/collaboration/index.html @@ -42,7 +42,9 @@

    Spolupráce
  • svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
  • svoboda redistribuovat kopie programu,
  • svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.
  • -

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) + + +

    Dnes je spousta projektů s otevřeným zdrojovým kódem (tzv. open-source projektů) dostupná na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

    @@ -224,19 +226,25 @@

    Vytvoření větve který máš na GitHubu ty. (Pozor, v příkazu je tvojejmeno dvakrát!)

    $ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka
    -

    a zkontroluj si, že se to povedlo:

    + + +

    a zkontroluj si, že se to povedlo:

    $ git remote -v
     origin  git@github.com:naucse/prezencka.git (fetch)
     origin  git@github.com:naucse/prezencka.git (push)
     tvojejmeno      https://github.com/tvojejmeno/prezencka (fetch)
     tvojejmeno      https://github.com/tvojejmeno/prezencka (push)
    -

    Tolik k nastavení – git remote add + + +

    Tolik k nastavení – git remote add stačí udělat jednou pro každý repozitář. Pak už můžeš změny nahrávat pomocí:

    $ git push tvojejmeno pridani-jmena
    -

    což znamená: pošli na adresu uloženou pod zkratkou + + +

    což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev pridani-jmena.

    Funguje? Podívej se na diff --git a/pyladies/comparisons/index.html b/pyladies/comparisons/index.html index 7819c44c..a638ed2f 100644 --- a/pyladies/comparisons/index.html +++ b/pyladies/comparisons/index.html @@ -30,7 +30,9 @@

    Porovnávání 3 ** 2 Umocnění (3 na druhou) -

    Python ale zná i další druhy operátorů. + + +

    Python ale zná i další druhy operátorů. Důležité jsou operátory porovnávací. Zkus si co dělají! (Buď z programu pomocí print, @@ -56,7 +58,9 @@

    Porovnávání 3 <= 5, 3 >= 5 Menší nebo rovno, větší nebo rovno -

    Hodnoty porovnání jsou takzvané booleovské hodnoty + + +

    Hodnoty porovnání jsou takzvané booleovské hodnoty (angl. boolean, podle G. Boolea). V Pythonu je můžeš použít vždycky, když potřebuješ vědět, jestli něco platí nebo neplatí. @@ -101,11 +105,13 @@

    Řešení

    -

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. + + +

    A nyní řekni počítači, aby se na základě hodnoty této proměnné rozhodl, co má udělat. K tomu můžeš použít dvojici příkazů if (pokud) a else (jinak):

    strana = float(input('Zadej stranu čtverce v centimetrech: '))
    diff --git a/pyladies/course.json b/pyladies/course.json
    index ae7bee96..d10bcc8b 100644
    --- a/pyladies/course.json
    +++ b/pyladies/course.json
    @@ -144,7 +144,7 @@
                         "index": {
                             "attribution": [
                                 "Pro PyLadies Brno napsal Petr Viktorin, 2014-2017.",
    -                            "Založeno na tutoriálu Django Girls."
    +                            "Založeno na tutoriálu [Django Girls].\n[Django Girls]: https://tutorial.djangogirls.org/en/intro_to_command_line/"
                             ],
                             "content": {
                                 "path": "cmdline/index.html"
    @@ -470,7 +470,7 @@
                             "slug": "index",
                             "solutions": [
                                 {
    -                                "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " + "content": "

    Každý řádek končí znakem nového řádku, '\\n',\nkterý možná znáš ze sekce o řetězcích.\nPři procházení souboru Python tento znak nechává na konci řetězce radek ¹.\nFunkce print pak přidá další nový řádek, protože ta na konci\nvýpisu vždycky odřádkovává – pokud nedostane argument end=''.

    \n
    \n

    ¹ Proč to dělá? Kdyby '\\n' na konci řádků nebylo,\nnedalo by se např. dobře rozlišit, jestli poslední řádek\nkončí na '\\n'

    " } ], "source_file": "lessons/beginners/files/index.md", @@ -1558,7 +1558,7 @@ "content": "

    Nedostal/a – dostal/a jsi šesté písmeno.

    " }, { - "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯
    " + "content": "
    print('Čokoláda'[-1])  # → a\nprint('Čokoláda'[-2])  # → d\nprint('Čokoláda'[-3])  # → á\nprint('Čokoláda'[-4])  # → l\n

    Záporná čísla vybírají písmenka od konce.

    \n
       [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  ╭───┬───┬───┬───┬───┬───┬───┬───╮\n  │ Č │ o │ k │ o │ l │ á │ d │ a │\n  ╰───┴───┴───┴───┴───┴───┴───┴───╯\n
    " }, { "content": "

    Zápis retezec[5:] vybere podřetězec od znaku číslo 5 dál.

    " diff --git a/pyladies/def/index.html b/pyladies/def/index.html index c780e573..4b333123 100644 --- a/pyladies/def/index.html +++ b/pyladies/def/index.html @@ -109,12 +109,14 @@

    Řešení

    -

    Vracení ukončuje funkci + + +

    Vracení ukončuje funkci #

    Speciální příkaz return, který jde použít jenom ve funkcích, vrátí danou diff --git a/pyladies/dict/index.html b/pyladies/dict/index.html index 748f4a20..3195a738 100644 --- a/pyladies/dict/index.html +++ b/pyladies/dict/index.html @@ -137,7 +137,7 @@

    Jak udělat slovník

    Pozor na to, že v tomhle případě musí být klíče pythonní „jména“ – musí být použitelné jako jména proměnných. Například takhle nejde zadat jako klíč řetězec -"def" nebo "propan-butan".

    +"def" nebo "propan-butan".

    Zaplň prázdný slovník #

    diff --git a/pyladies/exceptions/index.html b/pyladies/exceptions/index.html index 6ab53866..a7f138e8 100644 --- a/pyladies/exceptions/index.html +++ b/pyladies/exceptions/index.html @@ -94,7 +94,8 @@

    Druhy chyb │ ╰── IndentationError špatné odsazení │ ╰── TabError kombinování mezer a tabulátorů v odsazení ├── TypeError špatný typ, např. len(9) - ╰── ValueError špatná hodnota, např. int('xyz')

    Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, + ╰── ValueError špatná hodnota, např. int('xyz') +

    Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit, vždy najdeš v příslušné chybové hlášce.

    Když odchytáváš obecnou výjimku, chytnou se i všechny podřízené typy výjimek – diff --git a/pyladies/files/index.html b/pyladies/files/index.html index 4857abe5..2dc93387 100644 --- a/pyladies/files/index.html +++ b/pyladies/files/index.html @@ -93,16 +93,18 @@

    Řešení

    -

    Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce + + +

    Ideální způsob, jak odřádkování spravit, je odstranit z konce řetězce bílé znaky (mezery a nové řádky) pomocí metody rstrip:

    print('Slyšela jsem tuto básničku:')
     print()
    diff --git a/pyladies/first-steps/index.html b/pyladies/first-steps/index.html
    index d87f4682..d84e4f62 100644
    --- a/pyladies/first-steps/index.html
    +++ b/pyladies/first-steps/index.html
    @@ -75,7 +75,9 @@ 

    První příkaz
     >>> quit()
     (venv)$
    -

    Zobáčky >>> se změnily na výzvu +

    + +

    Zobáčky >>> se změnily na výzvu příkazové řádky, která začíná (venv) a končí $ nebo >. Teď fungují příkazy jako whoami a cd, ale příkazy Pythonu jako 1 + 2 fungovat nebudou, dokud Python opět nepustíš pomocí diff --git a/pyladies/fstring/index.html b/pyladies/fstring/index.html index 80def15a..7a166210 100644 --- a/pyladies/fstring/index.html +++ b/pyladies/fstring/index.html @@ -12,19 +12,23 @@

    Šablony (formátovací řetězce)

    To ale není tak přehledné, jak by mohlo. Lze to zpřehlednit použitím šablony.

    Takovou šablonu si představ jako formulář s vynechanými místy:

    -
    Součet je __________.

    Složitější šablona by byla třeba tahle:

    +
    Součet je __________.
    +

    Složitější šablona by byla třeba tahle:

    Mil[ý/á] _______,
     Váš výsledek je __________.
     
     S pozdravem,
    -_________

    Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba +_________ +

    Aby Python věděl, do kterého vynechaného místa co doplnit, je potřeba jednotlivá vynechaná místa ve formuláři nějak jednoznačně označit. Použijme jména v „kudrnatých“ závorkách:

    -
    Součet je {soucet}.
    Mil{y_a} {osloveni},
    +
    Součet je {soucet}.
    +
    Mil{y_a} {osloveni},
     Váš výsledek je {soucet}.
     
     S pozdravem,
    -{podpis}.

    Takovou šablonu můžeš použít jako formátovací řetězec +{podpis}. +

    Takovou šablonu můžeš použít jako formátovací řetězec (angl. formatted string literal, zkráceně f-string). Jako jakýkoli jiný řetězec ji vlož do uvozovek. diff --git a/pyladies/functions/index.html b/pyladies/functions/index.html index 97557c22..abc9c91e 100644 --- a/pyladies/functions/index.html +++ b/pyladies/functions/index.html @@ -31,8 +31,10 @@

    Funkce

    Ne že by neexistovaly programovací jazyky, na které je potřeba speciální klávesnice. Třeba program v jazyce APL laik jednoduše ani nenapíše, ani nepřečte:

    -

    -
    ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’

    Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, + + +

    ⍎’⎕’,∈Nρ⊂S←’←⎕←(3=T)∨M∧2=T←⊃+/(V⌽”⊂M),(V⊖”⊂M),(V,⌽V)⌽”(V,V←1¯1)⊖”⊂M’
    +

    Expert v APL může být vysoce produktivní, ale Python se zaměřuje spíš na to, aby se dal snadno naučit. A tak používá symboly jen pro ty nejčastější operace. Operátorů, které využívají symboly, je tak málo, že už jich zhruba půlku znáš!

    @@ -61,7 +63,9 @@

    Funkce [ ] ( ) { } . -

    Všechno ostatní vyjádříme slovně.

    + + +

    Všechno ostatní vyjádříme slovně.

    Délka řetězce #

    @@ -136,7 +140,7 @@

    Délka řetězce

    Procedury #

    -

    Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") +

    Možná sis všiml/a, že jednu funkci už voláš déle: print("Ahoj!") je taky volání funkce. Stejně jako len dostává print v závorkách argument – hodnotu, se kterou pracuje. @@ -190,7 +194,9 @@

    Řešení

    -

    Pojmenované argumenty + + +

    Pojmenované argumenty #

    Některé funkce umí pracovat i s pojmenovanými argumenty. diff --git a/pyladies/github-api/index.html b/pyladies/github-api/index.html index f6e8976b..7a4bd959 100644 --- a/pyladies/github-api/index.html +++ b/pyladies/github-api/index.html @@ -23,7 +23,7 @@

    Autorizace
    • Přihlaš se na github.com.
    • Jdi na nastavení Personal Accesss Tokens.
    • -
    • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
    • +
    • Vytvoř si nový token ("Generate new token"). Nezaškrtávej žádná oprávnění navíc.
    • Zkopíruj si token (dlouhý řetězec), které takto dostaneš, do souboru token.txt.

    Pozor!

    @@ -95,9 +95,10 @@

    Uživatelský účet

    API Githubu toho umí mnohem víc. Třeba na adrese https://api.github.com/emojis na tebe čeká -slovník s adresami malých obrázků. +slovník s adresami malých obrázků.

    -Celé API je zdokumentováno na adrese + +

    Celé API je zdokumentováno na adrese developer.github.com.

    Interakce # diff --git a/pyladies/hello-world/index.html b/pyladies/hello-world/index.html index 45840307..f47b8c18 100644 --- a/pyladies/hello-world/index.html +++ b/pyladies/hello-world/index.html @@ -59,7 +59,7 @@

    Spuštění zkušenějšího programátora.

    Typografická vsuvka

    V Pythonu je většinou jedno, kde napíšeš mezeru. Stejně jako náš příkaz -print("Ahoj světe!") by fungovalo třeba:

    +print("Ahoj světe!") by fungovalo třeba:

    print      (   "Ahoj světe!"     )
     

    Je ale zvykem dodržovat určitá pravidla. Jako v češtině se po otvírací závorce a za @@ -68,5 +68,5 @@

    Spuštění „Správně“ je tedy:

    print("Ahoj světe!")
     

    V rámci uvozovek má pak každá mezera význam: když napíšeš -" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

    +" Ahoj světe!", mezery navíc se objeví ve výsledné hlášce.

    \ No newline at end of file diff --git a/pyladies/ignoring/index.html b/pyladies/ignoring/index.html index 0e7d669e..3fc7fc97 100644 --- a/pyladies/ignoring/index.html +++ b/pyladies/ignoring/index.html @@ -4,24 +4,27 @@

    Ignorování souborů

    Často se stává, že některé soubory v repozitáři nechceš. Takových souborů jsou tři hlavní druhy:

    -
    Pomocné soubory nástrojů

    Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými +

    Pomocné soubory nástrojů
    +
    Python občas „sám od sebe“ vytváří adresář __pycache__ s pomocnými soubory, aby zrychlil importování modulů. Některé počítače vytváří skryté soubory s názvy jako .Thumbnails, .DS_Store nebo Thumbs.db. Takové věci v repozitáři nemají co dělat – je -dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

    -
    Výstup programu a nastavení

    Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři +dobrým zvykem do Gitu nedávat nic, co jde vytvořit automaticky.

    +
    Výstup programu a nastavení
    +
    Píšeš-li program, který kreslí obrázky, většinou chceš v repozitáři jen samotný program. -Obrázky si může pomocí programu každý vytvořit sám.

    -

    : Podobně fungují soubory s heslem: pokud program potřebuje heslo - např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně - k dispozici, musí si každý vytvořit soubor s heslem sám.

    -
    -
    Osobní soubory

    Občas se stane, že v adresáři s repozitářem máš soubor s osobními +Obrázky si může pomocí programu každý vytvořit sám.

    +
    Podobně fungují soubory s heslem: pokud program potřebuje heslo +např. k nějaké webové službě, ale svoje heslo nechceš dávat veřejně +k dispozici, musí si každý vytvořit soubor s heslem sám.
    +
    Osobní soubory
    +
    Občas se stane, že v adresáři s repozitářem máš soubor s osobními poznámkami. Zbytek repozitáře plánuješ zveřejnit, ale tyto soubory by měly zůstat -jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

    -
    Adresář s virtuálním prostředím

    Jistě už sis zvykl/a na virtuální prostředí. +jen ve tvé kopii. A to včetně informace o tom, že takové soubory máš.

    +
    Adresář s virtuálním prostředím
    +
    Jistě už sis zvykl/a na virtuální prostředí. Adresář s ním se může jmenovat různě, v začátečnickém kurzu používáme název venv. Není dobré tento adresář dávat do Gitu, protože je jednoduché jej vždy vytvořit znovu @@ -30,8 +33,9 @@

    Ignorování souborů prostředí nebylo vždy na úplně stejném místě. Virtuální prostředí z adresáře /home/helena/projektABC/venv nebude fungovat z adresáře C:\Users\Helena\projektABC\venv, -ale ani z /home/mirka/projektABC/venv.

    -

    My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby +ale ani z /home/mirka/projektABC/venv. + +

    My budeme chtít Git nastavit tak, aby tyto soubory ignoroval: aby git status neukazoval červeně, že ještě nejsou v repozitáři.

    Příprava # @@ -51,7 +55,8 @@

    Příprava getcanvas().postscript(file='obrazek.ps')

  • poznamky.txt

    -
    Tohle je tajné!
  • +
    Tohle je tajné!
    +
  • Autofile.tmp

    Do tohohle souboru napiš cokoliv. Různé operační systémy a (jiné programy) vytváří různé soubory @@ -72,12 +77,13 @@

    Příprava Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp - obrazek.ps - obrazek.py - poznamky.txt + Autofile.tmp + obrazek.ps + obrazek.py + poznamky.txt -nothing added to commit but untracked files present (use "git add" to track)

    Spousta souborů, ale jen jeden z nich chceš v repozitáři. +nothing added to commit but untracked files present (use "git add" to track) +

    Spousta souborů, ale jen jeden z nich chceš v repozitáři. Co s těmi ostatními?

    Výstupy programu a pomocné soubory společných nástrojů # @@ -94,7 +100,8 @@

    Výstupy program (Pozor na tečku ve jménu souboru; na některých systémech se špatně zadává – doporučuji soubor vytvořit v programátorském editoru.) Do něj napiš:

    -
    obrazek.ps

    Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

    +
    obrazek.ps
    +

    Pak se podívej na git status. Obrázek už by ve výpisu neměl být!

    $ git status
     On branch master
     
    @@ -102,12 +109,13 @@ 

    Výstupy program Untracked files: (use "git add <file>..." to include in what will be committed) - .gitignore - Autofile.tmp - obrazek.py - poznamky.txt + .gitignore + Autofile.tmp + obrazek.py + poznamky.txt -nothing added to commit but untracked files present (use "git add" to track)

    Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

    +nothing added to commit but untracked files present (use "git add" to track) +

    Nový soubor .gitignore přidej do repozitáře společně se samotným programem:

    $ git add .gitignore obrazek.py
     $ git status
     On branch master
    @@ -116,13 +124,14 @@ 

    Výstupy program Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py + new file: .gitignore + new file: obrazek.py Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp - poznamky.txt

    Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou + Autofile.tmp + poznamky.txt +

    Když uděláš git commit a repozitář nasdílíš s ostatními, všichni dostanou .gitignore s instrukcí, že obrazek.ps do repozitáře nepatří.

    Jak ignorovat zbylé dva soubory?

    Osobní poznámky @@ -133,13 +142,14 @@

    Osobní poznámky soubor se stejným jménem.

    Dej ho tedy do souboru, který se nebude šířit s repozitářem. Tento soubor je .git/info/exclude. -(Může být trochu složité ho najít, protože adresář .git je skrytý. +(Může být trochu složité ho najít, protože adresář .git je skrytý. Nevidíš–li ho, napiš v editoru do okýnka pro otevření souboru .git a dostaneš se do něj.)

    Soubory v adresáři .git bys neměl/a měnit, protože se tak dá přijít o historii projektu. Ale exclude je výjimka. Napiš na konec tohoto souboru:

    -
    poznamky.txt

    A po uložení budou poznámky ignorovány!

    +
    poznamky.txt
    +

    A po uložení budou poznámky ignorovány!

    $ git status
     On branch master
     
    @@ -147,12 +157,13 @@ 

    Osobní poznámky Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py + new file: .gitignore + new file: obrazek.py Untracked files: (use "git add <file>..." to include in what will be committed) - Autofile.tmp

    Další haraburdí + Autofile.tmp +

    Další haraburdí #

    Některé programy automaticky vytvářejí pomocné soubory. @@ -171,8 +182,10 @@

    Osobní poznámky Já doporučuji ho pojmenovat .gitignore_global a dát ho do tvého domovského adresáře.

    Do souboru zase napiš jméno ignorovaného souboru:

    -
    Autofile.tmp

    Potom řekni Gitu, kde tento soubor najít:

    -
    $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global

    A měl by být ignorován:

    +
    Autofile.tmp
    +

    Potom řekni Gitu, kde tento soubor najít:

    +
    $ git config --global core.excludesfile /tmp/tmp.1spGPvBL5W/.gitignore_global
    +

    A měl by být ignorován:

    $ git status
     On branch master
     
    @@ -180,8 +193,9 @@ 

    Osobní poznámky Changes to be committed: (use "git rm --cached <file>..." to unstage) - new file: .gitignore - new file: obrazek.py

    Formát ignorovacího souboru + new file: .gitignore + new file: obrazek.py +

    Formát ignorovacího souboru #

    Ve všech třech „ignorovacích“ souborech lze samozřejmě uvést víc souborů: @@ -190,10 +204,12 @@

    Osobní poznámky
    • * ve jméně souboru nahradí část jména souboru. Takže pokud chceš ignorovat všechny soubory s příponou .tmp, můžeš napsat:

      -
      *.tmp
    • +
      *.tmp
      +
    • / na konci jména značí adresář. Chceš-li tedy ignorovat adresáře __pycache__ (což v Pythonním projektu chceš), napiš do .gitignore:

      -
      __pycache__/
    • +
      __pycache__/
      +

    Další detaily je možné najít v dokumentaci.

    Automatické přidávání diff --git a/pyladies/install-editor/atom.html b/pyladies/install-editor/atom.html index 39dbf04b..f1bf6ec9 100644 --- a/pyladies/install-editor/atom.html +++ b/pyladies/install-editor/atom.html @@ -30,7 +30,7 @@

    Kontrola stylu zdrojového kódu dokáže postarat. Do příkazové řádky zadej následující:

    $ python -m pip install flake8
     

    A nyní si nainstaluj plugin do samotného editoru. V hlavní nabídce vyber -„Soubor > Nastavení/File > Settings“ a v nabídce +„Soubor > Nastavení/File > Settings“ a v nabídce uprostřed okna vyber poslední položku „Instalovat/Install“. Do vyhledávacího pole zadej „linter-flake8“ a v seznamu nalezených pluginů klikni u položky stejného jména @@ -61,7 +61,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -72,7 +73,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install-editor/gedit.html b/pyladies/install-editor/gedit.html index edc59195..8d901bad 100644 --- a/pyladies/install-editor/gedit.html +++ b/pyladies/install-editor/gedit.html @@ -3,9 +3,14 @@

    Instalace Geditu

    Na Linuxu se Gedit instaluje jako ostatní programy:

    -
    Fedora
    $ sudo dnf install gedit
    -
    Ubuntu
    $ sudo apt-get install gedit
    -

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +
    Fedora
    +
    $ sudo dnf install gedit
    +
    +
    Ubuntu
    +
    $ sudo apt-get install gedit
    +
    + +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    Pro Windows a macOS se Gedit dá stáhnout z domovské stránky.

    Nastavení # @@ -13,21 +18,28 @@

    Nastavení

    Gedit se nastavuje v Předvolbách (Preferences).

    -
    Číslování řádků

    V sekci Zobrazit/View vyber +

    Číslování řádků
    +

    V sekci Zobrazit/View vyber Zobrazovat čísla řádků/Display Line Numbers.

    -
    Odsazování

    V sekci Editor vyber:

    +
    +
    Odsazování
    +

    V sekci Editor vyber:

    • Šířka tabulátorů/Tab width: 4
    • Vkládat mezery místo tabulátorů/Insert spaces instead of tabs
    • Povolit automatické odsazování/Enable automatic indentation

    -
    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +

    +
    Obarvování
    +

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle koncovky souboru – např. .py pro Python.

    Proto jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

    -

    Nácvik odsazování + + +

    Nácvik odsazování #

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. @@ -52,7 +64,8 @@

    Nastavení měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -63,7 +76,8 @@ 

    Nastavení Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install-editor/index.html b/pyladies/install-editor/index.html index 4e139c73..1446978a 100644 --- a/pyladies/install-editor/index.html +++ b/pyladies/install-editor/index.html @@ -28,18 +28,23 @@

    Co programátorský editor umí nástroje. Aby se nám programy upravovaly pohodlněji, mají několik vychytávek:

    -
    Podpora více souborů

    Větší projekty sestávají z více souborů, které můžeš mít v editoru -otevřené všechny najednou.

    -
    Číslování řádků

    Před každým řádkem se ukazuje číslo. -To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.

    -
    Odsazování

    V Pythonu je důležité, kolika mezerami řádek začíná. -Správně nastavený editor nám odsazování značně zjednoduší.

    -
    Obarvování

    Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám +

    Podpora více souborů
    +
    Větší projekty sestávají z více souborů, které můžeš mít v editoru +otevřené všechny najednou.
    +
    Číslování řádků
    +
    Před každým řádkem se ukazuje číslo. +To se bude velice hodit, až Python bude nadávat, že chyba je na řádku 183.
    +
    Odsazování
    +
    V Pythonu je důležité, kolika mezerami řádek začíná. +Správně nastavený editor nám odsazování značně zjednoduší.
    +
    Obarvování
    +
    Ačkoli nemůžeme u jednotlivých písmenek nastavovat barvu přímo, editor nám obarvením může napovědět, jak našim instrukcím bude počítač rozumět. Ale je to jenom nápověda: programátor s jinak nastaveným editorem může mít stejný soubor obarvený -docela jinak.

    -

    Pro ilustraci, takhle může v editoru vypadat kousek kódu:

    +docela jinak. + +

    Pro ilustraci, takhle může v editoru vypadat kousek kódu:

        1  @app.route('/courses/<course:course>/')
         2  def course_page(course):
         3      try:
    diff --git a/pyladies/install-editor/kate.html b/pyladies/install-editor/kate.html
    index 4b323670..36a0a058 100644
    --- a/pyladies/install-editor/kate.html
    +++ b/pyladies/install-editor/kate.html
    @@ -3,17 +3,24 @@ 

    Instalace Kate

    Na Linuxu se Kate instaluje jako ostatní programy:

    -
    Fedora
    $ sudo dnf install kate
    -
    Ubuntu
    $ sudo apt-get install kate
    -

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    +
    Fedora
    +
    $ sudo dnf install kate
    +
    +
    Ubuntu
    +
    $ sudo apt-get install kate
    +
    + +

    Používáš-li jiný Linux, předpokládám že programy instalovat umíš. :)

    Pro Windows a macOS se Kate dá stáhnout z domovské stránky.

    Nastavení #

    -
    Číslování řádků

    V menu Pohled/View vyber -Ukazovat čísla řádek/Show Line Numbers.

    -
    Odsazování

    V Menu Nastavení/Settings vyber +

    Číslování řádků
    +
    V menu Pohled/View vyber +Ukazovat čísla řádek/Show Line Numbers.
    +
    Odsazování
    +

    V Menu Nastavení/Settings vyber Nastavit 'Kate'/Configure Kate.

    Tam v Úpravy/Editing vyber Odsazování/Indentation.

    @@ -25,19 +32,24 @@

    Nastavení
  • Odsadit pomocí/Indentation width: 4 znaky
  • Klávesa Backspace zpětně odsazuje v úvodních mezerách/Backspace key in leading blank space unindents
  • -

    Obarvování

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle +

    +
    Obarvování
    +

    Obarvování funguje automaticky, ale způsob obarvování se vybírá podle koncovky souboru – např. .py pro Python.

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, měl/a bys ho co nejdřív uložit pod správným jménem.

    -
    Psaní < ve Windows

    Pokud používáš českou klávesnici, je možné, že ti ve výchozím nastavení +

    +
    Psaní < ve Windows
    +
    Pokud používáš českou klávesnici, je možné, že ti ve výchozím nastavení nepůjde v Kate napsat znak <. Při stisknutí kláves Ctrl+Alt+, nebo AltGr+, se místo napsání < zobrazí okno Nastavit klávesové zkratky/Configure keybord shortcuts. V tom případě v tomto okně najdi klávesovou zkratku pro Nastavit klávesové zkratky/Configure keybord shortcuts a změn ji na -Žádná/None.

    -

    Nácvik odsazování +Žádná/None. + +

    Nácvik odsazování #

    Jak už bylo zmíňeno, v Pythonu je důležité, kolika mezerami řádek začíná. @@ -62,7 +74,8 @@

    Nastavení měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -73,7 +86,8 @@ 

    Nastavení Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install-editor/notepad-plus-plus.html b/pyladies/install-editor/notepad-plus-plus.html index 9a3b24da..3f40c8e1 100644 --- a/pyladies/install-editor/notepad-plus-plus.html +++ b/pyladies/install-editor/notepad-plus-plus.html @@ -8,10 +8,12 @@

    Nastavení #

    -
    Odsazování

    V menu Nastavení zvol Předvolby a pak nastav -„Nastavení tabulátoru/Tab Settings“ na -„Zaměnit za mezery/Replace by Space“.

    -

    Obarvování bude fungovat automaticky v souborech s koncovkou .py +

    Odsazování
    +
    V menu Nastavení zvol Předvolby a pak nastav +„Nastavení tabulátoru/Tab Settings“ na +„Zaměnit za mezery/Replace by Space“.
    + +

    Obarvování bude fungovat automaticky v souborech s koncovkou .py (jako Python). V jiných programovacích jazycích se totiž odsazuje i obarvuje jinak.

    Proto, jakmile v tomhle editoru vytvoříš nový soubor, @@ -41,7 +43,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -52,7 +55,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install-editor/others.html b/pyladies/install-editor/others.html index 90afd615..b5c2bb0e 100644 --- a/pyladies/install-editor/others.html +++ b/pyladies/install-editor/others.html @@ -71,7 +71,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -82,7 +83,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install-editor/vscode.html b/pyladies/install-editor/vscode.html index a2f062f8..3d9ebd4b 100644 --- a/pyladies/install-editor/vscode.html +++ b/pyladies/install-editor/vscode.html @@ -47,7 +47,8 @@

    Nácvik odsazování měl jejich vůni. Ta teď vyvanula, a tak je vracím. Dary nejbohatší se mění v trety, když se dárce mračí. -Zde, Výsosti.

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    +Zde, Výsosti. +

    (úryvek ze hry Hamlet, napsal W. Shakespeare, překlad E. A. Saudek)

    Tenhle text není moc přehledný, tak ho zkusíme poodsazovat, aby vypadal takhle:

    Ofelie:
         Ach princi!
    @@ -58,7 +59,8 @@ 

    Nácvik odsazování Mám od vás, princi, stále ještě dárky, Jež dávno toužím vrátit. Prosím vás, račte je přijmout teď. -atd.

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni +atd. +

    Abys odsadil/a jeden řádek, nastav kurzor na začátek řádku a stiskni klávesu Tab. Každým stisknutím řádek odsadíš o 4 mezery.

    Odsadíš-li moc, pomocí Shift+Tab odsazení zmenšíš.

    diff --git a/pyladies/install/linux.html b/pyladies/install/linux.html index c7bc0189..846f26d4 100644 --- a/pyladies/install/linux.html +++ b/pyladies/install/linux.html @@ -21,9 +21,13 @@

    Instalace Pythonu 3 Konkrétní příkaz záleží na distribuci:

    • Fedora:
      $ sudo dnf install python3
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    @@ -41,9 +45,13 @@

    Kontrola Tkinter

    Jestli ne, modul tkinter ještě nainstaluj:

    • Fedora:
      $ sudo dnf install python3-tkinter
      -
    • + + +
    • Ubuntu:
      $ sudo apt-get install python3-tk
      -
    • + + +

    Používáš-li jinou distribuci, musíš si správné jméno balíčku najít na Internetu.

    @@ -64,7 +72,9 @@

    Doinstalování Virtualenv
    • Ubuntu:
      $ sudo apt-get install python3-virtualenv
      -
    • + + +

    Používáš-li jinou distribuci, doufám, že instalovat programy už umíš.

    Instaluješ-li Virtualenv, zapamatuj si, že ho budeš muset použít později diff --git a/pyladies/install/windows.html b/pyladies/install/windows.html index 99135c9e..59729749 100644 --- a/pyladies/install/windows.html +++ b/pyladies/install/windows.html @@ -9,20 +9,22 @@

    Zjisti, jestli už máš Pyth Teď se může stát několik různých věcí:

    1. Otevře se ti Microsoft Store → okno zavři a pokračuj v kroku Stažení
    2. -
    3. Zobrazí se ti text podobný tomuto níže?
      > python
      +
    4. Zobrazí se ti text podobný tomuto níže?
    5. +
    +
    > python
     Python 3.8.1 (...)
    -Type "help", "copyright", "credits" or "license" for more information.
    ->>>
    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou +Type "help", "copyright", "credits" or "license" for more information. +>>> +

    To je dobrá zpráva! Ještě si zkontroluj, jakou verzi máš nainstalovanou (např.Python 3.11.2 je 3.11, Python 3.8.1 je 3.8 atd.). -Třetí číslo za tečkou není tady podstatné.

      +Třetí číslo za tečkou není tady podstatné.

      +
      • Je verze 3.6 nebo novější? Výborně, máš instalaci hotovou! Okénko s příkazovou řádkou můžeš zavřít. Až ho budeš znovu potřebovat, můžeš otevřít nové. Pokračuj dále Nastavením prostředí. V opačném případě přejdi na Stažení
      - -

      Stažení # diff --git a/pyladies/interfaces/index.html b/pyladies/interfaces/index.html index a681ff19..2882412c 100644 --- a/pyladies/interfaces/index.html +++ b/pyladies/interfaces/index.html @@ -40,7 +40,8 @@

      Rozhraní funkce """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True nebo False dle stisknutého tlačítka.""" ... -

      Screenshot s tlačítky Ano a Ne

      +Screenshot s tlačítky Ano a Ne +

      Když zavoláš tuhle funkci, ano_nebo_ne('Chutná ti čokoláda?'), ukáže se okýnko se dvěma tlačítky. Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

      diff --git a/pyladies/json/index.html b/pyladies/json/index.html index cf9d0b91..b51f996f 100644 --- a/pyladies/json/index.html +++ b/pyladies/json/index.html @@ -47,12 +47,14 @@

      Kódování dat - Python věk: 26

      Nebo třeba Bencode:

      -
      d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae

      Existují i netextové formáty jako +

      d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae
      +

      Existují i netextové formáty jako Pickle 3. Převedením do textu bys dostal/a „guláš“ jako:

      }q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X       ÄeÅ¡tinaqX
                                                                 angliÄtinaXPythonq       eXvÄq
      -K▒u.

      A nakonec uvedu JSON +K▒u. +

      A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:

      {
      diff --git a/pyladies/local-variables/index.html b/pyladies/local-variables/index.html
      index 3c9b968e..6b9de467 100644
      --- a/pyladies/local-variables/index.html
      +++ b/pyladies/local-variables/index.html
      @@ -128,29 +128,31 @@ 

      Řešení

    +

    A pro úplnost

    +
      +
    • Klíčová slova from, import, def, return neoznačují proměnné.
    • +
    • Jméno modulu math taky neoznačuje proměnnou.
    • +
    • Proměnná print se dá považovat za globální. +(Ve skutečnosti existuje zvláštní kategorie zabudovaných (angl. builtin) +proměnných – ty jsou „ještě globálnější“.)
    • +
    +
    -

    Rada na závěr + + +

    Rada na závěr #

    Pravidla pro lokální proměnné jsou pro začátečníky jednou z nejzvláštnějších diff --git a/pyladies/pong/index.html b/pyladies/pong/index.html index 38c56cc8..462b0b0f 100644 --- a/pyladies/pong/index.html +++ b/pyladies/pong/index.html @@ -3,7 +3,9 @@

    Pong

    -

    Dnes si prohloubíme znalosti programování grafických aplikací, + + +

    Dnes si prohloubíme znalosti programování grafických aplikací, které jsme získali na lekci o Pygletu, na reálném problému.

    Naprogramujeme si s pomocí knihovny Pyglet @@ -150,15 +152,17 @@

    Řešení

    -

    Po míčku zkus vykreslit obě pálky. + + +

    Po míčku zkus vykreslit obě pálky. V proměnné pozice_palek máme vertikální polohu první a druhé pálky, ale horizontální poloha je konstantní. Jaké souřadnice musíš předat funkci @@ -172,21 +176,23 @@

    Řešení

    -

    Přehlednosti hry pomůže půlící čára + + +

    Přehlednosti hry pomůže půlící čára uprostřed. Jak ji ale namalovat? Nebudeme vymýšlet zbytečné složitosti. Namalujme ji jako sérii obdélníčků táhnoucích se odshora @@ -201,17 +207,19 @@

    Řešení

    -

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. + + +

    Co nám ještě chybí? Počítadlo skóre pro oba hráče. K tomu se musíme naučit vykreslovat v Pygletu text. V Pygletu je modul text, který obsahuje objekt Label (Nápis). Ten se hodí k vykreslení hodnoty @@ -241,24 +249,26 @@

    Řešení

    -

    Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

    + + +

    Hurá, teď už máme vykreslené hrací pole. Pojďme ho rozhýbat.

    Dynamika hry #

    @@ -307,31 +317,33 @@

    Řešení

    -

    Proč vlastně používáme k odebrání n-tice metodu +

    + +

    Proč vlastně používáme k odebrání n-tice metodu discard() místo metody remove(), kterou známe ze seznamů a množiny ji také mají? Nezpůsobí totiž chybu, když se pokusíme odebrat @@ -419,24 +431,26 @@

    Řešení

    -

    Nic se zatím ale nestane, protože funkce + + +

    Nic se zatím ale nestane, protože funkce obnov_stav(dt) zatím nepracuje se změnou rychlosti. Musíme v ní tedy nastavit proměnnou poloha_micku podle současné rychlosti míčku diff --git a/pyladies/print/index.html b/pyladies/print/index.html index 06b74940..cb3a346d 100644 --- a/pyladies/print/index.html +++ b/pyladies/print/index.html @@ -56,7 +56,9 @@

    Další příkazy print(V míse je maso.) ^ SyntaxError: invalid syntax -

    Při chybě Python napřed zmíní jméno souboru a + + +

    Při chybě Python napřed zmíní jméno souboru a číslo řádku, na kterém si chyby všimnul. Potom vypíše celý řádek s chybou a nakonec oznámí druh chyby diff --git a/pyladies/pyglet/index.html b/pyladies/pyglet/index.html index eb6828b4..80929663 100644 --- a/pyladies/pyglet/index.html +++ b/pyladies/pyglet/index.html @@ -211,7 +211,8 @@

    Čas ⏲

    Vykreslování 🖌 #

    -

    + +

    Program, který vypisuje na terminál spoustu čísel, není asi zas tak zajímavý. Téma téhle stránky je ale grafika, tak se začněme od @@ -313,7 +314,8 @@

    Animace

    Zavolej později #

    -

    + +

    Pyglet umí kromě opakovaného „tikání“ zavolat funkci jednorázově, za určitou dobu.

    Stáhni si (nebo vytvoř) druhý obrázek. Já mám druhého diff --git a/pyladies/reassignment/index.html b/pyladies/reassignment/index.html index 6548d02f..f94650c1 100644 --- a/pyladies/reassignment/index.html +++ b/pyladies/reassignment/index.html @@ -69,28 +69,28 @@

    Řešení

    Příkaz celkem = celkem + delka_trasy vypočítá hodnotu +celkem + delka_trasy, tedy přičte aktuální číslo k součtu. +Výsledek uloží opět do proměnné celkem. +Nová hodnota celkem se pak použije v dalším průchodu cyklem.

    +

    Na začátku je celkem 0 a na konci se celkový součet všech čísel vypíše.

    \ No newline at end of file diff --git a/pyladies/str-index-slice/index.html b/pyladies/str-index-slice/index.html index e1e830e3..c72acbb0 100644 --- a/pyladies/str-index-slice/index.html +++ b/pyladies/str-index-slice/index.html @@ -26,7 +26,9 @@

    Řešení

    -

    Jak sis možná už všiml/a, programátoři počítají od nuly. + + +

    Jak sis možná už všiml/a, programátoři počítají od nuly. „První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.

    Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, druhé jedna, ... a osmé písmeno má číslo sedm.

    @@ -41,7 +43,8 @@

    Řešení

    ╭───┬───┬───┬───┬───┬───┬───┬───╮ │ Č │ o │ k │ o │ l │ á │ d │ a │ - ╰───┴───┴───┴───┴───┴───┴───┴───╯

    A když už jsme u divných čísel, + ╰───┴───┴───┴───┴───┴───┴───┴───╯ +

    A když už jsme u divných čísel, co se asi stane, když budu vybírat písmena pomocí záporných čísel?

    Řešení

    @@ -50,17 +53,20 @@

    Řešení

    Záporná čísla vybírají písmenka od konce.

    +
       [0] [1] [2] [3] [4] [5] [6] [7]
    +   [-8][-7][-6][-5][-4][-3][-2][-1]
    +  ╭───┬───┬───┬───┬───┬───┬───┬───╮
    +  │ Č │ o │ k │ o │ l │ á │ d │ a │
    +  ╰───┴───┴───┴───┴───┴───┴───┴───╯
    +
    -

    Sekání řetězců + + +

    Sekání řetězců #

    Kromě jednotlivých znaků můžeme vybírat i delší části – odborně @@ -77,7 +83,9 @@

    Řešení

    -

    Dá se použít i retezec[:5], + + +

    Dá se použít i retezec[:5], který vybere všechno až po znak číslo 5. Ne však znak 5 samotný, což je možná trochu zarážející, ale je potřeba s tím počítat. @@ -101,15 +109,17 @@

    Řešení

    -

    Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

    + + +

    Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

    U sekání (s :) pomáhá očíslovat si „hranice“ mezi znaky, abys v tom měl/a lepší přehled:

    @@ -127,7 +137,8 @@

    Řešení

    'čokoláda'[2:6] == 'kolá' ╰───────────╯ - 'čokoláda'[-3:] == 'áda'

    Cvičení + 'čokoláda'[-3:] == 'áda' +

    Cvičení #

    Zkus napsat program zamen.py, který umí zaměnit jedno písmeno ve slově za @@ -145,12 +156,16 @@

    Řešení

    Které písmeno zaměnit (od nuly)? 3 Nové písmeno: u čokuláda -
    +
    + +
     Slovo: kočka
     Které písmeno zaměnit (od nuly)? 1
     Nové písmeno: a
     kačka
    -

    Pozor na to, že řetězce v Pythonu nelze měnit. + + +

    Pozor na to, že řetězce v Pythonu nelze měnit. Nemůžeš v existujícím řetězci zaměnit jeden znak za jiný; musíš vytvořit nový řetězec poskládaný z částí toho starého.

    @@ -160,14 +175,14 @@

    Řešení

    \ No newline at end of file diff --git a/pyladies/str-methods/index.html b/pyladies/str-methods/index.html index 13105d5a..f31d3e4b 100644 --- a/pyladies/str-methods/index.html +++ b/pyladies/str-methods/index.html @@ -25,7 +25,9 @@

    Řetězcové funkce a metody Opak x in r 'dub' not in 'čokoláda -

    Řetězce vždy berou v potaz velikost písmen, + + +

    Řetězce vždy berou v potaz velikost písmen, takže např. 'ČOKO' in 'čokoláda' je False. Kdybys chtěl/a porovnávat bez ohledu na velikost písmen, musel/a bys oba řetězce převést třeba na malá písmena @@ -67,20 +69,22 @@

    Řešení

    Způsobů, jak takový program napsat, je více. +Lze například zavolat upper() dvakrát – zvlášť na jméno a zvlášť na příjmení.

    +

    Nebo to jde zapsat i takto – +metoda se dá volat na výsledku jakéhokoli výrazu:

    +
    jmeno = input('Zadej jméno: ')
    +prijmeni = input('Zadej příjmení ')
    +print('Iniciály:', (jmeno[0] + prijmeni[0]).upper())
    +

    Doporučuji spíš první způsob, ten se smysluplnými názvy proměnných. +Je sice delší, ale mnohem přehlednější.

    -

    A další + + +

    A další #

    Řetězcových metod je celá řada. diff --git a/pyladies/str/index.html b/pyladies/str/index.html index f558caca..d6c03eb3 100644 --- a/pyladies/str/index.html +++ b/pyladies/str/index.html @@ -48,7 +48,7 @@

    Znaky

    K uvození řetězce můžeš použít jednoduché nebo dvojité rovné uvozovky. Není mezi nimi rozdíl. Podobně 4.0 a 4.000 jsou dva zápisy téhož čísla, -tak 'slovo' a "slovo" pro Python označuje stejnou +tak 'slovo' a "slovo" pro Python označuje stejnou hodnotu, skládající se ze stejných pěti písmen.

    Použité uvozovky nejsou součástí hodnoty – python si „nepamatuje“, jakým způsobem byl řetězec uvozen. @@ -86,12 +86,12 @@

    Sekvence se zpětným lomítkem #

    Co dělat, když v řetězci potřebuješ oba druhy uvozovek, -jako ve větě Vtom vnuk křik': "Hleď!"?

    +jako ve větě Vtom vnuk křik': "Hleď!"?

    Můžeš si pomoci tím, že spojíš dva řetězce:

    >>> print("Vtom vnuk křik': " + '"Hleď!"')
     Vtom vnuk křik': "Hleď!"
     

    Ale lepší způsob je použít speciální zápis se zpětným lomítkem. -Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou +Kdykoli se v řetězci objeví sekvence \' nebo \", Python dá do řetězce danou uvozovku.

    >>> print("Vtom vnuk křik': \"Hleď!\"")
     Vtom vnuk křik': "Hleď!"
    @@ -111,14 +111,16 @@ 

    Řešení

    -

    Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. + + +

    Znaků, které se zadávají sekvencí se zpětným lomítkem, je více. Jedna ze zajímavějších je \t, představující tabulátor – jediný znak, který se, když ho vypíšeš, „roztáhne“ na víc mezer.

    >>> print("a\tb")   # Výpis "pro lidi"
    @@ -155,7 +157,7 @@ 

    Řešení

    nemůžeš použít přímo \. Musíš použít speciální sekvenci \\ – tedy lomítko zdvojit:

    print('C:\\PyLadies\\Nový adresář')
    -

    Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ +

    Podobně jako \" je zápis pro uvozovku a \' pro apostrof, sekvence \\ je zápis pro jedno zpětné lomítko.

    Nový řádek # @@ -204,24 +206,25 @@

    Nový řádek

    Jaká je délka těchto řetězců?

    Výsledek zjistíš snadno, zkus se ale zamyslet a Python použít jen pro ověření.

    print(len('ahoj'))
    -print(len("""Ahoj!"""))
    +print(len("""Ahoj!"""))
     print(len('a b'))
     print(len( ' a b ' ))
     print(len('\N{SNOWMAN}ové'))
     print(len('a\nb'))
     print(len('a\tb'))
    -print(len('"\'"'))
    +print(len('"\'"'))
     
     
    -print(len("""
    -abc"""))
    +print(len("""
    +abc"""))
     
     
     if True:
    -    print(len("""a
    -    b"""))
    +    print(len("""a
    +    b"""))
     
     
     print(len('C:\new_dir'))
     
    -print(len(f'{print}'))
    \ No newline at end of file +print(len(f'{print}')) + \ No newline at end of file diff --git a/pyladies/tuple/index.html b/pyladies/tuple/index.html index 9eb9c80e..d929c62e 100644 --- a/pyladies/tuple/index.html +++ b/pyladies/tuple/index.html @@ -3,7 +3,7 @@

    N-tice

    Když už známe seznam, podívejme se na jeho sestřičku: takzvanou n-tici (angl. tuple).

    -

    N-tice může, podobně jako seznam, obsahovat n prvků. +

    N-tice může, podobně jako seznam, obsahovat n prvků. N-tice se dvěma prvky je dvojice neboli pár (angl. pair); se třemi prvky trojice (angl. 3-tuple), diff --git a/pyladies/turtle/index.html b/pyladies/turtle/index.html index fc90c873..b56be61a 100644 --- a/pyladies/turtle/index.html +++ b/pyladies/turtle/index.html @@ -81,7 +81,7 @@

    Čtverec #

    Nakresli čtverec.

    -

    Želví čtverec

    +

    Želví čtverec

    Čtverec má čtyři rovné strany a čtyři rohy po 90°.

    @@ -91,25 +91,27 @@

    Řešení

    -

    Obdélník + + +

    Obdélník #

    Nakresli obdélník.

    Zkus zařídit, aby se po nakreslení „dívala” želva doprava (tak jako na začátku).

    -

    Želví obdélník

    +

    Želví obdélník

    Řešení

    @@ -117,24 +119,26 @@

    Řešení

    -

    Tři čtverce + + +

    Tři čtverce #

    Nakresli tři čtverce, každý otočený třeba o 20°.

    -

    Tři želví čtverce

    +

    Tři želví čtverce

    Řešení

    @@ -142,42 +146,44 @@

    Řešení

    -

    Tolik kódu! Tohle musí jít nějak zjednodušit!

    + + +

    Tolik kódu! Tohle musí jít nějak zjednodušit!

    Jde. Pojďme se naučit, jak v Pythonu nějakou činnost opakovat.

    Jak opakovat – a neopakovat se @@ -188,7 +194,7 @@

    Jak opakovat – a neopakovat sePrvní opakovací program, který napíšeš, bude dělat tohle:

    • Stokrát po sobě:
        -
      • Napiš "Nikdy nebudu odsazovat o tři mezery!"
      • +
      • Napiš "Nikdy nebudu odsazovat o tři mezery!"
    @@ -207,7 +213,7 @@

    Výčet

    Zkus napsat ještě jeden vzorový program, který v češtině zní:

      -
    • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
        +
      • Pro každý pozdrav z výčtu: „Ahoj“, “Hello”, “Hola”, ”Hei”, "SYN":
        • Vypiš pozdrav a za ním vykřičník.
      • @@ -266,24 +272,26 @@

        Řešení

        -

        Funkce range(n) vrací sekvenci čísel. + + +

        Funkce range(n) vrací sekvenci čísel. Začíná od 0 a čísel v ní je přesně n. (Na samotné n se tedy už nedostane.)

        Často budeš potřebovat Pythonu říct, ať něco „n-krát zopakuje“. @@ -326,7 +334,7 @@

        Řešení

        exitonclick()

        Zkus nakreslit dlouhou přerušovanou čáru.

        -

        Želva a přerušovaná čára

        +

        Želva a přerušovaná čára

        Řešení

        @@ -334,19 +342,21 @@

        Řešení

        -

        Pak zkus zařídit, aby jednotlivé čárky byly postupně + + +

        Pak zkus zařídit, aby jednotlivé čárky byly postupně větší a větší.

        -

        Želva a přerušovaná čára

        +

        Želva a přerušovaná čára

        Nápověda

        První čárka je dlouhá 1 jednotku, druhá 2 jednotky, třetí 3, atd.

        Dokonce můžeš na začátek dát prázdnou čárku (0 jednotek) @@ -359,17 +369,19 @@

        Řešení

        -

        Čtverec II + + +

        Čtverec II #

        A teď znovu nakresli čtverec, tentokrát lépe – s použitím cyklu!

        @@ -381,7 +393,7 @@

        Řešení

    -

    Želví čtverec

    +

    Želví čtverec

    Řešení

    @@ -389,21 +401,23 @@

    Řešení

    -

    Tři čtverce + + +

    Tři čtverce #

    Nakonec nakresli 3 čtverce, každý otočený o 20°. Tentokrát už víš, jak to dělat chytře: opakuj pomocí příkazu for, ne kopírováním kódu.

    -

    Tři želví čtverce

    +

    Tři želví čtverce

    • Třikrát:
      • Nakresli čtverec (viz jedna z předchozích úloh)
      • @@ -418,25 +432,27 @@

        Řešení

        -

        Úkol navíc + + +

        Úkol navíc #

        Máš-li hotovo, zkus nakreslit schody:

        -

        Želví schody

        +

        Želví schody

        A máš-li i schody, zkus nakreslit těchto šest (nebo sedm?) šestiúhelníků:

        -

        Želví plástev

        \ No newline at end of file +

        Želví plástev

        \ No newline at end of file diff --git a/pyladies/variables/index.html b/pyladies/variables/index.html index 67bf65fc..e235c0d3 100644 --- a/pyladies/variables/index.html +++ b/pyladies/variables/index.html @@ -9,7 +9,8 @@

        Čtverec se stranou 356 cm.

        Po spuštění by se mělo vypsat něco jako:

        Obvod čtverce se stranou 356 cm je 1424 cm
        -Obsah čtverce se stranou 356 cm je 126736 cm2

        Pro připomenutí, obvod čtverce se stranou a +Obsah čtverce se stranou 356 cm je 126736 cm2 +

        Pro připomenutí, obvod čtverce se stranou a se dá vypočítat jako O = 4a a obsah jako S = a².

        Matematika!

        @@ -41,11 +42,13 @@

        Řešení

        -

        Menší čtverec + + +

        Menší čtverec #

        Jestli všechno funguje, zkus změnit program tak, @@ -57,10 +60,12 @@

        Řešení

        -

        Proměnné + + +

        Proměnné #

        Zvládneš to i pro stranu 3945 cm, 832 cm, 956 cm? @@ -152,7 +157,7 @@

        Řešení

        promenna = float(input('Zadej číslo: '))
         
      -

      Místo textu 'Zadej …' se dá napsat i jiná výzva. +

      Místo textu 'Zadej …' se dá napsat i jiná výzva. A výsledek se samozřejmě dá uložit i do jiné proměnné než promenna.

      Hotový program může vypadat takto:

      # Tento program počítá obvod a obsah čtverce.
      diff --git a/pyladies/venv-setup/index.html b/pyladies/venv-setup/index.html
      index 151e1443..3f7546b0 100644
      --- a/pyladies/venv-setup/index.html
      +++ b/pyladies/venv-setup/index.html
      @@ -60,16 +60,16 @@ 

      Přepnutí

      Unix (Linux, macOS)

      $ pwd
       /home/helena/naucse-python
       
      -$ ls
      +

      $ ls 00

      -

      Windows

      > cd
      -C:\Users\Helena\naucse-python
      -
      -> dir
      +

      Windows

      > cd
      +C:\Users\Helena\naucse-python

      +

      > dir Directory of C:\Users\Helena\naucse-python 05/08/2014 07:28 PM <DIR> 00 -

      Virtuální prostředí +

      +

      Virtuální prostředí #

      Teď si vytvoříš virtuální prostředí pro Python.

      @@ -87,24 +87,24 @@

      Windows

      > <
       
      • Linux:

        Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

        -
         $ python3 -m venv venv
        +příkazů.
        +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
        +takže nejdřív zkus:

        +
        $ python3 -m venv venv
         

        A jestli dostaneš chybu No module named venv, zkus místo toho:

        -
         $ virtualenv -p python3 venv
        +
        $ virtualenv -p python3 venv
         
      • macOS:

        -
         $ python3 -m venv venv
        +
        $ python3 -m venv venv
         
      • Windows:

        Podle toho, jak máš Python nainstalovaný, bude fungovat jeden z následujících - příkazů. - Bude je rychlejší vyzkoušet než popsat, kdy je který správný, - takže nejdřív zkus:

        -
         > py -3 -m venv venv
        +příkazů.
        +Bude je rychlejší vyzkoušet než popsat, kdy je který správný,
        +takže nejdřív zkus:

        +
        > py -3 -m venv venv
         

        A jestli dostaneš chybu 'py' is not recognized, zkus místo toho:

        -
         > python3 -m venv venv
        +
        > python3 -m venv venv
         

      Tím se ti vytvořil adresář venv, který virtuální prostředí obsahuje. @@ -119,7 +119,9 @@

      Windows

      > <
        Directory of C:\Users\Helena\naucse-python
       05/08/2014 07:28 PM <DIR>  00
       05/08/2014 07:38 PM <DIR>  venv
      -

      V grafickém prohlížeči souborů to vypadá např. takto:

      + + +

      V grafickém prohlížeči souborů to vypadá např. takto:

      (adresáře '00' a 'venv' vedle sebe)

      Aktivace virtuálního prostředí # @@ -133,7 +135,9 @@

      Windows

      > <
       je příkaz pro Windows složitější:

      > &powershell -ExecutionPolicy bypass
       > venv/Scripts/Activate.ps1
      -

      Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky + + +

      Po spuštění tohoto příkazu by se mělo na začátku příkazové řádky (před $ nebo >) objevit slovo (venv). Tak poznáš, že je virtuální prostředí aktivní.

      Aktivační příkaz si zapiš.

      diff --git a/pyladies/while/index.html b/pyladies/while/index.html index 37dce985..5f0615db 100644 --- a/pyladies/while/index.html +++ b/pyladies/while/index.html @@ -77,26 +77,26 @@

      Řešení

      \ No newline at end of file diff --git a/pyladies/zip-enumerate/index.html b/pyladies/zip-enumerate/index.html index e102c6ce..d6dc42d1 100644 --- a/pyladies/zip-enumerate/index.html +++ b/pyladies/zip-enumerate/index.html @@ -96,26 +96,29 @@

      Rozbalování v cyklu for 4. Čt 5. Pá 6. So -7. Ne
      +7. Ne +

      Řešení

      To je trošku kostrbaté, ale dá se to zjednodušit: buď jako +f'{index + 1}. {den}', nebo můžeš funkci enumerate předat +pojmenovaný argument start, pomocí kterého umí sama +počítat od jiného začátku než od nuly:

      +
      dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']
      +for index, den in enumerate(dny, start=1):
      +    print(f'{index}. {den}')
      +
      -

      Zip: Víc iterací najednou + + +

      Zip: Víc iterací najednou #

      Další iterátor n-tic je funkce zip, která umí projít dvě sekvence @@ -165,7 +168,9 @@

      Řešení

      -

      Občas je potřeba projít všechny záznamy. + + +

      Občas je potřeba projít všechny záznamy. Na to slouží funkce zip_longest z modulu itertools:

      from itertools import zip_longest
       for vec, barva in zip_longest(veci, barvy, fillvalue='(nevím)'):
      
      From 695c521a931e6ed1ebcbb8817556719db16d22b1 Mon Sep 17 00:00:00 2001
      From: ghp_import <>
      Date: Sat, 29 Jun 2024 14:00:29 +0000
      Subject: [PATCH 30/31] Compiled
      
      ---
       lessons/cmdline/index.html  | 2 +-
       meta/cmdline/index.html     | 2 +-
       mi-pyt/cmdline/index.html   | 2 +-
       pyladies/cmdline/index.html | 2 +-
       4 files changed, 4 insertions(+), 4 deletions(-)
      
      diff --git a/lessons/cmdline/index.html b/lessons/cmdline/index.html
      index fcc6b4bf..50f1158d 100644
      --- a/lessons/cmdline/index.html
      +++ b/lessons/cmdline/index.html
      @@ -250,7 +250,7 @@ 

      Vkládání do příkazové řádky

      Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. Zkopírování jména adresáře doufám nebude problém; vkládání do příkazové řádky -je ale občas jiné než v ostatních pogramech:

      +je ale občas jiné než v ostatních programech:

      • Linux: Ctrl+Shift+V
      • macOS: ⌘ Command+V
      • diff --git a/meta/cmdline/index.html b/meta/cmdline/index.html index fcc6b4bf..50f1158d 100644 --- a/meta/cmdline/index.html +++ b/meta/cmdline/index.html @@ -250,7 +250,7 @@

        Vkládání do příkazové řádky

        Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. Zkopírování jména adresáře doufám nebude problém; vkládání do příkazové řádky -je ale občas jiné než v ostatních pogramech:

        +je ale občas jiné než v ostatních programech:

        • Linux: Ctrl+Shift+V
        • macOS: ⌘ Command+V
        • diff --git a/mi-pyt/cmdline/index.html b/mi-pyt/cmdline/index.html index fcc6b4bf..50f1158d 100644 --- a/mi-pyt/cmdline/index.html +++ b/mi-pyt/cmdline/index.html @@ -250,7 +250,7 @@

          Vkládání do příkazové řádky

          Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. Zkopírování jména adresáře doufám nebude problém; vkládání do příkazové řádky -je ale občas jiné než v ostatních pogramech:

          +je ale občas jiné než v ostatních programech:

          • Linux: Ctrl+Shift+V
          • macOS: ⌘ Command+V
          • diff --git a/pyladies/cmdline/index.html b/pyladies/cmdline/index.html index fcc6b4bf..50f1158d 100644 --- a/pyladies/cmdline/index.html +++ b/pyladies/cmdline/index.html @@ -250,7 +250,7 @@

            Vkládání do příkazové řádky

            Občas si otevřeš soubor v prohlížeči souborů a budeš do něj chtít přejít v příkazové řádce. Zkopírování jména adresáře doufám nebude problém; vkládání do příkazové řádky -je ale občas jiné než v ostatních pogramech:

            +je ale občas jiné než v ostatních programech:

            • Linux: Ctrl+Shift+V
            • macOS: ⌘ Command+V
            • From 29f3bc024d286d0f2b9a9d69378e631a8fd24ee1 Mon Sep 17 00:00:00 2001 From: ghp_import <> Date: Fri, 19 Jul 2024 07:51:39 +0000 Subject: [PATCH 31/31] Compiled --- lessons/course.json | 4 ++-- lessons/dict/index.html | 6 +++--- lessons/inheritance/index.html | 4 ++-- lessons/interfaces/index.html | 18 +++++++++--------- lessons/json/index.html | 4 ++-- lessons/list/index.html | 2 +- lessons/range/index.html | 2 +- lessons/testing/index.html | 18 +++++++++--------- lessons/tuple/index.html | 2 +- lessons/with/index.html | 2 +- lessons/zip-enumerate/index.html | 6 +++--- mi-pyt/testing/index.html | 18 +++++++++--------- pyladies/course.json | 4 ++-- pyladies/dict/index.html | 6 +++--- pyladies/inheritance/index.html | 4 ++-- pyladies/interfaces/index.html | 18 +++++++++--------- pyladies/json/index.html | 4 ++-- pyladies/list/index.html | 2 +- pyladies/range/index.html | 2 +- pyladies/testing/index.html | 18 +++++++++--------- pyladies/tuple/index.html | 2 +- pyladies/with/index.html | 2 +- pyladies/zip-enumerate/index.html | 6 +++--- 23 files changed, 77 insertions(+), 77 deletions(-) diff --git a/lessons/course.json b/lessons/course.json index e8dc8f9c..9f1839df 100644 --- a/lessons/course.json +++ b/lessons/course.json @@ -383,7 +383,7 @@ "#slovniky", "#typy_klicu_a_hodnot", "#zapln_prazdny_slovnik", - "https://docs.python.org/3.0/library/stdtypes.html#mapping-types-dict", + "https://docs.python.org/3/library/stdtypes.html#mapping-types-dict", "https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf" ], "slug": "index", @@ -2006,7 +2006,7 @@ "content": "
              dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']\nfor index, den in enumerate(dny):\n    cislo = index + 1\n    print(f'{cislo}. {den}')\n

              To je trošku kostrbaté, ale dá se to zjednodušit: buď jako\nf'{index + 1}. {den}', nebo můžeš funkci enumerate předat\npojmenovaný argument start, pomocí kterého umí sama\npočítat od jiného začátku než od nuly:

              \n
              dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']\nfor index, den in enumerate(dny, start=1):\n    print(f'{index}. {den}')\n
              " }, { - "content": "

              Iterátor zip skončí hned když dojdou prvky nejkratší sekvence.

              " + "content": "

              Iterátor zip skončí hned, když dojdou prvky nejkratší sekvence.

              " } ], "source_file": "lessons/beginners/zip-enumerate/index.md", diff --git a/lessons/dict/index.html b/lessons/dict/index.html index 3195a738..93bb5fdb 100644 --- a/lessons/dict/index.html +++ b/lessons/dict/index.html @@ -141,7 +141,7 @@

              Jak udělat slovník

      Zaplň prázdný slovník #

      -

      Nejobecnější způsob vytváření slovníků je podobný tomu co znáš u seznamů: +

      Nejobecnější způsob vytváření slovníků je podobný tomu, co znáš u seznamů: vytvoř prázdný slovník a postupně do něj přidávej záznamy, jeden za druhým.

      Řekněme, že máš slovník, který přiřazuje ovoci jeho barvu:

      barvy = {
      @@ -169,7 +169,7 @@ 

      Jak udělat slovník A to nejsou všechny. Řetězce a čísla použít jdou:

      jmena_cisel = {2: 'dva', 3: 'tři'}
       

      Ale seznamy nebo jiné slovníky ne. -Typy které se dají použít jako klíč ve slovníku se technicky označují jako +Typy, které se dají použít jako klíč ve slovníku, se technicky označují jako „hashovatelné“ (angl. hashable). Tento termín se objevuje v chybových hláškách:

      >>> jmena_seznamu = {[1, 2, 3]: 'čísla', ['a', 'b', 'c']: 'řetězce'}
      @@ -191,5 +191,5 @@ 

      Jak udělat slovník pěkně pohromadě, můžeš si stáhnout Slovníkový tahák.

      Kompletní popis slovníků najdeš -v dokumentaci +v dokumentaci Pythonu.

      \ No newline at end of file diff --git a/lessons/inheritance/index.html b/lessons/inheritance/index.html index 6f0d2aad..4c30ae40 100644 --- a/lessons/inheritance/index.html +++ b/lessons/inheritance/index.html @@ -143,7 +143,7 @@

      Polymorfismus když máš nějaké Kotatko, můžeš ho použít kdekoliv kde program očekává Zviratko, protože každé koťátko je zvířátko.

      -

      Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět +

      Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět, kterou třídu podědit z které. Každé koťátko nebo štěňátko je zvířátko, každá chata @@ -196,7 +196,7 @@

      Polymorfismus for zviratko in zviratka: zviratko.udelej_zvuk() zviratko.snez('flákota') -

      Jak tenhle příklad naznačuje, psát nadtřídy ze kterých se dobře dědí +

      Jak tenhle příklad naznačuje, psát nadtřídy, ze kterých se dobře dědí, není jednoduché. Zvlášť to platí, kdyby se z nich mělo dědit v jiném programu, než kde je nadtřída. I z toho důvodu je dobré dědičnost používat hlavně v rámci svého kódu: diff --git a/lessons/interfaces/index.html b/lessons/interfaces/index.html index 2882412c..b9616435 100644 --- a/lessons/interfaces/index.html +++ b/lessons/interfaces/index.html @@ -1,12 +1,12 @@

      Rozhraní #

      -

      Už víš že funkce ti umožňují kousek kódu:

      +

      Už víš, že funkce ti umožňují kousek kódu:

      • použít (zavolat) na více místech v programu, i když definice je jen jedna,
      • vyčlenit, aby detail (jako načtení čísla od uživatele) „nezavazel“ ve větším programu, který tak může být přehlednější, a
      • -
      • pojmenovat, aby bylo jasné co kód dělá i bez toho, abys musel/a číst +
      • pojmenovat, aby bylo jasné, co kód dělá, i bez toho, abys musel/a číst samotné tělo funkce.

      Další výhoda funkce je, že ji můžeš jednoduše vyměnit za jinou, @@ -16,10 +16,10 @@

      Rozhraní Do takové zásuvky můžeš zapojit počítač, lampu, nabíječku na mobil, vysavač, nebo rádio. Zásuvka poskytuje elektrický proud; je jedno, jak ho použiješ. -Stejně tak je jedno jestli je „druhý konec“ zásuvky připojený k solárnímu +Stejně tak je jedno, jestli je „druhý konec“ zásuvky připojený k solárnímu panelu nebo k atomové elektrárně. Zásuvka poskytuje elektrický proud, a jsou u ní důležité určité parametry -(tvar, napětí, frekvence, maximální proud) na kterých se obě strany, +(tvar, napětí, frekvence, maximální proud), na kterých se obě strany, poskytovatel proudu i spotřebič, shodly. Tyhle parametry tvoří rozhraní, které umožňuje připojit jakýkoli spotřebič k jakékoli elektrárně.

      @@ -34,7 +34,7 @@

      Rozhraní funkce

      Podobnou funkci už jsi napsal/a. Když zavoláš ano_nebo_ne('Chutná ti čokoláda?'), otázka se objeví na příkazové řádce. -Když uživatel odpoví, funkce vrátí True nebo False.

      +Když uživatel odpoví, funkce vrátí True nebo False.

      Co kdybys ale měl/a následující funkci?

      def ano_nebo_ne(otazka):
           """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
      @@ -44,8 +44,8 @@ 

      Rozhraní funkce

      Když zavoláš tuhle funkci, ano_nebo_ne('Chutná ti čokoláda?'), ukáže se okýnko se dvěma tlačítky. -Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

      -

      Z hlediska programu se nic nemění: jediné co se změní je definice funkce; +Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

      +

      Z hlediska programu se nic nemění: jediné, co se změní, je definice funkce; volání a práce s návratovou hodnotou je pak stejné jako dřív.

      Vyzkoušej si to! # @@ -65,7 +65,7 @@

      Vyzkoušej si to! Používáš-li Python 3.6, nacti_cislo nenahrazuj.

      Program by měl fungovat stejně jako dřív!

      Je to tím, že tyto funkce mají stejné rozhraní jako jejich dřívější protějšky. -Rozhraní funkce tvoří všechno, co potřebuje kód který funkce volá:

      +Rozhraní funkce tvoří všechno, co potřebuje kód, který funkce volá:

      • jméno, kterým se funkce volá,
      • argumenty, které bere (např. input bere otázku jako řetězec; print @@ -78,6 +78,6 @@

        Vyzkoušej si to! použít, věděl jak na to.

        Modul tkui je jen ilustrační. Je udělaný tak, aby se dobře “instaloval” spíš než aby ti pomohl psát reálné programy. -V tomto kurzu se vrátíme zpět k příkazové řádce, která je dělaná tak +V tomto kurzu se vrátíme zpět k příkazové řádce, která je dělaná tak, aby byla užitečná pro programátory.

        \ No newline at end of file diff --git a/lessons/json/index.html b/lessons/json/index.html index b51f996f..4ea3e359 100644 --- a/lessons/json/index.html +++ b/lessons/json/index.html @@ -165,9 +165,9 @@

        Kódování dat

        TOML #

        -

        Knihovnu pro TOML potřeba si nainstalovat. +

        Knihovnu pro TOML je potřeba si nainstalovat. Dělá se to příkazem, který znáš z instalace knihovny Pytest. -Pozor ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného +Pozor, ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného (a možná nebezpečného!):

        (venv)$ python -m pip install toml
         

        Data pak lze kódovat pomocí toml.dumps a dekódovat pomocí toml.loads:

        diff --git a/lessons/list/index.html b/lessons/list/index.html index 135b7b38..284b55d4 100644 --- a/lessons/list/index.html +++ b/lessons/list/index.html @@ -283,7 +283,7 @@

        Tvoření seznamů for cislo in range(10): mocniny_dvou.append(2 ** cislo) print(mocniny_dvou) -

        Podobným způsobem získáš seznam seznam matka, babička, prababička, +

        Podobným způsobem získáš seznam matka, babička, prababička, praprababička, atd.:

        predkove = ['matka']
         for pocet_pra in range(10):
        diff --git a/lessons/range/index.html b/lessons/range/index.html
        index 24d32fc4..17a5dc3f 100644
        --- a/lessons/range/index.html
        +++ b/lessons/range/index.html
        @@ -44,7 +44,7 @@ 

        Range – sekvence čísel U trochu menšího čísla (např. 1000000000, ale na každém počítači je to jinak) se může stát, že se Python pokusí seznam začít tvořit, zaplní přitom většinu dostupné paměti a počítač „zamrzne“. -V závislosti na systému se pak třeba může stát že reakce na +V závislosti na systému se pak třeba může stát, že reakce na Ctrl+C bude trvat hodně dlouho.

        Se samotným range(1000000000000000) ale není problém. S konceptem všech čísel od 0 do biliardy se počítač vypořádá, i když si je diff --git a/lessons/testing/index.html b/lessons/testing/index.html index 5a99557a..dea07c33 100644 --- a/lessons/testing/index.html +++ b/lessons/testing/index.html @@ -1,9 +1,9 @@

        Testování #

        -

        Programátorská práce nespočívá jen v tom, program napsat. +

        Programátorská práce nespočívá jen v tom program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. -Tomu ověřování že program funguje se říká testování (angl. testing).

        +Tomu ověřování, že program funguje, se říká testování (angl. testing).

        Zatím jsi asi svoje programy testoval/a tak, že jsi je zkusil/a spustit, něco zadal/a a podíval/a se, jestli jsou výsledky v pořádku. @@ -16,13 +16,13 @@

        Testování zkontrolují, že program funguje správně. Spuštěním testů můžeš kdykoli ověřit, že kód funguje. Když v otestovaném kódu v budoucnu uděláš nějakou změnu, -testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

        +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

        Instalace knihovny pytest #

        Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. -Kromě takových modulů ale existuje ale velká spousta +Kromě takových modulů ale existuje velká spousta dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat a používat.

        Na testy je v samotném Pythonu zabudovaná knihovna unittest. @@ -46,8 +46,8 @@

        Instalace knihovny pytest Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“; už při instalaci můžou něco pokazit. Dej si proto pozor a ve jménu pytest neudělej překlep!

        -

        Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět -zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

        +

        Nainstaluješ-li přesto omylem něco, cos nechtěl/a, dej co nejdřív vědět +zkušenějšímu programátorovi, aby zkontroloval, jaký to mohlo mít efekt.

        (venv)$ python -m pip install pytest
         

        Co ten příkaz znamená?

        python -m pip zavolá Python s tím, že má pustit modul @@ -71,7 +71,7 @@

        Instalace knihovny pytest

        Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst -dvě čísla, a další funkce, která testuje jestli se +dvě čísla, a další funkce, která testuje, jestli se secti pro určité hodnoty chová správně.

        Kód si opiš do souboru test_secteni.py v novém prázdném adresáři. Jméno je důležité: pytest ve výchozím nastavení předpokládá, @@ -122,7 +122,7 @@

        Instalace knihovny pytest ze všech souborů, jejichž jméno začíná na test_. Místo souboru lze též uvést adresář: pytest vyhledá testy v něm.

        Zkus si změnit funkci secti (nebo její test) a podívat se, -jak to vypadá když test „neprojde“.

        +jak to vypadá, když test „neprojde“.

        Testovací moduly #

        @@ -131,7 +131,7 @@

        Testovací moduly Je to tak přehlednější a taky to pak zjednodušuje distribuci – předání kódu někomu, kdo ho chce jen spustit a testy nepotřebuje.

        -

        Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +

        Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py a v test_secteni.py nech jenom test. Do test_secteni.py pak na začátek přidej from secteni import secti, aby byla funkce testu k dispozici.

        diff --git a/lessons/tuple/index.html b/lessons/tuple/index.html index d929c62e..637d2e01 100644 --- a/lessons/tuple/index.html +++ b/lessons/tuple/index.html @@ -99,7 +99,7 @@

        Kdy použít seznam a kdy n

        Seznamy i n-tice mají i technické limity: n-tice nejdou měnit a až se naučíš pracovat se slovníky, -zjistíš že seznamy tam nepůjdou použít jako klíče. +zjistíš, že seznamy tam nepůjdou použít jako klíče. V takových případech je potřeba použít ten druhý typ sekvence.

        Často není úplně jasné, který typ použít. V takovém případě je to pravděpodobně jedno.

        \ No newline at end of file diff --git a/lessons/with/index.html b/lessons/with/index.html index 9f717a63..fa90fff3 100644 --- a/lessons/with/index.html +++ b/lessons/with/index.html @@ -36,7 +36,7 @@

        Kontext: with a

        Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. -Podobných „samozavíracích“ objektů které se dají použít s with existuje +Podobných „samozavíracích“ objektů, které se dají použít s with, existuje v různých knihovnách víc. Typické jsou objekty, které se starají o připojení např. k jinému počítači nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

        diff --git a/lessons/zip-enumerate/index.html b/lessons/zip-enumerate/index.html index d6dc42d1..463db769 100644 --- a/lessons/zip-enumerate/index.html +++ b/lessons/zip-enumerate/index.html @@ -20,7 +20,7 @@

        Enumerate: očíslování sekvence

        Funkce enumerate vezme nějakou existující sekvenci a očísluje ji: ve vrácené sekvenci budou dvojice (index, původní hodnota).

        -

        Řekněme že máš tento seznam:

        +

        Řekněme, že máš tento seznam:

        trpaslici = ['Prófa', 'Stydlín', 'Dřímal', 'Kejchal', 'Štístko',
                      'Šmudla', 'Rejpal']
         

        Když na něj použiješ enumerate, dostaneš objekt enumerate, @@ -123,7 +123,7 @@

        Zip: Víc iterací najednou

        Další iterátor n-tic je funkce zip, která umí projít dvě sekvence naráz.

        -

        Řekněme že máš seznam věcí a druhý seznam, ve kterém jsou barvy těch věcí:

        +

        Řekněme, že máš seznam věcí a druhý seznam, ve kterém jsou barvy těch věcí:

        veci = ['tráva', 'slunce', 'mrkev', 'list']
         barvy = ['zelená', 'žluté', 'oranžová', 'zelený']
         

        Když na ně zavoláš zip, dostaneš iterátor, který (podobně jako enumerate @@ -166,7 +166,7 @@

        Řešení

        Ukázat řešení diff --git a/mi-pyt/testing/index.html b/mi-pyt/testing/index.html index 5a99557a..dea07c33 100644 --- a/mi-pyt/testing/index.html +++ b/mi-pyt/testing/index.html @@ -1,9 +1,9 @@

        Testování #

        -

        Programátorská práce nespočívá jen v tom, program napsat. +

        Programátorská práce nespočívá jen v tom program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. -Tomu ověřování že program funguje se říká testování (angl. testing).

        +Tomu ověřování, že program funguje, se říká testování (angl. testing).

        Zatím jsi asi svoje programy testoval/a tak, že jsi je zkusil/a spustit, něco zadal/a a podíval/a se, jestli jsou výsledky v pořádku. @@ -16,13 +16,13 @@

        Testování zkontrolují, že program funguje správně. Spuštěním testů můžeš kdykoli ověřit, že kód funguje. Když v otestovaném kódu v budoucnu uděláš nějakou změnu, -testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

        +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

        Instalace knihovny pytest #

        Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. -Kromě takových modulů ale existuje ale velká spousta +Kromě takových modulů ale existuje velká spousta dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat a používat.

        Na testy je v samotném Pythonu zabudovaná knihovna unittest. @@ -46,8 +46,8 @@

        Instalace knihovny pytest Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“; už při instalaci můžou něco pokazit. Dej si proto pozor a ve jménu pytest neudělej překlep!

        -

        Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět -zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

        +

        Nainstaluješ-li přesto omylem něco, cos nechtěl/a, dej co nejdřív vědět +zkušenějšímu programátorovi, aby zkontroloval, jaký to mohlo mít efekt.

        (venv)$ python -m pip install pytest
         

        Co ten příkaz znamená?

        python -m pip zavolá Python s tím, že má pustit modul @@ -71,7 +71,7 @@

        Instalace knihovny pytest

        Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst -dvě čísla, a další funkce, která testuje jestli se +dvě čísla, a další funkce, která testuje, jestli se secti pro určité hodnoty chová správně.

        Kód si opiš do souboru test_secteni.py v novém prázdném adresáři. Jméno je důležité: pytest ve výchozím nastavení předpokládá, @@ -122,7 +122,7 @@

        Instalace knihovny pytest ze všech souborů, jejichž jméno začíná na test_. Místo souboru lze též uvést adresář: pytest vyhledá testy v něm.

        Zkus si změnit funkci secti (nebo její test) a podívat se, -jak to vypadá když test „neprojde“.

        +jak to vypadá, když test „neprojde“.

        Testovací moduly #

        @@ -131,7 +131,7 @@

        Testovací moduly Je to tak přehlednější a taky to pak zjednodušuje distribuci – předání kódu někomu, kdo ho chce jen spustit a testy nepotřebuje.

        -

        Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +

        Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py a v test_secteni.py nech jenom test. Do test_secteni.py pak na začátek přidej from secteni import secti, aby byla funkce testu k dispozici.

        diff --git a/pyladies/course.json b/pyladies/course.json index d10bcc8b..df3091e5 100644 --- a/pyladies/course.json +++ b/pyladies/course.json @@ -327,7 +327,7 @@ "#slovniky", "#typy_klicu_a_hodnot", "#zapln_prazdny_slovnik", - "https://docs.python.org/3.0/library/stdtypes.html#mapping-types-dict", + "https://docs.python.org/3/library/stdtypes.html#mapping-types-dict", "https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf" ], "slug": "index", @@ -1892,7 +1892,7 @@ "content": "
        dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']\nfor index, den in enumerate(dny):\n    cislo = index + 1\n    print(f'{cislo}. {den}')\n

        To je trošku kostrbaté, ale dá se to zjednodušit: buď jako\nf'{index + 1}. {den}', nebo můžeš funkci enumerate předat\npojmenovaný argument start, pomocí kterého umí sama\npočítat od jiného začátku než od nuly:

        \n
        dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']\nfor index, den in enumerate(dny, start=1):\n    print(f'{index}. {den}')\n
        " }, { - "content": "

        Iterátor zip skončí hned když dojdou prvky nejkratší sekvence.

        " + "content": "

        Iterátor zip skončí hned, když dojdou prvky nejkratší sekvence.

        " } ], "source_file": "lessons/beginners/zip-enumerate/index.md", diff --git a/pyladies/dict/index.html b/pyladies/dict/index.html index 3195a738..93bb5fdb 100644 --- a/pyladies/dict/index.html +++ b/pyladies/dict/index.html @@ -141,7 +141,7 @@

        Jak udělat slovník

        Zaplň prázdný slovník #

        -

        Nejobecnější způsob vytváření slovníků je podobný tomu co znáš u seznamů: +

        Nejobecnější způsob vytváření slovníků je podobný tomu, co znáš u seznamů: vytvoř prázdný slovník a postupně do něj přidávej záznamy, jeden za druhým.

        Řekněme, že máš slovník, který přiřazuje ovoci jeho barvu:

        barvy = {
        @@ -169,7 +169,7 @@ 

        Jak udělat slovník A to nejsou všechny. Řetězce a čísla použít jdou:

        jmena_cisel = {2: 'dva', 3: 'tři'}
         

        Ale seznamy nebo jiné slovníky ne. -Typy které se dají použít jako klíč ve slovníku se technicky označují jako +Typy, které se dají použít jako klíč ve slovníku, se technicky označují jako „hashovatelné“ (angl. hashable). Tento termín se objevuje v chybových hláškách:

        >>> jmena_seznamu = {[1, 2, 3]: 'čísla', ['a', 'b', 'c']: 'řetězce'}
        @@ -191,5 +191,5 @@ 

        Jak udělat slovník pěkně pohromadě, můžeš si stáhnout Slovníkový tahák.

        Kompletní popis slovníků najdeš -v dokumentaci +v dokumentaci Pythonu.

        \ No newline at end of file diff --git a/pyladies/inheritance/index.html b/pyladies/inheritance/index.html index 6f0d2aad..4c30ae40 100644 --- a/pyladies/inheritance/index.html +++ b/pyladies/inheritance/index.html @@ -143,7 +143,7 @@

        Polymorfismus když máš nějaké Kotatko, můžeš ho použít kdekoliv kde program očekává Zviratko, protože každé koťátko je zvířátko.

        -

        Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět +

        Tohle je docela dobrá pomůcka pro případy, kdy nebudeš vědět, kterou třídu podědit z které. Každé koťátko nebo štěňátko je zvířátko, každá chata @@ -196,7 +196,7 @@

        Polymorfismus for zviratko in zviratka: zviratko.udelej_zvuk() zviratko.snez('flákota') -

        Jak tenhle příklad naznačuje, psát nadtřídy ze kterých se dobře dědí +

        Jak tenhle příklad naznačuje, psát nadtřídy, ze kterých se dobře dědí, není jednoduché. Zvlášť to platí, kdyby se z nich mělo dědit v jiném programu, než kde je nadtřída. I z toho důvodu je dobré dědičnost používat hlavně v rámci svého kódu: diff --git a/pyladies/interfaces/index.html b/pyladies/interfaces/index.html index 2882412c..b9616435 100644 --- a/pyladies/interfaces/index.html +++ b/pyladies/interfaces/index.html @@ -1,12 +1,12 @@

        Rozhraní #

        -

        Už víš že funkce ti umožňují kousek kódu:

        +

        Už víš, že funkce ti umožňují kousek kódu:

        • použít (zavolat) na více místech v programu, i když definice je jen jedna,
        • vyčlenit, aby detail (jako načtení čísla od uživatele) „nezavazel“ ve větším programu, který tak může být přehlednější, a
        • -
        • pojmenovat, aby bylo jasné co kód dělá i bez toho, abys musel/a číst +
        • pojmenovat, aby bylo jasné, co kód dělá, i bez toho, abys musel/a číst samotné tělo funkce.

        Další výhoda funkce je, že ji můžeš jednoduše vyměnit za jinou, @@ -16,10 +16,10 @@

        Rozhraní Do takové zásuvky můžeš zapojit počítač, lampu, nabíječku na mobil, vysavač, nebo rádio. Zásuvka poskytuje elektrický proud; je jedno, jak ho použiješ. -Stejně tak je jedno jestli je „druhý konec“ zásuvky připojený k solárnímu +Stejně tak je jedno, jestli je „druhý konec“ zásuvky připojený k solárnímu panelu nebo k atomové elektrárně. Zásuvka poskytuje elektrický proud, a jsou u ní důležité určité parametry -(tvar, napětí, frekvence, maximální proud) na kterých se obě strany, +(tvar, napětí, frekvence, maximální proud), na kterých se obě strany, poskytovatel proudu i spotřebič, shodly. Tyhle parametry tvoří rozhraní, které umožňuje připojit jakýkoli spotřebič k jakékoli elektrárně.

        @@ -34,7 +34,7 @@

        Rozhraní funkce

        Podobnou funkci už jsi napsal/a. Když zavoláš ano_nebo_ne('Chutná ti čokoláda?'), otázka se objeví na příkazové řádce. -Když uživatel odpoví, funkce vrátí True nebo False.

        +Když uživatel odpoví, funkce vrátí True nebo False.

        Co kdybys ale měl/a následující funkci?

        def ano_nebo_ne(otazka):
             """Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
        @@ -44,8 +44,8 @@ 

        Rozhraní funkce

        Když zavoláš tuhle funkci, ano_nebo_ne('Chutná ti čokoláda?'), ukáže se okýnko se dvěma tlačítky. -Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

        -

        Z hlediska programu se nic nemění: jediné co se změní je definice funkce; +Když uživatel jedno zmáčkne, funkce vrátí True nebo False.

        +

        Z hlediska programu se nic nemění: jediné, co se změní, je definice funkce; volání a práce s návratovou hodnotou je pak stejné jako dřív.

        Vyzkoušej si to! # @@ -65,7 +65,7 @@

        Vyzkoušej si to! Používáš-li Python 3.6, nacti_cislo nenahrazuj.

        Program by měl fungovat stejně jako dřív!

        Je to tím, že tyto funkce mají stejné rozhraní jako jejich dřívější protějšky. -Rozhraní funkce tvoří všechno, co potřebuje kód který funkce volá:

        +Rozhraní funkce tvoří všechno, co potřebuje kód, který funkce volá:

        • jméno, kterým se funkce volá,
        • argumenty, které bere (např. input bere otázku jako řetězec; print @@ -78,6 +78,6 @@

          Vyzkoušej si to! použít, věděl jak na to.

          Modul tkui je jen ilustrační. Je udělaný tak, aby se dobře “instaloval” spíš než aby ti pomohl psát reálné programy. -V tomto kurzu se vrátíme zpět k příkazové řádce, která je dělaná tak +V tomto kurzu se vrátíme zpět k příkazové řádce, která je dělaná tak, aby byla užitečná pro programátory.

          \ No newline at end of file diff --git a/pyladies/json/index.html b/pyladies/json/index.html index b51f996f..4ea3e359 100644 --- a/pyladies/json/index.html +++ b/pyladies/json/index.html @@ -165,9 +165,9 @@

          Kódování dat

          TOML #

          -

          Knihovnu pro TOML potřeba si nainstalovat. +

          Knihovnu pro TOML je potřeba si nainstalovat. Dělá se to příkazem, který znáš z instalace knihovny Pytest. -Pozor ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného +Pozor, ve jméně toml neudělej překlep, jinak nainstaluješ něco jiného (a možná nebezpečného!):

          (venv)$ python -m pip install toml
           

          Data pak lze kódovat pomocí toml.dumps a dekódovat pomocí toml.loads:

          diff --git a/pyladies/list/index.html b/pyladies/list/index.html index 135b7b38..284b55d4 100644 --- a/pyladies/list/index.html +++ b/pyladies/list/index.html @@ -283,7 +283,7 @@

          Tvoření seznamů for cislo in range(10): mocniny_dvou.append(2 ** cislo) print(mocniny_dvou) -

          Podobným způsobem získáš seznam seznam matka, babička, prababička, +

          Podobným způsobem získáš seznam matka, babička, prababička, praprababička, atd.:

          predkove = ['matka']
           for pocet_pra in range(10):
          diff --git a/pyladies/range/index.html b/pyladies/range/index.html
          index 24d32fc4..17a5dc3f 100644
          --- a/pyladies/range/index.html
          +++ b/pyladies/range/index.html
          @@ -44,7 +44,7 @@ 

          Range – sekvence čísel U trochu menšího čísla (např. 1000000000, ale na každém počítači je to jinak) se může stát, že se Python pokusí seznam začít tvořit, zaplní přitom většinu dostupné paměti a počítač „zamrzne“. -V závislosti na systému se pak třeba může stát že reakce na +V závislosti na systému se pak třeba může stát, že reakce na Ctrl+C bude trvat hodně dlouho.

          Se samotným range(1000000000000000) ale není problém. S konceptem všech čísel od 0 do biliardy se počítač vypořádá, i když si je diff --git a/pyladies/testing/index.html b/pyladies/testing/index.html index 5a99557a..dea07c33 100644 --- a/pyladies/testing/index.html +++ b/pyladies/testing/index.html @@ -1,9 +1,9 @@

          Testování #

          -

          Programátorská práce nespočívá jen v tom, program napsat. +

          Programátorská práce nespočívá jen v tom program napsat. Důležité je si i ověřit, že opravdu funguje, a případně ho pak opravit. -Tomu ověřování že program funguje se říká testování (angl. testing).

          +Tomu ověřování, že program funguje, se říká testování (angl. testing).

          Zatím jsi asi svoje programy testoval/a tak, že jsi je zkusil/a spustit, něco zadal/a a podíval/a se, jestli jsou výsledky v pořádku. @@ -16,13 +16,13 @@

          Testování zkontrolují, že program funguje správně. Spuštěním testů můžeš kdykoli ověřit, že kód funguje. Když v otestovaném kódu v budoucnu uděláš nějakou změnu, -testy ověří, že jsi nerozbil/a nic co dříve fungovalo.

          +testy ověří, že jsi nerozbil/a nic, co dříve fungovalo.

          Instalace knihovny pytest #

          Zatím jsme v kurzu pracovali s tím, co se instaluje se samotným Pythonem – s moduly jako math a turtle. -Kromě takových modulů ale existuje ale velká spousta +Kromě takových modulů ale existuje velká spousta dalších knihoven, které nejsou přímo v Pythonu, ale dají se doinstalovat a používat.

          Na testy je v samotném Pythonu zabudovaná knihovna unittest. @@ -46,8 +46,8 @@

          Instalace knihovny pytest Jiné knihovny ale můžou dělat neplechu nebo být dokonce „zavirované“; už při instalaci můžou něco pokazit. Dej si proto pozor a ve jménu pytest neudělej překlep!

          -

          Nainstaluješ-li přesto omylem něco cos nechtěl/a, dej co nejdřív vědět -zkušenějšímu programátorovi, aby zkontroloval jaký to mohlo mít efekt.

          +

          Nainstaluješ-li přesto omylem něco, cos nechtěl/a, dej co nejdřív vědět +zkušenějšímu programátorovi, aby zkontroloval, jaký to mohlo mít efekt.

          (venv)$ python -m pip install pytest
           

          Co ten příkaz znamená?

          python -m pip zavolá Python s tím, že má pustit modul @@ -71,7 +71,7 @@

          Instalace knihovny pytest

          Nejdříve si testování ukážeme na jednoduchém příkladu. Tady je funkce secti, která umí sečíst -dvě čísla, a další funkce, která testuje jestli se +dvě čísla, a další funkce, která testuje, jestli se secti pro určité hodnoty chová správně.

          Kód si opiš do souboru test_secteni.py v novém prázdném adresáři. Jméno je důležité: pytest ve výchozím nastavení předpokládá, @@ -122,7 +122,7 @@

          Instalace knihovny pytest ze všech souborů, jejichž jméno začíná na test_. Místo souboru lze též uvést adresář: pytest vyhledá testy v něm.

          Zkus si změnit funkci secti (nebo její test) a podívat se, -jak to vypadá když test „neprojde“.

          +jak to vypadá, když test „neprojde“.

          Testovací moduly #

          @@ -131,7 +131,7 @@

          Testovací moduly Je to tak přehlednější a taky to pak zjednodušuje distribuci – předání kódu někomu, kdo ho chce jen spustit a testy nepotřebuje.

          -

          Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py, +

          Rozděl soubor s testem sečítání: funkci secti přesuň do modulu secteni.py a v test_secteni.py nech jenom test. Do test_secteni.py pak na začátek přidej from secteni import secti, aby byla funkce testu k dispozici.

          diff --git a/pyladies/tuple/index.html b/pyladies/tuple/index.html index d929c62e..637d2e01 100644 --- a/pyladies/tuple/index.html +++ b/pyladies/tuple/index.html @@ -99,7 +99,7 @@

          Kdy použít seznam a kdy n

          Seznamy i n-tice mají i technické limity: n-tice nejdou měnit a až se naučíš pracovat se slovníky, -zjistíš že seznamy tam nepůjdou použít jako klíče. +zjistíš, že seznamy tam nepůjdou použít jako klíče. V takových případech je potřeba použít ten druhý typ sekvence.

          Často není úplně jasné, který typ použít. V takovém případě je to pravděpodobně jedno.

          \ No newline at end of file diff --git a/pyladies/with/index.html b/pyladies/with/index.html index 9f717a63..fa90fff3 100644 --- a/pyladies/with/index.html +++ b/pyladies/with/index.html @@ -36,7 +36,7 @@

          Kontext: with a

          Chování příkazu with závisí na objektu, se kterým jej použiješ. Pro soubor – výsledek funkce open – se soubor na konci bloku zavře. -Podobných „samozavíracích“ objektů které se dají použít s with existuje +Podobných „samozavíracích“ objektů, které se dají použít s with, existuje v různých knihovnách víc. Typické jsou objekty, které se starají o připojení např. k jinému počítači nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.

          diff --git a/pyladies/zip-enumerate/index.html b/pyladies/zip-enumerate/index.html index d6dc42d1..463db769 100644 --- a/pyladies/zip-enumerate/index.html +++ b/pyladies/zip-enumerate/index.html @@ -20,7 +20,7 @@

          Enumerate: očíslování sekvence

          Funkce enumerate vezme nějakou existující sekvenci a očísluje ji: ve vrácené sekvenci budou dvojice (index, původní hodnota).

          -

          Řekněme že máš tento seznam:

          +

          Řekněme, že máš tento seznam:

          trpaslici = ['Prófa', 'Stydlín', 'Dřímal', 'Kejchal', 'Štístko',
                        'Šmudla', 'Rejpal']
           

          Když na něj použiješ enumerate, dostaneš objekt enumerate, @@ -123,7 +123,7 @@

          Zip: Víc iterací najednou

          Další iterátor n-tic je funkce zip, která umí projít dvě sekvence naráz.

          -

          Řekněme že máš seznam věcí a druhý seznam, ve kterém jsou barvy těch věcí:

          +

          Řekněme, že máš seznam věcí a druhý seznam, ve kterém jsou barvy těch věcí:

          veci = ['tráva', 'slunce', 'mrkev', 'list']
           barvy = ['zelená', 'žluté', 'oranžová', 'zelený']
           

          Když na ně zavoláš zip, dostaneš iterátor, který (podobně jako enumerate @@ -166,7 +166,7 @@

          Řešení

          Ukázat řešení