{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "collapsed_sections": [ "vmt-OGHZ0DO1" ], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Přednáška 7. 10. 2022\n", "\n", "* **Kdykoliv nebudete něčemu rozumět, ptejte se**\n", " * Platí i mimo přednášky (e-mailem: 324776@mail.muni.cz, případně se domluvíme na konzultaci osobně nebo telekonferenčně)\n", "* Studijní materiály\n", "* Letmý úvod do algoritmizace, Pythonu a Google Colab (ne nutně v tomto pořadí)\n", "* Příklady z přednášky 30. 9.\n", "* Otevírání souborů uložených na Google Disku\n", "* Další zdroje pro zájemce" ], "metadata": { "id": "8P-I0zVpq-3H" } }, { "cell_type": "markdown", "source": [ "## Google Colab\n", "\n", "* Textová pole a pole pro kód\n", "* Formátování textu pomocí Markdownu (textová pole)\n", "* Spouštění kódu (matematické operace)\n", " * Shift + Enter (přechod na další buňku, případně její vytvoření)\n", " * Ctrl + Enter\n", " * Může se lišit podle operačního systému, případně podle použitého prohlížeče\n", "* Klávesové zkratky\n", " * Enter, Esc\n", " * a, b\n", " * Ctrl + m d\n", " * Ctrl + m m\n" ], "metadata": { "id": "77aXBcjz3ikK" } }, { "cell_type": "code", "source": [], "metadata": { "id": "u4ggVlBCC7ed" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "**text**\n", "*kurziva*\n", "\n", "* odrážka\n", "* odrážka 2\n", "\n", "# nadpis 1" ], "metadata": { "id": "J5sPvZK3hpaf" } }, { "cell_type": "code", "source": [ "7 + 3\n", "12 * 2\n", "48" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hjRV0GMhi5dH", "outputId": "f55ca30b-514e-4ce9-f84f-5bb8f10b1d4b" }, "execution_count": 2, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "48" ] }, "metadata": {}, "execution_count": 2 } ] }, { "cell_type": "markdown", "source": [ "## Python\n", "\n", "### Základní datové typy a operace\n", "\n", "#### Čísla\n", "\n", "* Sčítání, odčítání, dělení, násobení:\n", " * `3 + 8`\n", " * `15.3 - 20.4`\n", " * `18 * 3.2`\n", " * `33.1 / 15`\n", "* Porovnávání (vrací `True`/`False`, tj. boolovské hodnoty)\n", " * `13 > 8`\n", " * `0 <= -1`\n", " * `3 == 4`\n", " * `5 != 5.0`\n" ], "metadata": { "id": "5MylQU1N6fw-" } }, { "cell_type": "code", "source": [ "3 ** (1/2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "YWd-AzDR-axQ", "outputId": "b9d6b0fe-ebed-472e-d038-7ad8862bae52" }, "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1.7320508075688772" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "code", "source": [ "3 == 3.0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Suop2bEWj76p", "outputId": "8891dc57-dd99-46a4-834c-338bd291acdf" }, "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "markdown", "source": [ "#### Vsuvka: Chybové hlášky\n", "\n", "* `10 / 0`" ], "metadata": { "id": "ymP_zO8uDPMN" } }, { "cell_type": "code", "source": [ "10 / 0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 164 }, "id": "ieqfffWaDi6A", "outputId": "10f92182-ff5a-4762-af0b-af0e66a92197" }, "execution_count": 9, "outputs": [ { "output_type": "error", "ename": "ZeroDivisionError", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mZeroDivisionError\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[0;36m10\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } ] }, { "cell_type": "markdown", "source": [ "#### Textové řetězce\n", "\n", "* Řetězce:\n", " * `\"aaa\"`\n", " * `'bbb'`\n", " * ```python\n", " \"\"\"aaa bbb\n", " ccc ddd\"\"\"\n", " ```\n", " * ```python\n", " (\n", " \"aaa bbb \"\n", " \"ccc ddd\"\n", " )\n", " ```\n", "* Zřetězení více řetězců:\n", " * `\"aaa\" + \"bbb\"`\n", " * `\"ccc\" * 5`\n", "* Porovnání:\n", " * `\"aaa\" == 3 * \"a\"`\n", "* Podřetězec:\n", " * `\"abcde\"[1:4]`\n", " * `\"abcde\"[::-1]`\n", " * `\"cd\" in \"abcde\"`" ], "metadata": { "id": "Qqj0AOe3-blQ" } }, { "cell_type": "code", "source": [ "\"aaa\" == 'aaa'" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BqZhyrB9llo2", "outputId": "0bf3f8a6-fba0-4f86-8972-d30338c96b7e" }, "execution_count": 15, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 15 } ] }, { "cell_type": "code", "source": [ "\"a\" + \"b\" + \"c\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "_PlClspMmJ7I", "outputId": "d86bfc9d-fc87-40cb-b954-15f4ce56d678" }, "execution_count": 21, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'abc'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 21 } ] }, { "cell_type": "code", "source": [ "20 * \"-\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "PdIkozFWmVnO", "outputId": "3d648d8e-daea-4abd-dfa4-dc04d76a4797" }, "execution_count": 22, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'--------------------'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 22 } ] }, { "cell_type": "code", "source": [ "\"abcde\"[::-1]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "ArcyzvYXmeCv", "outputId": "aebd89e1-af6b-4b4a-9a05-718d5325a313" }, "execution_count": 24, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'edcba'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 24 } ] }, { "cell_type": "code", "source": [ "\"ab\" in \"abcde\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ldlMhqKnoFRZ", "outputId": "a50acad0-a74a-40ef-da17-30966319b931" }, "execution_count": 25, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 25 } ] }, { "cell_type": "code", "source": [ "\"\"\"\n", "\"ahoj,\" řekl\n", "\"\"\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "zZIvNYTElnjW", "outputId": "138c8642-3150-43fe-f6fc-3a90465c802a" }, "execution_count": 18, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'\\n\"ahoj,\" řekl\\n'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 18 } ] }, { "cell_type": "code", "source": [ "\"\"\"'Řekl: \"ahoj\"'\n", "a pak...\"\"\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "sHnBS11bImvs", "outputId": "6dc91122-2051-4952-ce0d-dcac5818df5f" }, "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'\\'Řekl: \"ahoj\"\\'\\na pak...'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "code", "source": [ "(\n", " \"asfasfasf\"\n", " \"asfsfguíhkjgniu\"\n", ")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "vO0qD-YIlReF", "outputId": "358d0ea1-aeb0-4078-a97d-25f0e4681f5a" }, "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'asfasfasfasfsfguíhkjgniu'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 13 } ] }, { "cell_type": "markdown", "source": [ "### Použití funkcí\n", "* Výpis na výstup:\n", " * `print(\"bbb\")`\n", " * `print(\"a\", \"b\", \"c\", sep=\",\")`\n", "* Výběr prvku s maximální hodnotou:\n", " * `max(3, 5, 8, 4)`\n", "* Zápis vycházející z objektově orientovaného programování (místo označení *funkce* se v těchto případech používá označení *metoda*):\n", " * `\"ABcDE\".lower()`\n", " * `(3.1).is_integer()`" ], "metadata": { "id": "1iQLNyDADnfk" } }, { "cell_type": "code", "source": [ "print(\"a\", \"b\", \"c\", sep=\"\\n\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "A090WF-_GXAJ", "outputId": "4162d124-9d26-4907-a2ff-3fc30245ca3a" }, "execution_count": 29, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "a\n", "b\n", "c\n" ] } ] }, { "cell_type": "code", "source": [ "print(3 + 4)\n", "2 + 3\n", "(3.1).is_integer()\n", "print(\n", " \"\"\"\n", " asfasf\n", " sfasdas\n", " asfasf\n", " \"\"\"\n", ")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ycFFnSFLpVs9", "outputId": "cd7a9e63-e4b5-4086-8361-48b0862ab466" }, "execution_count": 35, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "7\n", "\n", " asfasf\n", " sfasdas\n", " asfasf\n", " \n" ] } ] }, { "cell_type": "code", "source": [ "3.1.is_integer" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zESR61c_qcKg", "outputId": "9a65c80f-b2a9-4a34-dc72-cb027f89590e" }, "execution_count": 38, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 38 } ] }, { "cell_type": "code", "source": [ "\"\"\"\n", " asfasf\n", " sfasdas\n", " asfasf\n", "\"\"\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 37 }, "id": "INt5YpKgqKgh", "outputId": "8b68afac-673e-4e99-c2e3-f2dc176bcffa" }, "execution_count": 36, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'\\n asfasf\\n sfasdas\\n asfasf\\n'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 36 } ] }, { "cell_type": "markdown", "source": [ "### Proměnné\n", "* Struktury, které můžou obsahovat přiřazenou hodnotu\n", "* Pojmenování - řetězce alfanumerických znaků + podtržítek (bez uvozovek)\n", "* ```python\n", "var_1 = 5\n", "print(var_1 * var_1)\n", "var_1 += 4\n", "var_1\n", "```\n", "* ```python\n", "var_2 = (\n", " \"abcdef\"\n", " \"ghijkl\"\n", " \"mnopqr\"\n", ")\n", "print(var_2[5:8])\n", "```\n", "* Do proměnných lze přiřadit i funkci (v podstatě dojde k vytvoření aliasu)\n", "* ```python\n", "tisk_prvku = print # je potřeba přiřazovat funkci bez závorek!\n", "tisk_prvku(1, 3, 5, 10)\n", "```" ], "metadata": { "id": "JWdQa6eKGXkB" } }, { "cell_type": "code", "source": [ "var_2 = (\n", " \"abcdef\"\n", " \"ghijkl\"\n", " \"mnopqr\"\n", ")\n", "print(var_2[5:8])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "agwLxfTOLLgZ", "outputId": "edb5d220-cacc-4edf-d3eb-c02861457d8b" }, "execution_count": 40, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "fgh\n" ] } ] }, { "cell_type": "code", "source": [ "var_2 += \"g\"\n", "# var_2 = var_2 + \"g\"" ], "metadata": { "id": "WbVOQBHTsIUo" }, "execution_count": 46, "outputs": [] }, { "cell_type": "code", "source": [ "var_2 += \"x\"\n", "print(var_2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vwihCmbZs54-", "outputId": "b4a266b1-ef52-4897-acfa-7343aeed5a83" }, "execution_count": 48, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "abcdefghijklmnopqrgx\n" ] } ] }, { "cell_type": "markdown", "source": [ "### Komentáře\n", "* Dokumentace kódu pro pozdější pochopení\n", "* \"Vypnutí\" nepotřebných řádků\n" ], "metadata": { "id": "AUGI7FqoH_XN" } }, { "cell_type": "code", "source": [ "\"\"\"tohle je\n", "víceřádkový komentář\"\"\"\n", "\n", "# na dalším řádku se do proměnné var_1 přiřadí hodnota 5\n", "var_1 = 5\n", "print(var_1 ** 2) # vypíše druhou mocninu proměnné var_1\n", "# var_1 += 4\n", "var_1" ], "metadata": { "id": "pWi1025QH-6b" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Podmínky\n", "* \"Řízení toku programu\"\n", "* Odsazení vnořeného kódu (tab, mezery), vnořený kód je vyhodnocený pouze pokud je splněná vstupní podmínka bloku\n", "* ```python\n", "number = 3\n", "if (number % 2) == 0: # test, jestli je číslo sudé (% je operace modulo, zbytek po dělení)\n", " print(f\"číslo {number} je sudé!\")\n", "```\n", "* ```python\n", "age = 42\n", "if age >= 40:\n", " print(f\"Ve věku {age} let se může kandidovat do Senátu, nebo na prezidenta.\")\n", "elif age >= 18:\n", " print(f\"Ve věku {age} let se může volit.\")\n", "elif age >= 6:\n", " print(f\"Ve věku {age} let se může chodit do školy.\")\n", "else:\n", " print(f\"Ve věku {age} se nemůže ani chodit do školy, ani volit, ani kamkoliv kandidovat.\")\n", "```\n", "* Logické spojky: `and`, `or`, `not`\n", "* Zanořování" ], "metadata": { "id": "F4jkVlkqJdIE" } }, { "cell_type": "code", "source": [], "metadata": { "id": "w2--rflUUlXR" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Cykly\n", "* Repetitivní volání stejného kódu\n", "* Iterace přes prvky sekvence (například znaky v řetězci):\n", "* ```python\n", "position = 0\n", "for character in \"abcde\":\n", " position += 1\n", " print(f\"Znak {character} se nachází v řetězci na pozici {position}.\")\n", "```\n", "* ```python\n", "for position, character in enumerate(\"abcde\"):\n", " print(f\"Znak {character} se nachází v řetězci na pozici {position + 1}.\")\n", "```" ], "metadata": { "id": "_eh2hkIOUl2K" } }, { "cell_type": "code", "source": [], "metadata": { "id": "gJZD8vRwYDl3" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Komplexní datové struktury\n", "#### Seznam:\n", "```python\n", "list_1 = [\"a\", \"b\", \"c\", \"d\", 3, , 1]\n", "list_2 = [\"d\", 2]\n", "print(len(list_1)\n", "print(list_1[4])\n", "print(list_1[::-1] + list_2)\n", "print(\"b\" in list_1)\n", "for entry in list_2:\n", " if entry in list_1:\n", " print(f\"Prvek {entry} ze seznamu list_2 se nachází i v seznamu list_1\")\n", " else:\n", " print(f\"Prvek {entry} se v seznamu list_1 nenachází.\")\n", "```" ], "metadata": { "id": "UPeH9ULtb_CH" } }, { "cell_type": "code", "source": [], "metadata": { "id": "jTSATiygdcPK" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "#### Slovník\n", "```python\n", "dict_1 = {\n", " \"a\": 3,\n", " \"b\": 1,\n", " 0: 8\n", "}\n", "dict_2 = dict(x=3, y=28)\n", "dict_3 = dict((\"alpha\", \"a\"), (\"beta\", \"b\")) # (\"alpha\", \"a\") je struktura \"n-tice,\" tuple\n", "print(len(dict_1))\n", "print(dict_2.keys())\n", "print(dict_2.values())\n", "print(dict_3[\"alpha\"])\n", "if \"gamma\" in dict_3:\n", " print(dict_3[\"gamma\"])\n", "\n", "for key, value in dict_3.items():\n", " print(f\"Řecké písmeno {key} odpovídá písmenu {value} v latince.\")\n", "\n", "print(dict_3.get(\"delta\", \"Neznámé písmeno\"))\n", "```" ], "metadata": { "id": "2iZexexWdcy9" } }, { "cell_type": "code", "source": [], "metadata": { "id": "a9QacFEpf4fI" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Definice funkcí\n", "* Opakované použití částí kódu v různých místech programu\n", "* Zvyšuje čitelnost\n", "* ```python\n", "def logical_or(var_1, var_2):\n", " return f\"({var_1} | {var_2})\"\n", "```\n", "* ```python\n", "def logical_xor(var_1=\"A\", var_2=\"B\"):\n", " \"\"\"A XOR B je pravdivé právě tehdy, když je pravdivé pouze A nebo pouze B\n", " (tj. buď A, nebo B, ne A i B současně).\n", " \"\"\"\n", " return f\"(({var_1} & -{var_2}) | (-{var_1} & {var_2}))\"\n", "```" ], "metadata": { "id": "nUc9zdDof4-O" } }, { "cell_type": "code", "source": [], "metadata": { "id": "84J2PequizJa" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "### Používání modulů\n", "* Někdy je užitečné použít funkci, kterou už někdo napsal\n", "* Spousta funkcí je dostupná přímo v \"čistém\" Pythonu, například `print()`, `sum()`, `round()`, `len()`, `dict()` a další\n", "* Některé funkce je potřeba importovat z modulů\n", "* Moduly mohou být součástí standardní knihovny (tj. předinstalované):\n", " * Modul `math` pro různé komplexnější matematické operace\n", " * Modul `random` pro práci s náhodnými čísly\n", " * ```python\n", " import math\n", "\n", " print(math.sqrt(169))\n", " ```\n", " * ```python\n", " from math import sqrt\n", "\n", " print(sqrt(196))\n", " ```\n", "* Další moduly je potřeba předinstalovat - k tomu v Google Colab slouží speciální příkaz `%pip install `:\n", " * `%pip install nltk`\n", " * `%pip install truth-table-generator`\n" ], "metadata": { "id": "6U7hHhiLizz6" } }, { "cell_type": "code", "source": [ "from math import sqrt\n", "\n", "print(sqrt(196))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "v9lDqYbqklf_", "outputId": "d32f48cd-668e-4a54-f381-c28ca5d11a43" }, "execution_count": 52, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "14.0\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Algoritmizace\n", "\n", "* Rozpad problému na jednotlivé kroky, příkazy\n", "* Jak byste pomocí jednoduchých kroků popsali proces vaření čaje (pro jednoduchost si vystačíme s pytlíkovým)?\n", "* Jak byste naimplementovali funkci, která má dva vstupní argumenty - první z nich obsahuje seznam slov a druhý obsahuje jedno písmeno. Tato funkce vrátí seznam všech takových slov ze vstupního seznamu, která začínají daným písmenem.\n", " * první písmeno řetězce (slova) můžete získat pomocí indexu (`slovo[0]`)\n", " * do seznamu můžete přidávat pomocí metody `append`:\n", " * ```python\n", " suda_cisla = []\n", " for cislo in range(20):\n", " if cislo % 2 == 0:\n", " suda_cisla.append(cislo)\n", " ```" ], "metadata": { "id": "qrW_UJ9FkmD2" } }, { "cell_type": "code", "source": [], "metadata": { "id": "l82Nikg_nWnf" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Zadávání \"programovacích\" domácích úloh\n", "* Zadání bude vždy ve formě ipynb notebooku, do kterého doplníte vlastní řešení a odevzdáte do odevzdávárny\n", "* Zadání, co má výsledný kód dělat (včetně doporučení, jaké existující knihovny/moduly a funkce použít)\n", "* Doplnění vynechaných částí kódu v předpřipraveném Colab Notebooku\n", "* Oprava připraveného kódu tak, aby odpovídal zadání, například:\n", " * ```python\n", " def even(number):\n", " \"\"\"Funkce even vrátí True, pokud je číslo number sudé. Pokud\n", " je číslo liché, vrátí False\"\"\"\n", "\n", " return number % 2 == 1\n", " ```\n", " * Zmíněná funkce ve skutečnosti vrací `True` pro lichá čísla a `False` pro sudá, řešením je přepsat poslední řádek buď na `return number % 2 != 1`, nebo na `return number % 2 == 1`\n", "* Zadání může pracovat s výrokovou logikou, kdy výrok přepíšete do odpovídající formule a s pomocí příslušných nástrojů (viz colab notebooky truth_table.ipynb a nltk_prover.ipynb ve studijních materiálech)" ], "metadata": { "id": "i3QpZzjOnXVJ" } }, { "cell_type": "markdown", "source": [ "## Další zdroje\n", "\n", "* Dokumentace Pythonu: https://www.python.org/doc/\n", "* Kurz pro začátečníky od Pyladies (česky): https://naucse.python.cz/course/pyladies/\n", "* Videokurzy:\n", " * Kurz od freeCodeCamp.org: https://www.youtube.com/watch?v=rfscVS0vtbw\n", " * Video o 25 zlozvycích, kterých je dobré se zbavit: https://www.youtube.com/watch?v=qUeud6DvOW\n", "* Knížka o automatizaci repetitivních úloh pomocí Pythonu: https://automatetheboringstuff.com\n", "* Regulární výrazy:\n", " * https://www.rexegg.com/regex-quickstart.html\n", " * Interpret regulárních výrazů: https://regexr.com\n", "* Knížka o analýze dat pomocí Pythonu: https://wesmckinney.com/book/\n", "* Knížka Natural Language Processing with Python: https://www.nltk.org/book/\n", "* Jak psát \"hezky\" (Python style guide): https://peps.python.org/pep-0008/" ], "metadata": { "id": "vmt-OGHZ0DO1" } } ] }