From 59bd24ad2f269a8b744291ca8da52b60ceb8b805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Tomsa?= Date: Sun, 27 Jan 2019 12:58:10 +0100 Subject: [PATCH 01/37] =?UTF-8?q?Zalo=C5=BE=20nov=C3=BD=20b=C4=9Bh=20pro?= =?UTF-8?q?=20ostravsk=C3=A9=20jaro=202019?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vytvořen nový běh pro jarní Ostravu v roce 2019. Zkopírován podzimní z roku 2018 a upraveny datumy. Sloučeny moduly s testováním, rozděleny třídy a dědičnost. Upravena typografie. --- runs/2019/pyladies-ostrava-jaro/info.yml | 271 +++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 runs/2019/pyladies-ostrava-jaro/info.yml diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml new file mode 100644 index 0000000000..20a94086ce --- /dev/null +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -0,0 +1,271 @@ +title: Začátečnický kurz PyLadies +subtitle: Ostrava – jaro 2019 +time: 17:00–19:00 +default_time: + start: '17:00' + end: '19:00' +place: Tieto Towers, 28. října 3346/91, Moravská Ostrava, Ostrava +description: Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba. +long_description: | + Tady najdeš všechny materiály k ostravské verzi začátečnického kurzu + PyLadies. + + Stránky samotných PyLadies jsou na [http://pyladies.cz][PyLadies]. + + Jednotlivé lekce jsou určeny naprostým začátečnicím. + Instrukce jsou uvedeny pro operační systémy Linux, Windows i macOS. + + [PyLadies]: https://pyladies.cz/ +derives: pyladies +vars: + user-gender: f + pyladies: true + coach-present: true +plan: +- title: Instalace + slug: install + date: 2019-02-05 + materials: + - url: http://pyladies.cz/v1/s001-install/uvod-ostrava.html + title: Úvodní prezentace + - lesson: beginners/cmdline + type: lesson + - lesson: beginners/install + type: lesson + - lesson: beginners/first-steps + type: lesson + - lesson: beginners/install-editor + type: lesson + - title: Tahák na klávesnici (PDF) + url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf + type: cheatsheet + - title: Instrukce a domácí projekty (PDF) + url: http://pyladies.cz/v1/s001-install/handout/handout.pdf + type: homework +- title: První program + slug: hello-world + date: 2019-02-12 + materials: + - lesson: beginners/hello-world + type: lesson + - lesson: beginners/print + title: Chybové hlášky a print + type: lesson + - lesson: beginners/variables + type: lesson + - lesson: beginners/comparisons + type: lesson + - title: Společná večeře PyLadies ve Slezské P.U.O.R. + type: special + url: http://slezska.com/ + - title: Domácí projekty (PDF) + url: http://pyladies.cz/v1/s002-hello-world/handout/handout2-ostrava.pdf + type: homework + - title: "Nebo anebo a (bonus)" + lesson: beginners/and-or + vars: + bonus: true + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/AACCcUMFnjUBKeMCXzms +- title: Cykly + slug: loops + date: 2019-02-19 + materials: + - lesson: beginners/functions + type: lesson + - lesson: intro/turtle + type: lesson + - title: Tahák s užitečnými funkcemi + url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf + type: cheatsheet + - title: Domácí projekty (PDF) + url: http://pyladies.cz/v1/s003-looping/handout/handout3a.pdf + type: homework + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/1C7qR4cK9s0gfEHP2rDI +- title: Jeden nový cyklus a procvičování + slug: while + date: 2019-02-26 + materials: + - lesson: beginners/while + type: lesson + - title: Úkoly k procvičování + type: link + url: http://pyladies.cz/v1/s003-looping/ostrava/ukoly-k-procvicovani/ukoly.html + - title: Domácí projekty (PDF) + type: homework + url: http://pyladies.cz/v1/s003-looping/handout/handout3b-ostrava.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/b0l0jiJhNNUBhdf0ncl5 +- title: Funkce a řetězce + slug: def-str + date: 2019-03-05 + materials: + - lesson: beginners/def + type: lesson + - lesson: beginners/str + type: lesson + - title: Řetězcový tahák + url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf + type: cheatsheet + - title: Domácí projekty (PDF) + url: http://pyladies.cz/v1/s004-strings/handout/handout4-ostrava.pdf + type: homework + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/ztWlVnOsOM1smoLPxltm +- title: Soubory a výjimky + slug: file + date: 2019-03-12 + materials: + - lesson: beginners/exceptions + type: lesson + - lesson: beginners/files + type: lesson + - title: Domácí projekty A (PDF) + type: homework + url: http://pyladies.cz/v1/s005-modules/handout/handout5a-ostrava.pdf + - title: Domácí projekty B (PDF) + type: homework + url: http://pyladies.cz/v1/s005-modules/handout/handout7-ostrava.pdf + - title: odkaz k domácím projektům – hiragana + url: http://pyladies.cz/v1/s006-lists/resources/hiragana.txt + type: link + - title: odkaz k domácím projektům – katakana + url: http://pyladies.cz/v1/s006-lists/resources/katakana.txt + type: link + - title: odkaz k domácím projektům – „日本語の表記体系” na japonské Wikipedii + url: http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E8%A1%A8%E8%A8%98%E4%BD%93%E7%B3%BB + type: link + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/BLnJ6NvNedROu9HkB1rw +- title: Seznamy + slug: list + date: 2019-03-19 + materials: + - lesson: beginners/list + type: lesson + - lesson: beginners/tuple + type: lesson + - title: Tahák na seznamy + url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf + type: cheatsheet + - title: Domácí projekty (PDF) + url: http://pyladies.cz/v1/s006-lists/handout-ostrava/handout6.pdf + type: homework + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/U1mnwyGK9KimfVummSEZ +- title: Slovníky + slug: dict + date: 2019-03-26 + materials: + - lesson: beginners/dict + type: lesson + - lesson: intro/json + type: lesson + - title: Ukázka jednoduchého API + type: lesson + url: http://pyladies.cz/v1/s011-dicts/simple-api.html + - title: Slovníkový tahák + url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf + type: cheatsheet + - title: Domácí projekty (PDF) + type: homework + url: https://pyladies.cz/v1/s011-dicts/handout/handout9.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/oJ3pgen7AmDea0lBfPog +- title: Moduly a testování + slug: modules-testing + date: 2019-04-02 + materials: + - lesson: beginners/modules + type: lesson + - lesson: beginners/circular-imports + title: Poznámka o importování + type: lesson + - title: Domácí projekty k modulům (PDF) + url: http://pyladies.cz/v1/s005-modules/handout/handout5b-ostrava.pdf + type: homework + - lesson: beginners/testing + type: lesson + - title: Domácí projekty k testování (PDF) + type: homework + url: http://pyladies.cz/v1/s005-modules/handout/handout5c-ostrava.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/xApsz9zKYxknLpJf8Qml +- title: Grafika + slug: pyglet + date: 2019-04-09 + materials: + - lesson: intro/pyglet + type: lesson + - title: "Praktické cvičení: Pong – mimo kurz navíc" + lesson: projects/pong + - title: Kód celé hry Pong + url: http://pyladies.cz/v1/s012-pyglet/pong.py + - title: Tahák na Pyglet + url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf + type: cheatsheet + - title: Domácí projekty (PDF) + type: homework + url: https://pyladies.cz/v1/s012-pyglet/handout/handout.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/3e5TNn6NBlfI7SD5GFrW +- title: Třídy + slug: class + date: 2019-04-16 + materials: + - lesson: beginners/class + type: lesson + - lesson: beginners/inheritance + type: lesson + - title: Domácí projekty (PDF) + type: homework + url: https://pyladies.cz/v1/s014-class/handout/handout.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/SOtp5ITHEPscn0MqzEM5 +- title: Dědičnost + slug: inheritance + date: 2019-04-23 + materials: + - lesson: beginners/inheritance + type: lesson + - title: Domácí projekty (PDF) + type: homework + url: https://pyladies.cz/v1/s014-class/handout/handout.pdf + - title: Odevzdání domácích projektů + type: link + url: https://www.dropbox.com/request/AqCwMoyF9FuyI6Sinwu0 +- title: Závěrečný projekt + slug: asteroids + date: 2019-04-30 + materials: + - lesson: projects/asteroids + type: lesson + - lesson: projects/snake + type: lesson + - title: Množinový tahák + url: https://pyvec.github.io/cheatsheets/sets/sets-cs.pdf + type: cheatsheet + - title: Tahák na geometrii a fyziku 2D her + url: https://pyvec.github.io/cheatsheets/game-physics/game-physics-cs.pdf + type: cheatsheet +- title: Pokračování závěrečného projektu + slug: asteroids2 + date: 2019-05-07 + description: V této lekci budeme pokračovat v dalších fázích závěrečného projektu. + materials: [] +- title: Závěrečná hodina + slug: asteroids3 + date: 2019-05-14 + description: Během závěrečné hodiny si předáme diplomy a seznámíme se s možnostmi pokračování studia + materials: [] From 698c9dbf7d96b828903d8b7ae78189a23551254f Mon Sep 17 00:00:00 2001 From: Zuzanita <32848573+Zuzanita@users.noreply.github.com> Date: Thu, 31 Jan 2019 13:27:24 +0100 Subject: [PATCH 02/37] Prague spring 2019 runs --- runs/2019/pyladies-praha-jaro-cznic/info.yml | 131 +++++++++++++++++++ runs/2019/pyladies-praha-jaro-ntk/info.yml | 131 +++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 runs/2019/pyladies-praha-jaro-cznic/info.yml create mode 100644 runs/2019/pyladies-praha-jaro-ntk/info.yml diff --git a/runs/2019/pyladies-praha-jaro-cznic/info.yml b/runs/2019/pyladies-praha-jaro-cznic/info.yml new file mode 100644 index 0000000000..5b36f9245e --- /dev/null +++ b/runs/2019/pyladies-praha-jaro-cznic/info.yml @@ -0,0 +1,131 @@ +title: Začátečnický kurz PyLadies +subtitle: Praha (Olšanka) - jaro 2019 +time: 18:00 - 20:00 +default_time: + start: '18:00' + end: '20:00' +place: cz.nic, hotel Olšanka, Táboritská 23/1000, Praha 3 +description: Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba. +long_description: | + Tady najdeš všechny materiály k pražské verzi začátečnického kurzu PyLadies. Stránky samotných PyLadies jsou na http://pyladies.cz. Jednotlivé lekce jsou určeny naprostým začátečnicím. Instrukce jsou uvedeny pro operační systémy Linux, Windows i macOS. + + Domácí projekty lze odevzdávat na projekty.pyladies.cz. +derives: pyladies +vars: + pyladies: true + coach-present: true +plan: +- base: install + date: 2019-03-05 + materials: + - title: Úvodní prezentace + url: http://pyladies.cz/v1/s001-install/uvod-praha.html + - lesson: beginners/cmdline + type: lesson + - lesson: beginners/install + type: lesson + - lesson: beginners/venv-setup + type: lesson + - lesson: beginners/first-steps + type: lesson + - lesson: beginners/install-editor + type: lesson + - title: Instrukce a domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s001-install/handout/handout.pdf + type: homework + - title: Tahák na klávesnici (PDF) + url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf + type: cheatsheet + - title: Tahák na příkazovou řádku a první kroky v Pythonu (PDF) + url: https://s3-eu-west-1.amazonaws.com/messa-shared-files/2017/09/pyladies_2_lekce_tahak.pdf + type: cheatsheet +- base: hello + date: 2019-03-12 + materials: + - lesson: beginners/hello-world + type: lesson + - lesson: beginners/print + type: lesson + - lesson: beginners/variables + type: lesson + - lesson: beginners/comparisons + type: lesson + - title: Domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s002-hello-world/handout/handout2.pdf + type: homework + - title: "*Nebo* anebo *a* (bonus)" + lesson: beginners/and-or + vars: + bonus: true +- base: loops + date: 2019-03-19 + materils: + - lesson: beginners/functions + type: lesson + - lesson: intro/turtle + type: lesson + - title: Domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s003-looping/handout/handout3a.pdf + type: homework + - title: Tahák s užitečnými funkcemi + url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf + type: cheatsheet +- slug: while and functions + title: While & Vlastní funkce + date: 2019-03-26 + materials: + - lesson: beginners/while + type: lesson + - lesson: beginners/def + type: lesson +- slug: strings + title: Řetězce + date: 2019-04-02 + materials: + - lesson: beginners/str + type: lesson + - title: Řetězcový tahák + url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf + type: cheatsheet +- slug: practice + title: Procvičování + date: 2019-04-09 + materials: + - title: Procvičíme si vše, co jsme se naučily + url: null + type: special +- base: list + date: 2019-04-16 + materials: + - lesson: beginners/list + type: lesson + - title: Tahák na seznamy + url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf + type: cheatsheet +- base: dict + date: 2019-04-23 + materials: + - lesson: beginners/dict + type: lesson + - title: slovníkový tahák + url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf + type: cheatsheet +- base: tests + date: 2019-04-30 +- base: class + title: Opakování & Třídy + date: 2019-05-07 + materials: + - lesson: beginners/class + type: lesson +- slug: inheritance + title: Třídy & Dědičnost + date: 2019-05-14 + materials: + - lesson: beginners/inheritance + type: lesson +- base: pyglet + date: 2019-05-21 +- slug: data + title: Datová analýza + date: 2019-05-28 diff --git a/runs/2019/pyladies-praha-jaro-ntk/info.yml b/runs/2019/pyladies-praha-jaro-ntk/info.yml new file mode 100644 index 0000000000..422b7ecd4c --- /dev/null +++ b/runs/2019/pyladies-praha-jaro-ntk/info.yml @@ -0,0 +1,131 @@ +title: Začátečnický kurz PyLadies +subtitle: Praha (NTK) - jaro 2019 +time: 18:00 - 20:00 +default_time: + start: '18:00' + end: '20:00' +place: Národní technická knihovna, Technická 2710/6, Praha 6, +description: Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba. +long_description: | + Tady najdeš všechny materiály k pražské verzi začátečnického kurzu PyLadies. Stránky samotných PyLadies jsou na http://pyladies.cz. Jednotlivé lekce jsou určeny naprostým začátečnicím. Instrukce jsou uvedeny pro operační systémy Linux, Windows i macOS. + + Domácí projekty lze odevzdávat na projekty.pyladies.cz. +derives: pyladies +vars: + pyladies: true + coach-present: true +plan: +- base: install + date: 2019-03-07 + materials: + - title: Úvodní prezentace + url: http://pyladies.cz/v1/s001-install/uvod-praha.html + - lesson: beginners/cmdline + type: lesson + - lesson: beginners/install + type: lesson + - lesson: beginners/venv-setup + type: lesson + - lesson: beginners/first-steps + type: lesson + - lesson: beginners/install-editor + type: lesson + - title: Instrukce a domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s001-install/handout/handout.pdf + type: homework + - title: Tahák na klávesnici (PDF) + url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf + type: cheatsheet + - title: Tahák na příkazovou řádku a první kroky v Pythonu (PDF) + url: https://s3-eu-west-1.amazonaws.com/messa-shared-files/2017/09/pyladies_2_lekce_tahak.pdf + type: cheatsheet +- base: hello + date: 2019-03-14 + materials: + - lesson: beginners/hello-world + type: lesson + - lesson: beginners/print + type: lesson + - lesson: beginners/variables + type: lesson + - lesson: beginners/comparisons + type: lesson + - title: Domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s002-hello-world/handout/handout2.pdf + type: homework + - title: "*Nebo* anebo *a* (bonus)" + lesson: beginners/and-or + vars: + bonus: true +- base: loops + date: 2019-03-21 + materils: + - lesson: beginners/functions + type: lesson + - lesson: intro/turtle + type: lesson + - title: Domácí projekty (PDF) + url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s003-looping/handout/handout3a.pdf + type: homework + - title: Tahák s užitečnými funkcemi + url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf + type: cheatsheet +- slug: while and functions + title: While & Vlastní funkce + date: 2019-03-28 + materials: + - lesson: beginners/while + type: lesson + - lesson: beginners/def + type: lesson +- slug: strings + title: Řetězce + date: 2019-04-04 + materials: + - lesson: beginners/str + type: lesson + - title: Řetězcový tahák + url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf + type: cheatsheet +- slug: practice + title: Procvičování + date: 2019-04-11 + materials: + - title: Procvičíme si vše, co jsme se naučily + url: null + type: special +- base: list + date: 2019-04-18 + materials: + - lesson: beginners/list + type: lesson + - title: Tahák na seznamy + url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf + type: cheatsheet +- base: dict + date: 2019-04-25 + materials: + - lesson: beginners/dict + type: lesson + - title: Slovníkový tahák + url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf + type: cheatsheet +- base: tests + date: 2019-05-02 +- base: class + title: Opakování & Třídy + date: 2019-05-09 + materials: + - lesson: beginners/class + type: lesson +- slug: inheritance + title: Třídy & Dědičnost + date: 2019-05-16 + materials: + - lesson: beginners/inheritance + type: lesson +- base: pyglet + date: 2019-05-22 +- slug: data + title: Datová analýza + date: 2019-05-30 From 2f39fe832c054fa9ae45e4a1dce46be588b6668c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 31 Jan 2019 13:43:45 +0100 Subject: [PATCH 03/37] Prague updates based on Google spreadsheet --- runs/2019/pyladies-praha-jaro-cznic/info.yml | 29 +++++++++----------- runs/2019/pyladies-praha-jaro-ntk/info.yml | 29 +++++++++----------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/runs/2019/pyladies-praha-jaro-cznic/info.yml b/runs/2019/pyladies-praha-jaro-cznic/info.yml index 5b36f9245e..19b460c73f 100644 --- a/runs/2019/pyladies-praha-jaro-cznic/info.yml +++ b/runs/2019/pyladies-praha-jaro-cznic/info.yml @@ -30,8 +30,8 @@ plan: type: lesson - lesson: beginners/install-editor type: lesson - - title: Instrukce a domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s001-install/handout/handout.pdf + - title: Domácí projekty + url: https://projekty.pyladies.cz/ type: homework - title: Tahák na klávesnici (PDF) url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf @@ -50,9 +50,6 @@ plan: type: lesson - lesson: beginners/comparisons type: lesson - - title: Domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s002-hello-world/handout/handout2.pdf - type: homework - title: "*Nebo* anebo *a* (bonus)" lesson: beginners/and-or vars: @@ -64,13 +61,10 @@ plan: type: lesson - lesson: intro/turtle type: lesson - - title: Domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s003-looping/handout/handout3a.pdf - type: homework - title: Tahák s užitečnými funkcemi url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf type: cheatsheet -- slug: while and functions +- slug: while-functions title: While & Vlastní funkce date: 2019-03-26 materials: @@ -88,20 +82,16 @@ plan: url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf type: cheatsheet - slug: practice - title: Procvičování + title: Procvičování & soubory date: 2019-04-09 materials: - title: Procvičíme si vše, co jsme se naučily url: null type: special + - lesson: beginners/files + type: lesson - base: list date: 2019-04-16 - materials: - - lesson: beginners/list - type: lesson - - title: Tahák na seznamy - url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf - type: cheatsheet - base: dict date: 2019-04-23 materials: @@ -112,12 +102,16 @@ plan: type: cheatsheet - base: tests date: 2019-04-30 + title: Výjimky, moduly & testování - base: class title: Opakování & Třídy date: 2019-05-07 materials: - lesson: beginners/class type: lesson + - title: Tahák na třídy + url: https://pyvec.github.io/cheatsheets/classes/classes.pdf + type: cheatsheet - slug: inheritance title: Třídy & Dědičnost date: 2019-05-14 @@ -129,3 +123,6 @@ plan: - slug: data title: Datová analýza date: 2019-05-28 + materials: + - lesson: intro/notebook + - lesson: intro/pandas diff --git a/runs/2019/pyladies-praha-jaro-ntk/info.yml b/runs/2019/pyladies-praha-jaro-ntk/info.yml index 422b7ecd4c..afe030fbab 100644 --- a/runs/2019/pyladies-praha-jaro-ntk/info.yml +++ b/runs/2019/pyladies-praha-jaro-ntk/info.yml @@ -30,8 +30,8 @@ plan: type: lesson - lesson: beginners/install-editor type: lesson - - title: Instrukce a domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s001-install/handout/handout.pdf + - title: Domácí projekty + url: https://projekty.pyladies.cz/ type: homework - title: Tahák na klávesnici (PDF) url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf @@ -50,9 +50,6 @@ plan: type: lesson - lesson: beginners/comparisons type: lesson - - title: Domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s002-hello-world/handout/handout2.pdf - type: homework - title: "*Nebo* anebo *a* (bonus)" lesson: beginners/and-or vars: @@ -64,13 +61,10 @@ plan: type: lesson - lesson: intro/turtle type: lesson - - title: Domácí projekty (PDF) - url: https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s003-looping/handout/handout3a.pdf - type: homework - title: Tahák s užitečnými funkcemi url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf type: cheatsheet -- slug: while and functions +- slug: while-functions title: While & Vlastní funkce date: 2019-03-28 materials: @@ -88,20 +82,16 @@ plan: url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf type: cheatsheet - slug: practice - title: Procvičování + title: Procvičování & soubory date: 2019-04-11 materials: - title: Procvičíme si vše, co jsme se naučily url: null type: special + - lesson: beginners/files + type: lesson - base: list date: 2019-04-18 - materials: - - lesson: beginners/list - type: lesson - - title: Tahák na seznamy - url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf - type: cheatsheet - base: dict date: 2019-04-25 materials: @@ -112,12 +102,16 @@ plan: type: cheatsheet - base: tests date: 2019-05-02 + title: Výjimky, moduly & testování - base: class title: Opakování & Třídy date: 2019-05-09 materials: - lesson: beginners/class type: lesson + - title: Tahák na třídy + url: https://pyvec.github.io/cheatsheets/classes/classes.pdf + type: cheatsheet - slug: inheritance title: Třídy & Dědičnost date: 2019-05-16 @@ -129,3 +123,6 @@ plan: - slug: data title: Datová analýza date: 2019-05-30 + materials: + - lesson: intro/notebook + - lesson: intro/pandas From f6e8555d8e6f9444dfa1d74d65ff4ddf25162233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 31 Jan 2019 16:15:36 +0100 Subject: [PATCH 04/37] Fix a typo in date --- runs/2019/pyladies-praha-jaro-ntk/info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runs/2019/pyladies-praha-jaro-ntk/info.yml b/runs/2019/pyladies-praha-jaro-ntk/info.yml index afe030fbab..a870e98e2a 100644 --- a/runs/2019/pyladies-praha-jaro-ntk/info.yml +++ b/runs/2019/pyladies-praha-jaro-ntk/info.yml @@ -119,7 +119,7 @@ plan: - lesson: beginners/inheritance type: lesson - base: pyglet - date: 2019-05-22 + date: 2019-05-23 - slug: data title: Datová analýza date: 2019-05-30 From 2684d617d3689daa04d4859260f1be1027cab9b3 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 5 Feb 2019 14:34:12 +0100 Subject: [PATCH 05/37] Ostrava: Add venv setup to plan --- runs/2019/pyladies-ostrava-jaro/info.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index 20a94086ce..9866204d06 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -32,6 +32,8 @@ plan: type: lesson - lesson: beginners/install type: lesson + - lesson: beginners/venv-setup + type: lesson - lesson: beginners/first-steps type: lesson - lesson: beginners/install-editor From 223cd22a58c23e3c8f67b10d187aa81e457c3841 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Sun, 10 Feb 2019 00:56:31 +0100 Subject: [PATCH 06/37] Fix typo in Prague courses --- runs/2019/pyladies-praha-jaro-ntk/info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runs/2019/pyladies-praha-jaro-ntk/info.yml b/runs/2019/pyladies-praha-jaro-ntk/info.yml index a870e98e2a..c13115ee16 100644 --- a/runs/2019/pyladies-praha-jaro-ntk/info.yml +++ b/runs/2019/pyladies-praha-jaro-ntk/info.yml @@ -56,7 +56,7 @@ plan: bonus: true - base: loops date: 2019-03-21 - materils: + materials: - lesson: beginners/functions type: lesson - lesson: intro/turtle From b14e321ac071f4873f1721b94ca108248114e951 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Fri, 8 Feb 2019 14:08:26 +0100 Subject: [PATCH 07/37] Render first 3 homeworks for Ostrava from YAML Takes the task definitions in YAML/Markdown from the Courseware (https://github.com/messa/pyladies-courseware) and renders them in HTML. Further homework can be added similarly. This requires naucse_render 1.1+, so Pipfile and Pipfile.lock have changed. Run "pipenv install" to update the dependencies. --- Pipfile | 2 +- Pipfile.lock | 124 ++++++----- lessons/homework/ostrava1/index.md | 21 ++ lessons/homework/ostrava1/info.yml | 6 + lessons/homework/ostrava1/tasks.yml | 90 ++++++++ lessons/homework/ostrava2/index.md | 23 ++ lessons/homework/ostrava2/info.yml | 9 + lessons/homework/ostrava2/tasks.yml | 202 ++++++++++++++++++ lessons/homework/ostrava3/index.md | 23 ++ lessons/homework/ostrava3/info.yml | 7 + .../homework/ostrava3/static/03_diagram.png | Bin 0 -> 12982 bytes .../ostrava3/static/03_trojuhelnik.png | Bin 0 -> 3037 bytes .../homework/ostrava3/static/04_domecek.png | Bin 0 -> 2060 bytes .../homework/ostrava3/static/05_vesnice.png | Bin 0 -> 19330 bytes .../homework/ostrava3/static/06_uhelniky.png | Bin 0 -> 11941 bytes .../homework/ostrava3/static/10_ornament.png | Bin 0 -> 1324 bytes .../homework/ostrava3/static/11_ornament.png | Bin 0 -> 4657 bytes .../homework/ostrava3/static/12_spirala.png | Bin 0 -> 43604 bytes .../homework/ostrava3/static/15_kvetina.png | Bin 0 -> 84674 bytes lessons/homework/ostrava3/tasks.yml | 139 ++++++++++++ runs/2019/pyladies-ostrava-jaro/info.yml | 9 +- 21 files changed, 585 insertions(+), 70 deletions(-) create mode 100644 lessons/homework/ostrava1/index.md create mode 100644 lessons/homework/ostrava1/info.yml create mode 100644 lessons/homework/ostrava1/tasks.yml create mode 100644 lessons/homework/ostrava2/index.md create mode 100644 lessons/homework/ostrava2/info.yml create mode 100644 lessons/homework/ostrava2/tasks.yml create mode 100644 lessons/homework/ostrava3/index.md create mode 100644 lessons/homework/ostrava3/info.yml create mode 100644 lessons/homework/ostrava3/static/03_diagram.png create mode 100644 lessons/homework/ostrava3/static/03_trojuhelnik.png create mode 100644 lessons/homework/ostrava3/static/04_domecek.png create mode 100644 lessons/homework/ostrava3/static/05_vesnice.png create mode 100644 lessons/homework/ostrava3/static/06_uhelniky.png create mode 100644 lessons/homework/ostrava3/static/10_ornament.png create mode 100644 lessons/homework/ostrava3/static/11_ornament.png create mode 100644 lessons/homework/ostrava3/static/12_spirala.png create mode 100644 lessons/homework/ostrava3/static/15_kvetina.png create mode 100644 lessons/homework/ostrava3/tasks.yml diff --git a/Pipfile b/Pipfile index 160ae1a168..9d6c91d7c6 100644 --- a/Pipfile +++ b/Pipfile @@ -33,7 +33,7 @@ GitPython = "*" jsonschema = "*" lxml = "*" pygments-pytest = "*" -naucse-render = "<1.0" +naucse-render = "<2.0,>=1.1" [dev-packages] pytest = "*" diff --git a/Pipfile.lock b/Pipfile.lock index abae941e87..173f55be80 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a5eae78985a62a4066c7c963eb885031dd513a08b16bc5701d932f1000928006" + "sha256": "db186632c63887911e7f7ae4bab01da58591afbdcc687356913159fb24000ab1" }, "pipfile-spec": 6, "requires": { @@ -93,10 +93,10 @@ }, "decorator": { "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + "sha256:33cd704aea07b4c28b3eb2c97d288a06918275dac0ecebdaf1bc8a48d98adb9e", + "sha256:cabb249f4710888a2fc0e13e9a16c343d932033718ff62e1e9bc93a9d3a9122b" ], - "version": "==4.3.0" + "version": "==4.3.2" }, "defusedxml": { "hashes": [ @@ -262,35 +262,35 @@ }, "lxml": { "hashes": [ - "sha256:0dd6589fa75d369ba06d2b5f38dae107f76ea127f212f6a7bee134f6df2d1d21", - "sha256:1afbac344aa68c29e81ab56c1a9411c3663157b5aee5065b7fa030b398d4f7e0", - "sha256:1baad9d073692421ad5dbbd81430aba6c7f5fdc347f03537ae046ddf2c9b2297", - "sha256:1d8736421a2358becd3edf20260e41a06a0bf08a560480d3a5734a6bcbacf591", - "sha256:1e1d9bddc5afaddf0de76246d3f2152f961697ad7439c559f179002682c45801", - "sha256:1f179dc8b2643715f020f4d119d5529b02cd794c1c8f305868b73b8674d2a03f", - "sha256:241fb7bdf97cb1df1edfa8f0bcdfd80525d4023dac4523a241907c8b2f44e541", - "sha256:2f9765ee5acd3dbdcdc0d0c79309e01f7c16bc8d39b49250bf88de7b46daaf58", - "sha256:312e1e1b1c3ce0c67e0b8105317323e12807955e8186872affb667dbd67971f6", - "sha256:3273db1a8055ca70257fd3691c6d2c216544e1a70b673543e15cc077d8e9c730", - "sha256:34dfaa8c02891f9a246b17a732ca3e99c5e42802416628e740a5d1cb2f50ff49", - "sha256:3aa3f5288af349a0f3a96448ebf2e57e17332d99f4f30b02093b7948bd9f94cc", - "sha256:51102e160b9d83c1cc435162d90b8e3c8c93b28d18d87b60c56522d332d26879", - "sha256:56115fc2e2a4140e8994eb9585119a1ae9223b506826089a3ba753a62bd194a6", - "sha256:69d83de14dbe8fe51dccfd36f88bf0b40f5debeac763edf9f8325180190eba6e", - "sha256:99fdce94aeaa3ccbdfcb1e23b34273605c5853aa92ec23d84c84765178662c6c", - "sha256:a7c0cd5b8a20f3093ee4a67374ccb3b8a126743b15a4d759e2a1bf098faac2b2", - "sha256:abe12886554634ed95416a46701a917784cb2b4c77bfacac6916681d49bbf83d", - "sha256:b4f67b5183bd5f9bafaeb76ad119e977ba570d2b0e61202f534ac9b5c33b4485", - "sha256:bdd7c1658475cc1b867b36d5c4ed4bc316be8d3368abe03d348ba906a1f83b0e", - "sha256:c6f24149a19f611a415a51b9bc5f17b6c2f698e0d6b41ffb3fa9f24d35d05d73", - "sha256:d1e111b3ab98613115a208c1017f266478b0ab224a67bc8eac670fa0bad7d488", - "sha256:d6520aa965773bbab6cb7a791d5895b00d02cf9adc93ac2bf4edb9ac1a6addc5", - "sha256:dd185cde2ccad7b649593b0cda72021bc8a91667417001dbaf24cd746ecb7c11", - "sha256:de2e5b0828a9d285f909b5d2e9d43f1cf6cf21fe65bc7660bdaa1780c7b58298", - "sha256:f726444b8e909c4f41b4fde416e1071cf28fa84634bfb4befdf400933b6463af" + "sha256:0537eee4902e8bf4f41bfee8133f7edf96533dd175930a12086d6a40d62376b2", + "sha256:0562ec748abd230ab87d73384e08fa784f9b9cee89e28696087d2d22c052cc27", + "sha256:09e91831e749fbf0f24608694e4573be0ef51430229450c39c83176cc2e2d353", + "sha256:1ae4c0722fc70c0d4fba43ae33c2885f705e96dce1db41f75ae14a2d2749b428", + "sha256:1c630c083d782cbaf1f7f37f6cac87bda9cff643cf2803a5f180f30d97955cef", + "sha256:2fe74e3836bd8c0fa7467ffae05545233c7f37de1eb765cacfda15ad20c6574a", + "sha256:37af783c2667ead34a811037bda56a0b142ac8438f7ed29ae93f82ddb812fbd6", + "sha256:3f2d9eafbb0b24a33f56acd16f39fc935756524dcb3172892721c54713964c70", + "sha256:47d8365a8ef14097aa4c65730689be51851b4ade677285a3b2daa03b37893e26", + "sha256:510e904079bc56ea784677348e151e1156040dbfb736f1d8ea4b9e6d0ab2d9f4", + "sha256:58d0851da422bba31c7f652a7e9335313cf94a641aa6d73b8f3c67602f75b593", + "sha256:7940d5c2185ffb989203dacbb28e6ae88b4f1bb25d04e17f94b0edd82232bcbd", + "sha256:7cf39bb3a905579836f7a8f3a45320d9eb22f16ab0c1e112efb940ced4d057a5", + "sha256:9563a23c1456c0ab550c087833bc13fcc61013a66c6420921d5b70550ea312bf", + "sha256:95b392952935947e0786a90b75cc33388549dcb19af716b525dae65b186138fc", + "sha256:983129f3fd3cef5c3cf067adcca56e30a169656c00fcc6c648629dbb850b27fa", + "sha256:a0b75b1f1854771844c647c464533def3e0a899dd094a85d1d4ed72ecaaee93d", + "sha256:b5db89cc0ef624f3a81214b7961a99f443b8c91e88188376b6b322fd10d5b118", + "sha256:c0a7751ba1a4bfbe7831920d98cee3ce748007eab8dfda74593d44079568219a", + "sha256:c0c5a7d4aafcc30c9b6d8613a362567e32e5f5b708dc41bc3a81dac56f8af8bb", + "sha256:d4d63d85eacc6cb37b459b16061e1f100d154bee89dc8d8f9a6128a5a538e92e", + "sha256:da5e7e941d6e71c9c9a717c93725cda0708c2474f532e3680ac5e39ec57d224d", + "sha256:dccad2b3c583f036f43f80ac99ee212c2fa9a45151358d55f13004d095e683b2", + "sha256:df46307d39f2aeaafa1d25309b8a8d11738b73e9861f72d4d0a092528f498baa", + "sha256:e70b5e1cb48828ddd2818f99b1662cb9226dc6f57d07fc75485405c77da17436", + "sha256:ea825562b8cd057cbc9810d496b8b5dec37a1e2fc7b27bc7c1e72ce94462a09a" ], "index": "pypi", - "version": "==4.3.0" + "version": "==4.3.1" }, "markupsafe": { "hashes": [ @@ -335,19 +335,18 @@ }, "naucse-render": { "hashes": [ - "sha256:38730174ab499182a0a915c210060fceaa0be49ced88677e50865d6365ef9d34", - "sha256:66a36b29141d37398a2608e1f9718e850bc36908d1aae653531906b039b3ad58" + "sha256:a1d59668fe459095c52825dac43a4d5e15be96119654a9365a83017688f3817d" ], "index": "pypi", - "version": "==0.1" + "version": "==1.1" }, "nbconvert": { "hashes": [ - "sha256:08d21cf4203fabafd0d09bbd63f06131b411db8ebeede34b0fd4be4548351779", - "sha256:a8a2749f972592aa9250db975304af6b7337f32337e523a2c995cc9e12c07807" + "sha256:302554a2e219bc0fc84f3edd3e79953f3767b46ab67626fdec16e38ba3f7efe4", + "sha256:5de8fb2284422272a1d45abc77c07b888127550a6d602ce619592a2b08a474ff" ], "index": "pypi", - "version": "==5.4.0" + "version": "==5.4.1" }, "nbformat": { "hashes": [ @@ -364,10 +363,10 @@ }, "parso": { "hashes": [ - "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + "sha256:6ecf7244be8e7283ec9009c72d074830e7e0e611c974f813d76db0390a4e0dd6", + "sha256:8162be7570ffb34ec0b8d215d7f3b6c5fab24f51eb3886d6dee362de96b6db94" ], - "version": "==0.3.1" + "version": "==0.3.3" }, "pexpect": { "hashes": [ @@ -386,11 +385,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", - "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", - "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" + "sha256:88002cc618cacfda8760c4539e76c3b3f148ecdb7035a3d422c7ecdc90c2a3ba", + "sha256:c6655a12e9b08edb8cf5aeab4815fd1e1bdea4ad73d3bbf269cf2e0c4eb75d5e", + "sha256:df5835fb8f417aa55e5cafadbaeb0cf630a1e824aad16989f9f0493e679ec010" ], - "version": "==2.0.7" + "version": "==2.0.8" }, "ptyprocess": { "hashes": [ @@ -409,19 +408,19 @@ }, "pygments-pytest": { "hashes": [ - "sha256:9c65fbf5fb2364ef48b5e468f0d7b9212bcfa5888b4b43588ae2d56d0b2f8413", - "sha256:dd479d1dc6a4dc5ba40bb0b15932ba9df3edc1d6b8be07b375af1c8c15f7479f" + "sha256:c27f23d5b1b8b7c7ed337e13c98bff4582a86f9d468596cf448c96aac26a0bde", + "sha256:ffbece03459c42470e802b951915a667146603a154fc6505b9c9e8d0216bf176" ], "index": "pypi", - "version": "==1.1.0" + "version": "==1.1.1" }, "python-dateutil": { "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" ], "index": "pypi", - "version": "==2.7.5" + "version": "==2.8.0" }, "pyyaml": { "hashes": [ @@ -558,10 +557,10 @@ "develop": { "atomicwrites": { "hashes": [ - "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", - "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" ], - "version": "==1.2.1" + "version": "==1.3.0" }, "attrs": { "hashes": [ @@ -572,11 +571,10 @@ }, "more-itertools": { "hashes": [ - "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", - "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", - "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" + "sha256:0125e8f60e9e031347105eb1682cef932f5e97d7b9a1a28d9bf00c22a5daef40", + "sha256:590044e3942351a1bdb1de960b739ff4ce277960f2425ad4509446dbace8d9d1" ], - "version": "==5.0.0" + "version": "==6.0.0" }, "pluggy": { "hashes": [ @@ -594,11 +592,11 @@ }, "pytest": { "hashes": [ - "sha256:41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", - "sha256:c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be" + "sha256:65aeaa77ae87c7fc95de56285282546cfa9c886dc8e5dc78313db1c25e21bc07", + "sha256:6ac6d467d9f053e95aaacd79f831dbecfe730f419c6c7022cb316b365cd9199d" ], "index": "pypi", - "version": "==4.1.1" + "version": "==4.2.0" }, "pytest-env": { "hashes": [ @@ -609,11 +607,11 @@ }, "pytest-mock": { "hashes": [ - "sha256:53801e621223d34724926a5c98bd90e8e417ce35264365d39d6c896388dcc928", - "sha256:d89a8209d722b8307b5e351496830d5cc5e192336003a485443ae9adeb7dd4c0" + "sha256:4d0d06d173eecf172703219a71dbd4ade0e13904e6bbce1ce660e2e0dc78b5c4", + "sha256:bfdf02789e3d197bd682a758cae0a4a18706566395fbe2803badcd1335e0173e" ], "index": "pypi", - "version": "==1.10.0" + "version": "==1.10.1" }, "six": { "hashes": [ diff --git a/lessons/homework/ostrava1/index.md b/lessons/homework/ostrava1/index.md new file mode 100644 index 0000000000..6572333eef --- /dev/null +++ b/lessons/homework/ostrava1/index.md @@ -0,0 +1,21 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
{{ task.section.markdown | markdown }}
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava1/info.yml b/lessons/homework/ostrava1/info.yml new file mode 100644 index 0000000000..4aa669885b --- /dev/null +++ b/lessons/homework/ostrava1/info.yml @@ -0,0 +1,6 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +latex: true diff --git a/lessons/homework/ostrava1/tasks.yml b/lessons/homework/ostrava1/tasks.yml new file mode 100644 index 0000000000..7ef3bd10ed --- /dev/null +++ b/lessons/homework/ostrava1/tasks.yml @@ -0,0 +1,90 @@ +# https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s001-install/handout/handout.pdf +# https://github.com/messa/pyladies-courseware/blob/master/data/2018_pyladies_praha_autumn/homeworks/handout1.yaml + +tasks: + +- markdown: | + Doma (nebo pár dní po instalaci, pokud nejsi na srazu) si znovu spusť + Python a zkus, jestli stále funguje. + + ```python + >>> 1 + 1 + 2 + ``` + + Funguje i odčítání? + + ```python + >>> 4 - 2 + ``` + +- markdown: | + A co násobení? + Programátoři nenásobí pomocí · ani ×, použijí jiný _operátor_: hvězdičku. + Vyzkoušej si to. + +- markdown: | + Dělení? Znak ÷ se taky na klávesnici těžko píše (zvlášť na české). + Jak se asi bude dělit? + +- markdown: | + Závorky v Pythonu fungují jako v matematice. Zkus pomocí Pythonu vypočítat: + 3+(4+6)×8÷2−1 = + + Jak se to zapíše v Pythonu? + + mandatory: true + +- markdown: | + Jsou i jiné operátory než `+`, `-` a ty pro násobení a dělení. + Co dělá s čísly operátor `%` (procento)? + +- markdown: | + A co dělá operátor `**` (dvě hvězdičky)? + +- markdown: | + Až budeš příště sahat po kalkulačce, použij místo ní Python. + + submit: false + +- section: {} + +- markdown: | + Python umí i jiné věci než čísla. Třeba takové _řetězce_ – slova, + věty nebo jiný text. + Řetězce se zadávají v uvozovkách – jednoduchých `'` nebo dvojitých `"`: + + ```python + >>> 'Ahoj!' + 'Ahoj!' + ``` + + submit: false + +- markdown: | + Řetězce jdou spojovat sčítáním. Vyzkoušej si to: + + ```python + >>> 'A' + "B" + 'AB' + ``` + + submit: false + +- markdown: | + Co je tady špatně? Jak to spravit? + + ```python + >>> 'Ahoj' + 'PyLadies!' + ``` + +- markdown: | + Řetězce se dají sčítat. Dají se i násobit? Dělit? Odečítat? + +- markdown: | + Co se stane, když se pokusím sečíst číslo a řetězec? + + mandatory: true + +- markdown: | + A vynásobit? diff --git a/lessons/homework/ostrava2/index.md b/lessons/homework/ostrava2/index.md new file mode 100644 index 0000000000..65f4b14598 --- /dev/null +++ b/lessons/homework/ostrava2/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section %} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava2/info.yml b/lessons/homework/ostrava2/info.yml new file mode 100644 index 0000000000..b4818620ae --- /dev/null +++ b/lessons/homework/ostrava2/info.yml @@ -0,0 +1,9 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } + td, th {border: 1px solid #ccc; min-width: 3em; } + td code {background-color: transparent; } diff --git a/lessons/homework/ostrava2/tasks.yml b/lessons/homework/ostrava2/tasks.yml new file mode 100644 index 0000000000..7cb546d2ca --- /dev/null +++ b/lessons/homework/ostrava2/tasks.yml @@ -0,0 +1,202 @@ +# https://github.com/PyLadiesCZ/pyladies.cz/raw/master/original/v1/s002-hello-world/handout/handout2.pdf +# https://github.com/messa/pyladies-courseware/blob/master/data/2018_pyladies_praha_autumn/homeworks/handout2.yaml + +tasks: + +- markdown: | + Jakou používáš verzi Pythonu? + +- section: + markdown: | + Následující projekty procvičí orientaci v chybových hláškách. Doporučuji je udělat. + +- markdown: | + Jak se jmenuje druh chyby, která nastane, když… + + - Dáš uvozovky jen na jednu stranu řetězce? — SyntaxError + - Zkusíš odečíst číslo od řetězce? — + - Dělíš nulou? — + - Použiješ proměnnou, která neexistuje? — + - Stiskneš Ctrl+C, když se program ptá na vstup (pomocí input)? — + - Odsadíš příkaz bez předchozího if:? — + - Po `if:` odsadíš jeden příkaz o čtyři mezery a druhý jen o dvě? — + - Neuzavřeš závorku? – + - Zkusíš použít vykřičník (`!`) jako operátor? — + - Napíšeš v příkazu `print(1, 2, 3)` čárku navíc? — + +- markdown: | + _Podívej se na odpovědi na předchozí otázku, ale Python zkus použít jen na ověření._ + + Jaká chyba nastane, když zkusíš použít proměnnou předtím, než do ní něco přiřadíš? + +- markdown: | + _Podívej se na odpovědi na otázku 1, ale Python použij jen na ověření._ + + Jaká chyba nastane, když zkusíš podělit řetězec řetězcem? + +- markdown: | + Lomítko (`/`) je operátor, ale nedá se použít na řetězce. Vykřičník (`!`) v Pythonu není operátor. + Jak se liší „jejich“ chyby? + +- section: + markdown: | + Tenhle projekt by měl přivést k tomu, jak zjišťovat, co v Pythonu jde a co ne. + Druhá část je trochu na zamyšlení. + +- markdown: | + Ne všechno se dá použít jako jméno proměnné. + Fungují pro proměnné následující jména? Pokud ne, proč asi? + +
+ x
+ tlacitko4
+ 34
+ 3e4
+ krůta
+ $i
+ druha-odmocnina
+ readme.txt
+ kratsiStrana
+ POCET_BODU
+ _ (podtržítko)
+ π (pí)
+ True
+ _cache
+ __name__
+ while
+
+ +- section: + markdown: | + Následující projekty jsou na procvičení toho, co jsme dělaly na srazu. Nemáš-li čas, zatím je přeskoč. + +- markdown: | + _Zkus se nedívat na programy ze srazu._ + + Napiš program, který spočítá povrch a objem krychle o straně 2852 cm. + + Abys nemusela tolik hledat v učebnici (vlastně Wikipedii): povrch S = 6a², objem V = a³ + + _Řešení, pro kontrolu: S = 48803424 cm², V = 23197894208 cm³_ + + mandatory: true + +- markdown: | + Změň program tak, aby stranu/poloměr mohl uživatel zadat. + + _Tady už se na materiály ze srazu klidně podívej._ + + mandatory: true + +- section: + markdown: | + Další dva projekty doplňují program ze srazu. + Všechno bude vysvětleno později, takže jestli nemáš čas, přeskoč je. + +- markdown: | + Ulož si následující program jako `pokus.py` a spusť ho několikrát za sebou. Co dělá? + + ``` + from random import randrange + cislo = randrange(3) + print(cislo) + ``` + + _Jak to funguje, to se dozvíme příště; zatím to ber jako kouzelné zaříkadlo._ + + _Aby všechno fungovalo správně, nesmíš mít v aktuálním adresáři soubor jménem `random.py`._ + + mandatory: true + +- markdown: | + Zkombinuj program z předchozího projektu s programem kámen-nůžky-papír a nastav `tah_pocitace` na: + + - `'kámen'`, pokud je cislo 0, + - `'nůžky'`, pokud je cislo 1, + - jinak na `'papír'`. + +- section: + markdown: | + Tyhle projekty kombinují opakování a nové informace. Doporučuji si je projít. + +- markdown: | + Které pythonní _operátory_ dokážeš z hlavy vyjmenovat? + +- markdown: | + Zkusila jsi porovnávat řetězce? + Doplň tuhle tabulku tužkou; pak ověř odpovědi pomocí Pythonu: + + | `a` | | `b` | + |---------|:----:|-----------| + | `2` | > | `1` | + | `1` | < | `2` | + | `'abc'` | == | `'abc'` | + | `'aaa'` | | `'abc'` | + | `'abc'` | | `'Abc'` | + | `'abC'` | | `'abc'` | + | `'abc'` | | `'abcde'` | + | `'abc'` | | `'ábč'` | + | `'abc'` | | ``10`` | + +- markdown: | + Jaká je hodnota proměnné po provedení příkazů: + + * promenna = 1 < 2 ? + * promenna = 2 < 2 ? + * promenna = 1 < 2 < 3 ? + * promenna = 1 < 3 < 2 ? + * promenna = 1 < 3 < 3 ? + * promenna = 'abc' < 'ABC' < 'def' < 'zajíc' ? + + Tam, kde je hodnota proměnné `False`, dají se některé z porovnávaných hodnot mezi sebou vyměnit, aby + byla `True`? + +- section: + markdown: | + Další dva projekty ti umožní kreativně využít, co ses naučila. + +- markdown: | + Na srazu jsme měli program, který píše různé nesmysly podle uživatelem zadaného věku. + + Zkus napsat program, který píše hlášky podle zadané rychlosti chůze, váhy ulovené ryby, počtu tykadel, + teploty vody nebo třeba vzdálenosti od rovníku. + +- markdown: | + Napiš program, který po zadání správného hesla vypíše nějakou tajnou informaci. + + _Vhodné tajemství je třeba: V pátek jsem viděla černého havrana._ + +- section: + markdown: | + Poslední projekty jsou pokročilejší. Jestli nemáš čas, radši udělej pořádně ty ostatní. + +- markdown: | + Projdi si v materiálech bonusovou sekci _„Nebo anebo a”_: + + [naucse.python.cz/lessons/beginners/and-or/](https://naucse.python.cz/lessons/beginners/and-or/) + + submit: false + +- markdown: | + Doplň tuhle tabulku: + + | `a` | `b` | `a and b` | `a or b` | `not a` | + |---------|---------|-----------|----------|---------| + | `True` | `True` | | | | + | `False` | `True` | | | | + | `True` | `False` | | | | + | `False` | `False` | | |   | + + Tohle je takzvaná _pravdivostní_ tabulka: + _Obsahuje jeden řádek pro každou kombinaci booleovských hodnot, které `a` a `b` můžou mít. Když se stane, že se v složitějších `and` a `or` ztratíš, doporučuji napsat si podobnou tabulku a na každý řádek se podívat zvlášť._ + +- markdown: | + Zkus přepsat Kámen, Nůžky, Papír pomocí `and` a `or`. + + Dokážeš docílit toho, aby se každý z řetězců `'Plichta.'`, `'Počítač vyhrál.'` a `'Vyhrála jsi!'` objevil + v programu jen jednou, aniž bys tyhle řetězce musela přiřazovat do proměnných? + + Pokud ano, gratuluji! + +- markdown: | + Zkus program „šťastná/bohatá“ přepsat pomocí zanořených `if`ů. Která verze ti připadá čitelnější? diff --git a/lessons/homework/ostrava3/index.md b/lessons/homework/ostrava3/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava3/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava3/info.yml b/lessons/homework/ostrava3/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava3/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava3/static/03_diagram.png b/lessons/homework/ostrava3/static/03_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e9b6f07a5231d111de63dafa55aaa9f09df552 GIT binary patch literal 12982 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 ?U=FnxPyf`v>>@J!cEbpmslkUe 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/03_trojuhelnik.png b/lessons/homework/ostrava3/static/03_trojuhelnik.png new file mode 100644 index 0000000000000000000000000000000000000000..3176b4f62e923985b2098c09930c937ccc3a6c2c GIT binary patch literal 3037 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/04_domecek.png b/lessons/homework/ostrava3/static/04_domecek.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb3a87efd605487f8601d4516600ac1a064e264 GIT binary patch literal 2060 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/06_uhelniky.png b/lessons/homework/ostrava3/static/06_uhelniky.png new file mode 100644 index 0000000000000000000000000000000000000000..feb527e64eb9e2276ed2f6cf768c415124f19fba GIT binary patch literal 11941 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/10_ornament.png b/lessons/homework/ostrava3/static/10_ornament.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad46a3f08e3f8d9e7792c87fc1b412b39221ed3 GIT binary patch literal 1324 zcmaJ>e^AnQ7)C8|h^7_V>D0DnEA?=Msi}yVPEiAwBv!Z1a#q`kdc!M4Z3?@{x(a`1ttT+}zB}OmcFvmzNiV!I+($-PqVzU0o%S zNb~daJRXn9WQs(hg@uI|FJ2@iB_R-q?Cfl{TCG$ndvI`YczF2W;9z%mHyVxB>2%Z6)62`tHk+-aq-4jA9eh6DXfzfS6u7y$?cBN3 z!^5MwxmmB*=jP@%Ha4!WuhVF>k&zKPot}}AQCwUs7K^c1th2LoOiax1@NiF0PiSap zSXkJtTeswLIhV^F8XC&X%ru+L3WWlP!yP|+9 zIyyQe`|m%5!JLi~69|;z2AxKAG6Ms<{6^Zg&jqcGe{xiCKC$MsgLgjVaiyz-nXI|L zX6q}LJ*#_km_{bouE|GlHdyrZTFO_iEW1zM`$XJ^mPg98fl6TKJ8RS}f|kP(EPbBhn1WYN zxEKxu0l8y+T*HwR4erhJ(s@(u^Zqk3&{jDRpR|3dIocyyetKo#qoREQcauw>s6`FUH7CKBD3ueu*UDqrc7v%M$z2vkJ#NO?UZS zS1%Z^VnIP~C|50>S0qB4*>|ghR_@GJB`)@8Pp$<27sId!aB!!}e@+3d5lQ=F? zq!b}VL=|Cy1CTR80Nw2!oenS1RQ2q^+IrPC@a6b9dckiG%;4|W>RyXS7+NKY@pMG6 zq(!SUi!PrsLY~`QM?-G;XS{t6XTM!VG1~I9MZn}gM9Zp#lDUL2`pUJO;Llm?Dj}%9 zsLm=4SWbQE2{tvo$?Ex8{*CjV51}#p(8p2#gG}()wCj6i9AnTJ{`JjQh0-9fr@7P* zc&Z9gT*FSkfBw7-Q8Z-F2gja{A$vA*Hj}Z2*%UDEDgw@`S8EK|OG;BtxM|s1V9hIx z{NA>#y7Tb*!j;y#Q)1Iem0_QBmaq*2eBg|G+``@kda(S@C=MeTSN>^c1)0x9Wy~L$ j;8WTo&&mbQ3^vES@?)((P4B%7{X;NfA}K)>pUwOmDs!#- literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/11_ornament.png b/lessons/homework/ostrava3/static/11_ornament.png new file mode 100644 index 0000000000000000000000000000000000000000..0828fd44c0ebba6e8f031165010e62458c4c791a GIT binary patch literal 4657 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/static/12_spirala.png b/lessons/homework/ostrava3/static/12_spirala.png new file mode 100644 index 0000000000000000000000000000000000000000..641f9a8ee1a18f11f51605b9278b640cb4f7dd97 GIT binary patch literal 43604 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 W-<@zy4VV50e3a$Y8?uK{q`+NW8v&=K+ z%z5U{ojVh%tSE(sOoR*t1%)OfEv^a$1q+6PLJ&lPh5SVz-+vkk3ffXx9w_np`ug(n zvbeaoy}kYT`1thnG&D4nnwpxPp1!=i{QUfUdwbi_(GedX9~v5(mzQ^Tc2-+k`|H=Q z-zfon3$Nv#KiIO@%HxinVFfw!or1xh5P&a{r&x{tgPth=!1iU ztE;Q>^788H>fPPlm6et7@bHt9lai8>rlzLB!NEU&{!C0vWMpJaPfs5oA7^G}o}Qj= zZEam%UXF~6%+JrSuCC6`&i?-WJ1#D6V`HPMt7~m-t)QS_eSLj$a&l^Fs-~tUKR>^( zudlhexwp4>U|^uCstN=Gb$53c6%|!hR<^aZjg5_kgoM=9)$Q%=wYIi;Jduw;LCfID zh<^rpq#tEGQUeTc`_S@H@p>BMv4c3pRdbjAHbmKMv26LsynlKe8+J(>TAAER-%TGg zZuhzOX_LZMDsG)wIK4JdR}aZT)X@L^xL6MDClW7aXu~$M{^L=d0u#ygfLPw5I)BHZ z9Tg5HN7giMdS*$qrtbNez+Z#{Xn9I;oDs!BKfiogZ-@-z=c{_`bUU-Au9X$Ocl&fq z5FkR)u?A~kT@ilDur4OKTCwTSP6oF@{BfhtXIAZA3U;P4W@&QYCLl*~3PF;>hoI^F z>v8v~Cpcz6+GS7;$*ZqsZ2ERl2p%&eYcyg)esr|Qr;B6cHujuPWmI57{Fdb@cvpe~ zQ(Zlrc`7!%f~EY)sjSJ`INkf(d3#A|9C2j(Lk$v~{}+z&i8fxNyj4g~ExrY{KoeluJ|I+9@wszb)|N>&`lg>z&5H#q<$<)33+BA*PeJMC z_or9aqk5fpy9b&QH;4f-9llcYVt>gO{H4Bi@K9ie$nv89)NqClepFJFS>5VP(y6nP z6E{Kf_{J}(w$AYnVWbw0t3e6vHDVg&AUC(_{iI%A%Di0v{C-M}+whO;Yf4NcKgO>8 zw!QwzTGvA9$J+KP`aflH!y|$KYu5tC?5?Z%jV4pMzW zZ^DC{23y>NOoaiIH%x7kU;chajUs2NOQqeLNp&K~os&uSoXC|fA+NE}0Q?Agb7k;V zeEIXX%w4xzENTnbC7jnKjq<`(A==Jcovo;xU|A$>(&LNE{OeeJ z%-KeO3kbbUWXwWg>7S1H>-ru6PZn?+0u?{3QyH^V4hS$JfnRai$lT4`>uWUQV-HSY zdZ)wMHjNsnMc4-}@uJZuS>qP>+7Qn#$I-CMQ@h)mmNjwkRul8f9>iEZ+jWi4_u8YE z>TG;mN}?E*m;d|;m-zY13p<$GBgRxa*95^p(;Trnrl0|zAW6G=cD!zT~Q zLAqtWJDBM~@kEPnCP8BXb-IfZ`NEifceCd;vC*mD1sh(wX$hkbJ?jzb4;hmX_l%;JSyY{fO`l zZU&Q2D$zQGyeI$D9sJ_=C1*UkQXzjIjfM<$k)vt)6bsg><^clGzJ-h*AcrMIlHa6T zN%U6H-rH(Qca_7^e15ymP*#i}$*SjOmfXW9`z~GVKR&7{- zFfrdg+NXyFchNO=8CxMp#}BYR8rU5aLf-wEb^fVVOShJ7erOcc*tj=f?z(~g$nwR}eMSBlv{Z|Y7~vQ2;P*5v z;!iX?lQAjfdbPY{{@ohXw~4IEv=ok%8@s;kJ4aWH z=8j!o_|yA?aCbnSRoE#_tgQTQoOuztjWDjYdVYX{L++3_M?0-26x*qqblz>s6m|AI zOVyj@y|aHQj%wquDoB@m@)(LH9wYX*&s3H;+0J6yE^H+}4r+JE*nXcS%4??BO3KZAWN;fF

pI#LiA=Y9 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%0D>|&?xTm*sY)x%StfZb8OuXi` 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava3/tasks.yml b/lessons/homework/ostrava3/tasks.yml new file mode 100644 index 0000000000..22cf210a1a --- /dev/null +++ b/lessons/homework/ostrava3/tasks.yml @@ -0,0 +1,139 @@ +# https://pyladies.cz/v1/s003-looping/handout/handout3a.pdf +# https://github.com/messa/pyladies-courseware/blob/master/data/2018_pyladies_praha_autumn/homeworks/handout3a.yaml + +tasks: + +- section: + markdown: | + V těchto projektech je určitě něco nového. + Nezadávají postup, jak na odpověď přijít, ale to určitě zvládneš! + +- markdown: | + Co vrací funkce `range`? + +- markdown: | + Co se stane, když pro příkaz `for` + zavoláš funkci `range` se dvěma parametry? + +- markdown: | + Se třemi? + +- section: + markdown: | + Želví kreslení! Tahle sekce tě naučí myslet jako programátorka počítačové grafiky. + Je dobré jednotlivé projekty dělat postupně, a když něco začne fungovat, znovu si + řešení projít a zamyslet se nad ním. + +- markdown: | + Nakresli trojúhelník. + + trojúhelník + + __Poznámka:__ Rovnostranný trojúhelník má vnitřní úhly 60°. Želva se ale otáčí o vedlejší úhel 180 - 60 = 120°. + + diagram + +- markdown: | + Nakresli domeček! + + domeček + + _Jak pravil Pythagoras, délka šikmé čáry v domečku je √2-krát délka stěny. O funkci na odmocninu jsme mluvili na srazu._ + +- markdown: | + Nakresli vesnici! + + vesnice + +- markdown: | + Nakresli pětiúhelník, šestiúhelník, sedmiúhelník, osmiúhelník. + + mnohoúhelníky + + _Vnitřní úhel pravidelného n-úhelníka má 180 × (1 - 2/n) stupňů._ + + _Aby byly tvary zhruba stejně veliké, použij pro n-úhelník délku strany např. 200/n_ + +- markdown: | + Nakresli n-úhelník, kde n zadá uživatel. + +- markdown: | + Želva umí jen rovné čáry. Jde pomocí rovných čar nakreslit kolečko? + + _Nevíš-li, přeskoč na další projekt a pak se sem vrať._ + +- markdown: | + Nakresli pětadevadesátiúhelník. + +- markdown: | + Nakresli takovýto ornament: + + ornament + + _Nevíš-li si rady, vezmi pravítko a změř délky jednotlivých čar. Doporučuju začít od středu._ + +- markdown: | + Nakresli takovýto ornament: + + ornament + +- markdown: | + Nakresli spirálu. + + spirála + + _Od ornamentů ke spirále se dostaneš stejným způsobem jako od `n`-úhelníků ke kolečku._ + +- markdown: | + Napiš obrázek! Třeba les ze stromů, město z domů, nebe z hvězd, + dav ze smajlíků, hradbu z věží, zikkurat ze schodů, ... + + Můžeš použít i nějakou z funkcí modulu `random`. + + Podle toho, jak jste se na sraze domluvili, pošli řešení e-mailem + (např. organizátorům, koučovi, nebo vůbec). + Posílej ho jako přílohu, nekopíruj ho do textu e-mailu. + Jestli procházíš-li kurz sama a můžeš programování konzultovat s někým + zkušenějším, je tento úkol natakovou konzultaci ideální téma. + +- section: + markdown: | + Další projekty jsou pro opravdové grafické mistryně. Nepouštěj se do nich, dokud nemáš hotové ostatní projekty. Nedostaneš-li se k nim, nevadí + +- markdown: | + Na sraze jsme nakreslili tři čtverce, každý otočený o 20°. + Nakresli 18 takových čtverců. + +- markdown: | + Vezmi program z minulé úlohy a dokresli stonek a listy. + Je jenom na tobě, jaký budou mít tvar. + Piš komentáře a snaž se opakovat pomocí `for`, + ne pomocí Ctrl+C Ctrl+V. + + květina + + mandatory: true + +- section: + markdown: | + A až tě omrzí grafika, zkus zase naprogramovat něco v textovém režimu. + +- markdown: | + Napiš program, který postupně načte od uživatele dvě čísla a jednoznakový + řetězec – buď `'+'`, `'-'`, `'*'` nebo `'/'`. Program provede na číslech příslušnou operaci. + + Příklad použití programu: + + ``` + První číslo: 123 + Druhé číslo: 456 + Operace: + + 123 + 456 = 579 + ``` + + mandatory: true + +- markdown: | + Napiš program, který se pětkrát zeptá na číslo a nejmenší zadané číslo vypíše. + + _Nevíš-li si rady, podívej se do materiálů na sekci Přepisování proměnných. Místo sečítání budeš vybírat správnou hodnotu._ diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index 9866204d06..f4e32709e2 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -41,8 +41,7 @@ plan: - title: Tahák na klávesnici (PDF) url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf type: cheatsheet - - title: Instrukce a domácí projekty (PDF) - url: http://pyladies.cz/v1/s001-install/handout/handout.pdf + - lesson: homework/ostrava1 type: homework - title: První program slug: hello-world @@ -60,8 +59,7 @@ plan: - title: Společná večeře PyLadies ve Slezské P.U.O.R. type: special url: http://slezska.com/ - - title: Domácí projekty (PDF) - url: http://pyladies.cz/v1/s002-hello-world/handout/handout2-ostrava.pdf + - lesson: homework/ostrava2 type: homework - title: "Nebo anebo a (bonus)" lesson: beginners/and-or @@ -81,8 +79,7 @@ plan: - title: Tahák s užitečnými funkcemi url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf type: cheatsheet - - title: Domácí projekty (PDF) - url: http://pyladies.cz/v1/s003-looping/handout/handout3a.pdf + - lesson: homework/ostrava3 type: homework - title: Odevzdání domácích projektů type: link From fbf46a60047f03cfddd22331a0eac455b8fd5495 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 13 Feb 2019 13:06:14 +0100 Subject: [PATCH 08/37] homeworks: Remove notes for sending a solution --- lessons/homework/ostrava3/tasks.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lessons/homework/ostrava3/tasks.yml b/lessons/homework/ostrava3/tasks.yml index 22cf210a1a..d4dded8c67 100644 --- a/lessons/homework/ostrava3/tasks.yml +++ b/lessons/homework/ostrava3/tasks.yml @@ -90,12 +90,6 @@ tasks: Můžeš použít i nějakou z funkcí modulu `random`. - Podle toho, jak jste se na sraze domluvili, pošli řešení e-mailem - (např. organizátorům, koučovi, nebo vůbec). - Posílej ho jako přílohu, nekopíruj ho do textu e-mailu. - Jestli procházíš-li kurz sama a můžeš programování konzultovat s někým - zkušenějším, je tento úkol natakovou konzultaci ideální téma. - - section: markdown: | Další projekty jsou pro opravdové grafické mistryně. Nepouštěj se do nich, dokud nemáš hotové ostatní projekty. Nedostaneš-li se k nim, nevadí From 6cdb2c14f10b119a10954ed40d6769f3f05c5f6c Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Mon, 18 Feb 2019 14:24:22 +0100 Subject: [PATCH 09/37] Ostrava: Feedback for homeworks after second session --- lessons/feedback/ostrava2/index.ipynb | 370 +++++++++++++++++++++++ lessons/feedback/ostrava2/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 3 files changed, 376 insertions(+) create mode 100644 lessons/feedback/ostrava2/index.ipynb create mode 100644 lessons/feedback/ostrava2/info.yml diff --git a/lessons/feedback/ostrava2/index.ipynb b/lessons/feedback/ostrava2/index.ipynb new file mode 100644 index 0000000000..2b03967e80 --- /dev/null +++ b/lessons/feedback/ostrava2/index.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Zpětná vazba k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Je možné tohle zjednodušit?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "tah_cloveka = 'kámen'\n", + "tah_pocitace = 'papír'\n", + "\n", + "if tah_cloveka == 'kámen' and tah_pocitace == 'kámen'or tah_cloveka == 'nůžky' and tah_pocitace == 'nůžky' or tah_cloveka == 'papír' and tah_pocitace == 'papír':\n", + " print('Plichta.')\n", + "elif tah_cloveka == 'kámen' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky'and tah_pocitace == 'papír' or tah_cloveka == 'papír' and tah_pocitace == 'kámen':\n", + " print('Vyhrála jsi!')\n", + "elif tah_cloveka == 'kámen' and tah_pocitace == 'papír'or tah_cloveka == 'papír' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky' and tah_pocitace == 'kámen':\n", + " print('Počítač vyhrál.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Ano, je" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "tah_cloveka = 'kámen'\n", + "tah_pocitace = 'papír'\n", + "\n", + "if tah_cloveka == tah_pocitace:\n", + " print('Plichta.')\n", + "elif tah_cloveka == 'kámen' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky'and tah_pocitace == 'papír' or tah_cloveka == 'papír' and tah_pocitace == 'kámen':\n", + " print('Vyhrála jsi!')\n", + "else:\n", + " print('Počítač vyhrál.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Najdi chyby 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tento kousek kódu, který se stará o výběr tahu počítače na základě náhodně vygenerovaného čísla, může vypada na první pohled správně, ale ve skutečnosti jej stačí párkrát spustit a chybička se projeví." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "from random import randrange\n", + "cislo = randrange(2)\n", + "\n", + "if cislo == 0:\n", + " tah_pocitace = \"kámen\"\n", + " print(\"Počítač vybral kámen.\")\n", + "if cislo == 1:\n", + " print(\"Počítač vybral nůžky.\")\n", + " tah_pocitace = \"nůžky\"\n", + "else:\n", + " tah_pocitace = \"papír\"\n", + " print(\"Počítač vybral papír.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Správné řešení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Chybička byla v záměně `elif` za další `if` což způsobilo rozdělení jedné podmínky se třemi větvemi na dvě samostatné podmínky, z nichž ta první měla jen jednu větev (jen jeden if) a ta druhá dvě (jeden if a jeden else).\n", + "\n", + "Další chyba pak byla v generování náhodných čísel, protože `randrange(2)` vrátí vždy jen 0 nebo 1." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "from random import randrange\n", + "cislo = randrange(3)\n", + "\n", + "if cislo == 0:\n", + " tah_pocitace = \"kámen\"\n", + " print(\"Počítač vybral kámen.\")\n", + "elif cislo == 1:\n", + " print(\"Počítač vybral nůžky.\")\n", + " tah_pocitace = \"nůžky\"\n", + "else:\n", + " tah_pocitace = \"papír\"\n", + " print(\"Počítač vybral papír.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Najdu chybu 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copak se asi stane s proměnnou `strana` ještě před výpočtem povrchu a objemu?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "strana = int(input('Zadej velikost strany v cm: '))\n", + "strana = 2852\n", + "print('Objem krychle o straně',strana,'cm je', strana**3,'cm3')\n", + "print('Obsah krychle o straně',strana,'cm je', 6*strana**2,'cm2')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Šťastná - bohatá" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Několik možných řešení programu šťastná-bohatá. Všechny dělají totéž, ale některé jsou zkrátka lépe čitelné a kompaktnější." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Řešení 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Odpovídej \"ano\" nebo \"ne\".')\n", + "stastna_retezec = input('Jsi šťastná?')\n", + "bohata_retezec = input('Jsi bohatá?')\n", + "\n", + "if stastna_retezec == 'ano':\n", + " if bohata_retezec == 'ano':\n", + " print (\"ty se máš\")\n", + " elif bohata_retezec == 'ne':\n", + " print (\"zkus mín utrácet\")\n", + "elif stastna_retezec == 'ne':\n", + " if bohata_retezec == 'ano':\n", + " print (\"zkus se víc usmívat\")\n", + " elif bohata_retezec == 'ne':\n", + " print (\"to je mi líto\")\n", + "else:\n", + " print (\"Nerozumím.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Řešení 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Odpovídej \"ano\" nebo \"ne\".')\n", + "stastna_retezec = input('Jsi šťastná?')\n", + "bohata_retezec = input('Jsi bohatá?')\n", + "\n", + "if stastna_retezec == 'ano' and bohata_retezec == 'ano':\n", + " print (\"Grauluji\")\n", + "elif stastna_retezec == 'ano' and bohata_retezec == 'ne':\n", + " print('Zkus míň utrácet.')\n", + "elif stastna_retezec == 'ne' and bohata_retezec == 'ano':\n", + " print (\"zkus se víc usmívat\")\n", + "elif stastna_retezec == 'ne' and bohata_retezec == 'ne':\n", + " print (\"to je mi líto\")\n", + "else:\n", + " print (\"Nerozumim\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Řešení 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Odpovídej \"ano\" nebo \"ne\".')\n", + "stastna_retezec = input('Jsi šťastná? ')\n", + "if stastna_retezec == 'ano':\n", + " stastna = True\n", + "elif stastna_retezec == 'ne':\n", + " stastna = False\n", + "else:\n", + " print('Nerozumím!')\n", + "\n", + "bohata_retezec = input('Jsi bohatá? ')\n", + "if bohata_retezec == 'ano':\n", + " bohata = True\n", + "elif bohata_retezec == 'ne':\n", + " bohata = False\n", + "else:\n", + " print('Nerozumím!')\n", + "\n", + "if bohata and stastna:\n", + " print('Gratuluji!')\n", + "elif bohata:\n", + " print('Zkus se víc usmívat.')\n", + "elif stastna:\n", + " print('Zkus míň utrácet.')\n", + "else:\n", + " print('To je mi líto.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné rady, prosby a doporučení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Pochvala za použití horního indexu u centimetrů čtverečních.\n", + "- Názvy proměnných mají mít vysvětlující charakter, takže jednoznakové názvy jsou zapovězeny.\n", + "- Klíčová slova se nesmí použít jako názvy proměnné.\n", + "- Importy patří na samotný začátek souboru.\n", + "- Pište komentáře. Když narazíme na špatné řešení, snáze se nám radí, když vím, jak jste se k němu dostaly a na co jste při tom myslely. Komentáře ke standardním věcem psát netřeba.\n", + "- Odevzdávejte nejpozději v neděli večer a už jen programy s příponou .py!" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava2/info.yml b/lessons/feedback/ostrava2/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava2/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index f4e32709e2..b24eddee6e 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -68,6 +68,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/AACCcUMFnjUBKeMCXzms + - lesson: feedback/ostrava2 + type: lesson - title: Cykly slug: loops date: 2019-02-19 From a55bad2551e5f8c02aabd06cf168ac534e76218c Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 26 Feb 2019 07:27:20 +0100 Subject: [PATCH 10/37] Ostrava: Homeworks 4-7 transformed from PDFs to YML/HTML files --- lessons/homework/ostrava4/index.md | 23 +++ lessons/homework/ostrava4/info.yml | 7 + lessons/homework/ostrava4/tasks.yml | 176 ++++++++++++++++ lessons/homework/ostrava5/index.md | 23 +++ lessons/homework/ostrava5/info.yml | 7 + .../homework/ostrava5/static/02_domecky.png | Bin 0 -> 12657 bytes .../homework/ostrava5/static/03_domecky.png | Bin 0 -> 15551 bytes lessons/homework/ostrava5/tasks.yml | 169 +++++++++++++++ lessons/homework/ostrava6/index.md | 23 +++ lessons/homework/ostrava6/info.yml | 7 + lessons/homework/ostrava6/static/hiragana.txt | 6 + lessons/homework/ostrava6/static/katakana.txt | 6 + lessons/homework/ostrava6/static/obrazky.txt | 81 ++++++++ lessons/homework/ostrava6/tasks.yml | 87 ++++++++ lessons/homework/ostrava7/index.md | 23 +++ lessons/homework/ostrava7/info.yml | 7 + lessons/homework/ostrava7/tasks.yml | 192 ++++++++++++++++++ runs/2019/pyladies-ostrava-jaro/info.yml | 24 +-- 18 files changed, 841 insertions(+), 20 deletions(-) create mode 100644 lessons/homework/ostrava4/index.md create mode 100644 lessons/homework/ostrava4/info.yml create mode 100644 lessons/homework/ostrava4/tasks.yml create mode 100644 lessons/homework/ostrava5/index.md create mode 100644 lessons/homework/ostrava5/info.yml create mode 100644 lessons/homework/ostrava5/static/02_domecky.png create mode 100644 lessons/homework/ostrava5/static/03_domecky.png create mode 100644 lessons/homework/ostrava5/tasks.yml create mode 100644 lessons/homework/ostrava6/index.md create mode 100644 lessons/homework/ostrava6/info.yml create mode 100644 lessons/homework/ostrava6/static/hiragana.txt create mode 100644 lessons/homework/ostrava6/static/katakana.txt create mode 100644 lessons/homework/ostrava6/static/obrazky.txt create mode 100644 lessons/homework/ostrava6/tasks.yml create mode 100644 lessons/homework/ostrava7/index.md create mode 100644 lessons/homework/ostrava7/info.yml create mode 100644 lessons/homework/ostrava7/tasks.yml diff --git a/lessons/homework/ostrava4/index.md b/lessons/homework/ostrava4/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava4/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +

    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava4/info.yml b/lessons/homework/ostrava4/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava4/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava4/tasks.yml b/lessons/homework/ostrava4/tasks.yml new file mode 100644 index 0000000000..9c5ce63402 --- /dev/null +++ b/lessons/homework/ostrava4/tasks.yml @@ -0,0 +1,176 @@ +# https://pyladies.cz/v1/s003-looping/handout/handout3b-ostrava.pdf + +tasks: + +- section: + markdown: | + Na začátek trocha zdánlivě nudného opakování, ať si trochu osvěžíme programování. + To ale neznamená, že tu nemůžeš najít něco zvláštního a překvapivého! + +- markdown: | + Co dělá funkce `print`? + +- markdown: | + Co _vrací_ funkce `print`? + +- markdown: | + Co dělá pojmenovaný argument `end` funkce `print`? + +- markdown: | + Co dělá pojmenovaný argument `sep` funkce `print`? + +- markdown: | + Čím se liší chyby, které dostaneš když zadáš tyhle příkazy? + + - `int('blabla')` + - `float('blabla')` + - `int('8.9')` + - `int(8.9)` + +- section: + markdown: | + Následující sada projektů není jednoduchá, ale uděláš-li ji, pochopíš různá použití cyklu for. + +- markdown: | + Pomocí cyklu `for` a funkce `range()` napiš program, který vypíše: + + a + a + a + a + +- markdown: | + Pomocí cyklu `for` napiš program, který vypíše: + + Řádek 0 + Řádek 1 + Řádek 2 + Řádek 3 + Řádek 4 + +- markdown: | + Jak jsi pojmenovala proměnnou, kterou jsi v minulém příkladu použila? + Vymysli pro ni název, který nejlépe vystihuje, co proměnná obsahuje. + + _Je důležité proměnnou pojmenovat výstižně, jinak se v dalších projektech můžeš ztratit. Možné řešení je uvedeno na konci zadání._ + +- markdown: | + Pomocí cyklu `for` napiš program, který vypíše: + + 0 na druhou je 0 + 1 na druhou je 1 + 2 na druhou je 4 + 3 na druhou je 9 + 4 na druhou je 16 + + _Jak pojmenuješ proměnnou cyklu?_ + +- markdown: | + Pomocí cyklů `for` a parametru `end` pro `print` napiš program, který postupně z jednotlivých `'X'` vypíše: + + X X X X X + X X X X X + X X X X X + X X X X X + X X X X X + + „Z jednotlivých `'X'`“ znamená, že nepoužiješ např. `print('X X X X X')`. + + _Jak pojmenuješ proměnnou cyklu? A tu druhou?_ + + +- markdown: | + Napiš program, který vypíše „tabulku“ s násobilkou: + + 0 0 0 0 0 + 0 1 2 3 4 + 0 2 4 6 8 + 0 3 6 9 12 + 0 4 8 12 16 + + +- markdown: | + Napiš program, který postupně z jednotlivých `'X'` vypíše: + + X + X X + X X X + X X X X + +- markdown: | + Pomocí cyklu `for` a příkazu `if` napiš program, který vypíše následující řádky. + Funkci `print` volej pouze uvnitř v cyklu: + + první řádek + není první + není první + není první + +- markdown: | + Pomocí cyklů `for` a příkazu `if` napiš program, který z jednotlivých `'X'` a mezer vypíše: + + X X X X X X + X X + X X + X X + X X + X X X X X X + +- markdown: | + Programy s cyklem `for` uprav tak, aby počet řádků (či velikost čtverce/trojúhelníku/tabulky) mohl zadat uživatel. + +- section: + markdown: | + Následující sada projektů může vyžadovat delší zamyšlení. + A to zamyšlení je důležitější než samotná odpověď. + +- markdown: | + Co dělá tenhle kód? + + for c in 'Ahoj světe!': + print(c) + +- markdown: | + Vymyslíš lepší jméno pro proměnnou `c` z minulé úlohy? + +- markdown: | + Co dělá tenhle kód? + + for c in 38: + print(c) + +- markdown: | + Už víš, co dělá `for` s `range()`, výčtem hodnot a řetězcem. + Dokážeš to zobecnit – popsat `for` jednodušeji, než jak je popsán v materiálech? + +- section: + markdown: | + Teď několik programovacích oříšků pro dlouhé chvíle. Nemáš-li čas, přeskoč je. + +- markdown: | + Napiš program, který se zeptá na 3 čísla a zjistí, jestli je jejich součet větší než 10. + +- markdown: | + Napiš program, který načte číslo a zjistí, jestli je sudé. + + _Sudá čísla jsou beze zbytku dělitelná dvěma._ + +- markdown: | + Napiš program, který vypíše čísla od jedné do 100, ale: + + - Pokud je číslo dělitelné třemi, napíše místo něj „bum”. + - Pokud je číslo dělitelné pěti, napíše místo něj „bác”. + - Pokud je číslo dělitelné pěti i třemi zároveň, napíše místo toho „bum-bác”. + +- markdown: | + Máš-li ráda matematiku* a nebojíš-li se výzvy, načti od uživatele číslo _n_ a: + + - Vypočti faktoriál _n!_ (součin všech celých čísel od 1 do _n_). + - Zjisti, jestli je _n_ prvočíslo. + - Vypiš prvních _n_ členů Fibonacciho posloupnosti (1, 1, 2, 3, 5, 8, 13, 21, …). + + _*_ t.j. nemáš-li ráda matematiku, nedělej tenhle projekt :) + +- section: + markdown: | + Možné řešení projektu 7: `cislo_radku` diff --git a/lessons/homework/ostrava5/index.md b/lessons/homework/ostrava5/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava5/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava5/info.yml b/lessons/homework/ostrava5/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava5/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava5/static/02_domecky.png b/lessons/homework/ostrava5/static/02_domecky.png new file mode 100644 index 0000000000000000000000000000000000000000..3424793a58fc51b3e21390cebd285c7e207c77ae GIT binary patch literal 12657 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 literal 0 HcmV?d00001 diff --git a/lessons/homework/ostrava5/tasks.yml b/lessons/homework/ostrava5/tasks.yml new file mode 100644 index 0000000000..d695b4fd50 --- /dev/null +++ b/lessons/homework/ostrava5/tasks.yml @@ -0,0 +1,169 @@ +# https://pyladies.cz/v1/s004-strings/handout/handout4-ostrava.pdf + +tasks: + +- section: + markdown: | + Trocha experimentování. Zkus se zamyslet, jestli jsi „dobře” pochopila otázku. + +- markdown: | + Co se stane, když tělo nějaké funkce necháš prázdné? + +- markdown: | + Co se stane, když necháš prázdné tělo cyklu? + +- section: + markdown: | + Procvičení funkcí. Jestli jsi pythonní funkce nepsala už před kurzem, tak první z těchto projektů určitě udělej. Druhý jen pokud máš ráda geometrii :) + +- markdown: | + Napiš funkci, která vykreslí domeček dané velikosti. + _(t.j. velikost se zadá argumentem)_ + + domečky + +- markdown: | + Máš-li ráda geometrii*, můžeš zkusit dávat domečkové funkci dva argumenty: + šířku a výšku. + Je potřeba si vzpomenout na Pythagorovu větu a funkci tangens. + Pozor, funkce `tan` vrací výsletek v radiánech; + je potřeba ho převést na stupně (`from math import degrees`). + + domečky + + \* t.j. jestli nemáš ráda geometrii, tak tenhle projekt přeskoč + +- section: + markdown: | + Procvičení programování. + Často je jednoduché něco napsat, ale dotažení do konce může být časově náročné. + _Nemáš-li čas, zkus se aspoň zamyslet, jak bys projekt vyřešila._ + +- markdown: | + Změň program Kámen, Nůžky, Papír tak, aby opakoval hru dokud + uživatel nezadá `konec`. + +- markdown: | + Změň funkci `ano_nebo_ne` tak, + aby se místo `ano` se dalo použít i `a`, + místo `ne` i `n` + a aby se nebral ohled na velikost písmen a mezery před/za odpovědí. + + _Textům jako `možná` nebo `no tak určitě` by počítač dál neměl rozumět._ + +- section: + markdown: | + Sada zajímavých (snad) prográmků, které bys teď měla být schopná napsat. Nemáš-li čas, zatím je přeskoč. + +- markdown: | + Napiš program, který se zeptá na příjmení uživatelky/uživatele + a zkusí podle něj uhodnout její/jeho pohlaví. + +- markdown: | + Najdi na internetu text své oblíbené písně, zkopíruj si ho do řetězce + a zjisti, kolikrát je v něm použito písmeno K. + +- markdown: | + Napiš program, který simuluje tuto hru: + + První hráč hází kostkou + _(t.j. vybírají se náhodná čísla od 1 do 6)_, + dokud nepadne šestka. + Potom hází další hráč, dokud nepadne šestka i jemu. + Potom hází hráč třetí a nakonec čtvrtý. + Vyhrává ten, kdo na hození šestky potřeboval nejvíc hodů. + (V případě shody vyhraje ten, kdo házel dřív.) + + Program by měl vypisovat všechny hody a nakonec napsat, kdo vyhrál. + +- section: + markdown: | + Nakonec trošku delší projekt. + Budeme na něm stavět dál; nedokončíš-li ho teď, budeš ho muset dodělat před příští sadou projektů. + +
+ 1-D piškvorky se hrají na řádku s dvaceti políčky. + Hráči střídavě přidávají kolečka (`o`) a křížky (`x`), + třeba: +
+      1. kolo: -------x------------
+      2. kolo: -------x--o---------
+      3. kolo: -------xx-o---------
+      4. kolo: -------xxoo---------
+      5. kolo: ------xxxoo---------
+      
+ Hráč, která dá tři své symboly vedle sebe, vyhrál. +
+ +- mandatory: true + markdown: | + Napiš funkci `vyhodnot`, která dostane řetězec + s herním polem 1-D piškvorek + a vrátí jednoznakový řetězec podle stavu hry: + + - `"x"` – Vyhrál hráč s křížky (pole obsahuje `"xxx"`) + - `"o"` – Vyhrál hráč s kolečky (pole obsahuje `"ooo"`) + - `"!"` – Remíza (pole neobsahuje `"-"`, a nikdo nevyhrál) + - `"-"` – Ani jedna ze situací výše (t.j. hra ještě neskončila) + +- mandatory: true + markdown: | + Napiš funkci `tah`, která dostane řetězec s herním polem, + číslo políčka (0-19), a symbol (`x` nebo `o`) + a vrátí herní pole _(t.j. řetězec)_ s daným symbolem umístěným na danou pozici. + + Hlavička funkce by tedy měla vypadat nějak takhle: + + ``` + def tah(pole, cislo_policka, symbol): + "Vrátí herní pole s daným symbolem umístěným na danou pozici" + ... + ``` + + _Můžeš využít nějakou funkci, kterou jsme napsaly už na sraze?_ + +- markdown: | + Napiš funkci `tah_hrace`, která dostane řetězec s herním polem, + zeptá se hráče, na kterou pozici chce hrát, a vrátí herní pole + se zaznamenaným tahem hráče. + Funkce by měla odmítnout záporná nebo příliš velká čísla + a tahy na obsazená políčka. + Pokud uživatel zadá špatný vstup, funkce mu vynadá a zeptá se znova. + +- markdown: | + Napiš funkci `tah_pocitace`, která dostane řetězec s herním polem, + vybere pozici, na kterou hrát, a vrátí herní pole + se zaznamenaným tahem počítače. + + Použij jednoduchou náhodnou „strategii”: + + 1. Vyber číslo od 0 do 19. + 2. Pokud je dané políčko volné, hrej na něj. + 3. Pokud ne, opakuj od bodu 1. + + Hlavička funkce by tedy měla vypadat nějak takhle: + + ``` + def tah_pocitace(pole): + "Vrátí herní pole se zaznamenaným tahem počítače" + ... + ``` + +- markdown: | + Napiš funkci `piskvorky1d`, která vytvoří řetězec s herním polem + a střídavě volá funkce `tah_hrace` a `tah_pocitace`, + dokud někdo nevyhraje nebo nedojde k remíze. + + Nezapomeň kontrolovat stav hry po každém tahu. + +- section: + markdown: | + Poslední projekt je nepovinný, ale, jak to u podobných projektů bývá, můžeš na něj dostat zpětnou vazbu. + Doporučuju toho využít! + +- markdown: | + Zvládneš pro počítač naprogramovat lepší strategii? + Třeba aby se snažil hrát vedle svých existujících symbolů + nebo aby bránil protihráčovi? + + Stačí jen docela malé vylepšení! diff --git a/lessons/homework/ostrava6/index.md b/lessons/homework/ostrava6/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava6/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava6/info.yml b/lessons/homework/ostrava6/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava6/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava6/static/hiragana.txt b/lessons/homework/ostrava6/static/hiragana.txt new file mode 100644 index 0000000000..8ead6ac9eb --- /dev/null +++ b/lessons/homework/ostrava6/static/hiragana.txt @@ -0,0 +1,6 @@ +ぁあぃいぅうぇえぉおかがきぎく +ぐけげこごさざしじすずせぜそぞた +だちぢっつづてでとどなにぬねのは +ばぱひびぴふぶぷへべぺほぼぽまみ +むめもゃやゅゆょよらりるれろゎわ +ゐゑをんゔ diff --git a/lessons/homework/ostrava6/static/katakana.txt b/lessons/homework/ostrava6/static/katakana.txt new file mode 100644 index 0000000000..ebdf64c8b3 --- /dev/null +++ b/lessons/homework/ostrava6/static/katakana.txt @@ -0,0 +1,6 @@ +ァアィイゥウェエォオカガキギク +グケゲコゴサザシジスズセゼソゾタ +ダチヂッツヅテデトドナニヌネノハ +バパヒビピフブプヘベペホボポマミ +ムメモャヤュユョヨラリルレロヮワ +ヰヱヲンヴヵヶヷヸヹヺ diff --git a/lessons/homework/ostrava6/static/obrazky.txt b/lessons/homework/ostrava6/static/obrazky.txt new file mode 100644 index 0000000000..9c3279b465 --- /dev/null +++ b/lessons/homework/ostrava6/static/obrazky.txt @@ -0,0 +1,81 @@ + + + + + + + +~~~~~~~ +------------------ ++ +| +| +| +| +| +~~~~~~~ +------------------ ++---. +| +| +| +| +| +~~~~~~~ +------------------ ++---. +| | +| +| +| +| +~~~~~~~ +------------------ ++---. +| | +| O +| +| +| +~~~~~~~ +------------------ ++---. +| | +| O +| | +| +| +~~~~~~~ +------------------ ++---. +| | +| O +| --| +| +| +~~~~~~~ +------------------ ++---. +| | +| O +| --|-- +| +| +~~~~~~~ +------------------ ++---. +| | +| O +| --|-- +| / +| +~~~~~~~ +------------------ ++---. +| | +| O +| --|-- +| / \ +| +~~~~~~~ +------------------ diff --git a/lessons/homework/ostrava6/tasks.yml b/lessons/homework/ostrava6/tasks.yml new file mode 100644 index 0000000000..5aef5efc80 --- /dev/null +++ b/lessons/homework/ostrava6/tasks.yml @@ -0,0 +1,87 @@ +# https://pyladies.cz/v1/s005-modules/handout/handout5a-ostrava.pdf +# https://github.com/messa/pyladies-courseware/blob/master/data/2018_pyladies_praha_autumn/homeworks/handout9.yaml + +tasks: + +- section: + markdown: | + Máš-li hotové Piškvorky, můžeš si naprogramovat ještě jednu hru! Jestli na to tedy máš čas a chuť. + +- markdown: | + Vytvoř hru `sibenice` podle následujícího popisu. + Snaž se projekt rozdělit do funkcí s hezkými jmény, + piš dokumentační řetězce. + + - Počítač náhodně zvolí slovo (zatím třeba ze tří možností). + Pro jednoduchost používej malá písmena a nepoužívej slova, + ve kterých se stejné písmeno opakuje dvakrát + (třeba čokoláda). + - Nastav výchozí stav: řetězec s tolika podtržítky, kolik je + ve vybraném slově písmen. + - Nastav počet neúspěšných pokusů na nulu. + - Každý tah: + - Zeptej se hráče na písmeno. + - Pokud je to písmeno ve vybraném slově, zaměň příslušná + podtržítka za ono písmeno. + _Bude se hodit řetězcová metoda `index` + a funkce `zamen` z piškvorek._ + - Pokud dané písmeno _není_ ve vybraném slově, + započítej neúspěšný pokus. + - Vypiš stav (slovo s případnými podtržítky). + - Pokud už ve slově nejsou podtržítka, pogratuluj hráči + a ukonči hru. + - Podle počtu neúspěšných pokusů vypiš „obrázek”. + Obrázky jsou ke stažení
zde + a můžeš je dát do víceřádkových řetězců (s trojitými uvozovkami). + - Pokud jsi právě vypsala poslední obrázek, hráč prohrál. + Dej mu to najevo a ukonči program. + +
+    +---.
+    |   |
+    |   O
+    | --|--
+    |  /
+    |
+    ~~~~~~~
+
+    p_t__n
+    
+ +- markdown: | + Funguje-li ti předchozí hra, můžeš ji vylepšit. + + - Zařiď, aby fungovala slova s více stejnými písmeny. + - Když hráč nezadá písmeno (zadá např. `ABC` nebo `!`), nepovažuj to za tah. + - Po skončení dej hráči možnost hru opakovat. + +- markdown: | + Načítej „obrázky” v Šibenici ze souborů, místo řetězců ve zdrojovém kódu. + +- section: + markdown: | + Dnešní projekty jsou tak trochu navíc. Udělej je, pokud už máš hotové 1-D piškvorky. + +- markdown: | + Napiš program, který zkoupíruje soubor na jiné místo. + (Zeptá se na původní jméno a nové jméno, načte původní soubor a zapíše + obsah do nového.) + + _Program zkoušej v adresáři, který neobsahuje nic + důležitého – pro Python není těžké přepsat soubor, ve kterém jsou důležité informace!_ + +- markdown: | + Můj bratr, který píše japonské texty, mě požádal o program, který počítá + znaky. Program přečte soubor _rozsypanycaj.txt_ a zjistí, kolik znaků je psáno + kterou z japonských slabikových abeced + + * ひらがな (hiragana): + ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ちぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め もゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ + * カタカナ (katakana): + ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ + + Abecedy jsou k dispozici ke stažení v souborech hiragana.txt a katakana.txt. + + Program vypíše dvě čísla – počet znaků pro každou z abeced. Znaky, které nejsou v jedné z abeced, ignoruj. + + Pro testování si jako _rozsypanycaj.txt_ můžeš uložit stránku z japonské wikipedie. diff --git a/lessons/homework/ostrava7/index.md b/lessons/homework/ostrava7/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava7/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava7/info.yml b/lessons/homework/ostrava7/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava7/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava7/tasks.yml b/lessons/homework/ostrava7/tasks.yml new file mode 100644 index 0000000000..44033178eb --- /dev/null +++ b/lessons/homework/ostrava7/tasks.yml @@ -0,0 +1,192 @@ +# https://pyladies.cz/v1/s006-lists/handout-ostrava/handout6.pdf + +tasks: + +- section: + markdown: | + Na začátek trocha práce se seznamy. + Některé z projektů – a zvlášť ten poslední – potřebují trochu přemýšlení; + nebudeš-li vědět jak dál, zeptej se na internetu nebo na sraze ostatních + a řešte společně! + +- markdown: | + Udělej si seznam domácích zvířat. Budeš ho potřebovat v dalších úlohách. + Domácí zvířata známe tato: `"pes", "kočka", "králík", "had"`. + +- markdown: | + Napiš funkci, která vrací jména domácích zvířat (zadaných argumentem), která jsou kratší než 5 písmen. + +- markdown: | + Napiš funkci, která vrací jména domácích zvířat (zadaných argumentem), která začínají na `k`. + +- markdown: | + Napiš funkci, která dostane slovo a zjistí, jestli je v seznamu domácích zvířat. + + _„Zjistí“ znamená, že funkce vrátí `True` nebo `False`._ + +- markdown: | + Napiš funkci, která dostane dva seznamy jmen zvířat a vrátí tři seznamy: + + - zvířata, která jsou v obou seznamech (sjednocení množin: první ∪ druhá), + - zvířata, která jsou jen v prvním seznamu (rozdíl množin: první - druhá), + - zvířata, která jsou jen ve druhém seznamu (rozdíl množin: druhá - první). + +- markdown: | + Napiš program, který seřadí seznam domácích zvířat podle abecedy. + +- markdown: | + Had byl pyšný na to, že je v abecedě první. + Dokud nepřiletěla `"andulka"`. + + Abys hada uklidnila, vytvoř funkci, která zvířata seřadí podle abecedy, + ale bude ignorovat první písmeno t.j. vrátí: + +
+    "had",
+    "pes",
+    "andulka",
+    "kočka",
+    "králík".
+    
+ + Postup: + + - Máš seznam _hodnot_, které chceš seřadit podle nějakého + _klíče_. Klíč se dá z každé hodnoty vypočítat. + - Vytvoř seznam dvojic `(klíč, hodnota)`. + - Seřaď tento seznam dvojic – dvojice se řadí nejdřív podle + prvního prvku, pak druhého atd. + - Nakonec vytvoř ze seznamu dvojic opět jen seznam hodnot. + + Proč má zrovna had takovéhle výsadní postavení, zjistíš později. + +- section: + markdown: | + Jedna klasická programovací úloha, která nejspíš pořádně potrápí + tvé logické myšlení. Je nepovinná, nemáš-li na ni aspoň pár hodin, + tak ji přeskoč. + +- markdown: | + Napiš funkci, která převede římské číslice na číslo (`int`). + +- section: + markdown: | + Dadaistický koutek: procvičení práce se seznamy, řetězci a soubory. + Opět: nebudeš-li vědět jak dál, zeptej se! + +- markdown: | + Vyber si básničku, která má aspoň tři sloky po aspoň třech verších. + Ulož ji do souboru _basnicka.txt_. + +- markdown: | + Napiš program, který vypíše básničku ze souboru _basnicka.txt_, ale obrátí + pořadí veršů (t.j. jako první vypíše poslední řádek atd.). Nápověda: Každý + seznam má metodu `reverse`, která ho „obrátí”. + +- markdown: | + Napiš program, který obrátí pořadí slov v jednotlivých verších + +- markdown: | + Obrať pořadí slok (ty by měly být oddělené jedním prázdným řádkem). + +- markdown: | + Vypiš slova básně v náhodném pořadí. + + _Bonusový projekt: Snaž se přitom co nejlépe zachovat strukturu básně (sloky, + verše, interpunkci, velká písmena, ..._ + +- section: + markdown: | + Projekty závisí jeden na druhém, řeš je postupně. + Až to uděláš, můžeš si zahrát hru! + Tahle sekce není jednoduchá (a poslední dva projekty jsou obzvláště náročné). + Můžeš zkusit spojit síly s ostatními účastnicemi kurzu!} + +- markdown: | + Napiš funkci, která dostane seznam souřadnic (párů čísel menších než 10, + která určují sloupec a řádek) + a vypíše je jako mapu: mřížku 10×10, kde na políčka která jsou v seznamu + napíše `X`, jinde tečku. + Například: + + nakresli_mapu([(0, 0), (1, 0), (2, 2), (4, 3), (8, 9), (8, 9)]) + X X . . . . . . . . + . . . . . . . . . . + . . X . . . . . . . + . . . . X . . . . . + . . . . . . . . . . + . . . . . . . . . . + . . . . . . . . . . + . . . . . . . . . . + . . . . . . . . . . + . . . . . . . . X . + + _Jak na to?_ + + - Udělej tabulku (seznam seznamů) se samými tečkami, něco jako:
+ `[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]`. + - Na příslušných místech nahraď tečky X-ky. + - Tabulku vypiš pomocí dvou cyklů `for` zanořených do sebe. + +- markdown: | + Napiš funkci `pohyb`, která dostane seznam souřadnic a světovou stranu + (`"s"`, `"j"`, `"v"` nebo `"z"`) + a přidá k seznamu poslední bod „posunutý“ v daném směru. Např.: + + souradnice = [(0, 0)] + pohyb(souradnice, 'v') + print(souradnice) # → [(0, 0), (1, 0)] + pohyb(souradnice, 'v') + print(souradnice) # → [(0, 0), (1, 0), (2, 0)] + pohyb(souradnice, 'j') + print(souradnice) # → [(0, 0), (1, 0), (2, 0), (2, 1)] + pohyb(souradnice, 's') + print(souradnice) # → [(0, 0), (1, 0), (2, 0), (2, 1), (2, 0)] + + Funkce by neměla nic vracet. Jen mění už existující seznam. + +- markdown: | + Napiš cyklus, který se bude ptát uživatele na světovou stranu, + podle ní zavolá `pohyb`, a následně vykreslí seznam jako mapu. + Pak se opět se zeptá na stranu atd. + + Začínej se seznamem `[(0, 0), (1, 0), (2, 0)]`. + +- markdown: | + Doplň funkci `pohyb` tak, aby při pohybu umazala první bod ze seznamu + souřadnic. Výsledný seznam tak bude mít stejnou délku, jako před voláním. + +- markdown: | + Doplň funkci `pohyb` tak, aby zamezila: + + - pohybu ven z mapy, + - pohybu na políčko, které už v seznamu je. + + Vhodná výjimka pro tyto situace je `ValueError('Game over')`. + +- markdown: | + Přidej do hry hadí potravu. Tady jsou pravidla pro vegetariánského hada, + ale můžeš si je změnit podle chuti: + + Seznam ovoce obsahuje na začátku jedno ovoce na políčku, na kterém není had + (například: `[(2, 3)]` znamená jedno ovoce na pozici (2, 3)). + Když had sežere ovoce, vyroste („nesmaže“ se mu ocas, tedy neprovede se to, + cos přidala v projektu 13), + a pokud na mapě zrovna není další ovoce, na náhodném místě (kde není had) vyroste ovoce nové. + + Každých 30 tahů vyroste nové ovoce samo od sebe. + + Na mapě se toto tajemné ovoce zobrazuje jako otazník (`?`). + +- markdown: | + Hadí hřiště může mít libovolné rozměry větší než 4×1. + Třeba 20×20 nebo 10×30. + +- section: + markdown: | + A nakonec projekt na přemýšlení. + +- markdown: | + Může seznam obsahovat sám sebe? Zkus co nejjednodušeji udělat takový seznam, aby platilo: + + seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][0] == 5 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index b24eddee6e..331ffccd1c 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -95,9 +95,8 @@ plan: - title: Úkoly k procvičování type: link url: http://pyladies.cz/v1/s003-looping/ostrava/ukoly-k-procvicovani/ukoly.html - - title: Domácí projekty (PDF) + - lesson: homework/ostrava4 type: homework - url: http://pyladies.cz/v1/s003-looping/handout/handout3b-ostrava.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/b0l0jiJhNNUBhdf0ncl5 @@ -112,8 +111,7 @@ plan: - title: Řetězcový tahák url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf type: cheatsheet - - title: Domácí projekty (PDF) - url: http://pyladies.cz/v1/s004-strings/handout/handout4-ostrava.pdf + - lesson: homework/ostrava5 type: homework - title: Odevzdání domácích projektů type: link @@ -126,21 +124,8 @@ plan: type: lesson - lesson: beginners/files type: lesson - - title: Domácí projekty A (PDF) + - lesson: homework/ostrava6 type: homework - url: http://pyladies.cz/v1/s005-modules/handout/handout5a-ostrava.pdf - - title: Domácí projekty B (PDF) - type: homework - url: http://pyladies.cz/v1/s005-modules/handout/handout7-ostrava.pdf - - title: odkaz k domácím projektům – hiragana - url: http://pyladies.cz/v1/s006-lists/resources/hiragana.txt - type: link - - title: odkaz k domácím projektům – katakana - url: http://pyladies.cz/v1/s006-lists/resources/katakana.txt - type: link - - title: odkaz k domácím projektům – „日本語の表記体系” na japonské Wikipedii - url: http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E8%A1%A8%E8%A8%98%E4%BD%93%E7%B3%BB - type: link - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/BLnJ6NvNedROu9HkB1rw @@ -155,8 +140,7 @@ plan: - title: Tahák na seznamy url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf type: cheatsheet - - title: Domácí projekty (PDF) - url: http://pyladies.cz/v1/s006-lists/handout-ostrava/handout6.pdf + - lesson: homework/ostrava7 type: homework - title: Odevzdání domácích projektů type: link From 2d11680a02e43084ca39da1aec100eb1b57d33f4 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 26 Feb 2019 14:17:56 +0100 Subject: [PATCH 11/37] Ostrava: Feedback --- lessons/feedback/ostrava3/index.ipynb | 296 +++++++++++++++++++++++ lessons/feedback/ostrava3/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 3 files changed, 302 insertions(+) create mode 100644 lessons/feedback/ostrava3/index.ipynb create mode 100644 lessons/feedback/ostrava3/info.yml diff --git a/lessons/feedback/ostrava3/index.ipynb b/lessons/feedback/ostrava3/index.ipynb new file mode 100644 index 0000000000..a171ab64fe --- /dev/null +++ b/lessons/feedback/ostrava3/index.ipynb @@ -0,0 +1,296 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Nejmenší číslo" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "### Upovídané řešení z domácích projektů" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "prve = input('Zadej cislo: ')\n", + "druhe = input('Zadej cislo: ')\n", + "tretie = input('Zadej cislo: ')\n", + "stvrte = input('Zadej cislo: ')\n", + "piate = input('Zadej cislo: ')\n", + "\n", + "if prve Date: Tue, 5 Mar 2019 12:34:25 +0100 Subject: [PATCH 12/37] Ostrava: Feedback for homeworks --- lessons/feedback/ostrava4/index.ipynb | 267 +++++++++++++++++++++++ lessons/feedback/ostrava4/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 3 files changed, 273 insertions(+) create mode 100644 lessons/feedback/ostrava4/index.ipynb create mode 100644 lessons/feedback/ostrava4/info.yml diff --git a/lessons/feedback/ostrava4/index.ipynb b/lessons/feedback/ostrava4/index.ipynb new file mode 100644 index 0000000000..be7ec36b2a --- /dev/null +++ b/lessons/feedback/ostrava4/index.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Jde tento kód napsat jednodušeji, aby ale dělal úplně totéž?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "for radek in range(4):\n", + " radek += 1\n", + " for value in range(radek):\n", + " print('X', end=' ')\n", + " print('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Ano, lze :-)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "for radek in range(1, 5):\n", + " print('X ' * radek)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## A co tento?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "promenna = \"X\"\n", + "\n", + "for j in range(5):\n", + " for i in promenna:\n", + " print(i, i, i, i, i)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Ten taky" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "for j in range(5):\n", + " print('X ' * 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## A do třetice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for X_sloupce in range (6):\n", + " print ('')\n", + " for X_radky in range (6):\n", + " if X_radky == 0 or X_radky == 5 or X_sloupce == 0 or X_sloupce == 5:\n", + " print ('X', end = ' ')\n", + " else:\n", + " print (' ', end = ' ')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "for x in range(6):\n", + " if x % 5 == 0:\n", + " print('X ' * 6)\n", + " else:\n", + " print('X ', ' ' * 6, 'X')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Fibonacciho posloupnost" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pocet = 20\n", + "a = 0\n", + "b = 1\n", + "\n", + "print(a, b, sep=\", \", end=\", \")\n", + "\n", + "for i in range(pocet):\n", + " dalsi_v_rade = a + b\n", + " a = b\n", + " b = dalsi_v_rade\n", + "\n", + " print(dalsi_v_rade, end=\", \")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## A jeden nepodařený" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ctverec = input(\"Když napíšeš podelně, vypíšes z x část čtverce\")\n", + "if ctverec == \"podelne\":\n", + " print(\" x\"*5, sep=\" \")\n", + "for i in range(5):\n", + " print(\" x\",\" \",\" x\")\n", + "print(\" x\"*5, sep=\" \")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné připomínky a rady" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "* Pokud funkce nemá argumenty, mezi otevírací a zavírací závorku se nic nepíše (ani mezera)\n", + "* Také mezi název funkce a závorky se mezera nepíše - takže nikoli `print ()` ale `print()`\n", + "* Programy začínají bobtnat. Dávejte je prosím do samostatných souborů.\n", + "* Ptejte se na Slacku spíše než v domácích projektech. Vaše otázky mohou pomoci i ostatním." + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava4/info.yml b/lessons/feedback/ostrava4/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava4/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index ebf0184e7d..bf576da4fc 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -103,6 +103,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/b0l0jiJhNNUBhdf0ncl5 + - lesson: feedback/ostrava4 + type: lesson - title: Funkce a řetězce slug: def-str date: 2019-03-05 From 2fff5164bd62a22fc294c2702ba8a80b16d12bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lum=C3=ADr=20=27Frenzy=27=20Balhar?= Date: Tue, 5 Mar 2019 15:25:57 +0100 Subject: [PATCH 13/37] =?UTF-8?q?Ostrava:=20Pi=C5=A1kvorky=20a=20TDD=20jak?= =?UTF-8?q?o=20bonusov=C3=BD=20dom=C3=A1c=C3=AD=20projekt=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ostrava: Piškvorky a TDD jako bonusový domácí projekt --- lessons/homework/ostrava5_TDD/index.md | 90 ++++++++++++ lessons/homework/ostrava5_TDD/info.yml | 6 + .../homework/ostrava5_TDD/static/piskvorky.py | 48 +++++++ .../ostrava5_TDD/static/test_piskvorky.py | 133 ++++++++++++++++++ runs/2019/pyladies-ostrava-jaro/info.yml | 4 + 5 files changed, 281 insertions(+) create mode 100644 lessons/homework/ostrava5_TDD/index.md create mode 100644 lessons/homework/ostrava5_TDD/info.yml create mode 100644 lessons/homework/ostrava5_TDD/static/piskvorky.py create mode 100644 lessons/homework/ostrava5_TDD/static/test_piskvorky.py diff --git a/lessons/homework/ostrava5_TDD/index.md b/lessons/homework/ostrava5_TDD/index.md new file mode 100644 index 0000000000..85fbc17e50 --- /dev/null +++ b/lessons/homework/ostrava5_TDD/index.md @@ -0,0 +1,90 @@ +# 1D piškvorky s testy # + +## Co to je? ## + +Poté, co ses naučila pracovat s [řetězci][str] a psát [vlastní funkce][def], dostala jsi za [úkol][handout5] naprogramovat si jednoduchou hru: jednorozměrné piškvorky. Zatím máš předepsané, z jakých dílčích funkcí se bude hra skládat. Toho využijeme a nahlédneme do pokročilejší lekce – té o [testování][testing]. + +Testování ti pomůže ověřit, že tvůj program funguje, jak má. Neboj se však nic, všechno to složitější jsme zatím napsali za tebe. Ty tak můžeš postupovat podle zadání domácích projektů a testy ti spuštěním jednoho jednoduchého příkazu ukážou, jak moc blízko jsi dokončení programu. + +Toto je bonusový materiál, který může udělat domácí úkol zajímavější a naučit tě při tom opět něco nového. Pokud máš ale plné ruce práce se zvládáním aktuální látky, klidně postupuj jen podle zadání domácích projektů a na testování se společně podíváme později. + +## Jak na to? ## + +1. Stáhni si připravený soubor pro [piškvorky][piskvorky] a [soubor s testy][testpiskvorky] a ulož je do samostatné složky. + + V souboru *test_piskvorky.py* máš připravené testy. Nic v něm neměň, ale můžeš se do něj podívat. Samotnou hru pak piš do připraveného souboru _piskvorky.py_. Máš tam nachystané všechny potřebné funkce, jen zatím nic nedělají. Až je všechny doplníš, budeš mít funkční hru. + +1. Aktivuj si své virtuální prostředí. Jak na to jsme si ukázali [na začátku kurzu][venvsetup]. +1. Nainstaluj si knihovnu [pytest] podle [návodu][testing] v materiálech. Právě ta ti umožní ověřit správnou funkčnost programu. + + ```shell + (venv) $ pip install pytest + ``` + +1. Opět podle návodu pytest spusť. + + ```shell + (venv) $ pytest -v test_piskvorky.py + ``` + +## Co s tím? ## + +Pytest ti vypíše, kde všude v tvém programu narazil na problém. Tyto jsou podrobně rozepsané a výstup je tak trochu dlouhý. Na jeho začátku však budeš mít takovéto řádky: + +``` +test_piskvorky.py::test_vyhodnot_vyhra_x FAILED +test_piskvorky.py::test_vyhodnot_vyhra_o FAILED +test_piskvorky.py::test_vyhodnot_remiza FAILED +… +test_piskvorky.py::test_tah_pocitace_skoro_plne_konec_2 FAILED +``` + +Každé _FAILED_ znamená jednu chybu: jeden test, který neprošel. Protože jsi zatím nic nenapsala, je problém úplně ve všem. To se ale změní, jakmile splníš první úkol: zařídíš, aby funkce _vyhodnot_ rozpoznala, že vyhrál hráč s křížky. + +``` +test_piskvorky.py::test_vyhodnot_vyhra_x PASSED +test_piskvorky.py::test_vyhodnot_vyhra_o FAILED +test_piskvorky.py::test_vyhodnot_remiza FAILED +… +test_piskvorky.py::test_tah_pocitace_skoro_plne_konec_2 FAILED +``` + +Vidíš? Výsledek prvního testu se změnil na _PASSED_. To znamená, že v tomto případě program funguje, jak má. + +Až budeš mít program hotový, místo všech červených _FAILED_ bude u všech testů zelené _PASSED_. Pak víš, že máš hotovo. Teda, skoro. + +``` +test_piskvorky.py::test_vyhodnot_vyhra_x PASSED +test_piskvorky.py::test_vyhodnot_vyhra_o PASSED +… +test_piskvorky.py::test_tah_pocitace_skoro_plne_konec PASSED +test_piskvorky.py::test_tah_pocitace_skoro_plne_konec_2 PASSED +``` + +Proč jen skoro? Některé věci testovat moc dobře nejdou, nebo by to bylo pro tebe v tuto chvíli moc složité. + +* Jednou takovou věcí je zadání od uživatele. Funkci *tah_hrace* proto pytest netestuje. To pak platí i pro celé jádro hry, funkci _piskvorky1d_, která právě funkci *tah_hrace* používá, když je hráč na tahu. +* Druhou věcí, která není testy pokryta, je vypisování na obrazovku. Tedy všechna zvolání o chybách či stavu hry. + +Tyto věci musíš ověřit ručně. To by ale nemuselo být tak hrozné: programuješ hru a testováním si rovnou i hraješ. + +## Co dál? ## + +Snad ti tato zkušenost ukázala, že automatické testování ti může ušetřit čas a práci. Že díky testům si můžeš být jistá, že jsi úpravou programu nerozbila nic, co před tím fungovalo. + +Nahlédni do souboru *test_piskvorky.py*. Možná teď ještě nebudeš rozumět do detailu, jak to všechno vlastně funguje, ale i tak uvidíš, že to není raketová věda. Máš herní pole v nějakém stavu, zavoláš svou funkci, a ověříš, že vrátila to, co by měla. + +```python +assert tah("--------------------", 10, "x") == "----------x---------" +``` + +[Později][testing] se naučíš psát si testy sama. Snad ti tenhle malý exkurs ukázal, proč to není zbytečnost a že se ta trocha přidané námahy na začátku skutečně vyplatí. + +[str]: {{ lesson_url('beginners/str') }} +[def]: {{ lesson_url('beginners/def') }} +[handout5]: {{ lesson_url('homework/ostrava5') }} +[testing]: {{ lesson_url('beginners/testing') }} +[venvsetup]: {{ lesson_url('beginners/venv-setup') }} +[pytest]: https://pytest.readthedocs.io/ +[testpiskvorky]: static/test_piskvorky.py +[piskvorky]: static/piskvorky.py diff --git a/lessons/homework/ostrava5_TDD/info.yml b/lessons/homework/ostrava5_TDD/info.yml new file mode 100644 index 0000000000..85aad8fecc --- /dev/null +++ b/lessons/homework/ostrava5_TDD/info.yml @@ -0,0 +1,6 @@ +title: Bonus - 1D Piškvorky a test-driven development +style: md +attribution: Pro PyLadies CZ napsali Glutexo, Lumír Balhar, Petr Viktorin a další, 2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava5_TDD/static/piskvorky.py b/lessons/homework/ostrava5_TDD/static/piskvorky.py new file mode 100644 index 0000000000..61d9b8bd21 --- /dev/null +++ b/lessons/homework/ostrava5_TDD/static/piskvorky.py @@ -0,0 +1,48 @@ +DELKA_POLE = 20 + +SYMBOL_HRACE = "x" +SYMBOL_POCITACE = "o" + + +def vyhodnot(pole): + """ + Podle stavu herního pole vrátí: + řetězec "x", když vyhraje hráč, + řetězec "o", když vyhraje počítač, + řetězec "!", když dojde k remíze nebo + řetězec "-", když je možné ještě pokračovat ve hře + """ + pass + + +def tah(pole, cislo_policka, symbol): + """ + Vrátí herní pole s daným symbolem umístěným na danou pozici. + """ + pass + + +def tah_hrace(pole): + """ + Zeptá se hráče, kam chce hrát, a vrátí herní pole s jeho zaznamenaným + tahem. + """ + pass + + +def tah_pocitace(pole): + """ + Vrátí herní pole se zaznamenaným tahem počítače + """ + pass + + +def piskvorky1d(): + """ + Hraje 1D piškvorky. + """ + pass + + +if __name__ == "__main__": + piskvorky1d() diff --git a/lessons/homework/ostrava5_TDD/static/test_piskvorky.py b/lessons/homework/ostrava5_TDD/static/test_piskvorky.py new file mode 100644 index 0000000000..fed891d2f9 --- /dev/null +++ b/lessons/homework/ostrava5_TDD/static/test_piskvorky.py @@ -0,0 +1,133 @@ +import pytest + +from piskvorky import tah, tah_pocitace, vyhodnot + + +def test_vyhodnot_vyhra_x(): + """ + Křížky vyhrály. + """ + assert vyhodnot("xxx-----------------") == "x" + assert vyhodnot("--------xxx---------") == "x" + assert vyhodnot("-----------------xxx") == "x" + assert vyhodnot("-xoxoxxxoxoxoxoxoxox") == "x" + assert vyhodnot("-xooxxooxxooxxoxxxoo") == "x" + assert vyhodnot("xxxoxoxoxoxoxoxoxox-") == "x" + assert vyhodnot("oxxxoxoxxooxxooxxoo-") == "x" + assert vyhodnot("oxoxoxoxo-oxoxoxoxxx") == "x" + assert vyhodnot("xxooxxoox-ooxxooxxxo") == "x" + + +def test_vyhodnot_vyhra_o(): + """ + Kolečka vyhrála. + """ + assert vyhodnot("ooo-----------------") == "o" + assert vyhodnot("--------ooo---------") == "o" + assert vyhodnot("-----------------ooo") == "o" + assert vyhodnot("-xoxoxoxoooxoxoxoxox") == "o" + assert vyhodnot("-xoooxooxxooxxooxxoo") == "o" + assert vyhodnot("xoooxoxoxoxoxoxoxox-") == "o" + assert vyhodnot("oooxxooxxooxxooxxoo-") == "o" + assert vyhodnot("oxoxoxoxo-oxoxoxooox") == "o" + assert vyhodnot("xxooxxoox-ooxxooxooo") == "o" + + +def test_vyhodnot_remiza(): + """ + Nastala remíza. + """ + assert vyhodnot("oxoxoxoxoxoxoxoxoxox") == "!" + assert vyhodnot("xxooxxooxxooxxooxxoo") == "!" + + +def test_vyhodnot_hra(): + """ + Hra neskončila. + """ + assert vyhodnot("--------------------") == "-" + assert vyhodnot("xx----------------oo") == "-" + assert vyhodnot("-xoxoxoxoxoxoxoxoxox") == "-" + assert vyhodnot("-xooxxooxxooxxooxxoo") == "-" + assert vyhodnot("xoxoxoxoxoxoxoxoxox-") == "-" + assert vyhodnot("xooxxooxxooxxooxxoo-") == "-" + assert vyhodnot("oxoxoxoxo-oxoxoxoxox") == "-" + assert vyhodnot("xxooxxoox-ooxxooxxoo") == "-" + + +def test_tah_x(): + """ + Pozitivní testy se symbolem "x". + """ + assert tah("--------------------", 0, "x") == "x-------------------" + assert tah("--------------------", 10, "x") == "----------x---------" + assert tah("--------------------", 19, "x") == "-------------------x" + + +def test_tah_o(): + """ + Pozitivní testy se symbolem "o". + """ + assert tah("--------------------", 0, "o") == "o-------------------" + assert tah("--------------------", 10, "o") == "----------o---------" + assert tah("--------------------", 19, "o") == "-------------------o" + + +def test_tah_pocitace_prazdne(): + """ + Hra na prázdné pole. + """ + pole = "--------------------" + result = tah_pocitace(pole) + assert len(result) == 20 + assert result.count("-") == 19 + assert result.count("o") == 1 + + +def test_tah_pocitace_skoro_plne(): + """ + Hra na skoro plné pole (volno uprostřed). + """ + pole = "xoxoxoxoxo-xoxoxoxox" + result = tah_pocitace(pole) + assert len(result) == 20 + assert result.count("x") == 10 + assert result.count("o") == 10 + + +def test_tah_pocitace_skoro_plne_zacatek(): + """ + Hra na skoro plné pole (volno na začátku). + """ + pole = "-xoxoxoxoxoxoxoxoxox" + result = tah_pocitace(pole) + assert len(result) == 20 + assert result.count("x") == 10 + assert result.count("o") == 10 + + +def test_tah_pocitace_skoro_plne_konec(): + """ + Hra na skoro plné pole (volno na konci). + """ + pole = "xoxoxoxoxoxoxoxoxox-" + result = tah_pocitace(pole) + assert len(result) == 20 + assert result.count("x") == 10 + assert result.count("o") == 10 + + +def test_tah_pocitace_skoro_plne_konec_2(): + """ + Hra na skoro plné pole (2× volno na konci). + """ + pole = "xooxxooxoxoxoxooxx--" + result = tah_pocitace(pole) + assert len(result) == 20 + assert result.count("x") == 9 + assert result.count("o") == 10 + assert result.count("-") == 1 + + +if __name__ == "__main__": + pytest.main() diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index c608deaa04..a75295f36f 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -117,6 +117,10 @@ plan: type: cheatsheet - lesson: homework/ostrava5 type: homework + - lesson: homework/ostrava5_TDD + type: homework + vars: + bonus: true - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/ztWlVnOsOM1smoLPxltm From 1c371eb137e24b1b4ed7beb82735956d69217605 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Wed, 6 Mar 2019 15:28:16 +0100 Subject: [PATCH 14/37] Fix wording on TDD bonus material --- lessons/homework/ostrava5_TDD/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/homework/ostrava5_TDD/index.md b/lessons/homework/ostrava5_TDD/index.md index 85fbc17e50..7175c759a5 100644 --- a/lessons/homework/ostrava5_TDD/index.md +++ b/lessons/homework/ostrava5_TDD/index.md @@ -2,7 +2,7 @@ ## Co to je? ## -Poté, co ses naučila pracovat s [řetězci][str] a psát [vlastní funkce][def], dostala jsi za [úkol][handout5] naprogramovat si jednoduchou hru: jednorozměrné piškvorky. Zatím máš předepsané, z jakých dílčích funkcí se bude hra skládat. Toho využijeme a nahlédneme do pokročilejší lekce – té o [testování][testing]. +Poté, co ses naučila pracovat s [řetězci][str] a psát [vlastní funkce][def], dostala jsi za [úkol][handout5] naprogramovat si jednoduchou hru: jednorozměrné piškvorky. V domácím projektu je předepsáno, z jakých dílčích funkcí se bude hra skládat. Mrkni se na zadání domácího projektu, než budeš pokračovat. Detailního popisu zadání hned využijeme a nahlédneme do pokročilejší lekce – té o [testování][testing]. Lekci o testování není třeba studovat celou, na to se podíváme společně za několik lekcí, ale můžeš v ní najít odpovědi na některé otázky. Testování ti pomůže ověřit, že tvůj program funguje, jak má. Neboj se však nic, všechno to složitější jsme zatím napsali za tebe. Ty tak můžeš postupovat podle zadání domácích projektů a testy ti spuštěním jednoho jednoduchého příkazu ukážou, jak moc blízko jsi dokončení programu. From 45743ecf8a03a83e72a10adc497890587380785d Mon Sep 17 00:00:00 2001 From: Disi77 <45143100+Disi77@users.noreply.github.com> Date: Thu, 7 Mar 2019 22:57:28 +0100 Subject: [PATCH 15/37] Update tasks.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upraveno slovo na řádku 66 zkoupíruje na zkopíruje --- lessons/homework/ostrava6/tasks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/homework/ostrava6/tasks.yml b/lessons/homework/ostrava6/tasks.yml index 5aef5efc80..cbc2da8ccb 100644 --- a/lessons/homework/ostrava6/tasks.yml +++ b/lessons/homework/ostrava6/tasks.yml @@ -63,7 +63,7 @@ tasks: Dnešní projekty jsou tak trochu navíc. Udělej je, pokud už máš hotové 1-D piškvorky. - markdown: | - Napiš program, který zkoupíruje soubor na jiné místo. + Napiš program, který zkopíruje soubor na jiné místo. (Zeptá se na původní jméno a nové jméno, načte původní soubor a zapíše obsah do nového.) From 4fdc6ce245c6f414fbdc180ad312136dfdc2e035 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 12 Mar 2019 10:30:58 +0100 Subject: [PATCH 16/37] Ostrava: Feedback for homeworks --- lessons/feedback/ostrava5/bart-chalkboard.gif | Bin 0 -> 38455 bytes lessons/feedback/ostrava5/index.ipynb | 668 ++++++++++++++++++ lessons/feedback/ostrava5/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 4 files changed, 674 insertions(+) create mode 100644 lessons/feedback/ostrava5/bart-chalkboard.gif create mode 100644 lessons/feedback/ostrava5/index.ipynb create mode 100644 lessons/feedback/ostrava5/info.yml diff --git a/lessons/feedback/ostrava5/bart-chalkboard.gif b/lessons/feedback/ostrava5/bart-chalkboard.gif new file mode 100644 index 0000000000000000000000000000000000000000..28a0995190aa5d296ea010ccc85d74db0f1d7b3d GIT binary patch literal 38455 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 literal 0 HcmV?d00001 diff --git a/lessons/feedback/ostrava5/index.ipynb b/lessons/feedback/ostrava5/index.ipynb new file mode 100644 index 0000000000..751e0d1626 --- /dev/null +++ b/lessons/feedback/ostrava5/index.ipynb @@ -0,0 +1,668 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Tah hráče" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Je tam opravdu vše potřeba?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def tah_hrace (pole):\n", + " 'Vrátí herní pole se zaznamenaným tahem hráče'\n", + " t = 0\n", + " while t == 0:\n", + " pozice = int(input('Na které políčko chceš hrát? '))\n", + " if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):\n", + " return tah(pole,pozice,'x')\n", + " t = 1\n", + " else:\n", + " print('Špatně zadaná pozice, zkus to znovu.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Není" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def tah_hrace(pole):\n", + " 'Vrátí herní pole se zaznamenaným tahem hráče'\n", + " while True:\n", + " pozice = int(input('Na které políčko chceš hrát? '))\n", + " if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):\n", + " return tah(pole,pozice,'x')\n", + " else:\n", + " print('Špatně zadaná pozice, zkus to znovu.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Vyhodnocení piškvorek" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Co by se tady dalo udělat jednodušeji?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vyhodnot(pole):\n", + " \"Vyhodnotí stav pole.\"\n", + " krizek = \"xxx\"\n", + " kolecko = \"ooo\"\n", + " volno = \"-\"\n", + " if krizek in pole and kolecko not in pole:\n", + " return(\"x\")\n", + " elif kolecko in pole and krizek not in pole:\n", + " return(\"o\")\n", + " elif volno not in pole and krizek not in pole and kolecko not in pole:\n", + " return(\"!\")\n", + " else:\n", + " None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Upravená varianta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vyhodnot(pole):\n", + " \"Vyhodnotí stav pole.\"\n", + " if 'xxx' in pole:\n", + " return(\"x\")\n", + " elif 'ooo' in pole:\n", + " return(\"o\")\n", + " elif '-' not in pole:\n", + " return(\"!\")\n", + " else:\n", + " return '-'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Piškvorky" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randrange\n", + "\n", + "def vyhodnot(pole):\n", + " \"Vyhodnotí stav pole.\"\n", + " if 'xxx' in pole:\n", + " return(\"x\")\n", + " elif 'ooo' in pole:\n", + " return(\"o\")\n", + " elif '-' not in pole:\n", + " return(\"!\")\n", + " else:\n", + " return '-'\n", + "\n", + "def tah(pole, pozice, symbol):\n", + " \"Vrátí herní pole s daným symbolem umístěným na danou pozici.\"\n", + " return pole[:pozice] + symbol + pole[pozice + 1:]\n", + "\n", + "def tah_hrace(herni_pole):\n", + " \"Ptá se hráče na kterou pozici chce hrát a vrací herní pole se zaznamenaným tahem\"\n", + " while True:\n", + " cislo_pozice = int(input(\"Na kterou pozici chceš hrát? \"))\n", + " if cislo_pozice >= 0 and cislo_pozice < len(herni_pole) and herni_pole[cislo_pozice] == \"-\":\n", + " return tah(herni_pole, cislo_pozice, \"x\")\n", + " else:\n", + " print(\"Špatná pozice, zkus to znovu. \")\n", + "\n", + "def tah_pocitace(herni_pole):\n", + " \"Vrátí herní pole se zaznamenaným tahem počítače. \"\n", + " while True:\n", + " cislo_pozice = randrange(len(herni_pole))\n", + " if herni_pole[cislo_pozice] == \"-\":\n", + " return tah(herni_pole, cislo_pozice, \"o\")\n", + "\n", + "def piskvorky():\n", + " \"Vygeneruje prázdné pole a střídá tah hráče a počítače. \"\n", + " pole = \"-\" * 20\n", + " while True:\n", + " print(pole)\n", + " pole = tah_hrace(pole)\n", + " print(pole)\n", + " if vyhodnot(pole) != '-':\n", + " break\n", + " pole = tah_pocitace(pole)\n", + " if vyhodnot(pole) != '-':\n", + " break\n", + " \n", + " print(pole)\n", + " if vyhodnot(pole) == '!':\n", + " print('Remíza!')\n", + " elif vyhodnot(pole) == 'x':\n", + " print('Vyhrála jsi!')\n", + " elif vyhodnot(pole) == 'o':\n", + " print('Vyhrál počítač!')\n", + "\n", + "piskvorky()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Chyby v programu a jejich řešení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nejdříve chyby v syntaxi, na které si Python stěžuje ihned po přečtení programu." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "EOL while scanning string literal (, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m symbol_hrac = input('Chces o nebo x?)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m EOL while scanning string literal\n" + ] + } + ], + "source": [ + "def piskvorky1d(symbol):\n", + " symbol_hrac = input('Chces o nebo x?)\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-'\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 7)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m while vysledek =='-'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "def piskvorky1d(symbol):\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-'\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "expected an indented block (, line 8)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m tah_hrace(pole,symbol_hrac)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n" + ] + } + ], + "source": [ + "def piskvorky1d(symbol):\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-':\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def piskvorky1d(symbol):\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-':\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Pro řešení těch dalších už musíme kód v naší funkci spustit, jinak se o jeho chování nic nedozvíme." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "piskvorky1d() missing 1 required positional argument: 'symbol'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: piskvorky1d() missing 1 required positional argument: 'symbol'" + ] + } + ], + "source": [ + "def piskvorky1d(symbol):\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-':\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)\n", + "\n", + "piskvorky1d()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chces o nebo x?x\n", + "--------------------\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'vysledek' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mpole\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0;34m'-'\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m20\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'-'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m\u001b[0;34m'-'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'vysledek' is not defined" + ] + } + ], + "source": [ + "def piskvorky1d():\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek == '-'\n", + "\n", + " while vysledek =='-':\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek == vyhodnot(pole)\n", + " print(vysledek)\n", + "\n", + "piskvorky1d()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chces o nebo x?x\n", + "--------------------\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'tah_hrace' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m\u001b[0;34m'-'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mtah_hrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msymbol_hrac\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msymbol_hrac\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'o'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'tah_hrace' is not defined" + ] + } + ], + "source": [ + "def piskvorky1d():\n", + " symbol_hrac = input('Chces o nebo x?')\n", + " pole= '-' * 20\n", + " print(pole)\n", + " vysledek = '-'\n", + "\n", + " while vysledek =='-':\n", + " tah_hrace(pole,symbol_hrac)\n", + " print(pole)\n", + " if symbol_hrac == 'o':\n", + " symbol_pocitac == 'x'\n", + " else:\n", + " symbol_pocitac == 'o'\n", + " tah_pocitace(pole,symbol_pocitac)\n", + " print(pole)\n", + " vysledek = vyhodnot(pole)\n", + " print(vysledek)\n", + "\n", + "piskvorky1d()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Nepřehánějme to s komentáři" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Program by měl vypisovat všechny hody a nakonec napsat, kdo vyhrál.\n", + "def hazeni(hrac):\n", + " '''Tato funkce generuje náhodné hody kostkou hráče.\n", + " Výsledkem je počet hodů dokud nepadla šestka.'''\n", + "#hodnota jedna, protože vždycky se alespoň jednou hodí kostkou\n", + " pocet = 1\n", + " while True:\n", + "#hod generuje náhodná čísla 1-6\n", + " hod = randrange(1,7)\n", + " # print(hod, 'tohle jsem hodil')\n", + "#v každém případě, kdy není hozena šestka, se připočítává k hodnotě počet jednička\n", + " if hod != 6:\n", + " pocet += 1\n", + " # print(pocet, 'tolik hodů')\n", + "#když šestka padne, vypíše se v rámci funkce text a vrátí se hodnota (dále se s ní počítá jako s vyslB)\n", + " else:\n", + " print(hrac, '. hráč potřeboval ', pocet, ' hodů na hození šestky.', sep='')\n", + " return pocet" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def obsah_elipsy(a, b):\n", + " obsah = pi * a * b # Přiřazení do `obsah`\n", + " a = a + 3 # Přiřazení do `a`\n", + " return obsah" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Plagiáty?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![bart](bart-chalkboard.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Pochvaly" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Za to, že vaše programy očekávají různé vstupy - například `Ano`, `ANO`, `ano`, `A` atp.\n", + "* Pochvala za použití Gitu a Githubu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné rady a doporučení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* U funkcí vždy používáme dokumentační řetězce s trojtými uviozovkami. K popisu funkcí nepoužíváme komentáře.\n", + "* Nezapomeňte kontrolovat svůj kód před odesláním, jestli tam nezůstali nějaké ladící hlášky nebo něco navíc.\n", + "* Pokud máte domácí úkol v Gitu a nahraný na Github, není třeba ho zabalit a poslat ještě jednou na Dropbox. Pošlete jen odkaz.\n", + "* **Dělejte i složitější úlohy**. I když se vám třeba nakonec nepodaří dokončit, je to lepší než je neudělat vůbec a je se alespoň o čem bavit a co řešit." + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava5/info.yml b/lessons/feedback/ostrava5/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava5/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index a75295f36f..eb52f55ee7 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -124,6 +124,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/ztWlVnOsOM1smoLPxltm + - lesson: feedback/ostrava5 + type: lesson - title: Soubory a výjimky slug: file date: 2019-03-12 From 014d90c290cd1015bbaa055ac35778ab8e2a0ffa Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 12 Mar 2019 11:01:12 +0100 Subject: [PATCH 17/37] Move image to static folder and fix a link to it in feedback/ostrava5 --- lessons/feedback/ostrava5/index.ipynb | 2 +- .../ostrava5/{ => static}/bart-chalkboard.gif | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename lessons/feedback/ostrava5/{ => static}/bart-chalkboard.gif (100%) diff --git a/lessons/feedback/ostrava5/index.ipynb b/lessons/feedback/ostrava5/index.ipynb index 751e0d1626..83a7129ffe 100644 --- a/lessons/feedback/ostrava5/index.ipynb +++ b/lessons/feedback/ostrava5/index.ipynb @@ -599,7 +599,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![bart](bart-chalkboard.gif)" + "![bart](static/bart-chalkboard.gif)" ] }, { diff --git a/lessons/feedback/ostrava5/bart-chalkboard.gif b/lessons/feedback/ostrava5/static/bart-chalkboard.gif similarity index 100% rename from lessons/feedback/ostrava5/bart-chalkboard.gif rename to lessons/feedback/ostrava5/static/bart-chalkboard.gif From f7aa8b5c17c554fda0c5f425777c688a1dc26206 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 19 Mar 2019 07:47:33 +0100 Subject: [PATCH 18/37] Ostrava: Feedback for homeworks --- lessons/feedback/ostrava6/index.ipynb | 277 +++++++++++++++++++++++ lessons/feedback/ostrava6/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 3 files changed, 283 insertions(+) create mode 100644 lessons/feedback/ostrava6/index.ipynb create mode 100644 lessons/feedback/ostrava6/info.yml diff --git a/lessons/feedback/ostrava6/index.ipynb b/lessons/feedback/ostrava6/index.ipynb new file mode 100644 index 0000000000..a00a8a23f5 --- /dev/null +++ b/lessons/feedback/ostrava6/index.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Použití *with*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* *with* nám může ušetřit práci i starosti s přemýšlením nad uzavřením otevřeného souboru\n", + "* čtení celého souboru nemusíme dělat jen přes cyklus for, ale můžeme jej přečíst celý najednou metodou *.read()*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "soubor = open(\"soubor.txt\", mode=\"r\", encoding='utf-8')\n", + "novy_soubor = open(\"soubor2.txt\", mode=\"w\", encoding='utf-8')\n", + "\n", + "for text in soubor:\n", + " novy_soubor.write(text) \n", + "\n", + "print (\"Soubor zkopírován.\")\n", + "\n", + "soubor.close()\n", + "novy_soubor.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "with open(\"soubor.txt\", mode=\"r\", encoding='utf-8') as soubor:\n", + " with open(\"soubor2.txt\", mode=\"w\", encoding='utf-8') as novy_soubor:\n", + " novy_soubor.write(soubor.read()) \n", + "print (\"Soubor zkopírován.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Ukázkový příklad porušení DRY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Proč se tolik opakovat, když můžeme počet pokusů použít přímo, převést jej na řetězec a jen připojením přípony z něj udělat název souboru?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def vykresliPanacka(pocet_pokusu):\n", + " \"Funkce na základě neúspěšných pokusů vypisuje obrázky, dokud hra neskončí.\"\n", + " if pocet_pokusu == 1:\n", + " vstup=open(\"1.txt\", encoding='utf-8')\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 2:\n", + " vstup=open(\"2.txt\", encoding='utf-8')\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 3:\n", + " vstup=open(\"3.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 4:\n", + " vstup=open(\"4.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 5:\n", + " vstup=open(\"5.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 6:\n", + " vstup=open(\"6.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 7:\n", + " vstup=open(\"7.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 8:\n", + " vstup=open(\"8.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " elif pocet_pokusu == 9:\n", + " vstup=open(\"9.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " else:\n", + " vstup=open(\"10.txt\")\n", + " obrazek = vstup.read()\n", + " print(obrazek)\n", + " vstup.close()\n", + " print (\"Konec hry, prohrál jsi!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def vykresliPanacka(pocet_pokusu):\n", + " \"Funkce na základě neúspěšných pokusů vypisuje obrázky, dokud hra neskončí.\"\n", + " with open(str(pocet_pokusu) + \".txt\", encoding='utf-8') as soubor:\n", + " print(soubor.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Šibenice a vyplnění jednoho znaku do hádaného slova" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def vyplnZnak(hadanka, znak, tajneSlovo):\n", + " for index in range(len(tajneSlovo)):\n", + " if znak == tajneSlovo[index]:\n", + " hadanka = hadanka[:index] + znak + hadanka[index + 1:]\n", + " return hadanka" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Drobnosti" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Dokumentační řetězce se píšou hned pod název funkce a nikde jinde\n", + "* Nepoužívat kapitálky pro názvy proměnných. Většinou to není potřeba.\n", + "* Soubor nemusí mít příponu a rozhodně to nemusí být vždy `.txt`\n", + "* Používání knihoven pro kopírování souborů nebylo cílem, ale snaha se cení." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Martinovy prosby" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Nebalte do archívů každou úlohu zvlášť. Jeden archiv bohatě postačí.\n", + "* Neposílejte nám složky s virtuálním prostředím." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné rady, pochvaly a doporučení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Velká pochvala za úkoly na githubu\n", + "* Pochvala za hledání pomoci na internetu a používání nových věcí\n", + "* Pochvala těm, kdo měli obrázky šibenice a japonské abecedy ve zvláštním souboru a ne přímo v kódu\n", + "* Pochvala za psaní komentářů k funkcím a složitějšímu kódu" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava6/info.yml b/lessons/feedback/ostrava6/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava6/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index eb52f55ee7..c284ebc02b 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -139,6 +139,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/BLnJ6NvNedROu9HkB1rw + - lesson: feedback/ostrava6 + type: lesson - title: Seznamy slug: list date: 2019-03-19 From 92c73460748e8aaed8a1bb6718d2a16ab89ff81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lum=C3=ADr=20=27Frenzy=27=20Balhar?= Date: Mon, 25 Mar 2019 08:20:20 +0100 Subject: [PATCH 19/37] Ostrava: Transformed homeworks to lessons and some new ones (#29) Ostrava: Transformed homeworks and some new ones --- lessons/homework/ostrava10/index.md | 23 ++++++++ lessons/homework/ostrava10/info.yml | 7 +++ lessons/homework/ostrava10/tasks.yml | 13 +++++ lessons/homework/ostrava11/index.md | 23 ++++++++ lessons/homework/ostrava11/info.yml | 7 +++ lessons/homework/ostrava11/tasks.yml | 6 ++ lessons/homework/ostrava12/index.md | 23 ++++++++ lessons/homework/ostrava12/info.yml | 7 +++ lessons/homework/ostrava12/tasks.yml | 20 +++++++ lessons/homework/ostrava8/index.md | 23 ++++++++ lessons/homework/ostrava8/info.yml | 7 +++ lessons/homework/ostrava8/tasks.yml | 72 ++++++++++++++++++++++++ lessons/homework/ostrava9/index.md | 23 ++++++++ lessons/homework/ostrava9/info.yml | 7 +++ lessons/homework/ostrava9/tasks.yml | 44 +++++++++++++++ runs/2019/pyladies-ostrava-jaro/info.yml | 18 ++---- 16 files changed, 310 insertions(+), 13 deletions(-) create mode 100644 lessons/homework/ostrava10/index.md create mode 100644 lessons/homework/ostrava10/info.yml create mode 100644 lessons/homework/ostrava10/tasks.yml create mode 100644 lessons/homework/ostrava11/index.md create mode 100644 lessons/homework/ostrava11/info.yml create mode 100644 lessons/homework/ostrava11/tasks.yml create mode 100644 lessons/homework/ostrava12/index.md create mode 100644 lessons/homework/ostrava12/info.yml create mode 100644 lessons/homework/ostrava12/tasks.yml create mode 100644 lessons/homework/ostrava8/index.md create mode 100644 lessons/homework/ostrava8/info.yml create mode 100644 lessons/homework/ostrava8/tasks.yml create mode 100644 lessons/homework/ostrava9/index.md create mode 100644 lessons/homework/ostrava9/info.yml create mode 100644 lessons/homework/ostrava9/tasks.yml diff --git a/lessons/homework/ostrava10/index.md b/lessons/homework/ostrava10/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava10/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +

    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava10/info.yml b/lessons/homework/ostrava10/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava10/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava10/tasks.yml b/lessons/homework/ostrava10/tasks.yml new file mode 100644 index 0000000000..6343928655 --- /dev/null +++ b/lessons/homework/ostrava10/tasks.yml @@ -0,0 +1,13 @@ +# https://pyladies.cz/v1/s012-pyglet/handout/handout.pdf + +tasks: + +- section: + markdown: | + V rámci domácích projektů vylepšíme projekt z hodiny. + +- markdown: | + Uprav projekt z hodiny tak, aby obrázek létal po okně a nikdy jej + neopustil tzn. aby nikdy neuletěl zcela mimo viditelnou plochu. + Obrázek může opisovat nějaký tvar (kružnici, čtverec atp.), odrážet se + od odkrajů nebo se vždy objevit na opačné straně okna. Fantazii se meze nekladou. diff --git a/lessons/homework/ostrava11/index.md b/lessons/homework/ostrava11/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava11/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava11/info.yml b/lessons/homework/ostrava11/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava11/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava11/tasks.yml b/lessons/homework/ostrava11/tasks.yml new file mode 100644 index 0000000000..a9397081ca --- /dev/null +++ b/lessons/homework/ostrava11/tasks.yml @@ -0,0 +1,6 @@ +tasks: + +- markdown: | + Vytvoř třidu _Ctverec_ s jedním atributem _strana_ a metodami _obvod()_, _obsah()_ + a *rozdil_obsahu(jiny_ctverec)*, která vrátí rozdíl obsahů dvou + čtverců - zadaného a toho jehož metodu voláme. diff --git a/lessons/homework/ostrava12/index.md b/lessons/homework/ostrava12/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava12/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava12/info.yml b/lessons/homework/ostrava12/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava12/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava12/tasks.yml b/lessons/homework/ostrava12/tasks.yml new file mode 100644 index 0000000000..1619c2e9e9 --- /dev/null +++ b/lessons/homework/ostrava12/tasks.yml @@ -0,0 +1,20 @@ +tasks: + +- section: + markdown: | + Dnes rozšíříme minulý domácí projekt o dědičnost. + +- markdown: | + Vytvoř třídu _Kruh_ s atributem _polomer_ a stejnými metodami _obvod()_ + a _obsah()_ jako měla minule třída _Ctverec_. + +- markdown: | + Vytvoř třídu _Obdelnik_ s atributy pro délky stran a opět stejnými metodami _obvod()_ + a _obsah()_ jako měla minule třída _Ctverec_. + +- markdown: | + Zkus použít dědičnost tak, aby třídy _Ctverec_, _Kruh_ i _Obdelnik_ mohly používat + společnou metodu *rozdil_obsahu(jiny_objekt)* a aby tato metoda fungovala i mezi + objekty různých tříd. + + *Takže bude například možné zjistit rozdíl obsahu čtverce a kruhu* diff --git a/lessons/homework/ostrava8/index.md b/lessons/homework/ostrava8/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava8/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava8/info.yml b/lessons/homework/ostrava8/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava8/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava8/tasks.yml b/lessons/homework/ostrava8/tasks.yml new file mode 100644 index 0000000000..d7cb43cd5b --- /dev/null +++ b/lessons/homework/ostrava8/tasks.yml @@ -0,0 +1,72 @@ +# https://pyladies.cz/v1/s011-dicts/handout/handout9.pdf + +tasks: + +- section: + markdown: | + Těchto pár úkolů slouží k procvičení práce se slovníky, které se následně + pokusíš využít při programování známé skautské hry. + +- markdown: | + Napiš funkci, která pro argumentem zadané číslo `n` vytvoří a vrátí slovník, + kde jako klíče budou čísla od jedné do `n` a jako hodnoty k nim + jejich druhé mocniny. Například: + + ```pycon + >>> mocniny(4) + {1: 1, 2: 4, 3: 9, 4: 16} + ``` + + mandatory: true + +- markdown: | + Napiš funkci, která sečte a vrátí sumu všech klíčů a sumu všech hodnot + ve slovníku, který dostane jako argument. K vyzkoušení můžeš použít + slovník z minulé úlohy. Například: + + ```pycon + >>> soucet_klicu_a_hodnot(mocniny(4)) + (10, 30) + ``` + +- markdown: | + Napiš funkci, která jako argument dostane řetězec a vrátí slovník, + ve kterém budou jako klíče jednotlivé znaky ze zadaného řetězce a jako + hodnoty počty výskytů těchto znaků v řetězci. Například: + + ```pycon + >>> pocet_znaku("hello world") + {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1} + ``` + +- markdown: | + Napiš funkci, která vypíše obsah slovníku (klíče a k nim náležící + hodnoty) na jednotlivé řádky. + + Funkci, která něco vypisuje, je vhodné + pojmenovat speciálně, zde třeba `vypis_slovnik`, aby bylo jasné, + že jen vypisuje a nic nevrací. Například: + + ```pycon + >>> vypis_slovnik(mocniny(4)) + Klíč 1, hodnota 1 + Klíč 2, hodnota 4 + Klíč 3, hodnota 9 + Klíč 4, hodnota 16 + ``` + + mandatory: true + +- section: + markdown: | + A teď už ke slíbené hře. + +- markdown: | + Úkolem je vytvořit známou skautskou hru „Kdo? S kým? Co dělali?“. Hra se + hráče zeptá postupně na různé otázky, například „Kdo?“, „S kým?“, + „Co dělali?“, „Kde?“, „Kdy?“, a nakonec „Proč?“, s tím, že mu umožní + na jednu otázku odpovědět vícekrát a všechny odpovědi si uloží. + Na závěr pak hra z každé sady odpovědí vybere náhodně jednu odpověď + a z takto vybraných odpovědí složí větu, kterou vypíše uživateli. + Seznam otázek by mělo být možné změnit v kódu na jednom místě bez zásahu + do logiky programu. diff --git a/lessons/homework/ostrava9/index.md b/lessons/homework/ostrava9/index.md new file mode 100644 index 0000000000..cceac3fdda --- /dev/null +++ b/lessons/homework/ostrava9/index.md @@ -0,0 +1,23 @@ +{# Global "index" variable for page-wide numbering of tasks #} +{# (In Jinja we need to store the variable in a "namespace") #} +{% set global = {'index': 0} %} + +
    +{% for task in data.tasks %} + {% if 'section' in task %} +
+ {% if global.index %}
{% endif -%} + {% if 'markdown' in task.section -%} +
+ {{ task.section.markdown | markdown }} +
+ {% endif %} +
    + {% else %} +
  1. + {{ task.markdown | markdown }} +
  2. + {% set _ = global.update(index = global.index + 1) %} + {% endif %} +{% endfor %} +
diff --git a/lessons/homework/ostrava9/info.yml b/lessons/homework/ostrava9/info.yml new file mode 100644 index 0000000000..1240877468 --- /dev/null +++ b/lessons/homework/ostrava9/info.yml @@ -0,0 +1,7 @@ +title: Domácí projekty +style: md +data: tasks.yml +attribution: Pro PyLadies CZ napsal Petr Viktorin a další, 2014-2019. +license: cc-by-sa-40 +css: | + .group-heading {font-style: italic; font-size: 80%; } diff --git a/lessons/homework/ostrava9/tasks.yml b/lessons/homework/ostrava9/tasks.yml new file mode 100644 index 0000000000..75b773b272 --- /dev/null +++ b/lessons/homework/ostrava9/tasks.yml @@ -0,0 +1,44 @@ +# https://pyladies.cz/v1/s005-modules/handout/handout5b-ostrava.pdf +# https://pyladies.cz/v1/s005-modules/handout/handout5c-ostrava.pdf + +tasks: + +- section: + markdown: | + Nejdříve rozdělíme hotové 1D piškvorky do samostatných modulů a vylepšíme je. + +- markdown: | + Rozděl 1D Piškvorky na tři moduly: + + * _ai.py_, kde bude funkce *tah_pocitace*, + * _piskvorky.py_, kde budou ostatní funkce, + * _hra.py_, kde bude import a volání hlavní funkce z _piskvorky.py_ (a nic jiného). + +- markdown: | + Doplň funkci *tah_pocitace* tak, aby brala jako argument symbol, za který + má počítač hrát – buď 'x',nebo 'o'. Ověř, že se funkce *tah_pocitace* umí + vyrovnat s jinou délkou hracího pole než 20. Ověř si,že se *tah_pocitace* + chová rozumně když dostane plné hrací pole, nebo pole s délkou 0. + + _Rozumné chování v tomto případě znamená vyvolání rozumné výjimky._ + +- section: + markdown: | + Teď přijde řada na testování. + +- markdown: | + Z bonusového domácího projektu po páté lekci si stáhni modul *test_piskvorky.py* + a uprav své piškvorky tak, aby všechny testy procházely. + +- markdown: | + Dopiš do každé z testovacích funkcí alespoň dva testy. + +- markdown: | + Ověř, že se funkce *tah_pocitace* umí vyrovnat s jinou délkou hracího pole než 20. + + _„Ověření” znamená napsání příslušného testu._ + +- markdown: | + Ověř si, že se *tah_pocitace* chová rozumně když dostane plné hrací pole, nebo pole s délkou 0. + + _Rozumné chování v tomto případě znamená vyvolání rozumné výjimky._ diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index c284ebc02b..180c26c006 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -171,9 +171,8 @@ plan: - title: Slovníkový tahák url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf type: cheatsheet - - title: Domácí projekty (PDF) + - lesson: homework/ostrava8 type: homework - url: https://pyladies.cz/v1/s011-dicts/handout/handout9.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/oJ3pgen7AmDea0lBfPog @@ -186,14 +185,10 @@ plan: - lesson: beginners/circular-imports title: Poznámka o importování type: lesson - - title: Domácí projekty k modulům (PDF) - url: http://pyladies.cz/v1/s005-modules/handout/handout5b-ostrava.pdf - type: homework - lesson: beginners/testing type: lesson - - title: Domácí projekty k testování (PDF) + - lesson: homework/ostrava9 type: homework - url: http://pyladies.cz/v1/s005-modules/handout/handout5c-ostrava.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/xApsz9zKYxknLpJf8Qml @@ -210,9 +205,8 @@ plan: - title: Tahák na Pyglet url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf type: cheatsheet - - title: Domácí projekty (PDF) + - lesson: homework/ostrava10 type: homework - url: https://pyladies.cz/v1/s012-pyglet/handout/handout.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/3e5TNn6NBlfI7SD5GFrW @@ -224,9 +218,8 @@ plan: type: lesson - lesson: beginners/inheritance type: lesson - - title: Domácí projekty (PDF) + - lesson: homework/ostrava11 type: homework - url: https://pyladies.cz/v1/s014-class/handout/handout.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/SOtp5ITHEPscn0MqzEM5 @@ -236,9 +229,8 @@ plan: materials: - lesson: beginners/inheritance type: lesson - - title: Domácí projekty (PDF) + - lesson: homework/ostrava12 type: homework - url: https://pyladies.cz/v1/s014-class/handout/handout.pdf - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/AqCwMoyF9FuyI6Sinwu0 From e4c058db37158c20ea30adffcda32ece38c83653 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 26 Mar 2019 11:06:57 +0100 Subject: [PATCH 20/37] Ostrava: Feedback homeworks --- lessons/feedback/ostrava7/index.ipynb | 1233 +++++++++++++++++ lessons/feedback/ostrava7/info.yml | 4 + lessons/feedback/ostrava7/static/basnicka.txt | 11 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 4 files changed, 1250 insertions(+) create mode 100644 lessons/feedback/ostrava7/index.ipynb create mode 100644 lessons/feedback/ostrava7/info.yml create mode 100644 lessons/feedback/ostrava7/static/basnicka.txt diff --git a/lessons/feedback/ostrava7/index.ipynb b/lessons/feedback/ostrava7/index.ipynb new file mode 100644 index 0000000000..7ca44bda73 --- /dev/null +++ b/lessons/feedback/ostrava7/index.ipynb @@ -0,0 +1,1233 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Zvířátka" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Najdi chyby, nejasnosti či nepřesnosti v tomto kódu:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "zvirata = [ \"pes\", \"kočka\", \"králík\", \"had\", \"ježek\"]\n", + "znak = \"k\"\n", + "\n", + "def pismeno(jmeno):\n", + " for i in range(5):\n", + " if znak in jmeno[i][0]:\n", + " print(jmeno[i])\n", + " return\n", + "\n", + "pismeno(zvirata)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Takto by to mohlo vypadat přehlednější a pochopitelnější" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "zvirata = [ \"pes\", \"kočka\", \"králík\", \"had\", \"ježek\"]\n", + "\n", + "def s_prvnim_pismenem(seznam_zvirat, pismeno):\n", + " for zvire in seznam_zvirat:\n", + " if zvire.startswith(pismeno):\n", + " print(zvire)\n", + "\n", + "s_prvnim_pismenem(zvirata, 'k')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Další podobná funkce:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def kratke(jmeno = zvirata):\n", + " for i in range(len(jmeno)):\n", + " if len(jmeno[i]) < 5:\n", + " print(jmeno[i])\n", + " else:\n", + " print(end = \"\")\n", + " return jmeno\n", + "\n", + "kratke(zvirata)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "A její přehlednější varianta:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def kratke(seznam_zvirat):\n", + " for jmeno in seznam_zvirat:\n", + " if len(jmeno) < 5:\n", + " print(jmeno)\n", + "\n", + "kratke(zvirata)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Je možné tuto funkci zkrátit a zjednodušit?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def overeni(seznam):\n", + " \"ověří, zda je zadané slovo v seznamu a vrátí True/False\"\n", + " otazka = input(\"Zadej název zvířete, jež chceš ověřit: \")\n", + " if otazka in seznam:\n", + " return True\n", + " else:\n", + " return False" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Ano, je to možné" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def overeni(seznam):\n", + " \"ověří, zda je zadané slovo v seznamu a vrátí True/False\"\n", + " otazka = input(\"Zadej název zvířete, jež chceš ověřit: \")\n", + " return otazka in seznam" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Básnička" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Obrácené pořadí veršů" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Anyway the wind blows doesn't really matter to me, to me.\n", + "Little high, little low,\n", + "Because I'm easy come, easy go,\n", + "I'm just a poor boy, I need no sympathy,\n", + "Look up to the skies and see,\n", + "Open your eyes,\n", + "\n", + "No escape from reality.\n", + "Caught in a landslide,\n", + "Is this just fantasy?\n", + "Is this the real life?\n" + ] + } + ], + "source": [ + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " basnicka = soubor_s_bacnickou.read()\n", + "\n", + "seznam_versu = basnicka.split(\"\\n\") # Rozdělí básničku na jednotlivé verše (řádky) [seznam]\n", + "seznam_versu.reverse() # Obrátí pořadí veršů v seznamu\n", + "obracena_basnicka = \"\\n\".join(seznam_versu) # Složí zpět seznam na řetězec a mezi verše vloží \\n\n", + "print(obracena_basnicka)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Anyway the wind blows doesn't really matter to me, to me.\n", + "Little high, little low,\n", + "Because I'm easy come, easy go,\n", + "I'm just a poor boy, I need no sympathy,\n", + "Look up to the skies and see,\n", + "Open your eyes,\n", + "\n", + "No escape from reality.\n", + "Caught in a landslide,\n", + "Is this just fantasy?\n", + "Is this the real life?\n" + ] + } + ], + "source": [ + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " seznam_versu = soubor_s_bacnickou.readlines()\n", + "\n", + "for vers in seznam_versu[::-1]:\n", + " print(vers, end=\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Obrácené pořadí slov ve verších" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "life? real the this Is\n", + "fantasy? just this Is\n", + "landslide, a in Caught\n", + "reality. from escape No\n", + "\n", + "eyes, your Open\n", + "see, and skies the to up Look\n", + "sympathy, no need I boy, poor a just I'm\n", + "go, easy come, easy I'm Because\n", + "low, little high, Little\n", + "me. to me, to matter really doesn't blows wind the Anyway\n", + "\n" + ] + } + ], + "source": [ + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " basnicka = soubor_s_bacnickou.read()\n", + "\n", + "seznam_versu = basnicka.split(\"\\n\") # Rozdělí básničku na jednotlivé verše (řádky) [seznam]\n", + "\n", + "nova_basnicka = [] # Seznam pro novou básničku, která obrácením pořadí slov vznikne\n", + "\n", + "for vers in seznam_versu: # Pro každý verš v originální básničce\n", + " slova = vers.split() # Rozdělí verš na slova [seznam]\n", + " slova.reverse() # Obrátí pořádí slov\n", + " novy_vers = \" \".join(slova) # Spojí obrázená slova zpět do řetězce\n", + " nova_basnicka.append(novy_vers) # Přidá nový verš do nové básničky\n", + "\n", + "obracena_basnicka = \"\\n\".join(nova_basnicka) # Složí zpět seznam na řetězec a mezi verše vloží \\n\n", + "print(obracena_basnicka)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "life? real the this Is\n", + "fantasy? just this Is\n", + "landslide, a in Caught\n", + "reality. from escape No\n", + "\n", + "eyes, your Open\n", + "see, and skies the to up Look\n", + "sympathy, no need I boy, poor a just I'm\n", + "go, easy come, easy I'm Because\n", + "low, little high, Little\n", + "me. to me, to matter really doesn't blows wind the Anyway\n" + ] + } + ], + "source": [ + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " seznam_versu = soubor_s_bacnickou.readlines()\n", + "\n", + "for i, vers in enumerate(seznam_versu):\n", + " slova = vers.split()\n", + " slova.reverse()\n", + " seznam_versu[i] = \" \".join(slova)\n", + "\n", + "print(\"\\n\".join(seznam_versu))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Obrácené pořadí slok" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Open your eyes,\n", + "Look up to the skies and see,\n", + "I'm just a poor boy, I need no sympathy,\n", + "Because I'm easy come, easy go,\n", + "Little high, little low,\n", + "Anyway the wind blows doesn't really matter to me, to me.\n", + "\n", + "Is this the real life?\n", + "Is this just fantasy?\n", + "Caught in a landslide,\n", + "No escape from reality.\n" + ] + } + ], + "source": [ + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " basnicka = soubor_s_bacnickou.read()\n", + "\n", + "seznam_slok = basnicka.split(\"\\n\\n\") # Rozdělí básničku na jednotlivé sloky [seznam]\n", + "seznam_slok.reverse()\n", + "basnicka = \"\\n\".join(seznam_slok)\n", + "print(basnicka)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Slova v náhodném pořadí (Mr. Yoda style)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "life? this Is real the\n", + "Is this just fantasy?\n", + "Caught in a landslide,\n", + "reality. from escape No\n", + "\n", + "your eyes, Open\n", + "up see, and to Look skies the\n", + "just sympathy, I poor no need a I'm boy,\n", + "I'm come, easy easy go, Because\n", + "Little little high, low,\n", + "me. to blows the matter me, really wind to doesn't Anyway\n" + ] + } + ], + "source": [ + "from random import shuffle\n", + "\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", + " seznam_versu = soubor_s_bacnickou.readlines()\n", + "\n", + "for i, vers in enumerate(seznam_versu):\n", + " slova = vers.split()\n", + " shuffle(slova)\n", + " seznam_versu[i] = \" \".join(slova)\n", + "\n", + "print(\"\\n\".join(seznam_versu))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Funkce jako stavební blok programu" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Takto použitá funkce situaci spíše komplikuje, než aby něčemu pomohla." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['had', 'pes', 'andulka', 'kočka', 'králík']\n" + ] + } + ], + "source": [ + "zvirata = ['had', 'andulka', 'pes', 'kočka', 'králík']\n", + "dvojice = []\n", + "vysledek = []\n", + "\n", + "def razeni_had(seznam1, seznam2, seznam3):\n", + " '''seřadí výchozí seznam1 podle abecedy, ale bude ignorovat první písmeno'''\n", + " for slovo in seznam1:\n", + " seznam2.append([slovo[1:], slovo])\n", + " seznam2.sort()\n", + " for item in seznam2:\n", + " seznam3.append(item[1])\n", + " seznam3\n", + "\n", + "razeni_had(zvirata, dvojice, vysledek)\n", + "print(vysledek)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Co se asi stane, když takovou funkci zavoláme vícekrát?" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['had', 'pes', 'andulka', 'kočka', 'králík']\n", + "['had', 'pes', 'andulka', 'kočka', 'králík', 'had', 'had', 'pes', 'pes', 'andulka', 'andulka', 'kočka', 'kočka', 'králík', 'králík']\n" + ] + } + ], + "source": [ + "zvirata = ['had', 'andulka', 'pes', 'kočka', 'králík']\n", + "dvojice = []\n", + "vysledek = []\n", + "\n", + "def razeni_had(seznam1, seznam2, seznam3):\n", + " '''seřadí výchozí seznam1 podle abecedy, ale bude ignorovat první písmeno'''\n", + " for slovo in seznam1:\n", + " seznam2.append([slovo[1:], slovo])\n", + " seznam2.sort()\n", + " for item in seznam2:\n", + " seznam3.append(item[1])\n", + " seznam3\n", + "\n", + "razeni_had(zvirata, dvojice, vysledek)\n", + "print(vysledek)\n", + "razeni_had(zvirata, dvojice, vysledek)\n", + "print(vysledek)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Ověření, že funkce funguje" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nejsnazší je funkci prostě spustit s různými argumenty a podívat se, zda dělá to, co by dělat měla." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def absolutni_soucet(a, b):\n", + " if a < 0:\n", + " a = -a\n", + " if b < 0:\n", + " b = -b\n", + " return a + b" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "300\n", + "3\n", + "3\n", + "102\n" + ] + } + ], + "source": [ + "print(absolutni_soucet(1, 2))\n", + "print(absolutni_soucet(100, 200))\n", + "print(absolutni_soucet(-1, -2))\n", + "print(absolutni_soucet(-1, 2))\n", + "print(absolutni_soucet(100, -2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## List comprehensions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jedná se o zápis s Pythonu s jehož pomocí se dají jednoduše vytvářet seznamy." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam_mocnin = []\n", + "\n", + "for x in range(10):\n", + " seznam_mocnin.append(x ** 2)\n", + "\n", + "seznam_mocnin" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x for x in range(10)]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x**2 for x in range(10)]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 4, 16, 36, 64]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[x**2 for x in range(10) if x % 2 == 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, 0),\n", + " (1, 1),\n", + " (2, 4),\n", + " (3, 9),\n", + " (4, 16),\n", + " (5, 25),\n", + " (6, 36),\n", + " (7, 49),\n", + " (8, 64),\n", + " (9, 81)]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(x, x**2) for x in range(10)]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2]]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[[y for y in range(3)] for x in range(10)]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Tabulka s hracím polem" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Řešení 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_tabulku():\n", + " zap_tabulka = []\n", + "\n", + " for rada_x in '.', '.', '.', '.', '.', '.', '.', '.', '.', '.':\n", + " radek = []\n", + " for rada_y in '.', '.', '.', '.', '.', '.', '.', '.', '.', '.':\n", + " radek.append(rada_y)\n", + " zap_tabulka.append(radek)\n", + " return zap_tabulka" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Řešení 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_prazdne_herni_pole(r,s):\n", + " seznam_radku = []\n", + " for a in range(r):\n", + " radek = [\".\"]\n", + " for b in range(s-1):\n", + " radek.append(\".\")\n", + " seznam_radku.append(radek)\n", + " return seznam_radku" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Správné řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_tabulku(velikost):\n", + " seznam_radku = []\n", + " for a in range(velikost):\n", + " radek = []\n", + " for b in range(velikost):\n", + " radek.append(\".\")\n", + " seznam_radku.append(radek)\n", + " return seznam_radku" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Správné a krátké řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_tabulku(velikost):\n", + " seznam_radku = []\n", + " for a in range(velikost):\n", + " radek = [\".\"] * velikost\n", + " seznam_radku.append(radek)\n", + " return seznam_radku" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Krátké řešení (s pomocí list comprehensions)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_tabulku(velikost):\n", + " tabulka = []\n", + " for x in range(velikost):\n", + " radek = ['.' for x in range(velikost)]\n", + " tabulka.append(radek)\n", + " return tabulka" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Nejkratší řešení (je nejlepší?)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vytvor_tabulku(velikost):\n", + " return [list('.' * velikost) for x in range(velikost)]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Je vytvoření kompletní tabulky se všemi hracími políčky vážně potřeba?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Had" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def velikost_hraciho_pole():\n", + " \"\"\"Zjistí od uživatele rozumnou velikost herního pole\"\"\"\n", + " while True:\n", + " odpoved = input('Zadej velikost pole pro hada: ')\n", + " try:\n", + " velikost = int(odpoved)\n", + " except ValueError:\n", + " print('Velikost musí být celé číslo')\n", + " else:\n", + " if velikost > 5:\n", + " break\n", + " else:\n", + " print('Pole musí být rozumně veliké!')\n", + "\n", + " return velikost" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def vykresli_mapu(velikost, had, ovoce):\n", + " \"\"\"Vykreslí herní mapu s ovocem a hadem na správných místech\"\"\"\n", + " for x in range(velikost):\n", + " for y in range(velikost):\n", + " if (x, y) in had:\n", + " print('X', end=' ')\n", + " elif (x, y) in ovoce:\n", + " print('?', end=' ')\n", + " else:\n", + " print('.', end=' ')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def posun(velikost, had, ovoce):\n", + " \"\"\"Posune hada v určitém směru a zajistí jeho prodloužení při snězení jídla\"\"\"\n", + " while True:\n", + " smer = input('Zadej smer posunu [s, j, v, z]: ')\n", + " smer = smer.lower().strip()\n", + " if smer not in ('s', 'j', 'v', 'z'):\n", + " print('Nekorektni smer!')\n", + " else:\n", + " break\n", + "\n", + " hlava = had[-1]\n", + " x, y = hlava\n", + " if smer == 's':\n", + " nova_hlava = x-1, y\n", + " elif smer == 'j':\n", + " nova_hlava = x+1, y\n", + " elif smer == 'v':\n", + " nova_hlava = x, y+1\n", + " elif smer == 'z':\n", + " nova_hlava = x, y-1\n", + "\n", + " if nova_hlava in had:\n", + " raise ValueError('GAME OVER! Narazil si sam do sebe')\n", + "\n", + " x, y = nova_hlava\n", + "\n", + " if x < 0 or x > velikost-1 or y < 0 or y > velikost-1:\n", + " raise ValueError('GAME OVER! Vyjel si mimo herni pole')\n", + "\n", + " if nova_hlava in ovoce:\n", + " ovoce.remove(nova_hlava)\n", + " else:\n", + " del had[0]\n", + "\n", + " had.append(nova_hlava)\n", + " return True" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "from random import randrange\n", + "\n", + "def pridej_ovoce(velikost, had, ovoce):\n", + " \"\"\"Přidá další ovoce na herní plochu mimo souřadnice hada\"\"\"\n", + " ovoce.append((randrange(0, velikost), randrange(0, velikost)))\n", + " while ovoce[-1] in had:\n", + " del ovoce[-1]\n", + " ovoce.append((randrange(0, velikost), randrange(0, velikost)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def hra():\n", + " \"\"\"Hlavní části hry spojeny ve finální celek\"\"\"\n", + " velikost = velikost_hraciho_pole()\n", + "\n", + " had = [(0, 0), (0, 1), (0, 2)]\n", + " ovoce = []\n", + " pridej_ovoce(velikost, had, ovoce)\n", + "\n", + " vykresli_mapu(velikost, had, ovoce)\n", + "\n", + " while posun(velikost, had, ovoce):\n", + " vykresli_mapu(velikost, had, ovoce)\n", + " if not ovoce:\n", + " pridej_ovoce(velikost, had, ovoce)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "hra()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Rubber duck problem solving" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Gumová kačenka](https://raw.githubusercontent.com/RubberDuckDebugging/rubberduckdebugging.github.io/master/images/rubberducky.png)\n", + "\n", + "[rubberduckdebugging.com](https://rubberduckdebugging.com/)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "Jde o techniku řešení problému, při které se svůj problém snažíte vysvětlit někomu (nebo v případě gumové kachny něčemu), kdo programování nemusí vůbec rozumět. Když řešenou problematiku a vaše současné řešení popisujete nahlas, uvědomíte si, co váš program aktuálně dělá a co by dělat měl, což zpravidla vede k vyřešení problému." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné rady a poznatky" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Snažte se!!!" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava7/info.yml b/lessons/feedback/ostrava7/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava7/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/lessons/feedback/ostrava7/static/basnicka.txt b/lessons/feedback/ostrava7/static/basnicka.txt new file mode 100644 index 0000000000..360f7d0fbc --- /dev/null +++ b/lessons/feedback/ostrava7/static/basnicka.txt @@ -0,0 +1,11 @@ +Is this the real life? +Is this just fantasy? +Caught in a landslide, +No escape from reality. + +Open your eyes, +Look up to the skies and see, +I'm just a poor boy, I need no sympathy, +Because I'm easy come, easy go, +Little high, little low, +Anyway the wind blows doesn't really matter to me, to me. diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index 180c26c006..1af8aa7c57 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -157,6 +157,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/U1mnwyGK9KimfVummSEZ + - lesson: feedback/ostrava7 + type: lesson - title: Slovníky slug: dict date: 2019-03-26 From 69e636f379c1e7fb1f558622d8da05b05b5b42b5 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Tue, 26 Mar 2019 18:07:21 +0100 Subject: [PATCH 21/37] typo materils olsanka --- runs/2019/pyladies-praha-jaro-cznic/info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runs/2019/pyladies-praha-jaro-cznic/info.yml b/runs/2019/pyladies-praha-jaro-cznic/info.yml index 19b460c73f..de352f86c4 100644 --- a/runs/2019/pyladies-praha-jaro-cznic/info.yml +++ b/runs/2019/pyladies-praha-jaro-cznic/info.yml @@ -56,7 +56,7 @@ plan: bonus: true - base: loops date: 2019-03-19 - materils: + materials: - lesson: beginners/functions type: lesson - lesson: intro/turtle From 91829ee28d01ebd0dbaa0cde43796f18cfcbd6ba Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 2 Apr 2019 10:47:34 +0200 Subject: [PATCH 22/37] Ostrava: Feedback for homeworks --- lessons/feedback/ostrava8/index.ipynb | 1055 ++++++++++++++++++++++ lessons/feedback/ostrava8/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 3 files changed, 1061 insertions(+) create mode 100644 lessons/feedback/ostrava8/index.ipynb create mode 100644 lessons/feedback/ostrava8/info.yml diff --git a/lessons/feedback/ostrava8/index.ipynb b/lessons/feedback/ostrava8/index.ipynb new file mode 100644 index 0000000000..13b22a7591 --- /dev/null +++ b/lessons/feedback/ostrava8/index.ipynb @@ -0,0 +1,1055 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Globální proměnné nebrat" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "V tomto příkladu sice máme funkce, ale ty nejsou příliš užitečné, protože ke svému fungování potřebují množství globálních proměnných." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Vytvoření prázdného slovníku\n", + "slovnik_mocniny = dict()\n", + "slovnik_klicu_a_hodnot = dict()\n", + "\n", + "#Uživatel zadá číslo n, n+1 zajistí, že se později vypíše číslo přesně do výše,\n", + "#jakou uživatel zadal\n", + "n = int(input('Zadej číslo, program vypočítá druhé mocniny od 1 až po toto číslo: '))\n", + "n = n+1\n", + "\n", + "#Funkce k úkolu č. 0 - vypíše mocniny až do čísla daného uživatelem\n", + "def mocniny():\n", + " for x in range(1,n):\n", + " slovnik_mocniny[x]=x**2\n", + " return(slovnik_mocniny)\n", + "\n", + "#Funkce k úkolu č. 1 - sečte klíče a hodnoty ve slovníku mocniny, přidá je do\n", + "#slovníku soucet_klicu_a_hodnot\n", + "def soucet_klicu_a_hodnot():\n", + " soucet_klicu = sum(slovnik_mocniny.keys())\n", + " soucet_hodnot = sum(slovnik_mocniny.values())\n", + " slovnik_klicu_a_hodnot = {soucet_klicu, soucet_hodnot}\n", + " return slovnik_klicu_a_hodnot" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Mnohem lepší přístup:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mocniny(n):\n", + " \"\"\" Vytvori slovnik mocnin o velikosti n \"\"\"\n", + " slovnik = {}\n", + " for j in range(1, n+1):\n", + " slovnik[(j)] = j**2\n", + " return slovnik\n", + "\n", + "\n", + "def soucet_klicu_a_hodnot(slovnik):\n", + " \"\"\" vrati soucty vsech klicu a vsech hodnot\"\"\"\n", + " return sum(slovnik.keys()), sum(slovnik.values())\n", + "\n", + "\n", + "def vypis_slovnik(slovnik):\n", + " \"\"\" vypise obsah slovniku \"\"\"\n", + " for objekt in slovnik:\n", + " print(\"Klic \", objekt, \", hodnota \", slovnik[objekt], sep='')\n", + "\n", + "\n", + "print(mocniny(4))\n", + "print(soucet_klicu_a_hodnot(mocniny(4)))\n", + "print(pocet_znaku(\"hello world\"))\n", + "vypis_slovnik(mocniny(4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Skautská hra" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "while True:\n", + " odpoved = input('Na kolik odpovědí chceš hrát? ')\n", + " try:\n", + " odpoved = int(odpoved)\n", + " break\n", + " except ValueError:\n", + " print('Musíš napsat celé číslo!')\n", + "\n", + "kdo = []\n", + "s_kym = []\n", + "co_delali = []\n", + "kde = []\n", + "kdy = []\n", + "proc = []\n", + "\n", + "vsechno = [kdo,s_kym,co_delali,kde,kdy,proc]\n", + "\n", + "for i in range (odpoved):\n", + " kdo1 = input ('Kdo? ')\n", + " s_kym1 = input ('S kým? ')\n", + " co_delali1 = input ('Co dělali? ')\n", + " kde1 = input ('Kde? ')\n", + " kdy1 = input ('Kdy? ')\n", + " proc1 = input ('Proč? ')\n", + " print('')\n", + "\n", + " kdo.append(kdo1)\n", + " s_kym.append(s_kym1)\n", + " co_delali.append(co_delali1)\n", + " kde.append(kde1)\n", + " kdy.append(kdy1)\n", + " proc.append(proc1)\n", + "\n", + "a=random.choice(kdo)\n", + "b=random.choice(s_kym)\n", + "c=random.choice(co_delali)\n", + "d=random.choice(kde)\n", + "e=random.choice(kdy)\n", + "f=random.choice(proc)\n", + "\n", + "print(a, b, c, d, e, f)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Řešení bez slovníků, ale hlavně takové, kde by nebylo úplně snadné přidat další otázky." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "import random\n", + "\n", + "kdo_seznam = []\n", + "s_kym_seznam = []\n", + "kde_seznam = []\n", + "co_delali_seznam = []\n", + "proc_seznam = []\n", + "for pocet in range(3):\n", + " kdo = input('Kdo? ')\n", + " kdo_seznam.append(kdo)\n", + " s_kym = input('S kým? ')\n", + " s_kym_seznam.append(s_kym)\n", + " kde = input('Kde? ')\n", + " kde_seznam.append(kde)\n", + " co_delali = input('Co dělali? ')\n", + " co_delali_seznam.append(co_delali)\n", + " proc = input('Proč? ')\n", + " proc_seznam.append(proc)\n", + "print(random.choice(kdo_seznam), 's', random.choice(s_kym_seznam),'v', random.choice(kde_seznam), random.choice(co_delali_seznam), random.choice(proc_seznam))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Řešení, kde přidání, změna či odebrání jakékoli otázky znamená jen změnu na jednom míste v seznamu otázek." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "from random import choice\n", + "\n", + "otazky = ['Kdo', 'S kym', 'Co delali', 'Kde']\n", + "\n", + "odpovedi = {}\n", + "for otazka in otazky:\n", + " odpovedi[otazka] = []\n", + "\n", + "# Alternativní cesta\n", + "# odpovedi = {otazka: [] for otazka in otazky}\n", + " \n", + "for otazka in otazky:\n", + " while True:\n", + " odpoved = input('Zadej odpoved na otazku {}? '.format(otazka))\n", + " if not odpoved:\n", + " break\n", + " else:\n", + " odpovedi[otazka].append(odpoved)\n", + "\n", + "veta = ''\n", + "\n", + "for otazka in otazky:\n", + " veta = veta + choice(odpovedi[otazka]) + ' '\n", + "\n", + "print(veta)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Seznam sám v sobě" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, 5]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam = [5] * 6\n", + "seznam" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, [...]]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5] = seznam\n", + "seznam" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, [...]]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, [...]]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5][5][5][5]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, [...]]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[5, 5, 5, 5, 5, [...]]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Ukázky jednoduchých API" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import requests" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Ano nebo ne?" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'answer': 'yes',\n", + " 'forced': False,\n", + " 'image': 'https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response = requests.get(\"https://yesno.wtf/api\")\n", + "\n", + "response.raise_for_status()\n", + "\n", + "data = response.json()\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'yes'" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"answer\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif'" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"image\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image](https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Náhodná rada do života" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'slip': {'advice': 'A nod is as good as a wink to a blind horse.',\n", + " 'slip_id': '120'}}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response = requests.get(\"https://api.adviceslip.com/advice\")\n", + "\n", + "response.raise_for_status()\n", + "\n", + "data = response.json()\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A nod is as good as a wink to a blind horse.'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"slip\"][\"advice\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Texty písní" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Is this the real life? Is this just fantasy?\n", + "Caught in a landslide, no escape from reality\n", + "Open your eyes, look up to the skies and see\n", + "\n", + "I'm just a poor boy, I need no sympathy\n", + "Because I'm easy come, easy go, little high, little low\n", + "Anyway the wind blows, doesn't really matter to me, to me\n", + "\n", + "Mama, just killed a man\n", + "Put a gun against his head, pulled my trigger, now he's dead\n", + "Mama, life had just begun\n", + "But now I've gone and thrown it all away\n", + "\n", + "Mama, ooh, didn't mean to make you cry\n", + "If I'm not back again this time tomorrow\n", + "Carry on, carry on, as if nothing really matters\n", + "\n", + "Too late, my time has come\n", + "Sends shivers down my spine, body's aching all the time\n", + "Goodbye, everybody, I've got to go\n", + "Gotta leave you all behind and face the truth\n", + "\n", + "Mama, ooh, (Any way the wind blows) I don't wanna die\n", + "I sometimes wish I'd never been born at all\n", + "\n", + "I see a little silhouetto of a man\n", + "Scaramouche, Scaramouche, will you do the Fandango?\n", + "Thunderbolts and lightning, very, very frightening me\n", + "\n", + "Galileo (Galileo), Galileo (Galileo)\n", + "Galileo, Figaro, Magnifico, oh, oh, oh, oh, oh\n", + "\n", + "I'm just a poor boy, nobody loves me\n", + "He's just a poor boy from a poor family\n", + "Spare him his life from this monstrosity\n", + "\n", + "Easy come, easy go, will you let me go?\n", + "Bismillah, no, we will not let you go (Let him go)\n", + "Bismillah, we will not let you go (Let him go)\n", + "Bismillah, we will not let you go (Let me go)\n", + "Never let you go (Let me go)\n", + "Never let you go (Never, never, never let me go, oh, oh, oh)\n", + "No, no, no, no, no, no, no\n", + "\n", + "Oh, mamma mia, mamma mia\n", + "Mamma mia, let me go\n", + "Beelzebub has a devil put aside\n", + "For me, for me, for me\n", + "\n", + "So you think you can stone me and spit in my eye?\n", + "So you think you can love me and leave me to die?\n", + "Oh baby, can't do this to me, baby\n", + "Just gotta get out, just gotta get right out of here\n", + "\n", + "Ooh-ooh-ooh\n", + "Ooh-yeah, ooh-yeah\n", + "\n", + "Nothing really matters, anyone can see\n", + "Nothing really matters, nothing really matters to me\n", + "\n", + "Any way the wind blows\n" + ] + } + ], + "source": [ + "artist = \"Queen\"\n", + "title = \"Bohemian Rhapsody\"\n", + "\n", + "response = requests.get(\"https://api.lyrics.ovh/v1/{}/{}\".format(artist, title))\n", + "\n", + "response.raise_for_status()\n", + "\n", + "data = response.json()\n", + "text = data[\"lyrics\"]\n", + "\n", + "print(text)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Počasí" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'consolidated_weather': [{'id': 4827330616754176,\n", + " 'weather_state_name': 'Light Cloud',\n", + " 'weather_state_abbr': 'lc',\n", + " 'wind_direction_compass': 'NNE',\n", + " 'created': '2019-04-01T15:40:43.519403Z',\n", + " 'applicable_date': '2019-04-01',\n", + " 'min_temp': 6.23,\n", + " 'max_temp': 16.87,\n", + " 'the_temp': 16.0,\n", + " 'wind_speed': 5.624506348275404,\n", + " 'wind_direction': 15.843933712230228,\n", + " 'air_pressure': 1021.44,\n", + " 'humidity': 53,\n", + " 'visibility': 14.091766583154378,\n", + " 'predictability': 70},\n", + " {'id': 5566602449780736,\n", + " 'weather_state_name': 'Light Cloud',\n", + " 'weather_state_abbr': 'lc',\n", + " 'wind_direction_compass': 'SE',\n", + " 'created': '2019-04-01T15:40:46.702324Z',\n", + " 'applicable_date': '2019-04-02',\n", + " 'min_temp': 6.324999999999999,\n", + " 'max_temp': 16.495,\n", + " 'the_temp': 14.040000000000001,\n", + " 'wind_speed': 8.848418440266178,\n", + " 'wind_direction': 141.6650057162162,\n", + " 'air_pressure': 1016.7,\n", + " 'humidity': 51,\n", + " 'visibility': 15.103980255308995,\n", + " 'predictability': 70},\n", + " {'id': 6239291585855488,\n", + " 'weather_state_name': 'Heavy Cloud',\n", + " 'weather_state_abbr': 'hc',\n", + " 'wind_direction_compass': 'SSE',\n", + " 'created': '2019-04-01T15:40:50.333305Z',\n", + " 'applicable_date': '2019-04-03',\n", + " 'min_temp': 8.459999999999999,\n", + " 'max_temp': 18.935,\n", + " 'the_temp': 17.6,\n", + " 'wind_speed': 10.249016933365146,\n", + " 'wind_direction': 152.0369435066321,\n", + " 'air_pressure': 1007.515,\n", + " 'humidity': 56,\n", + " 'visibility': 13.653078521434821,\n", + " 'predictability': 71},\n", + " {'id': 5814165388132352,\n", + " 'weather_state_name': 'Light Cloud',\n", + " 'weather_state_abbr': 'lc',\n", + " 'wind_direction_compass': 'SSE',\n", + " 'created': '2019-04-01T15:40:52.521424Z',\n", + " 'applicable_date': '2019-04-04',\n", + " 'min_temp': 10.945,\n", + " 'max_temp': 16.915,\n", + " 'the_temp': 16.5,\n", + " 'wind_speed': 11.391530074339192,\n", + " 'wind_direction': 160.16280146794102,\n", + " 'air_pressure': 1002.565,\n", + " 'humidity': 55,\n", + " 'visibility': 13.370976000159072,\n", + " 'predictability': 70},\n", + " {'id': 5800497996890112,\n", + " 'weather_state_name': 'Showers',\n", + " 'weather_state_abbr': 's',\n", + " 'wind_direction_compass': 'SE',\n", + " 'created': '2019-04-01T15:40:55.517305Z',\n", + " 'applicable_date': '2019-04-05',\n", + " 'min_temp': 5.91,\n", + " 'max_temp': 10.305,\n", + " 'the_temp': 9.469999999999999,\n", + " 'wind_speed': 6.654490472305734,\n", + " 'wind_direction': 133.01467370354433,\n", + " 'air_pressure': 1005.3655,\n", + " 'humidity': 71,\n", + " 'visibility': 7.865937922532411,\n", + " 'predictability': 73},\n", + " {'id': 5218222536130560,\n", + " 'weather_state_name': 'Heavy Cloud',\n", + " 'weather_state_abbr': 'hc',\n", + " 'wind_direction_compass': 'NNE',\n", + " 'created': '2019-04-01T15:40:58.514664Z',\n", + " 'applicable_date': '2019-04-06',\n", + " 'min_temp': 4.58,\n", + " 'max_temp': 13.9,\n", + " 'the_temp': 6.1,\n", + " 'wind_speed': 2.9785608048993875,\n", + " 'wind_direction': 22.50000000000001,\n", + " 'air_pressure': 1010.0,\n", + " 'humidity': 75,\n", + " 'visibility': 9.997862483098704,\n", + " 'predictability': 71}],\n", + " 'time': '2019-04-01T20:37:07.101346+02:00',\n", + " 'sun_rise': '2019-04-01T06:33:42.385539+02:00',\n", + " 'sun_set': '2019-04-01T19:24:13.588295+02:00',\n", + " 'timezone_name': 'LMT',\n", + " 'parent': {'title': 'Austria',\n", + " 'location_type': 'Country',\n", + " 'woeid': 23424750,\n", + " 'latt_long': '47.696510,13.345770'},\n", + " 'sources': [{'title': 'BBC',\n", + " 'slug': 'bbc',\n", + " 'url': 'http://www.bbc.co.uk/weather/',\n", + " 'crawl_rate': 180},\n", + " {'title': 'Forecast.io',\n", + " 'slug': 'forecast-io',\n", + " 'url': 'http://forecast.io/',\n", + " 'crawl_rate': 480},\n", + " {'title': 'HAMweather',\n", + " 'slug': 'hamweather',\n", + " 'url': 'http://www.hamweather.com/',\n", + " 'crawl_rate': 360},\n", + " {'title': 'Met Office',\n", + " 'slug': 'met-office',\n", + " 'url': 'http://www.metoffice.gov.uk/',\n", + " 'crawl_rate': 180},\n", + " {'title': 'OpenWeatherMap',\n", + " 'slug': 'openweathermap',\n", + " 'url': 'http://openweathermap.org/',\n", + " 'crawl_rate': 360},\n", + " {'title': 'Weather Underground',\n", + " 'slug': 'wunderground',\n", + " 'url': 'https://www.wunderground.com/?apiref=fc30dc3cd224e19b',\n", + " 'crawl_rate': 720},\n", + " {'title': 'World Weather Online',\n", + " 'slug': 'world-weather-online',\n", + " 'url': 'http://www.worldweatheronline.com/',\n", + " 'crawl_rate': 360},\n", + " {'title': 'Yahoo',\n", + " 'slug': 'yahoo',\n", + " 'url': 'http://weather.yahoo.com/',\n", + " 'crawl_rate': 180}],\n", + " 'title': 'Vienna',\n", + " 'location_type': 'City',\n", + " 'woeid': 551801,\n", + " 'latt_long': '48.202541,16.368799',\n", + " 'timezone': 'Europe/Vienna'}" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "location = \"551801\"\n", + "\n", + "response = requests.get(\"https://www.metaweather.com/api/location/{}/\".format(location))\n", + "\n", + "response.raise_for_status()\n", + "\n", + "data = response.json()\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-04-01 6.23 16.87\n", + "2019-04-02 6.32 16.5\n", + "2019-04-03 8.46 18.93\n", + "2019-04-04 10.95 16.91\n", + "2019-04-05 5.91 10.3\n", + "2019-04-06 4.58 13.9\n" + ] + } + ], + "source": [ + "for day in data[\"consolidated_weather\"]:\n", + " print(day[\"applicable_date\"], round(day[\"min_temp\"], 2), round(day[\"max_temp\"], 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Oxford dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'metadata': {'provider': 'Oxford University Press'},\n", + " 'results': [{'id': 'python',\n", + " 'language': 'en',\n", + " 'lexicalEntries': [{'derivatives': [{'id': 'pythonic', 'text': 'pythonic'}],\n", + " 'entries': [{'etymologies': ['late 16th century (in the Greek sense): via Latin from Greek Puthōn, the name of a huge serpent killed by Apollo. The main current sense dates from the mid 19th century'],\n", + " 'grammaticalFeatures': [{'text': 'Singular', 'type': 'Number'}],\n", + " 'homographNumber': '000',\n", + " 'senses': [{'definitions': ['a large heavy-bodied non-venomous snake occurring throughout the Old World tropics, killing prey by constriction and asphyxiation.'],\n", + " 'domains': ['Reptile'],\n", + " 'id': 'm_en_gbus0833540.009',\n", + " 'notes': [{'text': 'Family Pythonidae: genera Python (of Asia and Africa), and Morelia and Aspidites (of Australasia)',\n", + " 'type': 'technicalNote'}],\n", + " 'short_definitions': ['large heavy-bodied non-venomous snake occurring throughout Old World tropics']},\n", + " {'definitions': ['a high-level general-purpose programming language.'],\n", + " 'domains': ['Computing'],\n", + " 'id': 'm_en_gbus0833540.014',\n", + " 'notes': [{'text': 'mass noun', 'type': 'grammaticalNote'}],\n", + " 'short_definitions': ['high-level general-purpose programming language'],\n", + " 'variantForms': [{'text': 'Python'}]}]}],\n", + " 'language': 'en',\n", + " 'lexicalCategory': 'Noun',\n", + " 'pronunciations': [{'audioFile': 'http://audio.oxforddictionaries.com/en/mp3/python_gb_1.mp3',\n", + " 'dialects': ['British English'],\n", + " 'phoneticNotation': 'IPA',\n", + " 'phoneticSpelling': 'ˈpʌɪθ(ə)n'}],\n", + " 'text': 'python'}],\n", + " 'type': 'headword',\n", + " 'word': 'python'}]}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "app_id = '8206c2a3'\n", + "app_key = 'bf9aacede374e4d731fb020edd801642'\n", + "language = 'en'\n", + "word = 'python'\n", + "\n", + "url = \"https://od-api.oxforddictionaries.com:443/api/v1/entries/{}/{}\".format(language, word)\n", + "response = requests.get(url, headers = {'app_id' : app_id, 'app_key' : app_key})\n", + "\n", + "data = response.json()\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'definitions': ['a large heavy-bodied non-venomous snake occurring throughout the Old World tropics, killing prey by constriction and asphyxiation.'],\n", + " 'domains': ['Reptile'],\n", + " 'id': 'm_en_gbus0833540.009',\n", + " 'notes': [{'text': 'Family Pythonidae: genera Python (of Asia and Africa), and Morelia and Aspidites (of Australasia)',\n", + " 'type': 'technicalNote'}],\n", + " 'short_definitions': ['large heavy-bodied non-venomous snake occurring throughout Old World tropics']},\n", + " {'definitions': ['a high-level general-purpose programming language.'],\n", + " 'domains': ['Computing'],\n", + " 'id': 'm_en_gbus0833540.014',\n", + " 'notes': [{'text': 'mass noun', 'type': 'grammaticalNote'}],\n", + " 'short_definitions': ['high-level general-purpose programming language'],\n", + " 'variantForms': [{'text': 'Python'}]}]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"results\"][0][\"lexicalEntries\"][0][\"entries\"][0][\"senses\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné rady a postřehy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "* Ptejte se na Slacku na cokoli. Co bude zajímavé pro více lidí, to zpracujeme do hodiny.\n", + "* Pokud máte úkoly na githubu:\n", + " * Odevzdejte na Dropbox jen odkaz v souboru `.txt` nikoli `.docx`\n", + " * Pokud vám Martin nezaloží issue, je ve vašem úkolu vše v pořádku\n", + "* Pochvala za validaci inputů\n", + " * Ještě větší pochvala za validaci s pomocí výjimek\n", + "* Pochvala za dokumentační řetězce\n", + " * Ještě větší pochvala za dokumentační řetězce ve třech uvozovkách\n", + " * A ještě větší pochvala těm, kdož jsou konzistentní a dávají dokumentační řetězce úplně všude" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava8/info.yml b/lessons/feedback/ostrava8/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava8/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index 1af8aa7c57..d71446a444 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -178,6 +178,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/oJ3pgen7AmDea0lBfPog + - lesson: feedback/ostrava8 + type: lesson - title: Moduly a testování slug: modules-testing date: 2019-04-02 From ecd884425f91a43c3f04b72c582d4597aaf53b3d Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 16 Apr 2019 11:48:20 +0200 Subject: [PATCH 23/37] Remove inheritance from lesson about classes. --- runs/2019/pyladies-ostrava-jaro/info.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index d71446a444..979f2e99ea 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -220,8 +220,6 @@ plan: materials: - lesson: beginners/class type: lesson - - lesson: beginners/inheritance - type: lesson - lesson: homework/ostrava11 type: homework - title: Odevzdání domácích projektů From 6cfcdbe24de2d9c0fdf763e11718d3368cca552a Mon Sep 17 00:00:00 2001 From: David <45515588+nappex@users.noreply.github.com> Date: Fri, 12 Apr 2019 14:25:43 +0200 Subject: [PATCH 24/37] Update index.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zmena nazvu proměnných palka_min a palka_max --- lessons/projects/pong/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lessons/projects/pong/index.md b/lessons/projects/pong/index.md index b945d6ff0f..bb0ab51793 100644 --- a/lessons/projects/pong/index.md +++ b/lessons/projects/pong/index.md @@ -541,8 +541,8 @@ to je mezi horním a dolním koncem pálky: ```python 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 + palka_min_y = pozice_mice[1] - VELIKOST_MICE / 2 - DELKA_PALKY / 2 + palka_max_y = pozice_mice[1] + VELIKOST_MICE / 2 + DELKA_PALKY / 2 ``` Nyní když míček narazí do pravé nebo levé stěny @@ -556,7 +556,7 @@ def obnov_stav(dt): ... # odrazeni vlevo if pozice_mice[0] < TLOUSTKA_PALKY + VELIKOST_MICE / 2: - if palka_min < pozice_palek[0] < palka_max: + if palka_min_y < pozice_palek[0] < palka_max_y: # palka je na spravnem miste, odrazime micek rychlost_mice[0] = abs(rychlost_mice[0]) else: @@ -566,7 +566,7 @@ def obnov_stav(dt): # odrazeni vpravo if pozice_mice[0] > SIRKA - (TLOUSTKA_PALKY + VELIKOST_MICE / 2): - if palka_min < pozice_palek[1] < palka_max: + if palka_min_y < pozice_palek[1] < palka_max_y: rychlost_mice[0] = -abs(rychlost_mice[0]) else: skore[0] += 1 From d7cb6ad743e544a7377999ed9cdb9ea5a7e57605 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 23 Apr 2019 11:58:49 +0200 Subject: [PATCH 25/37] Ostrava: Feedback for homeworks --- lessons/feedback/ostrava11/index.ipynb | 437 + lessons/feedback/ostrava11/index.slides.html | 13893 +++++++++++++++++ lessons/feedback/ostrava11/info.yml | 4 + runs/2019/pyladies-ostrava-jaro/info.yml | 2 + 4 files changed, 14336 insertions(+) create mode 100644 lessons/feedback/ostrava11/index.ipynb create mode 100644 lessons/feedback/ostrava11/index.slides.html create mode 100644 lessons/feedback/ostrava11/info.yml diff --git a/lessons/feedback/ostrava11/index.ipynb b/lessons/feedback/ostrava11/index.ipynb new file mode 100644 index 0000000000..7bbf886372 --- /dev/null +++ b/lessons/feedback/ostrava11/index.ipynb @@ -0,0 +1,437 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 1 - obsah lze vypočítat jen jednou a musí být spočten před počítáním rozdílu" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "class Ctverec:\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + " def obvod(self):\n", + " self.obvod = 4*self.strana\n", + " return self.obvod\n", + " def obsah(self):\n", + " self.obsah = self.strana**2\n", + " return self.obsah\n", + " def rozdil_obsahu(self, jiny_ctverec):\n", + " return self.obsah - jiny_ctverec.obsah" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "25" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c1.obsah()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'int' object is not callable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mc1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable" + ] + } + ], + "source": [ + "c1.obsah()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for -: 'method' and 'method'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for -: 'method' and 'method'" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "c2.rozdil_obsahu(c1)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n", + "100\n", + "75\n" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "print(c1.obsah())\n", + "print(c2.obsah())\n", + "print(c2.rozdil_obsahu(c1))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 2 - nefunguje dokud nemá ty správné globální proměnné" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "class Ctverec:\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + "\n", + " def obvod(self):\n", + " return 4 * self.strana\n", + "\n", + " def obsah(self):\n", + " return self.strana ** 2\n", + "\n", + " def rozdil_obsahu(self, jiny_ctverec):\n", + " return self.obsah() - druhy_ctverec.obsah()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'druhy_ctverec' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mdruhy_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'druhy_ctverec' is not defined" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "c2.rozdil_obsahu(c1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 3 - globální proměnné podruhé" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class Ctverec:\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + "\n", + " def obvod(self):\n", + " obvod = 4 * self.strana\n", + " return obvod\n", + "\n", + " def obsah(self):\n", + " obsah = self.strana * self.strana\n", + " return obsah\n", + "\n", + " def rozdil_obsahu(self):\n", + " rozdil = ctverec1.obsah() - ctverec2.obsah()\n", + " return rozdil" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "rozdil_obsahu() takes 1 positional argument but 2 were given", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: rozdil_obsahu() takes 1 positional argument but 2 were given" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "c2.rozdil_obsahu(c1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 4 - `jiny_ctverec` je vlastně délka strany" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class Ctverec:\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + "\n", + " def obvod(self):\n", + " print(self.strana*4)\n", + "\n", + " def obsah(self):\n", + " print(self.strana**2)\n", + "\n", + " def rozdil_obsahu(self, jiny_ctverec):\n", + " self.jiny_ctverec = jiny_ctverec\n", + " print((self.strana**2 - self.jiny_ctverec**2))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrana\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "c2.rozdil_obsahu(c1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 5 - `jiny_ctverec` je vlastně délka strany podruhé" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "class Ctverec:\n", + " \"\"\"Trida Ctverec s jednim atributem strana a metodami:\n", + " - obvod()\n", + " - obsah()\n", + " - rozdil_obsahu(jiny_ctverec): \n", + " vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame.\"\"\"\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + " \n", + " def obvod(self):\n", + " \"Vypocet obvodu ctverce\"\n", + " self.obvod = self.strana * 4\n", + " print(\"Ctverec o strane {}cm ma obvod {}cm.\".format(self.strana, self.obvod))\n", + "\n", + " def obsah(self):\n", + " \"Vypocet obsahu ctverce\"\n", + " self.obsah = self.strana ** 2\n", + " print(\"Ctverec o strane {}cm ma obsah {}cm2.\".format(self.strana, self.obsah))\n", + "\n", + " def rozdil_obsahu(self, jiny_ctverec):\n", + " \"vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame\"\n", + " rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)\n", + " return rozdil" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Správné řešení" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "class Ctverec():\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + "\n", + " def obvod(self):\n", + " return 4 * self.strana\n", + "\n", + " def obsah(self):\n", + " return self.strana ** 2\n", + "\n", + " def rozdil_obsahu(self, druhy_ctverec):\n", + " return self.obsah() - druhy_ctverec.obsah()" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava11/index.slides.html b/lessons/feedback/ostrava11/index.slides.html new file mode 100644 index 0000000000..7664913347 --- /dev/null +++ b/lessons/feedback/ostrava11/index.slides.html @@ -0,0 +1,13893 @@ + + + + + + + + + + + + +index slides + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+

Feedback k domácím projektům

+
+
+
+
+
+
+

Řešení 1 - obsah lze vypočítat jen jednou a musí být spočten před počítáním rozdílu

+
+
+
+
+
+
In [1]:
+
+
+
class Ctverec:
+    def __init__(self, strana):
+        self.strana = strana
+    def obvod(self):
+        self.obvod = 4*self.strana
+        return self.obvod
+    def obsah(self):
+        self.obsah = self.strana**2
+        return self.obsah
+    def rozdil_obsahu(self, jiny_ctverec):
+        return self.obsah - jiny_ctverec.obsah
+
+ +
+
+
+ +
+
+
+
In [2]:
+
+
+
c1 = Ctverec(5)
+c1.obsah()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[2]:
+ + + + +
+
25
+
+ +
+ +
+
+ +
+
+
+
In [3]:
+
+
+
c1.obsah()
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+TypeError                                 Traceback (most recent call last)
+<ipython-input-3-dd68ddc8112e> in <module>()
+----> 1 c1.obsah()
+
+TypeError: 'int' object is not callable
+
+
+ +
+
+ +
+
+
+
In [4]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+TypeError                                 Traceback (most recent call last)
+<ipython-input-4-b2d4f2c61000> in <module>()
+      1 c1 = Ctverec(5)
+      2 c2 = Ctverec(10)
+----> 3 c2.rozdil_obsahu(c1)
+
+<ipython-input-1-cf49bcfaa00b> in rozdil_obsahu(self, jiny_ctverec)
+      9         return self.obsah
+     10     def rozdil_obsahu(self, jiny_ctverec):
+---> 11         return self.obsah - jiny_ctverec.obsah
+
+TypeError: unsupported operand type(s) for -: 'method' and 'method'
+
+
+ +
+
+ +
+
+
+
In [15]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+print(c1.obsah())
+print(c2.obsah())
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
25
+100
+
+
+
+ +
+ +
Out[15]:
+ + + + +
+
75
+
+ +
+ +
+
+ +
+
+
+
+

Řešení 2 - nefunguje dokud nemá ty správné globální proměnné

+
+
+
+
+
+
In [5]:
+
+
+
class Ctverec:
+    def __init__(self, strana):
+        self.strana = strana
+
+    def obvod(self):
+        return 4 * self.strana
+
+    def obsah(self):
+        return self.strana ** 2
+
+    def rozdil_obsahu(self, jiny_ctverec):
+        return self.obsah() - druhy_ctverec.obsah()
+
+ +
+
+
+ +
+
+
+
In [6]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+NameError                                 Traceback (most recent call last)
+<ipython-input-6-b2d4f2c61000> in <module>()
+      1 c1 = Ctverec(5)
+      2 c2 = Ctverec(10)
+----> 3 c2.rozdil_obsahu(c1)
+
+<ipython-input-5-745a0cf85edb> in rozdil_obsahu(self, jiny_ctverec)
+     10 
+     11     def rozdil_obsahu(self, jiny_ctverec):
+---> 12         return self.obsah() - druhy_ctverec.obsah()
+
+NameError: name 'druhy_ctverec' is not defined
+
+
+ +
+
+ +
+
+
+
+

Řešení 3 - globální proměnné podruhé

+
+
+
+
+
+
In [7]:
+
+
+
class Ctverec:
+    def __init__(self, strana):
+        self.strana = strana
+
+    def obvod(self):
+        obvod = 4 * self.strana
+        return obvod
+
+    def obsah(self):
+        obsah = self.strana * self.strana
+        return obsah
+
+    def rozdil_obsahu(self):
+        rozdil = ctverec1.obsah() - ctverec2.obsah()
+        return rozdil
+
+ +
+
+
+ +
+
+
+
In [8]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+TypeError                                 Traceback (most recent call last)
+<ipython-input-8-b2d4f2c61000> in <module>()
+      1 c1 = Ctverec(5)
+      2 c2 = Ctverec(10)
+----> 3 c2.rozdil_obsahu(c1)
+
+TypeError: rozdil_obsahu() takes 1 positional argument but 2 were given
+
+
+ +
+
+ +
+
+
+
+

Řešení 4 - jiny_ctverec je vlastně délka strany

+
+
+
+
+
+
In [9]:
+
+
+
class Ctverec:
+    def __init__(self, strana):
+        self.strana = strana
+
+    def obvod(self):
+        print(self.strana*4)
+
+    def obsah(self):
+        print(self.strana**2)
+
+    def rozdil_obsahu(self, jiny_ctverec):
+        self.jiny_ctverec = jiny_ctverec
+        print((self.strana**2 - self.jiny_ctverec**2))
+
+ +
+
+
+ +
+
+
+
In [10]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+TypeError                                 Traceback (most recent call last)
+<ipython-input-10-b2d4f2c61000> in <module>()
+      1 c1 = Ctverec(5)
+      2 c2 = Ctverec(10)
+----> 3 c2.rozdil_obsahu(c1)
+
+<ipython-input-9-8c22002c806b> in rozdil_obsahu(self, jiny_ctverec)
+     11     def rozdil_obsahu(self, jiny_ctverec):
+     12         self.jiny_ctverec = jiny_ctverec
+---> 13         print((self.strana**2 - self.jiny_ctverec**2))
+
+TypeError: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'
+
+
+ +
+
+ +
+
+
+
+

Řešení 5 - jiny_ctverec je vlastně délka strany podruhé

+
+
+
+
+
+
In [11]:
+
+
+
class Ctverec:
+    """Trida Ctverec s jednim atributem strana a metodami:
+        - obvod()
+        - obsah()
+        - rozdil_obsahu(jiny_ctverec): 
+            vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame."""
+    def __init__(self, strana):
+        self.strana = strana
+    
+    def obvod(self):
+        "Vypocet obvodu ctverce"
+        self.obvod = self.strana * 4
+        print("Ctverec o strane {}cm ma obvod {}cm.".format(self.strana, self.obvod))
+
+    def obsah(self):
+        "Vypocet obsahu ctverce"
+        self.obsah = self.strana ** 2
+        print("Ctverec o strane {}cm ma obsah {}cm2.".format(self.strana, self.obsah))
+
+    def rozdil_obsahu(self, jiny_ctverec):
+        "vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame"
+        rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)
+        return rozdil
+
+ +
+
+
+ +
+
+
+
In [12]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+---------------------------------------------------------------------------
+TypeError                                 Traceback (most recent call last)
+<ipython-input-12-b2d4f2c61000> in <module>()
+      1 c1 = Ctverec(5)
+      2 c2 = Ctverec(10)
+----> 3 c2.rozdil_obsahu(c1)
+
+<ipython-input-11-c8a136296458> in rozdil_obsahu(self, jiny_ctverec)
+     20     def rozdil_obsahu(self, jiny_ctverec):
+     21         "vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame"
+---> 22         rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)
+     23         return rozdil
+
+TypeError: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'
+
+
+ +
+
+ +
+
+
+
+

