{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Praktikum 7\n", "\n", "Allolevad ülesanded on kusrsuse \"Sissejuhatus programmeerimisse Pythoni baasil\" YFX0500 **praktikumis** koos kursusega ja **kodus** iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon `help`, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.\n", "\n", "
Viimati uuendatud 14.10.2024.
\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 1:**\n", "\n", "Järgmises jubedas koodis:\n", "```python\n", "def nimi_1():\n", " yield 7777\n", " yield 777\n", " yield 77\n", " yield 7\n", "\n", "nimi_2 = nimi_1()\n", "nimi_3 = next(nimi_2)\n", "nimi_4 = next(nimi_1())\n", "\n", "print(nimi_1)\n", "print(nimi_2)\n", "print(nimi_3)\n", "print(nimi_4)\n", "```\n", "Mis on generaatori nimi? Mis on iteraatori nimi? Mis on esimese iteratsiooni või iteraadi nimi?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 2:**\n", "\n", "Kasuta generaatori definitsiooni kujul:\n", "```python\n", "def gen():\n", " yield 7777\n", " yield 777\n", " yield 77\n", " yield 7\n", "```\n", "Itereeri, üle generaatori või vastavalt vajadusele üle iteraatori, kasutades `for`-tsüklit:\n", "1. Funktsiooni `next` kasutus keelatud;\n", "2. Kasuta funktsiooni `next`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 1)\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# 2) Kasutan funktsiooni next.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 3:**\n", "\n", "Itereeri laisalt üle loendi:\n", "```python\n", "lst = [3, 4, 5, 6, 7]\n", "```\n", "Vihje: Laisa itereerimise mõiste." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 4:**\n", "\n", "Defineeri generaator ja/või loo selle põhjal iteraator mis genereerib järgmised täisarve vahemukus $[10, 0]$:\n", "\n", "Oodatev tulemus:\n", "```\n", "10\n", "9\n", "8\n", "7\n", "6\n", "5\n", "4\n", "3\n", "2\n", "1\n", "0\n", "```\n", "või\n", "```\n", "10 9 8 7 6 5 4 3 2 1 0 \n", "```\n", "Vihje: Mõtle tavalisele funktsioonile ning asenda `return` lausendiga `yield`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 5:**\n", "\n", "Defineeri generaator mis genereerib järgmised täisarve vahemikus $[10, 0]$. Kasuta generaatori defineerimise lühiesitust." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 6:**\n", "\n", "Defineeri generaator või iteraator mis loob ja leiab arvude 15-dad astmed, kusjuures arvud võetakse vahemikust $[10, 0]$.\n", "\n", "Oodatav tulemus:\n", "```\n", "1000000000000000\n", "205891132094649\n", "35184372088832\n", "4747561509943\n", "470184984576\n", "30517578125\n", "1073741824\n", "14348907\n", "32768\n", "1\n", "0\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 7:**\n", "\n", "Defineeri generaator mis loob ja leiab arvude 15-dad astmed. Arve vali vahemikust $[10, 0]$. Kasuta generaatori defineerimiseks generatori lühiesitust.\n", "\n", "Oodatav tulemus:\n", "```\n", "1000000000000000\n", "205891132094649\n", "35184372088832\n", "4747561509943\n", "470184984576\n", "30517578125\n", "1073741824\n", "14348907\n", "32768\n", "1\n", "0\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 8:**\n", "\n", "Defineeri generaator või iteraator mis väljastab alltoodud loendis olevate riikide nimed.\n", "```python\n", "['Eesti', 'Kanada', 'USA', 'Läti']\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 9:**\n", "\n", "Defineeri generaator, kasutades selle lühiesitust, mis väljastab alltoodud loendis olevate riikide nimed.\n", "```python\n", "['Eesti', 'Kanada', 'USA', 'Läti']\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 10:**\n", "\n", "Kasutades `for`-`in`-`if`-avaldist generaator lühiesituses teisenda loendis `numbrid` olevad arvud täisarvudeks (näiteks kasutades sisseehitatud funktsiooni `int`) ning elimineeri negatiivsed loendi elemendid.\n", "```python\n", "numbrid = [34.6, -203.4, 68.3, -12.2, 44.6, 12.7]\n", "```\n", "Oodatav tulemus:\n", "```\n", "34\n", "68\n", "44\n", "12\n", "```\n", "või\n", "```\n", "34 68 44 12\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 11:**\n", "\n", "Kasutades `for`-`in`-`if`-avaldist generaator lühiesituses leia $50$-ne esimese mitte-negatiivse täisarvu 16-dad astmed. Filtreeri välja paarisarvulised tulemused.\n", "\n", "Oodatav tulemus:\n", "```\n", "1\n", "43046721\n", "152587890625\n", "33232930569601\n", "1853020188851841\n", "45949729863572161\n", "665416609183179841\n", "6568408355712890625\n", "48661191875666868481\n", "288441413567621167681\n", "1430568690241985328321\n", "6132610415680998648961\n", "23283064365386962890625\n", "79766443076872509863361\n", "250246473680347348787521\n", "727423121747185263828481\n", "1977985201462558877934081\n", "5070942774902496337890625\n", "12337511914217166362274241\n", "28644003124274380508351361\n", "63759030914653054346432641\n", "136614025729312093462315201\n", "282748441902441558837890625\n", "566977372488557307219621121\n", "1104427674243920646305299201\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 12:**\n", "\n", "1. Defineeri funktsioon mis väljastab listi mis sisaldab funktsioonile etteantud listis olevate arvude ruute.\n", "2. Defineeri generaator mis väljastab listi mis sisaldab generaatorile etteantud listis olevate arvude ruute.\n", "\n", "Sisendlist vali kujul:\n", "```python\n", "[1, 2, 3, 4]\n", "```\n", "Oodatav tulemus:\n", "```python\n", "[1, 4, 9, 16]\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# 1 Funktsioon.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 2 Generaator.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 13:**\n", "\n", "Defineeri lõpmatu generaator mis genereerib mittenegatiivseid paarisarve. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 14:**\n", "\n", "Rakenda järjest kolme generaatorit. Generaatorid peavad töötama iseseisvalt ja ka üheskoos järjest rakendatuna. Generaatorid võtavad argumendina vasti järgmist listi:\n", "```python\n", "nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "```\n", "Generaatorid peavad:\n", "- Filtreerima välja listi paaritud arvud.\n", "- Korrutama etteantud listi arve arvuga kolm.\n", "- Väljastama sõne kujul `Number on .`\n", "\n", "Küsitud operatsioone teosta esitatud järjekorras.\n", "\n", "Oodatav tulemus:\n", "```\n", "Number on 6.\n", "Number on 12.\n", "Number on 18.\n", "Number on 24.\n", "Number on 30.\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 15:**\n", "\n", "Rakenda järjest nelja generaatorit. Generaatorid peavad töötama iseseisvalt ja ka üheskoos järjest rakendatuna. Generaatorid võtavad argumendina vasti järgmist listi:\n", "```python\n", "nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "```\n", "Generaatorid peavad:\n", "- Listist valima paarisarvud ja väljastama need.\n", "- Korrutama etteantud listi arve arvuga 7.31 ja väljastama saadud tulemused.\n", "- Leidma arvu juure ja väljastama selle.\n", "- Väljastama sõne kujul `Arv oli aga muutus arvuks .`\n", "\n", "Küsitud operatsioone teosta esitatud järjekorras.\n", "\n", "Oodatav tulemus:\n", "```\n", "Arv oli 2 aga muutus arvuks 3.823610858861032.\n", "Arv oli 4 aga muutus arvuks 5.407402333838309.\n", "Arv oli 6 aga muutus arvuks 6.622688275919379.\n", "Arv oli 8 aga muutus arvuks 7.647221717722064.\n", "Arv oli 10 aga muutus arvuks 8.549853799919621.\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 16:**\n", "\n", "Telk kujutus on antud kujul:\n", "$$x_{n + 1} = \\mu \\min(x_n, 1 - x_n)$$\n", "või \n", "$$x_{n+1} =\\begin{cases}\n", " \\mu x_n, & \\text{kui}~~~ x_n < \\dfrac{1}{2},\\\\\n", " \\mu (1 - x_n), & \\text{kui}~~~ \\dfrac{1}{2} \\le x_n,\n", " \\end{cases}\n", "$$\n", "kus $\\mu$ on kontrollparameeter. Defineeri generaator mis leiab iteraatide $x_n$ väärtused $n > 0$ jaoks, etteantud algväärtuse $x_0 \\in [0, 1]$ ja parameetri $\\mu \\in [0, 2]$ jaoks.\n", "\n", "Vihje: Kasuta esimest definitsiooni ja sisseehitatud funktsiooni `min`.\n", "\n", "Viide: https://en.wikipedia.org/wiki/Tent_map" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 17:**\n", "\n", "Loo uus generaator lisades eelmises ülesandes loodud generaatorile täisarvuline argument `n` mis tähistab väljastatud kujutuse iteraatide arvu. Teisisõnu muuda generaator lõplikuks. Leia esimese $55$-e telk kujutise jada liikme kuupjuurte maksimumi. Kasuta algtingimust $x_0 = 0.1$ ja parameetri $\\mu$ väärtuseks vali $2.0$. Kuupjuurte leidmiseks loo ja kasuta generaatorit. Maksimumi leidmiseks kasuta sisseehitatud funktsiooni `max`.\n", "\n", "Vihje: Kasuta generaatorite järjestikku rakendamist.\n", "\n", "Oodatav vastus: `0.933127789204312`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 18:**\n", "\n", "Rahetera numbrid või $3n + 1$ jada. Defineeri generaator mis genereerib numbreid järgmiselt:\n", "- Vali ühest suurem täisarv;\n", "- Juhul kui arv on paaris, jaga see kahega;\n", "- Juhul kui arv on paaritu, korruta see kolmega ja liida üks;\n", "- Kui leitud arv on üks lõpeta iteratsioon.\n", "\n", "Näide: Alustades viiega on oodatav tulemus järgmine:\n", "```\n", "5\n", "16\n", "8.0\n", "4.0\n", "2.0\n", "1.0\n", "```\n", "või\n", "```\n", "5 16 8.0 4.0 2.0 1.0\n", "```\n", "Viide: https://en.wikipedia.org/wiki/Collatz_conjecture" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 19:**\n", "\n", "Loo generaatorit nimega `minu_range` mis käitub võimalikult sarnaselt Pythoni sisseehitatud vahemikufunktsiooniga `range`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 20:**\n", "\n", "Loo generaator `minu_enumerate` mis käitub sarnaselt Pythoni sisseehitatud funktsiooniga `enumerate`. Loodud generaator peab töötama *ainult* järgmises tsüklis:\n", "```python\n", "for i, el in minu_enumerate([5, 4, 3, 2, 1]):\n", " print('Minu enumerate:', (i, el))\n", "```\n", "Koonsooli väljund peab olema *sarnane* alloleva tsükli väljundiga.\n", "```python\n", "for i, el in enumerate([5, 4, 3, 2, 1]):\n", " print('enumerate:', (i, el))\n", "```\n", "Oodatav tulemus:\n", "```\n", "Minu enumerate: (0, 5)\n", "Minu enumerate: (1, 4)\n", "Minu enumerate: (2, 3)\n", "Minu enumerate: (3, 2)\n", "Minu enumerate: (4, 1)\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0, 5), (1, 4), (2, 3), (3, 2), (4, 1)]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Meeldetuletuseks:\n", "list(enumerate([5, 4, 3, 2, 1])) # Mida funktsioon teeb." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 21:**\n", "\n", "Defineeri generaator mis võtab argumendina vastu meelevaldse funksiooni ning leiab selle funktsiooni iteraadid meelevaldselt valitud reaalarvulise algtimgimuse jaoks.\n", "\n", "Generaatori kontrollimiseks kasuta Ülesandes 16 kasutatud kujutuse funktsiooni, mis on endiselt kujul:\n", "$$f(x) = \\mu \\min(x, 1 - x),$$\n", "kus $\\mu \\in [0, 2]$ on parameeter.\n", "\n", "Näidisvastus: Kui valida algtingimuseks $x_0 = 0.1$, parameetri $\\mu = 2$ ja teostada $10$ iteraatsiooni siis:\n", "```\n", "0.1\n", "0.2\n", "0.4\n", "0.8\n", "0.3999999999999999\n", "0.7999999999999998\n", "0.40000000000000036\n", "0.8000000000000007\n", "0.3999999999999986\n", "0.7999999999999972\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 22:**\n", "\n", "Loo lõpmatu generaator mis genereerib Fibonacci jada liikmeid. Meeldetuletuseks: Funktsioon mis leiab `n`-da jada liikme ja kood mis väljastab konsooli kümme esimest liiget on kujul:\n", "```python\n", "def fib(n):\n", " '''Leian fibonacci n-da jada liikme.'''\n", " if n <= 2:\n", " return 1\n", " a = b = 1\n", " for i in range(n - 2):\n", " a, b = b, a + b\n", " return b\n", "\n", "for i in range(1, 11): # Esimesed 10 liiget.\n", " print(fib(i))\n", "```\n", "Oodatav tulemus:\n", "```\n", "1\n", "1\n", "2\n", "3\n", "5\n", "8\n", "13\n", "21\n", "34\n", "55\n", "```\n", "või\n", "```\n", "1 1 2 3 5 8 13 21 34 55 \n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.0" } }, "nbformat": 4, "nbformat_minor": 4 }