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/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/lessons/feedback/ostrava11/index.ipynb b/lessons/feedback/ostrava11/index.ipynb new file mode 100644 index 0000000000..bbfc62cb5e --- /dev/null +++ b/lessons/feedback/ostrava11/index.ipynb @@ -0,0 +1,432 @@ +{ + "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", + "\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" + ] + }, + { + "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 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'" + ] + } + ], + "source": [ + "c1 = Ctverec(5)\n", + "c2 = Ctverec(10)\n", + "c2.rozdil_obsahu(c1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "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": 6, + "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": 7, + "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": 8, + "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": 9, + "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": 10, + "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": 11, + "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": 12, + "metadata": {}, + "outputs": [], + "source": [ + "class Ctverec:\n", + " def __init__(self, strana):\n", + " self.strana = strana\n", + " \n", + " def obvod(self):\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", + " 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", + " 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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} 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/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/lessons/feedback/ostrava2/index.ipynb b/lessons/feedback/ostrava2/index.ipynb new file mode 100644 index 0000000000..a5a3459f85 --- /dev/null +++ b/lessons/feedback/ostrava2/index.ipynb @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Zpětná vazba k domácím projektům\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "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": [ + "print('Obvod čtverce je: ', 4*strana)\n", + "strana = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ASCII tabulka" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "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": {}, + "source": [ + "## Ano je !" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "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": {}, + "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": {}, + "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": {}, + "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": {}, + "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": {}, + "source": [ + "**JDE TO JEŠTĚ VYLEPŠIT??**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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": {}, + "source": [ + "## Najdi chyby 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": {}, + "source": [ + "## Bohatá a šťastná" + ] + }, + { + "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ší.\n", + "**ŘEŠENÍ 1**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Odpovídej \"ano\" nebo \"ne\".')\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", + "else:\n", + " print('nerozumím')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "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", + "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:\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": {}, + "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í" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 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": { + "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.0" + } + }, + "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/lessons/feedback/ostrava3/index.ipynb b/lessons/feedback/ostrava3/index.ipynb new file mode 100644 index 0000000000..1e0c2ffbf2 --- /dev/null +++ b/lessons/feedback/ostrava3/index.ipynb @@ -0,0 +1,341 @@ +{ + "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": [ + "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 n1 < n2 and n1 < n3 and n1 < n4 and n1 < n5:\n", + " print('Nejnizsi zadane cislo je:',n1)\n", + "elif n2 < n1 and n2 < n3 and n2 < n4 and n2 < n5:\n", + " print('Nejnizsi zadane cislo je:',n2)\n", + "elif n3 < n1 and n3 < n2 and n3 < n4 and n3 < n5:\n", + " print('Nejnizsi zadane cislo je:',n3)\n", + "elif n4 < n1 and n4 < n2 and n4 < n3 and n4 < n5:\n", + " print('Nejnizsi zadane cislo je:',n4)\n", + "elif n5 < n1 and n5 < n2 and n5 < n3 and n5 < n4:\n", + " print('Nejnizsi zadane cislo je:',n5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Lepší, ale pořád ne optimální" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "a = float(input('Prvni cislo: '))\n", + "b = float(input('Druhe cislo: '))\n", + "c = float(input('Treti cislo: '))\n", + "d = float(input('Ctrvte cislo: '))\n", + "e = float(input('Pate cislo: '))\n", + "\n", + "\n", + "m = a\n", + "\n", + "for cislo in a, b, c, d, e:\n", + " if cislo < m:\n", + " m=cislo\n", + "print(m)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Kratší a méně náročné řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "a = float(input('Napište libovolné číslo: '))\n", + "for cislo in range(4):\n", + " b = float(input('Napište libovolné číslo: '))\n", + " if b < a:\n", + " a = b\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## N-úhelníky v řadě" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Upovídané řešení z domácích projektů" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "from turtle import forward, left, right, exitonclick, shape, penup, pendown\n", + "shape('turtle')\n", + "\n", + "for i in range(5):\n", + " forward(50)\n", + " right(180+(((5-2)*180)/5))\n", + "penup()\n", + "forward(150)\n", + "pendown()\n", + "\n", + "for i in range(6):\n", + " forward(50)\n", + " right(180+(((6-2)*180)/6))\n", + "penup()\n", + "forward(150)\n", + "pendown()\n", + "\n", + "for i in range(7):\n", + " forward(50)\n", + " right(180+(((7-2)*180)/7))\n", + "penup()\n", + "forward(150)\n", + "pendown()\n", + "\n", + "for i in range(8):\n", + " forward(50)\n", + " right(180+(((8-2)*180)/8))\n", + "penup()\n", + "forward(150)\n", + "pendown()\n", + "\n", + "for i in range(9):\n", + " forward(50)\n", + " right(180+(((9-2)*180)/9))\n", + "penup()\n", + "forward(150)\n", + "pendown()\n", + "\n", + "exitonclick()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Kratší řešení s využitím cyklu v dalším cyklu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "from turtle import forward, left, penup, pendown, exitonclick\n", + "\n", + "for n in range(5, 9):\n", + " for uhelniky in range(n):\n", + " forward(200/n)\n", + " left(360/n)\n", + "\n", + " penup()\n", + " forward(100)\n", + " pendown()\n", + "\n", + "exitonclick()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Kytka" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from turtle import forward, left, speed, exitonclick, right, circle, speed\n", + "\n", + "speed(0)\n", + "\n", + "for i in range(18):\n", + " for j in range(4):\n", + " forward(50)\n", + " left(90)\n", + " left(20)\n", + "right(90)\n", + "forward(250)\n", + "\n", + "for i in range(5):\n", + " circle(i*5)\n", + "left(180)\n", + "forward(45)\n", + "for j in range(5):\n", + " circle(j*5)\n", + "forward(45)\n", + "right(180)\n", + "for k in range(5):\n", + " circle(k*5)\n", + "forward(45)\n", + "left(180)\n", + "forward(90)\n", + "for l in range(5):\n", + " circle(l*5)\n", + "\n", + "exitonclick()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Obecné připomínky a rady" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "* K importům:\n", + " * Importy provádíme vždy na prvních řádcích programu a v rámci programu pouze jednou.\n", + " * Snažíme se nepoužívat importy s hvězdičkou.\n", + " * Neimportujeme nic co pak v programu nepoužijeme.\n", + "* Ke komentářům:\n", + " * Nezakomentováváme programy nebo jednotlivé úlohy v nich.\n", + " * Není třeba psát komentáře k tomu, co je zcela jasné. Je to ale pořád lepší než je nepsat vůbec.\n", + " * Komentáře je lepší a jednodušší psát nad nebo pod kód místo vedle něj. Obzvlášť pokud má komentovaná část kódu několik řádků.\n", + "* Ke stylu:\n", + " * Zkuste nedělat extra dlouhé řádky. Maximum je takových 100 znaků.\n", + " * Kód nemusí být elegantní, hlavně když funguje (alespoň pro začátek).\n", + "* Díky všem, kteří zrychlili želvičku." + ] + } + ], + "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.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/feedback/ostrava3/info.yml b/lessons/feedback/ostrava3/info.yml new file mode 100644 index 0000000000..c63f246738 --- /dev/null +++ b/lessons/feedback/ostrava3/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/ostrava4/index.ipynb b/lessons/feedback/ostrava4/index.ipynb new file mode 100644 index 0000000000..cc0eb22c4d --- /dev/null +++ b/lessons/feedback/ostrava4/index.ipynb @@ -0,0 +1,318 @@ +{ + "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": [ + "## 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": { + "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": [ + "## Prázdný čtverec" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upovídané řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Méně upovidané řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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 x')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Krátké řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for radek in range(6):\n", + " if radek == 0 or radek == 5:\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": [ + "## 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()`" + ] + } + ], + "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.4" + } + }, + "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/lessons/feedback/ostrava5/index.ipynb b/lessons/feedback/ostrava5/index.ipynb new file mode 100644 index 0000000000..64cebc8b5c --- /dev/null +++ b/lessons/feedback/ostrava5/index.ipynb @@ -0,0 +1,762 @@ +{ + "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": [ + "## Ž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": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Rekurze" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Funkce ano_nebo_ne()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def ano_nebo_ne(otazka):\n", + " \"Vrátí True nebo False, podle odpovědi uživatele\"\n", + " while True:\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('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": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "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": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Piškvorky a funkce `vyhodnot()`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def vyhodnot(pole):\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", + " print(\"-\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "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": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "def vyhodnot(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": { + "slideshow": { + "slide_type": "slide" + } + }, + "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[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" + ] + } + ], + "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[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" + ] + } + ], + "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[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" + ] + } + ], + "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[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'" + ] + } + ], + "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[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" + ] + } + ], + "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[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" + ] + } + ], + "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": null, + "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](static/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", + "* Ž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í" + ] + }, + { + "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 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", + "* **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\"" + ] + } + ], + "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.4" + } + }, + "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/lessons/feedback/ostrava5/static/bart-chalkboard.gif b/lessons/feedback/ostrava5/static/bart-chalkboard.gif new file mode 100644 index 0000000000..28a0995190 Binary files /dev/null and b/lessons/feedback/ostrava5/static/bart-chalkboard.gif differ diff --git a/lessons/feedback/ostrava6/index.ipynb b/lessons/feedback/ostrava6/index.ipynb new file mode 100644 index 0000000000..bab9a9d1dd --- /dev/null +++ b/lessons/feedback/ostrava6/index.ipynb @@ -0,0 +1,232 @@ +{ + "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": { + "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": { + "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": null, + "metadata": {}, + "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": [ + "## Obecné rady, pochvaly a doporučení" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* 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\n", + "* Když se neptáte, tak nevíme, s čím byste potřebovaly pomoci a nemůžeme to dát do feedbacku." + ] + } + ], + "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.4" + } + }, + "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/lessons/feedback/ostrava7/index.ipynb b/lessons/feedback/ostrava7/index.ipynb new file mode 100644 index 0000000000..005daa537c --- /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_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", + "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_basnickou:\n", + " seznam_versu = soubor_s_basnickou.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_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", + "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_basnickou:\n", + " seznam_versu = soubor_s_basnickou.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_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", + "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_basnickou:\n", + " seznam_versu = soubor_s_basnickou.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": [ + "### Lepší ř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": [ + "### Lepší 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.0" + } + }, + "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/lessons/feedback/ostrava8/index.ipynb b/lessons/feedback/ostrava8/index.ipynb new file mode 100644 index 0000000000..b544132ebd --- /dev/null +++ b/lessons/feedback/ostrava8/index.ipynb @@ -0,0 +1,330 @@ +{ + "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": [ + "## 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": [ + "### Jiné řešení" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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": {}, + "source": [ + "## Součet klíčů a hodnot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def soucet_klicu_a_hodnot(slovnik):\n", + " suma_klicu = 0\n", + " suma_hodnot = 0\n", + "\n", + " for klic in slovnik:\n", + " suma_klicu += klic\n", + "\n", + " for hodnota in slovnik.values():\n", + " suma_hodnot += hodnota\n", + "\n", + " 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" + ] + }, + { + "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", + "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": [ + "## Obecné rady a postřehy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "* 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" + ] + } + ], + "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.0" + } + }, + "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/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/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/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 0000000000..a6e9b6f07a Binary files /dev/null and b/lessons/homework/ostrava3/static/03_diagram.png differ diff --git a/lessons/homework/ostrava3/static/03_trojuhelnik.png b/lessons/homework/ostrava3/static/03_trojuhelnik.png new file mode 100644 index 0000000000..3176b4f62e Binary files /dev/null and b/lessons/homework/ostrava3/static/03_trojuhelnik.png differ diff --git a/lessons/homework/ostrava3/static/04_domecek.png b/lessons/homework/ostrava3/static/04_domecek.png new file mode 100644 index 0000000000..bfb3a87efd Binary files /dev/null and b/lessons/homework/ostrava3/static/04_domecek.png differ diff --git a/lessons/homework/ostrava3/static/05_vesnice.png b/lessons/homework/ostrava3/static/05_vesnice.png new file mode 100644 index 0000000000..fd744f9a18 Binary files /dev/null and b/lessons/homework/ostrava3/static/05_vesnice.png differ diff --git a/lessons/homework/ostrava3/static/06_uhelniky.png b/lessons/homework/ostrava3/static/06_uhelniky.png new file mode 100644 index 0000000000..feb527e64e Binary files /dev/null and b/lessons/homework/ostrava3/static/06_uhelniky.png differ diff --git a/lessons/homework/ostrava3/static/10_ornament.png b/lessons/homework/ostrava3/static/10_ornament.png new file mode 100644 index 0000000000..7ad46a3f08 Binary files /dev/null and b/lessons/homework/ostrava3/static/10_ornament.png differ diff --git a/lessons/homework/ostrava3/static/11_ornament.png b/lessons/homework/ostrava3/static/11_ornament.png new file mode 100644 index 0000000000..0828fd44c0 Binary files /dev/null and b/lessons/homework/ostrava3/static/11_ornament.png differ diff --git a/lessons/homework/ostrava3/static/12_spirala.png b/lessons/homework/ostrava3/static/12_spirala.png new file mode 100644 index 0000000000..641f9a8ee1 Binary files /dev/null and b/lessons/homework/ostrava3/static/12_spirala.png differ diff --git a/lessons/homework/ostrava3/static/15_kvetina.png b/lessons/homework/ostrava3/static/15_kvetina.png new file mode 100644 index 0000000000..beb7d4f376 Binary files /dev/null and b/lessons/homework/ostrava3/static/15_kvetina.png differ diff --git a/lessons/homework/ostrava3/tasks.yml b/lessons/homework/ostrava3/tasks.yml new file mode 100644 index 0000000000..d4dded8c67 --- /dev/null +++ b/lessons/homework/ostrava3/tasks.yml @@ -0,0 +1,133 @@ +# 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`. + +- 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/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 0000000000..3424793a58 Binary files /dev/null and b/lessons/homework/ostrava5/static/02_domecky.png differ diff --git a/lessons/homework/ostrava5/static/03_domecky.png b/lessons/homework/ostrava5/static/03_domecky.png new file mode 100644 index 0000000000..86f620c9e0 Binary files /dev/null and b/lessons/homework/ostrava5/static/03_domecky.png differ 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/ostrava5_TDD/index.md b/lessons/homework/ostrava5_TDD/index.md new file mode 100644 index 0000000000..7175c759a5 --- /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. 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. + +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/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..cbc2da8ccb --- /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ý 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.) + + _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/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/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 diff --git a/runs/2019/pyladies-ostrava-jaro/info.yml b/runs/2019/pyladies-ostrava-jaro/info.yml new file mode 100644 index 0000000000..685eaa05f5 --- /dev/null +++ b/runs/2019/pyladies-ostrava-jaro/info.yml @@ -0,0 +1,264 @@ +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/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-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/ + - 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-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 + - 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-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 + - 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-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 + - 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-03-12 + 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-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 + - 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-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 + - 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-04-02 + 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-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 + - 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-04-16 + 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-04-23 + 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-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: [] diff --git a/runs/2019/pyladies-ostrava-podzim/info.yml b/runs/2019/pyladies-ostrava-podzim/info.yml new file mode 100644 index 0000000000..ca1ca6aa20 --- /dev/null +++ b/runs/2019/pyladies-ostrava-podzim/info.yml @@ -0,0 +1,211 @@ +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 +- 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/ + - title: "Nebo anebo a (bonus)" + lesson: beginners/and-or + vars: + bonus: true + - 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: 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: 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_TDD + type: homework + vars: + bonus: true + - 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: 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: 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: 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 +- 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: feedback/ostrava10 + type: lesson +- title: Třídy + slug: class + date: 2019-11-13 + materials: + - lesson: beginners/class + type: lesson + - lesson: feedback/ostrava11 + type: lesson +- title: Dědičnost + slug: inheritance + date: 2019-11-20 + materials: + - lesson: beginners/inheritance + type: lesson + - lesson: feedback/ostrava12 + type: lesson +- 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: [] 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..de352f86c4 --- /dev/null +++ b/runs/2019/pyladies-praha-jaro-cznic/info.yml @@ -0,0 +1,128 @@ +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: 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 + 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: "*Nebo* anebo *a* (bonus)" + lesson: beginners/and-or + vars: + bonus: true +- base: loops + date: 2019-03-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 +- slug: while-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í & 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 +- 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 + 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 + materials: + - lesson: beginners/inheritance + type: lesson +- base: pyglet + date: 2019-05-21 +- 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 new file mode 100644 index 0000000000..c13115ee16 --- /dev/null +++ b/runs/2019/pyladies-praha-jaro-ntk/info.yml @@ -0,0 +1,128 @@ +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: 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 + 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: "*Nebo* anebo *a* (bonus)" + lesson: beginners/and-or + vars: + bonus: true +- base: loops + date: 2019-03-21 + 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 +- slug: while-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í & 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 +- 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 + 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 + materials: + - lesson: beginners/inheritance + type: lesson +- base: pyglet + date: 2019-05-23 +- slug: data + title: Datová analýza + date: 2019-05-30 + materials: + - lesson: intro/notebook + - lesson: intro/pandas