Správné řešení

+
+
+
+
+
+
In [13]:
+
+
+
class Ctverec():
+    def __init__(self, strana):
+        self.strana = strana
+
+    def obvod(self):
+        return 4 * self.strana
+
+    def obsah(self):
+        return self.strana ** 2
+
+    def rozdil_obsahu(self, druhy_ctverec):
+        return self.obsah() - druhy_ctverec.obsah()
+
+ +
+
+
+ +
+
+
+
In [14]:
+
+
+
c1 = Ctverec(5)
+c2 = Ctverec(10)
+c2.rozdil_obsahu(c1)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[14]:
+ + + + +
+
75
+
+ +
+ +
+
+ +
+
+
+ + + + + + + diff --git a/lessons/feedback/ostrava11/info.yml b/lessons/feedback/ostrava11/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava11/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml index 979f2e99ea..685eaa05f5 100644 --- a/runs/2019/pyladies-ostrava-jaro/info.yml +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -225,6 +225,8 @@ plan: - title: Odevzdání domácích projektů type: link url: https://www.dropbox.com/request/SOtp5ITHEPscn0MqzEM5 + - lesson: feedback/ostrava11 + type: lesson - title: Dědičnost slug: inheritance date: 2019-04-23 From e0f85bb5699e3a9cea2c510c91673d66a4c26e10 Mon Sep 17 00:00:00 2001 From: Disi77 <45143100+Disi77@users.noreply.github.com> Date: Tue, 6 Aug 2019 10:12:10 +0200 Subject: [PATCH 26/37] Create info.yml for PyLadies Ostrava Podzim 2019 --- runs/2019/pyladies-ostrava-podzim/info.yml | 264 +++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 runs/2019/pyladies-ostrava-podzim/info.yml diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml new file mode 100644 index 0000000000..81c4641dd2 --- /dev/null +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -0,0 +1,264 @@ +title: Začátečnický kurz PyLadies +subtitle: Ostrava – podzim 2019 +time: 17:00–19:00 +default_time: + start: '17:00' + end: '19:00' +place: Tieto Towers, 28. října 3346/91, Moravská Ostrava, Ostrava +description: Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba. +long_description: | + Tady najdeš všechny materiály k ostravské verzi začátečnického kurzu + PyLadies. + + Stránky samotných PyLadies jsou na [http://pyladies.cz][PyLadies]. + + Jednotlivé lekce jsou určeny naprostým začátečnicím. + Instrukce jsou uvedeny pro operační systémy Linux, Windows i macOS. + + [PyLadies]: https://pyladies.cz/ +derives: pyladies +vars: + user-gender: f + pyladies: true + coach-present: true +plan: +- title: Instalace + slug: install + date: 2019-09-04 + materials: + - url: http://pyladies.cz/v1/s001-install/uvod-ostrava.html + title: Úvodní prezentace + - lesson: beginners/cmdline + type: lesson + - lesson: beginners/install + type: lesson + - lesson: beginners/venv-setup + type: lesson + - lesson: beginners/first-steps + type: lesson + - lesson: beginners/install-editor + type: lesson + - title: Tahák na klávesnici (PDF) + url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf + type: cheatsheet + - lesson: homework/ostrava1 + type: homework +- title: První program + slug: hello-world + date: 2019-09-11 + materials: + - lesson: beginners/hello-world + type: lesson + - lesson: beginners/print + title: Chybové hlášky a print + type: lesson + - lesson: beginners/variables + type: lesson + - lesson: beginners/comparisons + type: lesson + - title: Společná večeře PyLadies ve Slezské P.U.O.R. + type: special + url: http://slezska.com/ + - lesson: homework/ostrava2 + type: homework + - title: "Nebo anebo a (bonus)" + lesson: beginners/and-or + vars: + bonus: true + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/AACCcUMFnjUBKeMCXzms + # - lesson: feedback/ostrava2 + # type: lesson +- title: Cykly + slug: loops + date: 2019-09-18 + materials: + - lesson: beginners/functions + type: lesson + - lesson: intro/turtle + type: lesson + - title: Tahák s užitečnými funkcemi + url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf + type: cheatsheet + - lesson: homework/ostrava3 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/1C7qR4cK9s0gfEHP2rDI + # - lesson: feedback/ostrava3 + # type: lesson +- title: Jeden nový cyklus a procvičování + slug: while + date: 2019-09-25 + materials: + - lesson: beginners/while + type: lesson + - title: Úkoly k procvičování + type: link + url: http://pyladies.cz/v1/s003-looping/ostrava/ukoly-k-procvicovani/ukoly.html + - lesson: homework/ostrava4 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/b0l0jiJhNNUBhdf0ncl5 + # - lesson: feedback/ostrava4 + # type: lesson +- title: Funkce a řetězce + slug: def-str + date: 2019-10-02 + materials: + - lesson: beginners/def + type: lesson + - lesson: beginners/str + type: lesson + - title: Řetězcový tahák + url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf + type: cheatsheet + - lesson: homework/ostrava5 + type: homework + - lesson: homework/ostrava5_TDD + type: homework + vars: + bonus: true + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/ztWlVnOsOM1smoLPxltm + # - lesson: feedback/ostrava5 + # type: lesson +- title: Soubory a výjimky + slug: file + date: 2019-10-09 + materials: + - lesson: beginners/exceptions + type: lesson + - lesson: beginners/files + type: lesson + - lesson: homework/ostrava6 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/BLnJ6NvNedROu9HkB1rw + # - lesson: feedback/ostrava6 + # type: lesson +- title: Seznamy + slug: list + date: 2019-10-16 + materials: + - lesson: beginners/list + type: lesson + - lesson: beginners/tuple + type: lesson + - title: Tahák na seznamy + url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf + type: cheatsheet + - lesson: homework/ostrava7 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/U1mnwyGK9KimfVummSEZ + # - lesson: feedback/ostrava7 + # type: lesson +- title: Slovníky + slug: dict + date: 2019-10-23 + materials: + - lesson: beginners/dict + type: lesson + - lesson: intro/json + type: lesson + - title: Ukázka jednoduchého API + type: lesson + url: http://pyladies.cz/v1/s011-dicts/simple-api.html + - title: Slovníkový tahák + url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf + type: cheatsheet + - lesson: homework/ostrava8 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/oJ3pgen7AmDea0lBfPog + # - lesson: feedback/ostrava8 + # type: lesson +- title: Moduly a testování + slug: modules-testing + date: 2019-10-30 + materials: + - lesson: beginners/modules + type: lesson + - lesson: beginners/circular-imports + title: Poznámka o importování + type: lesson + - lesson: beginners/testing + type: lesson + - lesson: homework/ostrava9 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/xApsz9zKYxknLpJf8Qml +- title: Grafika + slug: pyglet + date: 2019-11-06 + materials: + - lesson: intro/pyglet + type: lesson + - title: "Praktické cvičení: Pong – mimo kurz navíc" + lesson: projects/pong + - title: Kód celé hry Pong + url: http://pyladies.cz/v1/s012-pyglet/pong.py + - title: Tahák na Pyglet + url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf + type: cheatsheet + - lesson: homework/ostrava10 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/3e5TNn6NBlfI7SD5GFrW +- title: Třídy + slug: class + date: 2019-11-13 + materials: + - lesson: beginners/class + type: lesson + - lesson: homework/ostrava11 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/SOtp5ITHEPscn0MqzEM5 + # - lesson: feedback/ostrava11 + # type: lesson +- title: Dědičnost + slug: inheritance + date: 2019-11-20 + materials: + - lesson: beginners/inheritance + type: lesson + - lesson: homework/ostrava12 + type: homework + # - title: Odevzdání domácích projektů + # type: link + # url: https://www.dropbox.com/request/AqCwMoyF9FuyI6Sinwu0 +- title: Závěrečný projekt + slug: asteroids + date: 2019-11-27 + materials: + - lesson: projects/asteroids + type: lesson + - lesson: projects/snake + type: lesson + - title: Množinový tahák + url: https://pyvec.github.io/cheatsheets/sets/sets-cs.pdf + type: cheatsheet + - title: Tahák na geometrii a fyziku 2D her + url: https://pyvec.github.io/cheatsheets/game-physics/game-physics-cs.pdf + type: cheatsheet +- title: Pokračování závěrečného projektu + slug: asteroids2 + date: 2019-12-04 + description: V této lekci budeme pokračovat v dalších fázích závěrečného projektu. + materials: [] +- title: Závěrečná hodina + slug: asteroids3 + date: 2019-12-11 + description: Během závěrečné hodiny si předáme diplomy a seznámíme se s možnostmi pokračování studia + materials: [] From f63ad67d6ec4617681ac877a01c835d7e4ca3896 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Mon, 2 Sep 2019 12:55:18 +0200 Subject: [PATCH 27/37] Ostrava: Remove home projects from the plan --- runs/2019/pyladies-ostrava-podzim/info.yml | 57 ---------------------- 1 file changed, 57 deletions(-) diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 81c4641dd2..98cec2cf21 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -41,8 +41,6 @@ plan: - title: Tahák na klávesnici (PDF) url: https://pyvec.github.io/cheatsheets/keyboard/keyboard-cs.pdf type: cheatsheet - - lesson: homework/ostrava1 - type: homework - title: První program slug: hello-world date: 2019-09-11 @@ -59,15 +57,10 @@ plan: - title: Společná večeře PyLadies ve Slezské P.U.O.R. type: special url: http://slezska.com/ - - lesson: homework/ostrava2 - type: homework - title: "Nebo anebo a (bonus)" lesson: beginners/and-or vars: bonus: true - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/AACCcUMFnjUBKeMCXzms # - lesson: feedback/ostrava2 # type: lesson - title: Cykly @@ -81,11 +74,6 @@ plan: - title: Tahák s užitečnými funkcemi url: https://pyvec.github.io/cheatsheets/basic-functions/basic-functions-cs.pdf type: cheatsheet - - lesson: homework/ostrava3 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/1C7qR4cK9s0gfEHP2rDI # - lesson: feedback/ostrava3 # type: lesson - title: Jeden nový cyklus a procvičování @@ -97,11 +85,6 @@ plan: - title: Úkoly k procvičování type: link url: http://pyladies.cz/v1/s003-looping/ostrava/ukoly-k-procvicovani/ukoly.html - - lesson: homework/ostrava4 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/b0l0jiJhNNUBhdf0ncl5 # - lesson: feedback/ostrava4 # type: lesson - title: Funkce a řetězce @@ -115,15 +98,10 @@ plan: - title: Řetězcový tahák url: https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf type: cheatsheet - - lesson: homework/ostrava5 - type: homework - lesson: homework/ostrava5_TDD type: homework vars: bonus: true - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/ztWlVnOsOM1smoLPxltm # - lesson: feedback/ostrava5 # type: lesson - title: Soubory a výjimky @@ -134,11 +112,6 @@ plan: type: lesson - lesson: beginners/files type: lesson - - lesson: homework/ostrava6 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/BLnJ6NvNedROu9HkB1rw # - lesson: feedback/ostrava6 # type: lesson - title: Seznamy @@ -152,11 +125,6 @@ plan: - title: Tahák na seznamy url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf type: cheatsheet - - lesson: homework/ostrava7 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/U1mnwyGK9KimfVummSEZ # - lesson: feedback/ostrava7 # type: lesson - title: Slovníky @@ -173,11 +141,6 @@ plan: - title: Slovníkový tahák url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf type: cheatsheet - - lesson: homework/ostrava8 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/oJ3pgen7AmDea0lBfPog # - lesson: feedback/ostrava8 # type: lesson - title: Moduly a testování @@ -191,11 +154,6 @@ plan: type: lesson - lesson: beginners/testing type: lesson - - lesson: homework/ostrava9 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/xApsz9zKYxknLpJf8Qml - title: Grafika slug: pyglet date: 2019-11-06 @@ -209,22 +167,12 @@ plan: - title: Tahák na Pyglet url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf type: cheatsheet - - lesson: homework/ostrava10 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/3e5TNn6NBlfI7SD5GFrW - title: Třídy slug: class date: 2019-11-13 materials: - lesson: beginners/class type: lesson - - lesson: homework/ostrava11 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/SOtp5ITHEPscn0MqzEM5 # - lesson: feedback/ostrava11 # type: lesson - title: Dědičnost @@ -233,11 +181,6 @@ plan: materials: - lesson: beginners/inheritance type: lesson - - lesson: homework/ostrava12 - type: homework - # - title: Odevzdání domácích projektů - # type: link - # url: https://www.dropbox.com/request/AqCwMoyF9FuyI6Sinwu0 - title: Závěrečný projekt slug: asteroids date: 2019-11-27 From b1f8c729174ccdb4ba6e620d090638a162529bf6 Mon Sep 17 00:00:00 2001 From: Petra Cihalova Date: Thu, 19 Sep 2019 21:36:55 +0200 Subject: [PATCH 28/37] [Ostrava] Change feedback for Lesson2 and add link to this feedback to material-list --- lessons/feedback/ostrava2/index.ipynb | 310 ++++++++++++--------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 175 insertions(+), 139 deletions(-) diff --git a/lessons/feedback/ostrava2/index.ipynb b/lessons/feedback/ostrava2/index.ipynb index 2b03967e80..a5a3459f85 100644 --- a/lessons/feedback/ostrava2/index.ipynb +++ b/lessons/feedback/ostrava2/index.ipynb @@ -2,34 +2,83 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "# Zpětná vazba k domácím projektům" + "# Zpětná vazba k domácím projektům\n", + "\n" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" + "metadata": {}, + "source": [ + "## Použiji proměnnou, která neexistuje" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'strana' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Obvod čtverce je: '\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mstrana\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mstrana\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'strana' is not defined" + ] } - }, + ], "source": [ - "## Je možné tohle zjednodušit?" + "print('Obvod čtverce je: ', 4*strana)\n", + "strana = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ASCII tabulka" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, + "metadata": {}, + "outputs": [], + "source": [ + "'abc' > 'Abc'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**PROČ?**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Existuje něco jménem [ASCII tabulka](http://znakynaklavesnici.cz/ascii-tabulka/), která každému znaku přiřazuje číselnou hodnotu. V Pythonu tohle číslo lze získat pomocí funkce ord, např. ord(\"a\"). Protože velké A má číselnou hodnotu 65 a malé \"a\" má 97, platí, že \"A\" < \"a\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## KÁMEN - NŮŽKY - PAPÍR\n", + "**Je možné toto zjednodušit?**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "tah_cloveka = 'kámen'\n", @@ -45,23 +94,15 @@ }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "### Ano, je" + "## Ano je !" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, + "metadata": {}, "outputs": [], "source": [ "tah_cloveka = 'kámen'\n", @@ -77,11 +118,7 @@ }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ "## Najdi chyby 1" ] @@ -96,11 +133,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, + "metadata": {}, "outputs": [], "source": [ "from random import randrange\n", @@ -119,32 +152,24 @@ }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "### Správné řešení" + "**SPRÁVNÉ ŘEŠENÍ**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Chybička byla v záměně `elif` za další `if` což způsobilo rozdělení jedné podmínky se třemi větvemi na dvě samostatné podmínky, z nichž ta první měla jen jednu větev (jen jeden if) a ta druhá dvě (jeden if a jeden else).\n", + "Chybička byla v záměně **elif** za další **if** což způsobilo rozdělení jedné podmínky se třemi větvemi na dvě samostatné podmínky, z nichž ta první měla jen jednu větev (jen jeden if) a ta druhá dvě (jeden if a jeden else).\n", "\n", - "Další chyba pak byla v generování náhodných čísel, protože `randrange(2)` vrátí vždy jen 0 nebo 1." + "Další chyba pak byla v generování náhodných čísel, protože **randrange(2)** vrátí vždy jen 0 nebo 1." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, + "metadata": {}, "outputs": [], "source": [ "from random import randrange\n", @@ -161,22 +186,11 @@ " print(\"Počítač vybral papír.\")" ] }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Najdu chybu 2" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Copak se asi stane s proměnnou `strana` ještě před výpočtem povrchu a objemu?" + "**JDE TO JEŠTĚ VYLEPŠIT??**" ] }, { @@ -185,74 +199,58 @@ "metadata": {}, "outputs": [], "source": [ - "strana = int(input('Zadej velikost strany v cm: '))\n", - "strana = 2852\n", - "print('Objem krychle o straně',strana,'cm je', strana**3,'cm3')\n", - "print('Obsah krychle o straně',strana,'cm je', 6*strana**2,'cm2')" + "from random import randrange\n", + "cislo = randrange(3)\n", + "\n", + "if cislo == 0:\n", + " tah_pocitace = \"kámen\"\n", + "elif cislo == 1:\n", + " tah_pocitace = \"nůžky\"\n", + "else:\n", + " tah_pocitace = \"papír\"\n", + "\n", + "print('Počítač vybral', tah_pocitace)" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "## Šťastná - bohatá" + "## Najdi chyby 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Několik možných řešení programu šťastná-bohatá. Všechny dělají totéž, ale některé jsou zkrátka lépe čitelné a kompaktnější." + "Copak se asi stane s proměnnou strana ještě před výpočtem povrchu a objemu?" ] }, { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "### Řešení 1" + "strana = int(input('Zadej velikost strany v cm: '))\n", + "strana = 2852\n", + "print('Objem krychle o straně',strana,'cm je', strana**3,'cm3')\n", + "print('Obsah krychle o straně',strana,'cm je', 6*strana**2,'cm2')" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "print('Odpovídej \"ano\" nebo \"ne\".')\n", - "stastna_retezec = input('Jsi šťastná?')\n", - "bohata_retezec = input('Jsi bohatá?')\n", - "\n", - "if stastna_retezec == 'ano':\n", - " if bohata_retezec == 'ano':\n", - " print (\"ty se máš\")\n", - " elif bohata_retezec == 'ne':\n", - " print (\"zkus mín utrácet\")\n", - "elif stastna_retezec == 'ne':\n", - " if bohata_retezec == 'ano':\n", - " print (\"zkus se víc usmívat\")\n", - " elif bohata_retezec == 'ne':\n", - " print (\"to je mi líto\")\n", - "else:\n", - " print (\"Nerozumím.\")" + "## Bohatá a šťastná" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "### Řešení 2" + "Několik možných řešení programu šťastná-bohatá. Všechny dělají totéž, ale některé jsou zkrátka lépe čitelné a kompaktnější.\n", + "**ŘEŠENÍ 1**" ] }, { @@ -262,30 +260,30 @@ "outputs": [], "source": [ "print('Odpovídej \"ano\" nebo \"ne\".')\n", - "stastna_retezec = input('Jsi šťastná?')\n", - "bohata_retezec = input('Jsi bohatá?')\n", + "stastna = input('Jsi šťastná? ')\n", + "bohata = input('jsi bohatá? ')\n", + "\n", + "if stastna == 'ano':\n", + " if bohata == 'ano':\n", + " print('Gratuluji')\n", + " elif bohata == 'ne':\n", + " print('zkus míň utrácet')\n", + "\n", + "elif stastna == 'ne':\n", + " if bohata == 'ne':\n", + " print('to je mi líto')\n", + " elif bohata == 'ano':\n", + " print('zkus se víc usmívat')\n", "\n", - "if stastna_retezec == 'ano' and bohata_retezec == 'ano':\n", - " print (\"Grauluji\")\n", - "elif stastna_retezec == 'ano' and bohata_retezec == 'ne':\n", - " print('Zkus míň utrácet.')\n", - "elif stastna_retezec == 'ne' and bohata_retezec == 'ano':\n", - " print (\"zkus se víc usmívat\")\n", - "elif stastna_retezec == 'ne' and bohata_retezec == 'ne':\n", - " print (\"to je mi líto\")\n", "else:\n", - " print (\"Nerozumim\")" + " print('nerozumím')" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "### Řešení 3" + "**ŘEŠENÍ 2**" ] }, { @@ -298,36 +296,76 @@ "stastna_retezec = input('Jsi šťastná? ')\n", "if stastna_retezec == 'ano':\n", " stastna = True\n", + "elif stastna_retezec == 'Ano':\n", + " stastna = True\n", "elif stastna_retezec == 'ne':\n", " stastna = False\n", + "elif stastna_retezec == 'Ne':\n", + " stastna = False\n", "else:\n", " print('Nerozumím!')\n", "\n", "bohata_retezec = input('Jsi bohatá? ')\n", "if bohata_retezec == 'ano':\n", " bohata = True\n", + "elif bohata_retezec == 'Ano':\n", + " bohata = True\n", "elif bohata_retezec == 'ne':\n", " bohata = False\n", + "elif bohata_retezec == 'Ne':\n", + " bohata = False\n", "else:\n", " print('Nerozumím!')\n", "\n", - "if bohata and stastna:\n", - " print('Gratuluji!')\n", + "if bohata:\n", + " if stastna:\n", + " # Je bohatá a zároveň štǎstná, ta se má.\n", + " print('Gratuluji!')\n", "elif bohata:\n", + " # Je bohatá, ale není „bohatá a zároveň šťastná“,\n", + " # takže musí být jen bohatá.\n", " print('Zkus se víc usmívat.')\n", "elif stastna:\n", + " # Tady musí být jen šťastná.\n", " print('Zkus míň utrácet.')\n", "else:\n", + " # A tady víme, že není ani šťastná, ani bohatá.\n", " print('To je mi líto.')" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, + "source": [ + "**ŘEŠENÍ 3**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Odpovídej \"ano\" nebo \"ne\".')\n", + "stastna_retezec = input('Jsi šťastná? ')\n", + "bohata_retezec = input('Jsi bohatá? ')\n", + "\n", + "if stastna_retezec == \"ano\":\n", + " if bohata_retezec == \"ano\":\n", + " print(\"Gratuluji.\")\n", + " else:\n", + " print(\"Zkus míň utrácet.\")\n", + " \n", + "elif bohata_retezec == \"ano\":\n", + " print(\"Zkus se více usmívat.\")\n", + " \n", + "else:\n", + " print(\"To je mi líto.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Obecné rady, prosby a doporučení" ] @@ -336,17 +374,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Pochvala za použití horního indexu u centimetrů čtverečních.\n", - "- Názvy proměnných mají mít vysvětlující charakter, takže jednoznakové názvy jsou zapovězeny.\n", - "- Klíčová slova se nesmí použít jako názvy proměnné.\n", - "- Importy patří na samotný začátek souboru.\n", - "- Pište komentáře. Když narazíme na špatné řešení, snáze se nám radí, když vím, jak jste se k němu dostaly a na co jste při tom myslely. Komentáře ke standardním věcem psát netřeba.\n", - "- Odevzdávejte nejpozději v neděli večer a už jen programy s příponou .py!" + "* Používání nových (neprobraných) funkcionalit --> ANO/NE?\n", + "* Názvy proměnných mají mít vysvětlující charakter, takže jednoznakové názvy jsou zapovězeny.\n", + "* Pište komentáře. Když narazíme na špatné řešení, snáze se nám radí, když vím, jak jste se k němu dostaly a na co jste při tom myslely. Komentáře ke standardním věcem psát netřeba.\n", + "* Odevzdávejte nejpozději v neděli večer, konzultujte na Slacku\n", + "* Spouštějte svůj program opakovaně, snažte se simulovat všechny možnosti, které mohou nastat" ] } ], "metadata": { - "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -362,7 +398,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.0" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 98cec2cf21..068287c603 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -61,8 +61,8 @@ plan: lesson: beginners/and-or vars: bonus: true - # - lesson: feedback/ostrava2 - # type: lesson + - lesson: feedback/ostrava2 + type: lesson - title: Cykly slug: loops date: 2019-09-18 From 45dcfdba9927b862e94a795e847f441431165d32 Mon Sep 17 00:00:00 2001 From: Petra Cihalova Date: Tue, 24 Sep 2019 22:25:13 +0200 Subject: [PATCH 29/37] [Ostrava] Add Feedback for Lesson 3 --- lessons/feedback/ostrava3/index.ipynb | 163 +++++++++++++-------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 106 insertions(+), 61 deletions(-) diff --git a/lessons/feedback/ostrava3/index.ipynb b/lessons/feedback/ostrava3/index.ipynb index a171ab64fe..1e0c2ffbf2 100644 --- a/lessons/feedback/ostrava3/index.ipynb +++ b/lessons/feedback/ostrava3/index.ipynb @@ -43,22 +43,22 @@ }, "outputs": [], "source": [ - "prve = input('Zadej cislo: ')\n", - "druhe = input('Zadej cislo: ')\n", - "tretie = input('Zadej cislo: ')\n", - "stvrte = input('Zadej cislo: ')\n", - "piate = input('Zadej cislo: ')\n", + "n1 = int(input('Zadej prvni cele cislo:'))\n", + "n2 = int(input('Zadej druhe cele cislo:'))\n", + "n3 = int(input('Zadej treti cele cislo:'))\n", + "n4 = int(input('Zadej ctvrte cele cislo:'))\n", + "n5 = int(input('Zadej pate cele cislo:'))\n", "\n", - "if prve Date: Wed, 2 Oct 2019 14:44:14 +0200 Subject: [PATCH 30/37] Ostrava: Feedback (#46) * Ostrava: Feedback * fixup! Ostrava: Feedback --- lessons/feedback/ostrava4/index.ipynb | 129 ++++++++++++++------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/lessons/feedback/ostrava4/index.ipynb b/lessons/feedback/ostrava4/index.ipynb index be7ec36b2a..cc0eb22c4d 100644 --- a/lessons/feedback/ostrava4/index.ipynb +++ b/lessons/feedback/ostrava4/index.ipynb @@ -11,6 +11,37 @@ "# Feedback k domácím projektům" ] }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Co vrací funkce `print`?" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ahoj světe\n", + "None\n" + ] + } + ], + "source": [ + "vysledek = print(\"Ahoj světe\")\n", + "\n", + "print(vysledek)" + ] + }, { "cell_type": "markdown", "metadata": { @@ -125,7 +156,14 @@ } }, "source": [ - "## A do třetice" + "## Prázdný čtverec" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upovídané řešení" ] }, { @@ -134,30 +172,46 @@ "metadata": {}, "outputs": [], "source": [ - "for X_sloupce in range (6):\n", - " print ('')\n", - " for X_radky in range (6):\n", - " if X_radky == 0 or X_radky == 5 or X_sloupce == 0 or X_sloupce == 5:\n", - " print ('X', end = ' ')\n", - " else:\n", - " print (' ', end = ' ')" + "for radek in range(6):\n", + " if radek == 0:\n", + " for obsah_radku in range(6):\n", + " print('X', end=\" \")\n", + " print()\n", + " elif radek == 5:\n", + " for obsah_radku in range(6):\n", + " print('X', end=\" \")\n", + " print()\n", + " else:\n", + " print('X', end=\" \")\n", + " print(' ' * 7, end=\" \")\n", + " print('X', end=\" \")\n", + " print()" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "fragment" + "slide_type": "slide" } }, + "source": [ + "### Méně upovidané řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ - "for x in range(6):\n", - " if x % 5 == 0:\n", - " print('X ' * 6)\n", + "for radek in range(6):\n", + " if radek == 0:\n", + " print('x x x x x x')\n", + " elif radek==5:\n", + " print('x x x x x x')\n", " else:\n", - " print('X ', ' ' * 6, 'X')" + " print('x x')" ] }, { @@ -168,7 +222,7 @@ } }, "source": [ - "## Fibonacciho posloupnost" + "### Krátké řešení" ] }, { @@ -177,18 +231,11 @@ "metadata": {}, "outputs": [], "source": [ - "pocet = 20\n", - "a = 0\n", - "b = 1\n", - "\n", - "print(a, b, sep=\", \", end=\", \")\n", - "\n", - "for i in range(pocet):\n", - " dalsi_v_rade = a + b\n", - " a = b\n", - " b = dalsi_v_rade\n", - "\n", - " print(dalsi_v_rade, end=\", \")" + "for radek in range(6):\n", + " if radek == 0 or radek == 5:\n", + " print('X ' * 6)\n", + " else:\n", + " print('X ', ' ' * 6, 'X')" ] }, { @@ -199,7 +246,7 @@ } }, "source": [ - "## A jeden nepodařený" + "## Fibonacciho posloupnost" ] }, { @@ -208,12 +255,18 @@ "metadata": {}, "outputs": [], "source": [ - "ctverec = input(\"Když napíšeš podelně, vypíšes z x část čtverce\")\n", - "if ctverec == \"podelne\":\n", - " print(\" x\"*5, sep=\" \")\n", - "for i in range(5):\n", - " print(\" x\",\" \",\" x\")\n", - "print(\" x\"*5, sep=\" \")" + "pocet = 20\n", + "a = 0\n", + "b = 1\n", + "\n", + "print(a, b, sep=\", \", end=\", \")\n", + "\n", + "for i in range(pocet):\n", + " dalsi_v_rade = a + b\n", + " a = b\n", + " b = dalsi_v_rade\n", + "\n", + " print(dalsi_v_rade, end=\", \")" ] }, { @@ -236,9 +289,7 @@ }, "source": [ "* Pokud funkce nemá argumenty, mezi otevírací a zavírací závorku se nic nepíše (ani mezera)\n", - "* Také mezi název funkce a závorky se mezera nepíše - takže nikoli `print ()` ale `print()`\n", - "* Programy začínají bobtnat. Dávejte je prosím do samostatných souborů.\n", - "* Ptejte se na Slacku spíše než v domácích projektech. Vaše otázky mohou pomoci i ostatním." + "* Také mezi název funkce a závorky se mezera nepíše - takže nikoli `print ()` ale `print()`" ] } ], @@ -259,7 +310,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index f212301f1b..d9edd93465 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -85,8 +85,8 @@ plan: - title: Úkoly k procvičování type: link url: http://pyladies.cz/v1/s003-looping/ostrava/ukoly-k-procvicovani/ukoly.html - # - lesson: feedback/ostrava4 - # type: lesson + - lesson: feedback/ostrava4 + type: lesson - title: Funkce a řetězce slug: def-str date: 2019-10-02 From 326afc83406947ef50df8251f9cb85bd6fe3d67a Mon Sep 17 00:00:00 2001 From: Disi77 <45143100+Disi77@users.noreply.github.com> Date: Wed, 9 Oct 2019 09:52:17 +0200 Subject: [PATCH 31/37] [Ostrava] Add Feedback Lesson 5 (#47) * [Ostrava] Add Feedback Lesson 5 --- lessons/feedback/ostrava5/index.ipynb | 228 +++++++++++++++------ runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 163 insertions(+), 69 deletions(-) diff --git a/lessons/feedback/ostrava5/index.ipynb b/lessons/feedback/ostrava5/index.ipynb index 83a7129ffe..64cebc8b5c 100644 --- a/lessons/feedback/ostrava5/index.ipynb +++ b/lessons/feedback/ostrava5/index.ipynb @@ -19,14 +19,59 @@ } }, "source": [ - "## Tah hráče" + "## Želva\n", + "* exitonclick() v těle funkce\n", + "* import v těle funkce\n", + "* jak to udělat, aby mi terminál, kde zadává uživatel velikost strany, nepřekrylo okno s želvou?\n", + "* popisné stringy místo komentářů?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "from turtle import shape, forward, left, right, exitonclick\n", + "strana = int(input('Pro nakresleni domecku zadej delku strany v celych cislech: '))\n", + "def domecek(strana):\n", + " from math import sqrt\n", + " shape('turtle')\n", + " 'Podsada a prava strana'\n", + " for a in range(2):\n", + " forward(strana)\n", + " left(90)\n", + " forward(strana)\n", + " 'Otoceni na strechu'\n", + " right(180-45)\n", + " for b in range(2):\n", + " forward((sqrt(strana**2+strana**2))/2)\n", + " right(90)\n", + " forward(sqrt(strana**2+strana**2))\n", + " right(135)\n", + " forward(strana)\n", + " right(135)\n", + " forward(sqrt(strana**2+strana**2))\n", + " left(45)\n", + " forward(strana)\n", + " exitonclick()\n", + " \n", + "domecek(strana)" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ - "### Je tam opravdu vše potřeba?" + "## Rekurze" ] }, { @@ -35,16 +80,20 @@ "metadata": {}, "outputs": [], "source": [ - "def tah_hrace (pole):\n", - " 'Vrátí herní pole se zaznamenaným tahem hráče'\n", - " t = 0\n", - " while t == 0:\n", - " pozice = int(input('Na které políčko chceš hrát? '))\n", - " if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):\n", - " return tah(pole,pozice,'x')\n", - " t = 1\n", - " else:\n", - " print('Špatně zadaná pozice, zkus to znovu.')" + "def tah_hrace(pole):\n", + " pozice = int(input('Zadej cislo policka (0-19):')) \n", + " if pozice < 0:\n", + " print('Policko nemuze byt mensi nez 0. Zadej znovu cislo policka (0-19):')\n", + " return tah_hrace(pole)\n", + " elif pozice > 19: \n", + " print('Policko nemuze byt vetsi nez 19. Zadej znovu cislo policka (0-19):')\n", + " return tah_hrace(pole)\n", + " else:\n", + " if '-' not in pole[pozice]:\n", + " print('Tohle policko uz je obsazene! Zadej znovu cislo policka (0-19):')\n", + " return tah_hrace(pole)\n", + " else: \n", + " return tah(pole, pozice, 'o')" ] }, { @@ -55,7 +104,7 @@ } }, "source": [ - "### Není" + "## Funkce ano_nebo_ne()" ] }, { @@ -64,80 +113,118 @@ "metadata": {}, "outputs": [], "source": [ - "def tah_hrace(pole):\n", - " 'Vrátí herní pole se zaznamenaným tahem hráče'\n", + "def ano_nebo_ne(otazka):\n", + " \"Vrátí True nebo False, podle odpovědi uživatele\"\n", " while True:\n", - " pozice = int(input('Na které políčko chceš hrát? '))\n", - " if (pozice > 0) and (pozice<=20) and (pole[pozice-1] == '-'):\n", - " return tah(pole,pozice,'x')\n", + " odpoved = input(otazka)\n", + "\n", + " if odpoved.strip().lower() == 'ano' or odpoved.strip().lower() == 'a':\n", + " return True\n", + " elif odpoved.strip().lower() == 'ne' or odpoved.strip().lower() == 'n':\n", + " return False\n", " else:\n", - " print('Špatně zadaná pozice, zkus to znovu.')" + " print('Nerozumím! Odpověz \"ano\" nebo \"ne\".')\n", + "\n", + "if ano_nebo_ne('Chceš si zahrát hru? '):\n", + " print('OK! Ale napřed si ji musíš naprogramovat.')\n", + "else:\n", + " print('Škoda.')" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": { "slideshow": { "slide_type": "slide" } }, + "outputs": [], "source": [ - "## Vyhodnocení piškvorek" + "def ano_nebo_ne(otazka):\n", + " \"Vrátí True nebo False, podle odpovědi uživatele\"\n", + " while True:\n", + " odpoved = input(otazka).lower().strip()\n", + " if odpoved == 'ano' or odpoved == \"a\":\n", + " return True\n", + " elif odpoved == 'ne' or odpoved == \"n\":\n", + " return False\n", + " else:\n", + " print('Nerozumím! Odpověz \"ano\" nebo \"ne\".') " ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ - "### Co by se tady dalo udělat jednodušeji?" + "## Piškvorky a funkce `vyhodnot()`" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "outputs": [], "source": [ "def vyhodnot(pole):\n", - " \"Vyhodnotí stav pole.\"\n", - " krizek = \"xxx\"\n", - " kolecko = \"ooo\"\n", - " volno = \"-\"\n", - " if krizek in pole and kolecko not in pole:\n", - " return(\"x\")\n", - " elif kolecko in pole and krizek not in pole:\n", - " return(\"o\")\n", - " elif volno not in pole and krizek not in pole and kolecko not in pole:\n", - " return(\"!\")\n", + " if \"xxx\" in pole:\n", + " print(\"X\")\n", + " elif \"ooo\" in pole:\n", + " print(\"O\")\n", + " elif \"-\" not in pole:\n", + " print(\"!\")\n", " else:\n", - " None" + " print(\"-\")" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": { "slideshow": { "slide_type": "slide" } }, + "outputs": [], "source": [ - "### Upravená varianta" + "def vyhodnot(pole):\n", + " result = '-'\n", + "\n", + " if 'xxx' not in retezec and 'ooo' not in retezec and '-' not in retezec:\n", + " result = '!'\n", + " elif 'xxx' in retezec:\n", + " result = 'x'\n", + " elif 'ooo' in retezec:\n", + " result = 'o'\n", + "\n", + " return result" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "outputs": [], "source": [ "def vyhodnot(pole):\n", - " \"Vyhodnotí stav pole.\"\n", " if 'xxx' in pole:\n", - " return(\"x\")\n", + " return 'x'\n", " elif 'ooo' in pole:\n", - " return(\"o\")\n", + " return 'o'\n", " elif '-' not in pole:\n", - " return(\"!\")\n", + " return '!'\n", " else:\n", " return '-'" ] @@ -156,7 +243,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "outputs": [], "source": [ "from random import randrange\n", @@ -244,7 +335,7 @@ "evalue": "EOL while scanning string literal (, line 2)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m symbol_hrac = input('Chces o nebo x?)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m EOL while scanning string literal\n" + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m2\u001b[0m\n\u001b[1;33m symbol_hrac = input('Chces o nebo x?)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m EOL while scanning string literal\n" ] } ], @@ -282,7 +373,7 @@ "evalue": "invalid syntax (, line 7)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m while vysledek =='-'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m7\u001b[0m\n\u001b[1;33m while vysledek =='-'\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" ] } ], @@ -320,7 +411,7 @@ "evalue": "expected an indented block (, line 8)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m tah_hrace(pole,symbol_hrac)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n" + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m8\u001b[0m\n\u001b[1;33m tah_hrace(pole,symbol_hrac)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m expected an indented block\n" ] } ], @@ -398,10 +489,10 @@ "evalue": "piskvorky1d() missing 1 required positional argument: 'symbol'", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: piskvorky1d() missing 1 required positional argument: 'symbol'" + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m \u001b[0mpiskvorky1d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: piskvorky1d() missing 1 required positional argument: 'symbol'" ] } ], @@ -449,11 +540,11 @@ "evalue": "name 'vysledek' is not defined", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mpole\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0;34m'-'\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m20\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'-'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m\u001b[0;34m'-'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'vysledek' is not defined" + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m \u001b[0mpiskvorky1d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mpole\u001b[0m\u001b[1;33m=\u001b[0m \u001b[1;34m'-'\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mvysledek\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'-'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[1;33m==\u001b[0m\u001b[1;34m'-'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'vysledek' is not defined" ] } ], @@ -501,11 +592,11 @@ "evalue": "name 'tah_hrace' is not defined", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mpiskvorky1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[0;34m==\u001b[0m\u001b[0;34m'-'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mtah_hrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msymbol_hrac\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msymbol_hrac\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'o'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'tah_hrace' is not defined" + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvysledek\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m \u001b[0mpiskvorky1d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mpiskvorky1d\u001b[1;34m()\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;32mwhile\u001b[0m \u001b[0mvysledek\u001b[0m \u001b[1;33m==\u001b[0m\u001b[1;34m'-'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[0mtah_hrace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0msymbol_hrac\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpole\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0msymbol_hrac\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'o'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'tah_hrace' is not defined" ] } ], @@ -570,7 +661,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "slideshow": { "slide_type": "slide" @@ -618,7 +709,9 @@ "metadata": {}, "source": [ "* Za to, že vaše programy očekávají různé vstupy - například `Ano`, `ANO`, `ano`, `A` atp.\n", - "* Pochvala za použití Gitu a Githubu." + "* Že jste se někteří úspěšně popasovali s bonusem **1D Piškvorky a test-driven development**\n", + "* Za kreativní řešení, která nás pobavila, např. **funkce stupen_nasranosti()**\n", + "* Pro ty, kteří se ptají" ] }, { @@ -636,10 +729,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "* U funkcí vždy používáme dokumentační řetězce s trojtými uviozovkami. K popisu funkcí nepoužíváme komentáře.\n", + "* U funkcí vždy používáme dokumentační řetězce s trojtými uvozovkami. K popisu funkcí nepoužíváme komentáře.\n", "* Nezapomeňte kontrolovat svůj kód před odesláním, jestli tam nezůstali nějaké ladící hlášky nebo něco navíc.\n", - "* Pokud máte domácí úkol v Gitu a nahraný na Github, není třeba ho zabalit a poslat ještě jednou na Dropbox. Pošlete jen odkaz.\n", - "* **Dělejte i složitější úlohy**. I když se vám třeba nakonec nepodaří dokončit, je to lepší než je neudělat vůbec a je se alespoň o čem bavit a co řešit." + "* **Dělejte i složitější úlohy**. I když se vám třeba nakonec nepodaří dokončit, je to lepší než je neudělat vůbec a je se alespoň o čem bavit a co řešit.\n", + "* Ptejte se na Slacku !!!\n", + "* Posílejte i nefunkční kód, chce to ale trochu podrobnější popis závady než \"Program mi nefunguje\"" ] } ], @@ -660,7 +754,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index d9edd93465..ce4556c5a5 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -102,8 +102,8 @@ plan: type: homework vars: bonus: true - # - lesson: feedback/ostrava5 - # type: lesson + - lesson: feedback/ostrava5 + type: lesson - title: Soubory a výjimky slug: file date: 2019-10-09 From e7da5530e6b161ae14de37866cebf7f185644709 Mon Sep 17 00:00:00 2001 From: Disi77 <45143100+Disi77@users.noreply.github.com> Date: Tue, 15 Oct 2019 16:18:12 +0200 Subject: [PATCH 32/37] [Ostrava] Add Feedback Lesson6 (#49) --- lessons/feedback/ostrava6/index.ipynb | 55 ++-------------------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 7 insertions(+), 52 deletions(-) diff --git a/lessons/feedback/ostrava6/index.ipynb b/lessons/feedback/ostrava6/index.ipynb index a00a8a23f5..bab9a9d1dd 100644 --- a/lessons/feedback/ostrava6/index.ipynb +++ b/lessons/feedback/ostrava6/index.ipynb @@ -86,7 +86,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, "slideshow": { "slide_type": "slide" } @@ -151,7 +150,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, "slideshow": { "slide_type": "slide" } @@ -177,10 +175,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def vyplnZnak(hadanka, znak, tajneSlovo):\n", @@ -190,46 +186,6 @@ " return hadanka" ] }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Drobnosti" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Dokumentační řetězce se píšou hned pod název funkce a nikde jinde\n", - "* Nepoužívat kapitálky pro názvy proměnných. Většinou to není potřeba.\n", - "* Soubor nemusí mít příponu a rozhodně to nemusí být vždy `.txt`\n", - "* Používání knihoven pro kopírování souborů nebylo cílem, ale snaha se cení." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Martinovy prosby" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Nebalte do archívů každou úlohu zvlášť. Jeden archiv bohatě postačí.\n", - "* Neposílejte nám složky s virtuálním prostředím." - ] - }, { "cell_type": "markdown", "metadata": { @@ -245,10 +201,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "* Velká pochvala za úkoly na githubu\n", - "* Pochvala za hledání pomoci na internetu a používání nových věcí\n", "* Pochvala těm, kdo měli obrázky šibenice a japonské abecedy ve zvláštním souboru a ne přímo v kódu\n", - "* Pochvala za psaní komentářů k funkcím a složitějšímu kódu" + "* Pochvala za psaní komentářů k funkcím a složitějšímu kódu\n", + "* Když se neptáte, tak nevíme, s čím byste potřebovaly pomoci a nemůžeme to dát do feedbacku." ] } ], @@ -269,7 +224,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index ce4556c5a5..54f98b4bf0 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -112,8 +112,8 @@ plan: type: lesson - lesson: beginners/files type: lesson - # - lesson: feedback/ostrava6 - # type: lesson + - lesson: feedback/ostrava6 + type: lesson - title: Seznamy slug: list date: 2019-10-16 From 2c958eac5982998fdba5f309e6eebf5fe913f0ce Mon Sep 17 00:00:00 2001 From: Disi77 <45143100+Disi77@users.noreply.github.com> Date: Wed, 23 Oct 2019 09:30:23 +0200 Subject: [PATCH 33/37] [Ostrava] Add Feedback Lesson 7 (#50) --- lessons/feedback/ostrava7/index.ipynb | 30 +++++++++++----------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lessons/feedback/ostrava7/index.ipynb b/lessons/feedback/ostrava7/index.ipynb index 7ca44bda73..005daa537c 100644 --- a/lessons/feedback/ostrava7/index.ipynb +++ b/lessons/feedback/ostrava7/index.ipynb @@ -223,8 +223,8 @@ } ], "source": [ - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " basnicka = soubor_s_bacnickou.read()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " basnicka = soubor_s_basnickou.read()\n", "\n", "seznam_versu = basnicka.split(\"\\n\") # Rozdělí básničku na jednotlivé verše (řádky) [seznam]\n", "seznam_versu.reverse() # Obrátí pořadí veršů v seznamu\n", @@ -260,8 +260,8 @@ } ], "source": [ - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " seznam_versu = soubor_s_bacnickou.readlines()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " seznam_versu = soubor_s_basnickou.readlines()\n", "\n", "for vers in seznam_versu[::-1]:\n", " print(vers, end=\"\")" @@ -307,8 +307,8 @@ } ], "source": [ - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " basnicka = soubor_s_bacnickou.read()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " basnicka = soubor_s_basnickou.read()\n", "\n", "seznam_versu = basnicka.split(\"\\n\") # Rozdělí básničku na jednotlivé verše (řádky) [seznam]\n", "\n", @@ -352,8 +352,8 @@ } ], "source": [ - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " seznam_versu = soubor_s_bacnickou.readlines()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " seznam_versu = soubor_s_basnickou.readlines()\n", "\n", "for i, vers in enumerate(seznam_versu):\n", " slova = vers.split()\n", @@ -402,8 +402,8 @@ } ], "source": [ - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " basnicka = soubor_s_bacnickou.read()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " basnicka = soubor_s_basnickou.read()\n", "\n", "seznam_slok = basnicka.split(\"\\n\\n\") # Rozdělí básničku na jednotlivé sloky [seznam]\n", "seznam_slok.reverse()\n", @@ -452,8 +452,8 @@ "source": [ "from random import shuffle\n", "\n", - "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_bacnickou:\n", - " seznam_versu = soubor_s_bacnickou.readlines()\n", + "with open(\"static/basnicka.txt\", encoding=\"utf-8\") as soubor_s_basnickou:\n", + " seznam_versu = soubor_s_basnickou.readlines()\n", "\n", "for i, vers in enumerate(seznam_versu):\n", " slova = vers.split()\n", @@ -889,7 +889,7 @@ } }, "source": [ - "### Správné řešení" + "### Lepší řešení" ] }, { @@ -916,7 +916,7 @@ } }, "source": [ - "### Správné a krátké řešení" + "### Lepší a krátké řešení" ] }, { @@ -1225,7 +1225,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.0" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 54f98b4bf0..1cc503b260 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -125,8 +125,8 @@ plan: - title: Tahák na seznamy url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf type: cheatsheet - # - lesson: feedback/ostrava7 - # type: lesson + - lesson: feedback/ostrava7 + type: lesson - title: Slovníky slug: dict date: 2019-10-23 From 47201661b31d5c8be3b9bc668542b1a3bc262402 Mon Sep 17 00:00:00 2001 From: Petra Cihalova Date: Tue, 29 Oct 2019 21:35:16 +0100 Subject: [PATCH 34/37] [Ostrava] Add Feedback Lesson 8 --- lessons/feedback/ostrava8/index.ipynb | 885 ++------------------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 2 files changed, 82 insertions(+), 807 deletions(-) diff --git a/lessons/feedback/ostrava8/index.ipynb b/lessons/feedback/ostrava8/index.ipynb index 13b22a7591..b544132ebd 100644 --- a/lessons/feedback/ostrava8/index.ipynb +++ b/lessons/feedback/ostrava8/index.ipynb @@ -19,14 +19,31 @@ } }, "source": [ - "## Globální proměnné nebrat" + "## Slovník a mocniny" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mocniny(cislo):\n", + " seznam_mocnin = []\n", + " for i in range(1,cislo):\n", + " seznam_mocnin.append((i, i**2))\n", + "\n", + " mocniny = dict(seznam_mocnin) \n", + " return mocniny\n", + " \n", + "mocniny(4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "V tomto příkladu sice máme funkce, ale ty nejsou příliš užitečné, protože ke svému fungování potřebují množství globálních proměnných." + "### Jiné řešení" ] }, { @@ -35,39 +52,18 @@ "metadata": {}, "outputs": [], "source": [ - "#Vytvoření prázdného slovníku\n", - "slovnik_mocniny = dict()\n", - "slovnik_klicu_a_hodnot = dict()\n", - "\n", - "#Uživatel zadá číslo n, n+1 zajistí, že se později vypíše číslo přesně do výše,\n", - "#jakou uživatel zadal\n", - "n = int(input('Zadej číslo, program vypočítá druhé mocniny od 1 až po toto číslo: '))\n", - "n = n+1\n", - "\n", - "#Funkce k úkolu č. 0 - vypíše mocniny až do čísla daného uživatelem\n", - "def mocniny():\n", - " for x in range(1,n):\n", - " slovnik_mocniny[x]=x**2\n", - " return(slovnik_mocniny)\n", - "\n", - "#Funkce k úkolu č. 1 - sečte klíče a hodnoty ve slovníku mocniny, přidá je do\n", - "#slovníku soucet_klicu_a_hodnot\n", - "def soucet_klicu_a_hodnot():\n", - " soucet_klicu = sum(slovnik_mocniny.keys())\n", - " soucet_hodnot = sum(slovnik_mocniny.values())\n", - " slovnik_klicu_a_hodnot = {soucet_klicu, soucet_hodnot}\n", - " return slovnik_klicu_a_hodnot" + "def mocniny(n):\n", + " slovnik_mocniny = {}\n", + " for i in range(1, n+1):\n", + " slovnik_mocniny[i] = i**2\n", + " return slovnik_mocniny" ] }, { "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "metadata": {}, "source": [ - "Mnohem lepší přístup:" + "## Součet klíčů a hodnot" ] }, { @@ -76,29 +72,61 @@ "metadata": {}, "outputs": [], "source": [ - "def mocniny(n):\n", - " \"\"\" Vytvori slovnik mocnin o velikosti n \"\"\"\n", - " slovnik = {}\n", - " for j in range(1, n+1):\n", - " slovnik[(j)] = j**2\n", - " return slovnik\n", - "\n", - "\n", "def soucet_klicu_a_hodnot(slovnik):\n", - " \"\"\" vrati soucty vsech klicu a vsech hodnot\"\"\"\n", - " return sum(slovnik.keys()), sum(slovnik.values())\n", + " suma_klicu = 0\n", + " suma_hodnot = 0\n", "\n", + " for klic in slovnik:\n", + " suma_klicu += klic\n", "\n", - "def vypis_slovnik(slovnik):\n", - " \"\"\" vypise obsah slovniku \"\"\"\n", - " for objekt in slovnik:\n", - " print(\"Klic \", objekt, \", hodnota \", slovnik[objekt], sep='')\n", + " for hodnota in slovnik.values():\n", + " suma_hodnot += hodnota\n", "\n", - "\n", - "print(mocniny(4))\n", - "print(soucet_klicu_a_hodnot(mocniny(4)))\n", - "print(pocet_znaku(\"hello world\"))\n", - "vypis_slovnik(mocniny(4))" + " return (suma_hodnot, suma_klicu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Jiné řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def soucet_klicu_a_hodnot(slovnik):\n", + " return((sum(slovnik.keys()), sum(slovnik.values())))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Musí tam být tolik závorek?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Počet znaků v řetězci" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def vypocti_znaky(retezec):\n", + " slovnik = {}\n", + " for znak in retezec:\n", + " slovnik[znak] = retezec.count(znak)\n", + " return slovnik" ] }, { @@ -233,9 +261,6 @@ "odpovedi = {}\n", "for otazka in otazky:\n", " odpovedi[otazka] = []\n", - "\n", - "# Alternativní cesta\n", - "# odpovedi = {otazka: [] for otazka in otazky}\n", " \n", "for otazka in otazky:\n", " while True:\n", @@ -253,752 +278,6 @@ "print(veta)" ] }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Seznam sám v sobě" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, 5]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam = [5] * 6\n", - "seznam" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, [...]]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5] = seznam\n", - "seznam" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, [...]]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, [...]]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5][5][5][5]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, [...]]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 5, 5, 5, 5, [...]]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][0]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Ukázky jednoduchých API" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "import requests" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Ano nebo ne?" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'answer': 'yes',\n", - " 'forced': False,\n", - " 'image': 'https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif'}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "response = requests.get(\"https://yesno.wtf/api\")\n", - "\n", - "response.raise_for_status()\n", - "\n", - "data = response.json()\n", - "\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'yes'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data[\"answer\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data[\"image\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![image](https://yesno.wtf/assets/yes/13-c3082a998e7758be8e582276f35d1336.gif)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Náhodná rada do života" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'slip': {'advice': 'A nod is as good as a wink to a blind horse.',\n", - " 'slip_id': '120'}}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "response = requests.get(\"https://api.adviceslip.com/advice\")\n", - "\n", - "response.raise_for_status()\n", - "\n", - "data = response.json()\n", - "\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A nod is as good as a wink to a blind horse.'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data[\"slip\"][\"advice\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Texty písní" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Is this the real life? Is this just fantasy?\n", - "Caught in a landslide, no escape from reality\n", - "Open your eyes, look up to the skies and see\n", - "\n", - "I'm just a poor boy, I need no sympathy\n", - "Because I'm easy come, easy go, little high, little low\n", - "Anyway the wind blows, doesn't really matter to me, to me\n", - "\n", - "Mama, just killed a man\n", - "Put a gun against his head, pulled my trigger, now he's dead\n", - "Mama, life had just begun\n", - "But now I've gone and thrown it all away\n", - "\n", - "Mama, ooh, didn't mean to make you cry\n", - "If I'm not back again this time tomorrow\n", - "Carry on, carry on, as if nothing really matters\n", - "\n", - "Too late, my time has come\n", - "Sends shivers down my spine, body's aching all the time\n", - "Goodbye, everybody, I've got to go\n", - "Gotta leave you all behind and face the truth\n", - "\n", - "Mama, ooh, (Any way the wind blows) I don't wanna die\n", - "I sometimes wish I'd never been born at all\n", - "\n", - "I see a little silhouetto of a man\n", - "Scaramouche, Scaramouche, will you do the Fandango?\n", - "Thunderbolts and lightning, very, very frightening me\n", - "\n", - "Galileo (Galileo), Galileo (Galileo)\n", - "Galileo, Figaro, Magnifico, oh, oh, oh, oh, oh\n", - "\n", - "I'm just a poor boy, nobody loves me\n", - "He's just a poor boy from a poor family\n", - "Spare him his life from this monstrosity\n", - "\n", - "Easy come, easy go, will you let me go?\n", - "Bismillah, no, we will not let you go (Let him go)\n", - "Bismillah, we will not let you go (Let him go)\n", - "Bismillah, we will not let you go (Let me go)\n", - "Never let you go (Let me go)\n", - "Never let you go (Never, never, never let me go, oh, oh, oh)\n", - "No, no, no, no, no, no, no\n", - "\n", - "Oh, mamma mia, mamma mia\n", - "Mamma mia, let me go\n", - "Beelzebub has a devil put aside\n", - "For me, for me, for me\n", - "\n", - "So you think you can stone me and spit in my eye?\n", - "So you think you can love me and leave me to die?\n", - "Oh baby, can't do this to me, baby\n", - "Just gotta get out, just gotta get right out of here\n", - "\n", - "Ooh-ooh-ooh\n", - "Ooh-yeah, ooh-yeah\n", - "\n", - "Nothing really matters, anyone can see\n", - "Nothing really matters, nothing really matters to me\n", - "\n", - "Any way the wind blows\n" - ] - } - ], - "source": [ - "artist = \"Queen\"\n", - "title = \"Bohemian Rhapsody\"\n", - "\n", - "response = requests.get(\"https://api.lyrics.ovh/v1/{}/{}\".format(artist, title))\n", - "\n", - "response.raise_for_status()\n", - "\n", - "data = response.json()\n", - "text = data[\"lyrics\"]\n", - "\n", - "print(text)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Počasí" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'consolidated_weather': [{'id': 4827330616754176,\n", - " 'weather_state_name': 'Light Cloud',\n", - " 'weather_state_abbr': 'lc',\n", - " 'wind_direction_compass': 'NNE',\n", - " 'created': '2019-04-01T15:40:43.519403Z',\n", - " 'applicable_date': '2019-04-01',\n", - " 'min_temp': 6.23,\n", - " 'max_temp': 16.87,\n", - " 'the_temp': 16.0,\n", - " 'wind_speed': 5.624506348275404,\n", - " 'wind_direction': 15.843933712230228,\n", - " 'air_pressure': 1021.44,\n", - " 'humidity': 53,\n", - " 'visibility': 14.091766583154378,\n", - " 'predictability': 70},\n", - " {'id': 5566602449780736,\n", - " 'weather_state_name': 'Light Cloud',\n", - " 'weather_state_abbr': 'lc',\n", - " 'wind_direction_compass': 'SE',\n", - " 'created': '2019-04-01T15:40:46.702324Z',\n", - " 'applicable_date': '2019-04-02',\n", - " 'min_temp': 6.324999999999999,\n", - " 'max_temp': 16.495,\n", - " 'the_temp': 14.040000000000001,\n", - " 'wind_speed': 8.848418440266178,\n", - " 'wind_direction': 141.6650057162162,\n", - " 'air_pressure': 1016.7,\n", - " 'humidity': 51,\n", - " 'visibility': 15.103980255308995,\n", - " 'predictability': 70},\n", - " {'id': 6239291585855488,\n", - " 'weather_state_name': 'Heavy Cloud',\n", - " 'weather_state_abbr': 'hc',\n", - " 'wind_direction_compass': 'SSE',\n", - " 'created': '2019-04-01T15:40:50.333305Z',\n", - " 'applicable_date': '2019-04-03',\n", - " 'min_temp': 8.459999999999999,\n", - " 'max_temp': 18.935,\n", - " 'the_temp': 17.6,\n", - " 'wind_speed': 10.249016933365146,\n", - " 'wind_direction': 152.0369435066321,\n", - " 'air_pressure': 1007.515,\n", - " 'humidity': 56,\n", - " 'visibility': 13.653078521434821,\n", - " 'predictability': 71},\n", - " {'id': 5814165388132352,\n", - " 'weather_state_name': 'Light Cloud',\n", - " 'weather_state_abbr': 'lc',\n", - " 'wind_direction_compass': 'SSE',\n", - " 'created': '2019-04-01T15:40:52.521424Z',\n", - " 'applicable_date': '2019-04-04',\n", - " 'min_temp': 10.945,\n", - " 'max_temp': 16.915,\n", - " 'the_temp': 16.5,\n", - " 'wind_speed': 11.391530074339192,\n", - " 'wind_direction': 160.16280146794102,\n", - " 'air_pressure': 1002.565,\n", - " 'humidity': 55,\n", - " 'visibility': 13.370976000159072,\n", - " 'predictability': 70},\n", - " {'id': 5800497996890112,\n", - " 'weather_state_name': 'Showers',\n", - " 'weather_state_abbr': 's',\n", - " 'wind_direction_compass': 'SE',\n", - " 'created': '2019-04-01T15:40:55.517305Z',\n", - " 'applicable_date': '2019-04-05',\n", - " 'min_temp': 5.91,\n", - " 'max_temp': 10.305,\n", - " 'the_temp': 9.469999999999999,\n", - " 'wind_speed': 6.654490472305734,\n", - " 'wind_direction': 133.01467370354433,\n", - " 'air_pressure': 1005.3655,\n", - " 'humidity': 71,\n", - " 'visibility': 7.865937922532411,\n", - " 'predictability': 73},\n", - " {'id': 5218222536130560,\n", - " 'weather_state_name': 'Heavy Cloud',\n", - " 'weather_state_abbr': 'hc',\n", - " 'wind_direction_compass': 'NNE',\n", - " 'created': '2019-04-01T15:40:58.514664Z',\n", - " 'applicable_date': '2019-04-06',\n", - " 'min_temp': 4.58,\n", - " 'max_temp': 13.9,\n", - " 'the_temp': 6.1,\n", - " 'wind_speed': 2.9785608048993875,\n", - " 'wind_direction': 22.50000000000001,\n", - " 'air_pressure': 1010.0,\n", - " 'humidity': 75,\n", - " 'visibility': 9.997862483098704,\n", - " 'predictability': 71}],\n", - " 'time': '2019-04-01T20:37:07.101346+02:00',\n", - " 'sun_rise': '2019-04-01T06:33:42.385539+02:00',\n", - " 'sun_set': '2019-04-01T19:24:13.588295+02:00',\n", - " 'timezone_name': 'LMT',\n", - " 'parent': {'title': 'Austria',\n", - " 'location_type': 'Country',\n", - " 'woeid': 23424750,\n", - " 'latt_long': '47.696510,13.345770'},\n", - " 'sources': [{'title': 'BBC',\n", - " 'slug': 'bbc',\n", - " 'url': 'http://www.bbc.co.uk/weather/',\n", - " 'crawl_rate': 180},\n", - " {'title': 'Forecast.io',\n", - " 'slug': 'forecast-io',\n", - " 'url': 'http://forecast.io/',\n", - " 'crawl_rate': 480},\n", - " {'title': 'HAMweather',\n", - " 'slug': 'hamweather',\n", - " 'url': 'http://www.hamweather.com/',\n", - " 'crawl_rate': 360},\n", - " {'title': 'Met Office',\n", - " 'slug': 'met-office',\n", - " 'url': 'http://www.metoffice.gov.uk/',\n", - " 'crawl_rate': 180},\n", - " {'title': 'OpenWeatherMap',\n", - " 'slug': 'openweathermap',\n", - " 'url': 'http://openweathermap.org/',\n", - " 'crawl_rate': 360},\n", - " {'title': 'Weather Underground',\n", - " 'slug': 'wunderground',\n", - " 'url': 'https://www.wunderground.com/?apiref=fc30dc3cd224e19b',\n", - " 'crawl_rate': 720},\n", - " {'title': 'World Weather Online',\n", - " 'slug': 'world-weather-online',\n", - " 'url': 'http://www.worldweatheronline.com/',\n", - " 'crawl_rate': 360},\n", - " {'title': 'Yahoo',\n", - " 'slug': 'yahoo',\n", - " 'url': 'http://weather.yahoo.com/',\n", - " 'crawl_rate': 180}],\n", - " 'title': 'Vienna',\n", - " 'location_type': 'City',\n", - " 'woeid': 551801,\n", - " 'latt_long': '48.202541,16.368799',\n", - " 'timezone': 'Europe/Vienna'}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "location = \"551801\"\n", - "\n", - "response = requests.get(\"https://www.metaweather.com/api/location/{}/\".format(location))\n", - "\n", - "response.raise_for_status()\n", - "\n", - "data = response.json()\n", - "\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2019-04-01 6.23 16.87\n", - "2019-04-02 6.32 16.5\n", - "2019-04-03 8.46 18.93\n", - "2019-04-04 10.95 16.91\n", - "2019-04-05 5.91 10.3\n", - "2019-04-06 4.58 13.9\n" - ] - } - ], - "source": [ - "for day in data[\"consolidated_weather\"]:\n", - " print(day[\"applicable_date\"], round(day[\"min_temp\"], 2), round(day[\"max_temp\"], 2))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Oxford dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'metadata': {'provider': 'Oxford University Press'},\n", - " 'results': [{'id': 'python',\n", - " 'language': 'en',\n", - " 'lexicalEntries': [{'derivatives': [{'id': 'pythonic', 'text': 'pythonic'}],\n", - " 'entries': [{'etymologies': ['late 16th century (in the Greek sense): via Latin from Greek Puthōn, the name of a huge serpent killed by Apollo. The main current sense dates from the mid 19th century'],\n", - " 'grammaticalFeatures': [{'text': 'Singular', 'type': 'Number'}],\n", - " 'homographNumber': '000',\n", - " 'senses': [{'definitions': ['a large heavy-bodied non-venomous snake occurring throughout the Old World tropics, killing prey by constriction and asphyxiation.'],\n", - " 'domains': ['Reptile'],\n", - " 'id': 'm_en_gbus0833540.009',\n", - " 'notes': [{'text': 'Family Pythonidae: genera Python (of Asia and Africa), and Morelia and Aspidites (of Australasia)',\n", - " 'type': 'technicalNote'}],\n", - " 'short_definitions': ['large heavy-bodied non-venomous snake occurring throughout Old World tropics']},\n", - " {'definitions': ['a high-level general-purpose programming language.'],\n", - " 'domains': ['Computing'],\n", - " 'id': 'm_en_gbus0833540.014',\n", - " 'notes': [{'text': 'mass noun', 'type': 'grammaticalNote'}],\n", - " 'short_definitions': ['high-level general-purpose programming language'],\n", - " 'variantForms': [{'text': 'Python'}]}]}],\n", - " 'language': 'en',\n", - " 'lexicalCategory': 'Noun',\n", - " 'pronunciations': [{'audioFile': 'http://audio.oxforddictionaries.com/en/mp3/python_gb_1.mp3',\n", - " 'dialects': ['British English'],\n", - " 'phoneticNotation': 'IPA',\n", - " 'phoneticSpelling': 'ˈpʌɪθ(ə)n'}],\n", - " 'text': 'python'}],\n", - " 'type': 'headword',\n", - " 'word': 'python'}]}" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "app_id = '8206c2a3'\n", - "app_key = 'bf9aacede374e4d731fb020edd801642'\n", - "language = 'en'\n", - "word = 'python'\n", - "\n", - "url = \"https://od-api.oxforddictionaries.com:443/api/v1/entries/{}/{}\".format(language, word)\n", - "response = requests.get(url, headers = {'app_id' : app_id, 'app_key' : app_key})\n", - "\n", - "data = response.json()\n", - "\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'definitions': ['a large heavy-bodied non-venomous snake occurring throughout the Old World tropics, killing prey by constriction and asphyxiation.'],\n", - " 'domains': ['Reptile'],\n", - " 'id': 'm_en_gbus0833540.009',\n", - " 'notes': [{'text': 'Family Pythonidae: genera Python (of Asia and Africa), and Morelia and Aspidites (of Australasia)',\n", - " 'type': 'technicalNote'}],\n", - " 'short_definitions': ['large heavy-bodied non-venomous snake occurring throughout Old World tropics']},\n", - " {'definitions': ['a high-level general-purpose programming language.'],\n", - " 'domains': ['Computing'],\n", - " 'id': 'm_en_gbus0833540.014',\n", - " 'notes': [{'text': 'mass noun', 'type': 'grammaticalNote'}],\n", - " 'short_definitions': ['high-level general-purpose programming language'],\n", - " 'variantForms': [{'text': 'Python'}]}]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data[\"results\"][0][\"lexicalEntries\"][0][\"entries\"][0][\"senses\"]" - ] - }, { "cell_type": "markdown", "metadata": { @@ -1018,12 +297,8 @@ } }, "source": [ - "* Ptejte se na Slacku na cokoli. Co bude zajímavé pro více lidí, to zpracujeme do hodiny.\n", - "* Pokud máte úkoly na githubu:\n", - " * Odevzdejte na Dropbox jen odkaz v souboru `.txt` nikoli `.docx`\n", - " * Pokud vám Martin nezaloží issue, je ve vašem úkolu vše v pořádku\n", - "* Pochvala za validaci inputů\n", - " * Ještě větší pochvala za validaci s pomocí výjimek\n", + "* Evergreen = ptejte se\n", + "* Pochvala za všechna funkční řešení\n", "* Pochvala za dokumentační řetězce\n", " * Ještě větší pochvala za dokumentační řetězce ve třech uvozovkách\n", " * A ještě větší pochvala těm, kdož jsou konzistentní a dávají dokumentační řetězce úplně všude" @@ -1047,7 +322,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.0" } }, "nbformat": 4, diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 1cc503b260..4b7e1d5bb9 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -141,8 +141,8 @@ plan: - title: Slovníkový tahák url: https://pyvec.github.io/cheatsheets/dicts/dicts-cs.pdf type: cheatsheet - # - lesson: feedback/ostrava8 - # type: lesson + - lesson: feedback/ostrava8 + type: lesson - title: Moduly a testování slug: modules-testing date: 2019-10-30 From d07e2ba53fb76599c4a25dc051ec3a6b85ded7c3 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Wed, 13 Nov 2019 14:43:28 +0100 Subject: [PATCH 35/37] [Ostrava] Add feedback for lesson about pyglet --- lessons/feedback/ostrava10/index.ipynb | 234 +++++++++++++++++++++ lessons/feedback/ostrava10/info.yml | 4 + runs/2019/pyladies-ostrava-podzim/info.yml | 2 + 3 files changed, 240 insertions(+) create mode 100644 lessons/feedback/ostrava10/index.ipynb create mode 100644 lessons/feedback/ostrava10/info.yml diff --git a/lessons/feedback/ostrava10/index.ipynb b/lessons/feedback/ostrava10/index.ipynb new file mode 100644 index 0000000000..0838dc5fa0 --- /dev/null +++ b/lessons/feedback/ostrava10/index.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Problém s proměnnými - lokální vs. globální, mutable vs. immutable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pyglet\n", + "from random import randint\n", + "\n", + "sirka = 1280\n", + "vyska = 800\n", + "rychlost_x = 0\n", + "rychlost_y = 0\n", + "\n", + "window = pyglet.window.Window(sirka, vyska)\n", + "\n", + "obrazek = pyglet.image.load(\"ball.png\")\n", + "sprite = pyglet.sprite.Sprite(obrazek)\n", + "sprite.x = -100\n", + "sprite.y = -100\n", + "\n", + "def tik(t):\n", + " sprite.x = sprite.x + t * rychlost_x\n", + " sprite.y = sprite.y + t * rychlost_y\n", + " if sprite.x + obrazek.width > sirka or sprite.x < 0:\n", + " rychlost_x = -rychlost_x\n", + " if sprite.y + obrazek.height > vyska or sprite.y < 0:\n", + " rychlost_y = -rychlost_y\n", + "\n", + "def klik(x, y, tlacitko, mod):\n", + " sprite.x = x\n", + " sprite.y = y\n", + " rychlost_x = randint(-500, 500)\n", + " rychlost_y = randint(-500, 500)\n", + "\n", + "def vykresli():\n", + " window.clear()\n", + " sprite.draw()\n", + "\n", + "pyglet.clock.schedule_interval(tik, 1/30)\n", + "window.push_handlers(on_draw=vykresli, on_mouse_press=klik)\n", + "\n", + "pyglet.app.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tento kód nefunguje, protože se uvnitř funkcí snažíme měnit obsah proměnných a zároveň přistupovat k jejich globálnímu stavu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 1 - kouzelný příkaz `global`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def tik(t):\n", + " global rychlost_x, rychlost_y\n", + " sprite.x = sprite.x + t * rychlost_x\n", + " sprite.y = sprite.y + t * rychlost_y\n", + " if sprite.x + obrazek.width > sirka or sprite.x < 0:\n", + " rychlost_x = -rychlost_x\n", + " if sprite.y + obrazek.height > vyska or sprite.y < 0:\n", + " rychlost_y = -rychlost_y\n", + "\n", + "def klik(x, y, tlacitko, mod):\n", + " global rychlost_x, rychlost_y\n", + " sprite.x = x\n", + " sprite.y = y\n", + " rychlost_x = randint(-500, 500)\n", + " rychlost_y = randint(-500, 500)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 2 - slovníky a seznamy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rychlost = {\"x\": 0, \"y\": 0}\n", + "\n", + "def tik(t):\n", + " sprite.x = sprite.x + t * rychlost[\"x\"]\n", + " sprite.y = sprite.y + t * rychlost[\"y\"]\n", + " if sprite.x + obrazek.width > sirka or sprite.x < 0:\n", + " rychlost[\"x\"] = -rychlost[\"x\"]\n", + " if sprite.y + obrazek.height > vyska or sprite.y < 0:\n", + " rychlost[\"y\"] = -rychlost[\"y\"]\n", + "\n", + "def klik(x, y, tlacitko, mod):\n", + " sprite.x = x\n", + " sprite.y = y\n", + " rychlost[\"x\"] = randint(-500, 500)\n", + " rychlost[\"y\"] = randint(-500, 500)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 3 - třída a objekty" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pyglet\n", + "from random import randint\n", + "\n", + "sirka = 1280\n", + "vyska = 800\n", + "\n", + "window = pyglet.window.Window(sirka, vyska)\n", + "\n", + "obrazek = pyglet.image.load(\"ball.png\")\n", + "\n", + "class Kulicka:\n", + " def __init__(self, x, y):\n", + " self.sprite = pyglet.sprite.Sprite(obrazek)\n", + " self.sprite.x = x\n", + " self.sprite.y = y\n", + " self.rychlost_x = randint(-500, 500)\n", + " self.rychlost_y = randint(-500, 500)\n", + "\n", + " def vykresli(self):\n", + " self.sprite.draw()\n", + " \n", + " def tik(self, t):\n", + " self.sprite.x = self.sprite.x + t * self.rychlost_x\n", + " self.sprite.y = self.sprite.y + t * self.rychlost_y\n", + " if self.sprite.x + obrazek.width > sirka or self.sprite.x < 0:\n", + " self.rychlost_x = -self.rychlost_x\n", + " if self.sprite.y + obrazek.height > vyska or self.sprite.y < 0:\n", + " self.rychlost_y = -self.rychlost_y\n", + "\n", + "kulicky = []\n", + "\n", + "def tik(t):\n", + " for kulicka in kulicky:\n", + " kulicka.tik(t)\n", + "\n", + "def klik(x, y, tlacitko, mod):\n", + " kulicky.append(Kulicka(x, y))\n", + "\n", + "def vykresli():\n", + " window.clear()\n", + " for kulicka in kulicky:\n", + " kulicka.vykresli()\n", + "\n", + "pyglet.clock.schedule_interval(tik, 1/30)\n", + "window.push_handlers(on_draw=vykresli, on_mouse_press=klik)\n", + "\n", + "pyglet.app.run()\n" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava10/info.yml b/lessons/feedback/ostrava10/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava10/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 4b7e1d5bb9..779de0e0fc 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -167,6 +167,8 @@ plan: - title: Tahák na Pyglet url: https://pyvec.github.io/cheatsheets/pyglet/pyglet-basics-cs.pdf type: cheatsheet + - lesson: feedback/ostrava10 + type: lesson - title: Třídy slug: class date: 2019-11-13 From f9b6a7c449dc4c5a6849d137ed4af8df5a994c21 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Wed, 20 Nov 2019 12:57:53 +0100 Subject: [PATCH 36/37] [Ostrava] Feedback for classes --- lessons/feedback/ostrava11/index.ipynb | 45 +- lessons/feedback/ostrava11/index.slides.html | 13893 ----------------- runs/2019/pyladies-ostrava-podzim/info.yml | 4 +- 3 files changed, 22 insertions(+), 13920 deletions(-) delete mode 100644 lessons/feedback/ostrava11/index.slides.html diff --git a/lessons/feedback/ostrava11/index.ipynb b/lessons/feedback/ostrava11/index.ipynb index 7bbf886372..bbfc62cb5e 100644 --- a/lessons/feedback/ostrava11/index.ipynb +++ b/lessons/feedback/ostrava11/index.ipynb @@ -35,12 +35,15 @@ "class Ctverec:\n", " def __init__(self, strana):\n", " self.strana = strana\n", + "\n", " def obvod(self):\n", " self.obvod = 4*self.strana\n", " return self.obvod\n", + "\n", " def obsah(self):\n", " self.obsah = self.strana**2\n", " return self.obsah\n", + "\n", " def rozdil_obsahu(self, jiny_ctverec):\n", " return self.obsah - jiny_ctverec.obsah" ] @@ -86,7 +89,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mc1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mc1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable" ] } @@ -111,8 +114,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for -: 'method' and 'method'" ] } @@ -125,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 5, "metadata": { "slideshow": { "slide_type": "slide" @@ -163,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "slideshow": { "slide_type": "-" @@ -187,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" @@ -201,8 +204,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mdruhy_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mdruhy_ctverec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobsah\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'druhy_ctverec' is not defined" ] } @@ -226,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -249,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" @@ -263,7 +266,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: rozdil_obsahu() takes 1 positional argument but 2 were given" ] } @@ -287,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -308,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "slideshow": { "slide_type": "fragment" @@ -322,8 +325,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrana\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mc1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mc2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCtverec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mc2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrozdil_obsahu\u001b[0;34m(self, jiny_ctverec)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrozdil_obsahu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrana\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjiny_ctverec\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'" ] } @@ -347,31 +350,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "class Ctverec:\n", - " \"\"\"Trida Ctverec s jednim atributem strana a metodami:\n", - " - obvod()\n", - " - obsah()\n", - " - rozdil_obsahu(jiny_ctverec): \n", - " vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame.\"\"\"\n", " def __init__(self, strana):\n", " self.strana = strana\n", " \n", " def obvod(self):\n", - " \"Vypocet obvodu ctverce\"\n", " self.obvod = self.strana * 4\n", " print(\"Ctverec o strane {}cm ma obvod {}cm.\".format(self.strana, self.obvod))\n", "\n", " def obsah(self):\n", - " \"Vypocet obsahu ctverce\"\n", " self.obsah = self.strana ** 2\n", " print(\"Ctverec o strane {}cm ma obsah {}cm2.\".format(self.strana, self.obsah))\n", "\n", " def rozdil_obsahu(self, jiny_ctverec):\n", - " \"vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame\"\n", " rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)\n", " return rozdil" ] @@ -429,7 +424,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.5" } }, "nbformat": 4, diff --git a/lessons/feedback/ostrava11/index.slides.html b/lessons/feedback/ostrava11/index.slides.html deleted file mode 100644 index 7664913347..0000000000 --- a/lessons/feedback/ostrava11/index.slides.html +++ /dev/null @@ -1,13893 +0,0 @@ - - - - - - - - - - - - -index slides - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-

