{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "name": "python-bevezeto.ipynb", "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false }, "colab": { "name": "kl_vezerlok_fv.ipynb", "provenance": [], "collapsed_sections": [ "6oIPg7dmQrFw", "uHARN1v5QrGs", "uQPgOkQfQrHL", "5nlrZaVrQrHx", "dB79OWLkQrID" ], "toc_visible": true, "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "m8AjWrbBQrFK", "colab_type": "text" }, "source": [ "# Python vezérlőutasítások, függvények, ..\n", "\n", "Bonyolultabb programok sok egymás után következő utasítás végrehajtásából állnak. Azt, hogy melyik utasítás mikor kerül végrehajtásra, a vezérlőutasítások határozzák meg. Minden program nyelvben két alapvető vezérlő utasítás mindenképpen megtalálható, a feltételválasztó és a ciklusszervező." ] }, { "cell_type": "markdown", "metadata": { "id": "tw8brNpRQrFL", "colab_type": "text" }, "source": [ "## Az `if` utasítás\n", "Az **`if`** utasítás tölti be a legtöbb nyelvben a feltételválsztó utasítás szerepét. Segítségével határozhatjuk meg, hogy bizonyos körülmények teljesülésekor a program a megfelelő utasításokat hajtsa végre. \n", "Lássunk erre egy példát:" ] }, { "cell_type": "code", "metadata": { "id": "JYOPzwKXQrFN", "colab_type": "code", "colab": {}, "outputId": "e36f3342-415e-481d-c2f6-d136ff85f71f" }, "source": [ "if 2+2==4:\n", " print('Minden OK')\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Minden OK\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "IzEg6DeBQrFR", "colab_type": "text" }, "source": [ "
Figyelem, a második sort beljebb húztuk! A behúzás a Python jelölése az utasítások csoportosítására!
A behúzás mértékére általánosan bevett szokás, hogy a szintaktikailag alacsonyabb szintű programrészek négy szóközzel beljebb vannak tolva. Ha tehát két **`if`** utasítást ágyazunk egymásba, akkor a második által teljesítendő utasítások 8 szóközzel lesznek beljebb húzva. Ez a behúzás a `jupyter` notebook kódcelláiban automatikusan is megtörténik. A `:` utáni ENTER leütése után a következő sor 4 szóközzel kerül beljebb, további ENTER leütése hatására a hierarchia azonos szintjén kezdjük az új sort. Ha feljebb szeretnénk lépni, akkor a behúzást ki kell törölni. A C, C++, Java nyelvekben kapcsos zárójeleket {} használnak az egybefüggő kódrészletek elkülönítésére, kb. így: \n", "```C\n", "if (i==10) {\n", "print i\n", "}\n", "```\n", "A FORTRAN nyelvben az *END* szócska kiírása jelzi a kódrészlet végét. A pythonban a kettőspont (\":\"), majd szóközökkel beljebb írt sorok szolgálnak erre. Ha más programokból másolunk át részleteket, figyeljünk arra, hogy a behúzás helyett nem TAB-ot használ-e. (A TAB néhol megengedett, de kerülendő. A modern [python kódolási stílusirányzat](http://django.arek.uni-obuda.hu/python3-doc/html/tutorial/controlflow.html#intermezzo-kodolasi-stilus) minden behúzást, ahogy azt fent is említettük, 4 szóköznek javasol.)" ] }, { "cell_type": "code", "metadata": { "id": "2rzJBxfcQrFS", "colab_type": "code", "colab": {}, "outputId": "d5a1439b-4879-4332-af18-c8b4f66dae86" }, "source": [ "today='Hétfő';\n", "time='12:00';\n", "if today=='Hétfő':\n", " if time=='12:00':\n", " print('Üdv délben python!')\n", " else:\n", " print('Üdv python!')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Üdv délben python!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "68SyI_O0QrFV", "colab_type": "text" }, "source": [ "Bonyolultabb kritériumszerkezetet az **`else`** és **`elif`** parancsok segítségével konstruálhatunk:" ] }, { "cell_type": "code", "metadata": { "id": "zM9zCSHuQrFW", "colab_type": "code", "colab": {}, "outputId": "e030a1e6-6c35-4aab-8adf-a6c789880ff2" }, "source": [ "x = 1\n", "if x < 0:\n", " x = 0\n", " print('Negatív, csere nullára')\n", "elif x == 0:\n", " print('Nulla')\n", "elif x == 1:\n", " print('Egy')\n", "else:\n", " print('Egynél több.')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Egy\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "OUbbgmzEQrFZ", "colab_type": "text" }, "source": [ "Hiányozhat, de lehet egy vagy akár egynél több **`elif`** rész, az **`else`** rész szintén elmaradhat. Az **`elif`** kulcsszó – amely az ‘else if’ rövidítése – hasznos a felesleges behúzások elkerülésre. Egy **`if`** ...**`elif`** ... **`elif`** ... sor helyettesíti a más nyelvekben található `switch` és `case` utasításokat." ] }, { "cell_type": "markdown", "metadata": { "id": "L6Gt9vBMQrFa", "colab_type": "text" }, "source": [ "## A **`for`** utasítás\n", "A számítógépek legfontosabb tulajdonságai közt szerepel az, hogy nagyon gyorsak és \"fáradhatatlanok\". Olyan feladatok megoldásában a leghatékonyabbak, amikor a feladatot kevés munkával meg lehet fogalmazni (\"az alkotó pihen\") de végrehajtása nagyon sok ismétlést, iterációt igényel (\"a gép forog\"). Az iteráció (angol: iterate) azt jelenti, hogy például egy lista elemein egyesével végigmegy a program, és műveleteket végez el rajtuk. A Python-ban az egyik erre használható utasítás a **`for`** parancs (magyarul kb. a ...-ra, azaz pl. a hét minden napjára, a lista minden elemére):" ] }, { "cell_type": "code", "metadata": { "id": "avhx5eYZQrFb", "colab_type": "code", "colab": {} }, "source": [ "days_of_the_week = [\"Vasárnap\",\"Hétfő\",\"Kedd\",\"Szerda\",\"Csütörtök\",\"Péntek\",\"Szombat\"]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "1buoNn5AQrFe", "colab_type": "code", "colab": {}, "outputId": "ab9ad190-786b-4fc3-dcf9-a90d77494b13" }, "source": [ "for day in days_of_the_week:\n", " print(day)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Vasárnap\n", "Hétfő\n", "Kedd\n", "Szerda\n", "Csütörtök\n", "Péntek\n", "Szombat\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "BmlcxyWJQrFh", "colab_type": "text" }, "source": [ "Ez a kódrészlet a `days_of_the_week` listán megy végig, és a meglátogatott elemet hozzárendeli a `day` változóhoz, amit *ciklusváltozónak* is neveznek. Ezek után mindent végrehajt, amit a beljebb tabulált (angolul: *indented*) parancsblokkban írtunk (most csak egy `print` utasítás), amihez felhasználhatja a ciklusváltozót is. Miután vége a beljebb tabulált régiónak, kilép a ciklusból.\n", "Annak semmi jelentősége nincs, hogy a példában a **day** nevet adtuk az iterációban szereplő *ciklusváltozó*nak. A program semmit se tud az emberi időszámításról, például, hogy a hétben napok vannak és nem kiscicák:" ] }, { "cell_type": "code", "metadata": { "id": "F8BTpJRDQrFi", "colab_type": "code", "colab": {}, "outputId": "05ae954b-6006-4b8a-f1a1-e1a80e20ecc0" }, "source": [ "for macska in days_of_the_week:\n", " print(macska)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Vasárnap\n", "Hétfő\n", "Kedd\n", "Szerda\n", "Csütörtök\n", "Péntek\n", "Szombat\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ZHbWWNdNQrFk", "colab_type": "text" }, "source": [ "A ciklus utasításblokkja állhat több utasításból is:" ] }, { "cell_type": "code", "metadata": { "id": "6ar2Ho5OQrFl", "colab_type": "code", "colab": {}, "outputId": "1479cb52-6bef-42ed-ba85-3bcb52609bf2" }, "source": [ "for day in days_of_the_week:\n", " statement = \"Hát \" + day + ' van ma'\n", " print(statement)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Hát Vasárnap van ma\n", "Hát Hétfő van ma\n", "Hát Kedd van ma\n", "Hát Szerda van ma\n", "Hát Csütörtök van ma\n", "Hát Péntek van ma\n", "Hát Szombat van ma\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "I3cURySWQrFo", "colab_type": "text" }, "source": [ "A **`range()`** parancs remekül használható, ha a **`for`** ciklusban adott számú műveletet szeretnénk elvégezni:" ] }, { "cell_type": "code", "metadata": { "id": "zfsoUNc_QrFp", "colab_type": "code", "colab": {}, "outputId": "52028161-8e7e-4e21-a9cd-6709e499d379" }, "source": [ "for i in range(8):\n", " print(i,\" szer \",i ,\"az pontosan \",i*i)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "0 szer 0 az pontosan 0\n", "1 szer 1 az pontosan 1\n", "2 szer 2 az pontosan 4\n", "3 szer 3 az pontosan 9\n", "4 szer 4 az pontosan 16\n", "5 szer 5 az pontosan 25\n", "6 szer 6 az pontosan 36\n", "7 szer 7 az pontosan 49\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ijycqLJmQrFr", "colab_type": "text" }, "source": [ "Akkor válik mindez még érdekesebbé, ha az eddig tanult iterációt és feltételvizsgálatot kombináljuk:" ] }, { "cell_type": "code", "metadata": { "id": "dEuFH23pQrFs", "colab_type": "code", "colab": {}, "outputId": "611fdb28-17a3-4668-de02-422ad8494f68" }, "source": [ "for day in days_of_the_week:\n", " statement = \"Hát \" + day + 'ma van'\n", " print(statement)\n", " if day == \"Vasárnap\":\n", " print (\" Aludhatunk tovább\")\n", " elif day == \"Szombat\":\n", " print (\" Mulatság, ..\")\n", " else:\n", " print (\" Dolgozni kell\")" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Hát Vasárnapma van\n", " Aludhatunk tovább\n", "Hát Hétfőma van\n", " Dolgozni kell\n", "Hát Keddma van\n", " Dolgozni kell\n", "Hát Szerdama van\n", " Dolgozni kell\n", "Hát Csütörtökma van\n", " Dolgozni kell\n", "Hát Péntekma van\n", " Dolgozni kell\n", "Hát Szombatma van\n", " Mulatság, ..\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "1y3UqO8xQrFv", "colab_type": "text" }, "source": [ "Figyeljük meg, a fenti példában hogy ágyazódik egymás alá a **`for`** és az **`if`**! " ] }, { "cell_type": "markdown", "metadata": { "id": "6oIPg7dmQrFw", "colab_type": "text" }, "source": [ "## Egy példaprogram: Fibbonacci-sorozat\n", "A [Fibonacci](http://en.wikipedia.org/wiki/Fibonacci_number)-sorozat első két eleme 0 és 1, majd a következő elemet mindig az előző kettő összegéből számoljuk ki: 0,1,1,2,3,5,8,13,21,34,55,89,...\n", "\n", "Ha nagyobb $n$ értékekre is ki akarjuk számolni a sorozatot, ez kiváló feladat lehet egy fáradhatatlan és gyors számítógépnek!" ] }, { "cell_type": "code", "metadata": { "id": "Niov7lYnQrFw", "colab_type": "code", "colab": {}, "outputId": "f6381314-8844-47fc-a37f-87304ebfaa32" }, "source": [ "n = 10 # ennyi elemet szeretnénk meghatározni\n", "sequence = [0,1] # az első két elem\n", "for i in range(2,n): # számok 2-től n-ig, Figyelni kell, hogy n ne legyen kisebb mint 2!!\n", " sequence.append(sequence[i-1]+sequence[i-2])\n", "print (sequence)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "iRIlRhP9QrFz", "colab_type": "text" }, "source": [ "Nézzük végig lépésről lépésre! Először $n$ értékét, azaz a kiszámolandó sorozat hosszát állítjuk be 10-re. A sorozatot majdan tároló listát **`sequence`**-nek neveztük el, és *inicializáltuk* az első két értékkel. A \"kézi munka\" után következhet a gép automatikus munkája, az iteráció.\n", "\n", "Az iterációt 2-vel kezdjük (ez ugye a 0-s indexelés miatt a 3. elem lesz, hisz az első kettőt már mi megadtuk) és $n$-ig, a megadott listaméretig számolunk. \n", "\n", "A ciklus törzsében az addig kiszámolt lista végére hozzátűzzük (**`append`** parancsról kicsit bővebben [itt](http://django.arek.uni-obuda.hu/python3-doc/html/tutorial/datastructures.html#a-listakrol-bovebben)) az előző két tag összegét. A ciklus vége után kiíratjuk az eredményt." ] }, { "cell_type": "markdown", "metadata": { "id": "1f5AMyFCQrF0", "colab_type": "text" }, "source": [ "# Függvények\n", "\n", "Számos programozási nyelvben szokás a felhasználó által megalkotott bonyolultabb utasításokat függvényekbe szervezni. Jól megírt függvények használata általában rövidebbé és jobban átláthatóvá teszi a programokat.\n", "\n", "## Függvények deklarálása\n", "Ha más hosszúságú sorozatot szeretnénk, átmásolhatjuk a fenti kódot egy új cellába, és átírhatjuk az **`n=10`**-et pl. **`n=100`**-ra. Van azonban egy hatékonyabb módszer, új *függvény*-ként definiálhatjuk a **def** utasítás segítségével:" ] }, { "cell_type": "code", "metadata": { "id": "Fx4fg7b0QrF1", "colab_type": "code", "colab": {} }, "source": [ "def fibonacci(sequence_length):\n", " \"A Fibonacci sorozat elso *sequence_length* darab eleme\" # ez csak a 'help'-hez kell\n", " sequence = [0,1]\n", " if 0 < sequence_length < 3:\n", " return sequence[:sequence_length]\n", " for i in range(2,sequence_length): \n", " sequence.append(sequence[i-1]+sequence[i-2])\n", " return sequence" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Tcesp3rFQrF4", "colab_type": "text" }, "source": [ "Most már *meghívhatjuk* a **`fibonacci()`** függvényt különböző hosszakra:" ] }, { "cell_type": "code", "metadata": { "id": "lvWd1OETQrF5", "colab_type": "code", "colab": {}, "outputId": "f27fd035-658e-4aa0-fd6a-976f9da2e35a" }, "source": [ "fibonacci(5)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[0, 1, 1, 2, 3]" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "markdown", "metadata": { "id": "1BX69HBtQrF_", "colab_type": "text" }, "source": [ "Elemezzük a fenti kódot! A már megszokott módon a kettőspont és behúzás határozza meg a függvénydefinícióhoz tartozó kódblokkot. \n", "A 2. sorban idézőjelek közt szerepel a [\"**docstring**\"](http://django.arek.uni-obuda.hu/python3-doc/html/tutorial/controlflow.html#a-dokumentacios-karakterlancok), ami a függvény működését magyarázza el röviden, és később a **help** paranccsal hívható elő:" ] }, { "cell_type": "code", "metadata": { "id": "Vjlik-dcQrGA", "colab_type": "code", "colab": {}, "outputId": "d2e4ce52-30d9-43a7-983c-f35273e30a11" }, "source": [ "help(fibonacci)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Help on function fibonacci in module __main__:\n", "\n", "fibonacci(sequence_length)\n", " A Fibonacci sorozat elso *sequence_length* darab eleme\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "jZ_e6y_BQrGC", "colab_type": "text" }, "source": [ "A notebookos környezetben a docstring a ? segítségével is elérhető:" ] }, { "cell_type": "code", "metadata": { "id": "kZRqAaW4QrGD", "colab_type": "code", "colab": {} }, "source": [ "?fibonacci" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ITzLAEwEQrGG", "colab_type": "text" }, "source": [ "A `docstring`-et `jupyter` környezetben úgy is megtekinthetjük, ha egyes függvények hasában, azaz a zárójelek között SHIFT+TAB-ot nyomunk. Próbáld ki ezt az alábbi cellán (annélkül hogy lefuttatnád azt)!" ] }, { "cell_type": "code", "metadata": { "id": "1t9zVopxQrGI", "colab_type": "code", "colab": {}, "outputId": "70ba0177-8766-4c9d-c8cc-f6b2f775165f" }, "source": [ "fibonacci()" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "fibonacci() missing 1 required positional argument: 'sequence_length'", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m