Feedback k domácím projektům

-
-
-
-
-
-
-

Řešení 1 - obsah lze vypočítat jen jednou a musí být spočten před počítáním rozdílu

-
-
-
-
-
-
In [1]:
-
-
-
class Ctverec:
-    def __init__(self, strana):
-        self.strana = strana
-    def obvod(self):
-        self.obvod = 4*self.strana
-        return self.obvod
-    def obsah(self):
-        self.obsah = self.strana**2
-        return self.obsah
-    def rozdil_obsahu(self, jiny_ctverec):
-        return self.obsah - jiny_ctverec.obsah
-
- -
-
-
- -
-
-
-
In [2]:
-
-
-
c1 = Ctverec(5)
-c1.obsah()
-
- -
-
-
- -
-
- - -
- -
Out[2]:
- - - - -
-
25
-
- -
- -
-
- -
-
-
-
In [3]:
-
-
-
c1.obsah()
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-TypeError                                 Traceback (most recent call last)
-<ipython-input-3-dd68ddc8112e> in <module>()
-----> 1 c1.obsah()
-
-TypeError: 'int' object is not callable
-
-
- -
-
- -
-
-
-
In [4]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-TypeError                                 Traceback (most recent call last)
-<ipython-input-4-b2d4f2c61000> in <module>()
-      1 c1 = Ctverec(5)
-      2 c2 = Ctverec(10)
-----> 3 c2.rozdil_obsahu(c1)
-
-<ipython-input-1-cf49bcfaa00b> in rozdil_obsahu(self, jiny_ctverec)
-      9         return self.obsah
-     10     def rozdil_obsahu(self, jiny_ctverec):
----> 11         return self.obsah - jiny_ctverec.obsah
-
-TypeError: unsupported operand type(s) for -: 'method' and 'method'
-
-
- -
-
- -
-
-
-
In [15]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-print(c1.obsah())
-print(c2.obsah())
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
25
-100
-
-
-
- -
- -
Out[15]:
- - - - -
-
75
-
- -
- -
-
- -
-
-
-
-

Řešení 2 - nefunguje dokud nemá ty správné globální proměnné

-
-
-
-
-
-
In [5]:
-
-
-
class Ctverec:
-    def __init__(self, strana):
-        self.strana = strana
-
-    def obvod(self):
-        return 4 * self.strana
-
-    def obsah(self):
-        return self.strana ** 2
-
-    def rozdil_obsahu(self, jiny_ctverec):
-        return self.obsah() - druhy_ctverec.obsah()
-
- -
-
-
- -
-
-
-
In [6]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-NameError                                 Traceback (most recent call last)
-<ipython-input-6-b2d4f2c61000> in <module>()
-      1 c1 = Ctverec(5)
-      2 c2 = Ctverec(10)
-----> 3 c2.rozdil_obsahu(c1)
-
-<ipython-input-5-745a0cf85edb> in rozdil_obsahu(self, jiny_ctverec)
-     10 
-     11     def rozdil_obsahu(self, jiny_ctverec):
----> 12         return self.obsah() - druhy_ctverec.obsah()
-
-NameError: name 'druhy_ctverec' is not defined
-
-
- -
-
- -
-
-
-
-

Řešení 3 - globální proměnné podruhé

-
-
-
-
-
-
In [7]:
-
-
-
class Ctverec:
-    def __init__(self, strana):
-        self.strana = strana
-
-    def obvod(self):
-        obvod = 4 * self.strana
-        return obvod
-
-    def obsah(self):
-        obsah = self.strana * self.strana
-        return obsah
-
-    def rozdil_obsahu(self):
-        rozdil = ctverec1.obsah() - ctverec2.obsah()
-        return rozdil
-
- -
-
-
- -
-
-
-
In [8]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-TypeError                                 Traceback (most recent call last)
-<ipython-input-8-b2d4f2c61000> in <module>()
-      1 c1 = Ctverec(5)
-      2 c2 = Ctverec(10)
-----> 3 c2.rozdil_obsahu(c1)
-
-TypeError: rozdil_obsahu() takes 1 positional argument but 2 were given
-
-
- -
-
- -
-
-
-
-

Řešení 4 - jiny_ctverec je vlastně délka strany

-
-
-
-
-
-
In [9]:
-
-
-
class Ctverec:
-    def __init__(self, strana):
-        self.strana = strana
-
-    def obvod(self):
-        print(self.strana*4)
-
-    def obsah(self):
-        print(self.strana**2)
-
-    def rozdil_obsahu(self, jiny_ctverec):
-        self.jiny_ctverec = jiny_ctverec
-        print((self.strana**2 - self.jiny_ctverec**2))
-
- -
-
-
- -
-
-
-
In [10]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-TypeError                                 Traceback (most recent call last)
-<ipython-input-10-b2d4f2c61000> in <module>()
-      1 c1 = Ctverec(5)
-      2 c2 = Ctverec(10)
-----> 3 c2.rozdil_obsahu(c1)
-
-<ipython-input-9-8c22002c806b> in rozdil_obsahu(self, jiny_ctverec)
-     11     def rozdil_obsahu(self, jiny_ctverec):
-     12         self.jiny_ctverec = jiny_ctverec
----> 13         print((self.strana**2 - self.jiny_ctverec**2))
-
-TypeError: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'
-
-
- -
-
- -
-
-
-
-

Řešení 5 - jiny_ctverec je vlastně délka strany podruhé

-
-
-
-
-
-
In [11]:
-
-
-
class Ctverec:
-    """Trida Ctverec s jednim atributem strana a metodami:
-        - obvod()
-        - obsah()
-        - rozdil_obsahu(jiny_ctverec): 
-            vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame."""
-    def __init__(self, strana):
-        self.strana = strana
-    
-    def obvod(self):
-        "Vypocet obvodu ctverce"
-        self.obvod = self.strana * 4
-        print("Ctverec o strane {}cm ma obvod {}cm.".format(self.strana, self.obvod))
-
-    def obsah(self):
-        "Vypocet obsahu ctverce"
-        self.obsah = self.strana ** 2
-        print("Ctverec o strane {}cm ma obsah {}cm2.".format(self.strana, self.obsah))
-
-    def rozdil_obsahu(self, jiny_ctverec):
-        "vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame"
-        rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)
-        return rozdil
-
- -
-
-
- -
-
-
-
In [12]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
- - -
-
----------------------------------------------------------------------------
-TypeError                                 Traceback (most recent call last)
-<ipython-input-12-b2d4f2c61000> in <module>()
-      1 c1 = Ctverec(5)
-      2 c2 = Ctverec(10)
-----> 3 c2.rozdil_obsahu(c1)
-
-<ipython-input-11-c8a136296458> in rozdil_obsahu(self, jiny_ctverec)
-     20     def rozdil_obsahu(self, jiny_ctverec):
-     21         "vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame"
----> 22         rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)
-     23         return rozdil
-
-TypeError: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'
-
-
- -
-
- -
-
-
-
-

Správné řešení

-
-
-
-
-
-
In [13]:
-
-
-
class Ctverec():
-    def __init__(self, strana):
-        self.strana = strana
-
-    def obvod(self):
-        return 4 * self.strana
-
-    def obsah(self):
-        return self.strana ** 2
-
-    def rozdil_obsahu(self, druhy_ctverec):
-        return self.obsah() - druhy_ctverec.obsah()
-
- -
-
-
- -
-
-
-
In [14]:
-
-
-
c1 = Ctverec(5)
-c2 = Ctverec(10)
-c2.rozdil_obsahu(c1)
-
- -
-
-
- -
-
- - -
- -
Out[14]:
- - - - -
-
75
-
- -
- -
-
- -
-
-
- - - - - - - diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 779de0e0fc..8ef33e9f9b 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -175,8 +175,8 @@ plan: materials: - lesson: beginners/class type: lesson - # - lesson: feedback/ostrava11 - # type: lesson + - lesson: feedback/ostrava11 + type: lesson - title: Dědičnost slug: inheritance date: 2019-11-20 From 565145451f9f97bd9978242c6f9477b99609caad Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Wed, 27 Nov 2019 15:02:05 +0100 Subject: [PATCH 37/37] [Ostrava] Feedback for lesson about inheritance --- lessons/feedback/ostrava12/index.ipynb | 140 +++++++++++++++++++++ lessons/feedback/ostrava12/info.yml | 4 + runs/2019/pyladies-ostrava-podzim/info.yml | 2 + 3 files changed, 146 insertions(+) create mode 100644 lessons/feedback/ostrava12/index.ipynb create mode 100644 lessons/feedback/ostrava12/info.yml diff --git a/lessons/feedback/ostrava12/index.ipynb b/lessons/feedback/ostrava12/index.ipynb new file mode 100644 index 0000000000..ad72f7dbbf --- /dev/null +++ b/lessons/feedback/ostrava12/index.ipynb @@ -0,0 +1,140 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Feedback k domácím projektům" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Řešení 1" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from math import pi\n", + "\n", + "class Tvar:\n", + " def rozdil_obsahu(self, jiny_tvar):\n", + " return abs(self.obsah() - jiny_tvar.obsah())\n", + "\n", + "class Ctverec(Tvar):\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + "\n", + " def obvod(self):\n", + " return self.strana * 4\n", + "\n", + " def obsah(self):\n", + " return self.strana ** 2\n", + "\n", + "class Kruh(Tvar):\n", + " def __init__(self, polomer):\n", + " self.polomer = polomer\n", + "\n", + " def obvod(self):\n", + " return 2 * pi * self.polomer\n", + "\n", + " def obsah(self):\n", + " return pi * (self.polomer ** 2)\n", + "\n", + "class Obdelnik(Tvar):\n", + " def __init__(self, strana_prvni, strana_druha):\n", + " self.strana_prvni = strana_prvni\n", + " self.strana_druha = strana_druha\n", + "\n", + " def obvod(self):\n", + " return 2 * (self.strana_prvni + self.strana_druha)\n", + "\n", + " def obsah(self):\n", + " return self.strana_prvni * self.strana_druha" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Řešení 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from math import pi\n", + "\n", + "class Tvary:\n", + " def __init__(self, delka):\n", + " self.delka = delka\n", + " \n", + " def rozdil_obsahu(self, jiny_objekt):\n", + " return abs(self.obsah() - jiny_objekt.obsah())\n", + "\n", + "class Ctverec(Tvary):\n", + " def obvod(self):\n", + " return self.delka*4\n", + "\n", + " def obsah(self):\n", + " return self.delka * self.delka\n", + "\n", + "\n", + "class Kruh(Tvary):\n", + " def obvod(self):\n", + " return(round( 2 * pi * self.delka, 2))\n", + "\n", + " def obsah(self):\n", + " return(round(pi * self.delka ** 2, 2))\n", + "\n", + "class Obdelnik(Tvary):\n", + " def __init__(self, delka, delka_2):\n", + " self.delka_2 = delka_2\n", + " super().__init__(delka)\n", + "\n", + " def obvod(self):\n", + " return(round(2 * self.delka + 2 * self.delka_2, 2))\n", + "\n", + " def obsah(self):\n", + " return(round(self.delka * self.delka_2, 2))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava12/info.yml b/lessons/feedback/ostrava12/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava12/info.yml @@ -0,0 +1,4 @@ +title: Zpětná vazba k domácím projektům +style: ipynb +attribution: Pro PyLadies Ostrava napsal Lumír Balhar, 2019. +license: cc-by-sa-40 diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml index 8ef33e9f9b..ca1ca6aa20 100644 --- a/runs/2019/pyladies-ostrava-podzim/info.yml +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -183,6 +183,8 @@ plan: materials: - lesson: beginners/inheritance type: lesson + - lesson: feedback/ostrava12 + type: lesson - title: Závěrečný projekt slug: asteroids date: 2019-11-27