{ "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.4" }, "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_py_okt_02.ipynb", "provenance": [], "collapsed_sections": [ "kxWFfJImTgwV", "wveDqgrjTgw7", "ZRIZU49zTgxN", "bwWsc9rbTgxn", "4Ltl9vrOTgxx" ], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "sKM1oNgYTgv3", "colab_type": "text" }, "source": [ "

\n", " \n", " \n", "

\n", "\n", "\n", "

\n", "\n", "\n", "\n", "# Python alapok 2\n", "\n", "\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "HcKZkMVjTgv5", "colab_type": "text" }, "source": [ "# Alapvető vezérlőutasítások\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": "EF_3HOJgTgv6", "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": "jPx4O5CxTgv7", "colab_type": "code", "colab": {}, "outputId": "a6aa4977-f1f0-4eee-89cd-9ad1a310f954" }, "source": [ "if 2+2==4:\n", " print('A matematika még mindig működik')\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "A matematika még mindig működik\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "zf7FO6RfTgv-", "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": "xMvsWFqyTgv_", "colab_type": "code", "colab": {}, "outputId": "b86fabc0-d7b5-4766-fc8d-cb87f0856cc5" }, "source": [ "today='Monday';\n", "time='12:00';\n", "if today=='Monday':\n", " if time=='12:00':\n", " print('Nyomassuk a pythont!')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Nyomassuk a pythont!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "G9Z1Of4mTgwB", "colab_type": "text" }, "source": [ "Bonyolultabb kritériumszerkezetet az **`else`** és **`elif`** parancsok segítségével konstruálhatunk:" ] }, { "cell_type": "code", "metadata": { "id": "BRd1N_ppTgwC", "colab_type": "code", "colab": {}, "outputId": "76e1b96d-4093-4853-c446-da5c02d7e99c" }, "source": [ "x = 1\n", "if x < 0:\n", " x = 0\n", " print('Negatív, lecseréltem 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": "lp3khVjETgwE", "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": "mCPGS8e7TgwE", "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": "gdj2XoDjTgwF", "colab_type": "code", "colab": {} }, "source": [ "days_of_the_week = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "bNIL8dABTgwH", "colab_type": "code", "colab": {}, "outputId": "e0782e2d-407d-48c0-fd99-1118667b5a64" }, "source": [ "for day in days_of_the_week:\n", " print(day)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Sunday\n", "Monday\n", "Tuesday\n", "Wednesday\n", "Thursday\n", "Friday\n", "Saturday\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "QTJDndxQTgwJ", "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": "mrTRFSCLTgwK", "colab_type": "code", "colab": {}, "outputId": "b7e9d83e-6718-4019-fbad-985fd5945ccf" }, "source": [ "for macska in days_of_the_week:\n", " print(macska)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Sunday\n", "Monday\n", "Tuesday\n", "Wednesday\n", "Thursday\n", "Friday\n", "Saturday\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "CCH9ncEoTgwL", "colab_type": "text" }, "source": [ "A ciklus utasításblokkja állhat több utasításból is:" ] }, { "cell_type": "code", "metadata": { "id": "XWPArFD-TgwM", "colab_type": "code", "colab": {}, "outputId": "be3c958e-1d98-4556-9597-f6818056dd08" }, "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Today is Sunday\n", "Today is Monday\n", "Today is Tuesday\n", "Today is Wednesday\n", "Today is Thursday\n", "Today is Friday\n", "Today is Saturday\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "MkF9TKcTTgwO", "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": "tJfixZoHTgwP", "colab_type": "code", "colab": {}, "outputId": "71a6106f-e4c4-4822-cef0-d1c235e8a76a" }, "source": [ "for i in range(20):\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", "8 szer 8 az pontosan 64\n", "9 szer 9 az pontosan 81\n", "10 szer 10 az pontosan 100\n", "11 szer 11 az pontosan 121\n", "12 szer 12 az pontosan 144\n", "13 szer 13 az pontosan 169\n", "14 szer 14 az pontosan 196\n", "15 szer 15 az pontosan 225\n", "16 szer 16 az pontosan 256\n", "17 szer 17 az pontosan 289\n", "18 szer 18 az pontosan 324\n", "19 szer 19 az pontosan 361\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "TsgLH95vTgwR", "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": "35nEFTStTgwS", "colab_type": "code", "colab": {}, "outputId": "d351b3ff-05ea-47f3-e3c4-af20cbb5d800" }, "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)\n", " if day == \"Sunday\":\n", " print (\" Sleep in\")\n", " elif day == \"Saturday\":\n", " print (\" Do chores\")\n", " else:\n", " print (\" Go to work\")" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Today is Sunday\n", " Sleep in\n", "Today is Monday\n", " Go to work\n", "Today is Tuesday\n", " Go to work\n", "Today is Wednesday\n", " Go to work\n", "Today is Thursday\n", " Go to work\n", "Today is Friday\n", " Go to work\n", "Today is Saturday\n", " Do chores\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Nw3DHEOBTgwU", "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": "kxWFfJImTgwV", "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": "pICfToZMTgwV", "colab_type": "code", "colab": {}, "outputId": "fc791707-8d4a-4835-dfd3-49fd74e2e9db" }, "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": "C6AdWSN0TgwY", "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": "eg4Fpa5yTgwZ", "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": "jUg3S-GPTgwZ", "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": "PCjlva8aTgwb", "colab_type": "text" }, "source": [ "Most már *meghívhatjuk* a **`fibonacci()`** függvényt különböző hosszakra:" ] }, { "cell_type": "code", "metadata": { "id": "Xfu3ZZNcTgwc", "colab_type": "code", "colab": {}, "outputId": "e3c97b11-f411-4111-c3d3-f289a4cf5635" }, "source": [ "fibonacci(5)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[0, 1, 1, 2, 3]" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "1Ej0v-ccTgwe", "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": "Q5KRAzNDTgwe", "colab_type": "code", "colab": {}, "outputId": "191e69ab-797b-4ac7-f85e-7fba2cc48454" }, "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": "RInqnzWfTgwg", "colab_type": "text" }, "source": [ "A notebookos környezetben a docstring a ? segítségével is elérhető:" ] }, { "cell_type": "code", "metadata": { "id": "TdinWlodTgwh", "colab_type": "code", "colab": {} }, "source": [ "?fibonacci" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "GPc3BMsWTgwj", "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": "fdVBnv9NTgwj", "colab_type": "code", "colab": {} }, "source": [ "fibonacci()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "0wJXLppjTgwo", "colab_type": "text" }, "source": [ "A függvény kimenetelét a **`return`** kulcsszó határozza meg. Ha a fügvény definiálása során nem használtunk **`return`** utasítást akkor a függvény **None** (semmi) értéket ad vissza. Ha egy függvény lefutott, és nem hajtott végre **`return`** utasítást, akkor is **None** értékkel tér vissza. A **fibonacci** fügvény például egy listát ad vissza:" ] }, { "cell_type": "code", "metadata": { "id": "grtdo4kaTgwo", "colab_type": "code", "colab": {}, "outputId": "b1b38744-8a1b-4465-b4b8-b4e4279809fb" }, "source": [ "x=fibonacci(10)\n", "x" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "hkDEla_UTgws", "colab_type": "text" }, "source": [ "Ez a függvény viszont nem tér vissza sehol:" ] }, { "cell_type": "code", "metadata": { "id": "MCZGlHF7Tgwt", "colab_type": "code", "colab": {} }, "source": [ "def ures_fuggveny(x):\n", " print('Én egy ures fuggvény vagyok,\\nannak ellenére hogy beszélek,\\nnem térek vissza változóval!!')\n", " y=x-2;" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "kpSG8ZSvTgwu", "colab_type": "text" }, "source": [ "Így a **z** válltozóban nem tárolódik semmilyen érték!" ] }, { "cell_type": "code", "metadata": { "id": "wqYvWKM8Tgwv", "colab_type": "code", "colab": {}, "outputId": "64b48ee6-a953-4827-f539-c695858951c5" }, "source": [ "z=ures_fuggveny(3)\n", "z" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Én egy ures fuggvény vagyok,\n", "annak ellenére hogy beszélek,\n", "nem térek vissza változóval!!\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Q3YS8iFITgwx", "colab_type": "code", "colab": {}, "outputId": "1a702a12-5f22-4ca4-ed8c-5a09e53195a3" }, "source": [ "print(z)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "None\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "_8oe2aXgTgwy", "colab_type": "text" }, "source": [ "Egy függvénynek lehet több bemeneti változója is:" ] }, { "cell_type": "code", "metadata": { "id": "o7ayxhzdTgwz", "colab_type": "code", "colab": {} }, "source": [ "def osszead(a,b):\n", " return a+b" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "PqJCy5tTTgw1", "colab_type": "text" }, "source": [ "Az is előfordulhat, hogy több értéket szeretnénk visszakapni egy függvényből. Ezt például az alábbiak alapján tehetjük meg:" ] }, { "cell_type": "code", "metadata": { "id": "Wm-n1SDjTgw1", "colab_type": "code", "colab": {} }, "source": [ "def plusminus(a,b):\n", " return a+b,a-b" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "nCiLz9FvTgw5", "colab_type": "code", "colab": {}, "outputId": "efa3db9d-a647-4627-8b44-9b548a82ff64" }, "source": [ "p,m=plusminus(2,3)\n", "print (p)\n", "print (m)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "5\n", "-1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "wveDqgrjTgw7", "colab_type": "text" }, "source": [ "## Paraméter lista és a \"kicsomagolás\"" ] }, { "cell_type": "markdown", "metadata": { "id": "wQzzY3wETgw7", "colab_type": "text" }, "source": [ "Előfordulhat, hogy egy függvénynek sok bemenő paramétere van, vagy hogy egy függvény bemenő paramétereit egy másik függvény eleve egy listába rendezi. Egy tipikus ilyen példa, amint azt későb látni fogjuk, a függvényillesztés esete. Ilyenkor a paramétereket tartalmazó lista \"kicsomagolásával\", amit a \\*-jellel tehetünk meg, kompaktabb kódot érhetünk el. Vegyünk például egy olyan esetet amikor egy adatsorra egy ötödfokú polinomot illesztünk. " ] }, { "cell_type": "markdown", "metadata": { "id": "xkkmZjhyTgw8", "colab_type": "text" }, "source": [ "$$f(x)=a_0+a_1x+a_2x^2+a_3x^3+a_4x^4+a_5x^5$$" ] }, { "cell_type": "markdown", "metadata": { "id": "-JsHCs_gTgw8", "colab_type": "text" }, "source": [ "Definiáljunk egy függvényt ami egy \"futó\" $x$ változó és az ötödfokó polinomnak megfelelően hat darab \"paraméter\" $a_i$ változó segítségével kiértékeli a fenti polinomot:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "gZ8nsrORTgw9", "colab_type": "code", "colab": {} }, "source": [ "# ez lesz az illesztendő függvény\n", "def poly5(x,a0,a1,a2,a3,a4,a5):\n", " return a0+a1*x+a2*x**2+a3*x**3+a4*x**4+a5*x**5" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "UrI1WRicTgw_", "colab_type": "text" }, "source": [ "Az illesztés során hat darab illesztési paramétert határozunk meg: $a_0,a_1,a_2,a_3,a_4,a_5$ ám ezeket az illesztő program egy listába rendezve adja a kezünkbe:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "nlhZZMKnTgxA", "colab_type": "code", "colab": {} }, "source": [ "# ezek az illesztés során meghatározott paraméterek\n", "# az alábbi sorrendnek megfelelően\n", "# params=[a0,a1,a2,a3,a4,a5]\n", "params=[ 2.27171539, -1.1368942 , 0.65380304, -0.25005187, -0.1751268 , -0.48828309];" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "sv23MKIxTgxB", "colab_type": "text" }, "source": [ "Ha ki szeretnénk értékelni az illesztett polinomot az $x=0.3$ helyen, akkor azt megtehetjük az alábbi módon:" ] }, { "cell_type": "code", "metadata": { "id": "Eq--K1QzTgxC", "colab_type": "code", "colab": {}, "outputId": "9f76d505-78ee-4e72-bb43-91733e190292" }, "source": [ "poly5(0.3,params[0],params[1],params[2],params[3],params[4],params[5])" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1.9801329481213" ] }, "metadata": { "tags": [] }, "execution_count": 24 } ] }, { "cell_type": "markdown", "metadata": { "id": "BoiJGs06TgxE", "colab_type": "text" }, "source": [ "vagy az ennél sokkal kompaktabb módszerrel:" ] }, { "cell_type": "code", "metadata": { "id": "0_KgNmXsTgxE", "colab_type": "code", "colab": {}, "outputId": "3ac6b009-ef0b-4ee9-a4eb-b65950dde802" }, "source": [ "poly5(0.3,*params)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1.9801329481213" ] }, "metadata": { "tags": [] }, "execution_count": 25 } ] }, { "cell_type": "markdown", "metadata": { "id": "HTPspIilTgxH", "colab_type": "text" }, "source": [ "Ez a konstrukció lehetővé teszi, hogy a függvény definiálása során felkészísük a függvényt arra, hogy a bemenő\n", "paraméterek száma ne legyen rögzített. Ha a függvény deklaráció során egy paraméter elé **\\***-t teszünk akkor az a paraméter tetszőleges hosszúságú lehet! Vizsgáljuk meg az alábbi példát:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "wpvXo3D8TgxH", "colab_type": "code", "colab": {} }, "source": [ "def adok_mit_kapok(*argv): #Így, a *-al, készítünk fel egy függvényt \n", " #válltozó számú paraméter fogadására\n", " print(\"Nekem \",len(argv),\"db bemenő paraméterem jött\")\n", " for arg in argv:\n", " print (\"Ez egy paraméter :\", arg)\n", " return argv[-1] #a bemenő paraméterek elemeire mint \n", " #szokványos lista elemekre hivatkozunk" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "rgkoiM1uTgxJ", "colab_type": "text" }, "source": [ "A fenti blokkban definiált függvény tetszőleges számú bemenő paramétert elfogad! A futás során közli, hogy hány paraméter érkezett, kiírja azokat, illetve a paraméterlista utolsó tagját mint a függvény vissza térési értékét állítja be." ] }, { "cell_type": "code", "metadata": { "id": "f5dTIM5YTgxJ", "colab_type": "code", "colab": {}, "outputId": "3912bc8d-547e-44a2-d885-8a03bd1a0bd9" }, "source": [ "adok_mit_kapok('Gáspár','Menyhért','Boldizsár')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Nekem 3 db bemenő paraméterem jött\n", "Ez egy paraméter : Gáspár\n", "Ez egy paraméter : Menyhért\n", "Ez egy paraméter : Boldizsár\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "'Boldizsár'" ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "cell_type": "markdown", "metadata": { "id": "nnfS3Px6TgxL", "colab_type": "text" }, "source": [ "Természetesen a tetszőleges paraméter helyett egy \"kicsomagolt\" tetszőleges hosszúságú listát is használhatunk!" ] }, { "cell_type": "code", "metadata": { "id": "794DdqTQTgxM", "colab_type": "code", "colab": {}, "outputId": "f3d480b7-e7b4-4d58-804f-6f5716ba7515" }, "source": [ "adok_mit_kapok(*params) #természetesen itt is működik a kicsomagolás.." ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Nekem 6 db bemenő paraméterem jött\n", "Ez egy paraméter : 2.27171539\n", "Ez egy paraméter : -1.1368942\n", "Ez egy paraméter : 0.65380304\n", "Ez egy paraméter : -0.25005187\n", "Ez egy paraméter : -0.1751268\n", "Ez egy paraméter : -0.48828309\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "-0.48828309" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "markdown", "metadata": { "id": "ZRIZU49zTgxN", "colab_type": "text" }, "source": [ "## Függvények kulcsszavakkal" ] }, { "cell_type": "markdown", "metadata": { "id": "dVCuvXm-TgxO", "colab_type": "text" }, "source": [ "Azon kívül, hogy a szótárak már önmagukban is igen hasznos adatstruktúrák, később látni fogjuk, hogy sokszor függvények bizonyos paramétereit is szokás szótárakba szedni. Az ilyen paramétereket szokás kulcsszavas változóknak vagy kulcsszavas argumentumnak (angol nyelven keyword argument) hívni. Ezek használata olvashatóbbá és emberi szemmel is jóval értelmezhetőbbé teszi a programot, ezenfelül további flexibilitást is ad a programozó kezébe. \n", "Nézzük ezt meg az alábbi példán:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "OLcPf_hITgxO", "colab_type": "code", "colab": {} }, "source": [ "#Így adunk meg alapértelmezett értékeket\n", "def students(ido, allapot='lelkesen figyelik a tanárt', tevekenyseg='kísérletezés', ora='fizika'):\n", " print(\"Ezek a diákok \"+ora+\"órán \"+tevekenyseg+\" közben mindig \"+allapot+\"!\");\n", " print(\"Még akkor is, ha épp \",ido,\"-t mutat az óra!\");" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "OLPbtUsmTgxQ", "colab_type": "text" }, "source": [ "A függvény első paraméterét meg kell adnunk, ha nem adunk többet, akkor az alapértelmezett értékek ugranak be:" ] }, { "cell_type": "code", "metadata": { "id": "MCETdRtSTgxR", "colab_type": "code", "colab": {}, "outputId": "5bd5361f-1f01-4a3e-e838-73aaebe3782c" }, "source": [ "students('17:00') " ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ezek a diákok fizikaórán kísérletezés közben mindig lelkesen figyelik a tanárt!\n", "Még akkor is, ha épp 17:00 -t mutat az óra!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "AmH26S8LTgxT", "colab_type": "text" }, "source": [ "Ha egy kulcsszavas argumentumot kap a függvény, akkor azt értelemszerűen használja:" ] }, { "cell_type": "code", "metadata": { "id": "q87AyxjqTgxU", "colab_type": "code", "colab": {}, "outputId": "da26944c-e7e7-47b0-ed57-5138383ad4a2" }, "source": [ "students('8:00',allapot='unott képet vágnak')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ezek a diákok fizikaórán kísérletezés közben mindig unott képet vágnak!\n", "Még akkor is, ha épp 8:00 -t mutat az óra!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Z_EIule8TgxX", "colab_type": "text" }, "source": [ "A kulcsszavas argumentumok sorrendjére nem kell figyelni:" ] }, { "cell_type": "code", "metadata": { "id": "rqJvtCEvTgxY", "colab_type": "code", "colab": {}, "outputId": "c1ae5e25-dfb0-4711-b22a-a83d1fd60b97" }, "source": [ "students('8:00',ora='ógörög',allapot='pánikolva izzadnak',tevekenyseg='TÉMAZÁRÓ')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ezek a diákok ógörögórán TÉMAZÁRÓ közben mindig pánikolva izzadnak!\n", "Még akkor is, ha épp 8:00 -t mutat az óra!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "JU2rzg7cTgxZ", "colab_type": "text" }, "source": [ "Ha a deklaráció során nem használt kulcsszót adunk meg, akkor hibát kapunk:" ] }, { "cell_type": "code", "metadata": { "id": "PXQAgo3STgxa", "colab_type": "code", "colab": {}, "outputId": "7c47f140-2c71-44d8-caee-2286c15b0814" }, "source": [ "students('17:00',tanar='Mici néni')" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "students() got an unexpected keyword argument 'tanar'", "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[0mstudents\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'17:00'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtanar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Mici néni'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: students() got an unexpected keyword argument 'tanar'" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "xiuNPGrXTgxb", "colab_type": "text" }, "source": [ "Hasonlóan problémába ütközünk, ha egy kulcsszót kétszer is alkalmazunk:" ] }, { "cell_type": "code", "metadata": { "id": "CDyVPi-nTgxc", "colab_type": "code", "colab": {}, "outputId": "1b4085c8-5544-445d-c707-26de66af64ea" }, "source": [ "students('8:00',ora='ógörög',ora='kémia')" ], "execution_count": 0, "outputs": [ { "output_type": "error", "ename": "SyntaxError", "evalue": "keyword argument repeated (, line 1)", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m students('8:00',ora='ógörög',ora='kémia')\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m keyword argument repeated\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "nC4tYJkETgxd", "colab_type": "text" }, "source": [ "Kulcsszavas argumentumok szótárának kicsomagolása \\*\\*-jel segítségével történik:" ] }, { "cell_type": "code", "metadata": { "id": "q8RNDxw4Tgxe", "colab_type": "code", "colab": {}, "outputId": "38599cdf-6869-42e1-cf84-c2426528e134" }, "source": [ "diak_hozzaallas={'ora':'ének','allapot':'nyüszítenek'};\n", "students(12,**diak_hozzaallas)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ezek a diákok énekórán kísérletezés közben mindig nyüszítenek!\n", "Még akkor is, ha épp 12 -t mutat az óra!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "sweboi1fTgxf", "colab_type": "text" }, "source": [ "Amint a sima paramétereknél is, itt is előfordulhat az, hogy tetszőleges hosszúságú dict-et szeretnénk feldolgozni. Erre példa, ha egy olyan függvényt írunk, amely esetleg több más fügvényt hív, melyeknek tovább akarjuk adni a bejövő paraméterek egy részét. \n", "\n", "Az alábbi függvény egy tetszőleges szótárat vár a bemenetre, megnézi hogy milyen hosszú, és ha a szótárban van 'hamburger' címkéjű kulcsszó, akkor annak az értékét adja vissza:" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "2C-yX5AfTgxg", "colab_type": "code", "colab": {} }, "source": [ "def kulcsot_adok_amit_kapok(**szotar):\n", " print('A szotár hossza:',len(szotar))\n", " for kulcs in list(szotar.keys()):\n", " if kulcs=='hamburger':\n", " print('Van hamburger!')\n", " return szotar[kulcs]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "mmo9uz71Tgxj", "colab_type": "code", "colab": {}, "outputId": "05e642ab-845c-4d2a-98c5-d60299fc5975" }, "source": [ "kulcsot_adok_amit_kapok(makaróni=1,torta='finom') #itt már nem jelent hibát ha előre meg nemhatározott kulcsszavaink vannak!" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "A szotár hossza: 2\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "esI0U8fqTgxl", "colab_type": "code", "colab": {}, "outputId": "c8a3769a-d88e-451b-b910-d51e54e1f3b2" }, "source": [ "kaja={'makaróni':1,'torta':'finom','hamburger':137,'saláta':'nincs'}\n", "kulcsot_adok_amit_kapok(**kaja) " ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "A szotár hossza: 4\n", "Van hamburger!\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "137" ] }, "metadata": { "tags": [] }, "execution_count": 38 } ] }, { "cell_type": "markdown", "metadata": { "id": "bwWsc9rbTgxn", "colab_type": "text" }, "source": [ "## Általános függvénydeklarációs szokások" ] }, { "cell_type": "markdown", "metadata": { "id": "OUE5EzPGTgxn", "colab_type": "text" }, "source": [ "Amint azt a fentiekben láttuk, függvényeknek többféleképpen is adhatunk paramétereket, \n", "\n", "1. változók (ezek lehetnek sima változók, meghatározott hosszúságú listák, vagy akár kulcsszavas változók is)\n", "2. előre meg nem határozott hosszúságú változó lista\n", "3. kulcsszavas változók tetszőleges hosszú listája\n", "\n", "Sokszor előfordul, hogy egy függvénynek mind a négy fajta bemenete is lehet. Illetve hogy néhány változónak alapértelmezett értéket is adunk. Függvények definiálásánál használjuk a fenti sorrendet!\n", "\n", "Például:" ] }, { "cell_type": "code", "metadata": { "id": "u0shfp4fTgxo", "colab_type": "code", "colab": {} }, "source": [ "def bonyolult_fuggveny(valtozo1,valtozo2,valtozo3='ELZETT',*args,**kwargs):\n", " if ((len(args)==0 and len(kwargs)==0)):\n", " return valtozo3+str(valtozo2)+str(valtozo1)\n", " elif (len(args)!=0 and len(kwargs)==0):\n", " return 'Van valami az args-ban!'\n", " elif (len(args)==0 and len(kwargs)!=0):\n", " return 'Van valami az kwargs-ban!'\n", " else:\n", " return 'Mindenféle változónk van:'+str(valtozo1)+str(valtozo2)+valtozo3+str(args)+str(kwargs)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "id": "n8QbY5KVTgxp", "colab_type": "text" }, "source": [ "A fenti függvény első két változója \"sima\" változó, a harmadik egy kulcsszavas változó az alapértelmezett 'ELZETT' értékkel, és ezen kívül megengedünk még egyéb tetszőleges hosszú \"sima\" változók listáját (args), illetve tetszőleges hosszú kulcsszavas változók listáját (kwargs). Nézzük meg hogy a notebook során korábban definiált változókat felhasználva milyen viselkedést mutat a fent deklarált függvény:" ] }, { "cell_type": "code", "metadata": { "id": "Ti5NXIFWTgxp", "colab_type": "code", "colab": {}, "outputId": "06862fc2-60da-485a-f671-b6abba1b6d94" }, "source": [ "bonyolult_fuggveny(1,2)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'ELZETT21'" ] }, "metadata": { "tags": [] }, "execution_count": 40 } ] }, { "cell_type": "code", "metadata": { "id": "25VW8gmtTgxr", "colab_type": "code", "colab": {}, "outputId": "5b021e77-4b5c-44c8-e5a1-ebb5096c560f" }, "source": [ "bonyolult_fuggveny(1,2,valtozo3='MULTLOCK')" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'MULTLOCK21'" ] }, "metadata": { "tags": [] }, "execution_count": 41 } ] }, { "cell_type": "code", "metadata": { "id": "QedtS-rNTgxt", "colab_type": "code", "colab": {}, "outputId": "249c86bf-83f2-4884-bbbd-c1ac534d9c25" }, "source": [ "bonyolult_fuggveny(1,2,*days_of_the_week)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'Van valami az args-ban!'" ] }, "metadata": { "tags": [] }, "execution_count": 42 } ] }, { "cell_type": "code", "metadata": { "id": "SZVVXlEOTgxu", "colab_type": "code", "colab": {}, "outputId": "beef2aac-94a4-45f6-8d34-de85d13fdccc" }, "source": [ "bonyolult_fuggveny(1,2,**kaja)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'Van valami az kwargs-ban!'" ] }, "metadata": { "tags": [] }, "execution_count": 43 } ] }, { "cell_type": "code", "metadata": { "id": "3EOeELApTgxv", "colab_type": "code", "colab": {}, "outputId": "128b64c1-073f-4156-9bde-b60a3961427b" }, "source": [ "bonyolult_fuggveny(1,2,*days_of_the_week,**kaja)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "\"Mindenféle változónk van:12Sunday('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'){'torta': 'finom', 'hamburger': 137, 'makaróni': 1, 'saláta': 'nincs'}\"" ] }, "metadata": { "tags": [] }, "execution_count": 44 } ] }, { "cell_type": "markdown", "metadata": { "id": "4Ltl9vrOTgxx", "colab_type": "text" }, "source": [ "## A [Lambda](http://www.secnetix.de/olli/Python/lambda_functions.hawk)-formák \n", "\n", "\n", "\n", "Egy függvénynek nemcsak változókat, hanem más függvényeket is megadhatunk bemenetként. Például gondolhatunk egy olyan függvényre, ami egy matematikai függvényt ábrázol! \n", "\n", "Ilyen esetekben, amikor egy függvény a bemenetére másik függvényt vár, sokszor előfordul, hogy hosszadalmas külön definiálni a bemeneti függvényt. Ekkor tömörebb használni az úgynevezett `lambda`-formákat.\n", "\n", "Nézzünk erre egy példát! Definiáljunk egy függvényt, ami egy másik függvényt értékel ki egy adott helyen, kiírja a kiértékelési helyet, és visszatér a kiértékelt függvényértékkel:\n" ] }, { "cell_type": "code", "metadata": { "collapsed": true, "id": "vZ9Wa_DgTgxz", "colab_type": "code", "colab": {} }, "source": [ "def funfun(g,x):\n", " print('Ez volt az x változó: ',x)\n", " return g(x)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "3Omsb4aaTgx1", "colab_type": "code", "colab": {}, "outputId": "bc922d24-6b38-48aa-9460-1bfa2e4f8d20" }, "source": [ "def fx(x):\n", " return x**2-1/x;\n", "funfun(fx,0.1)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ez volt az x változó: 0.1\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "-9.99" ] }, "metadata": { "tags": [] }, "execution_count": 46 } ] }, { "cell_type": "markdown", "metadata": { "id": "9ctgP5WyTgx5", "colab_type": "text" }, "source": [ "Ekkor egy úgynevezett `lambda`-forma segítségével alkalmazhatjuk az ennél kicsivel kompaktabb kifejezést (megúszva a függvénydeklarációt):" ] }, { "cell_type": "code", "metadata": { "id": "mrw9onpjTgx5", "colab_type": "code", "colab": {}, "outputId": "2713c26b-cd40-416f-b549-4504ea6a2685" }, "source": [ "funfun(lambda x:x**2-1/x,0.1)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Ez volt az x változó: 0.1\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "-9.99" ] }, "metadata": { "tags": [] }, "execution_count": 47 } ] }, { "cell_type": "markdown", "metadata": { "id": "3E3LuRlDTgx7", "colab_type": "text" }, "source": [ "A fenti kifejezésben a \n", ">```Python\n", "lambda x:x**2-1/x\n", "```\n", "\n", "kódrészlet egy \"anonim\" függvényt definiál, amely az $x$ változóhoz hozzárendeli az $x^2-1/x$-et." ] }, { "cell_type": "markdown", "metadata": { "id": "dZIOJoOcTgx7", "colab_type": "text" }, "source": [ "A `lambda`-kifejezésekkel lehet többváltozós függvényeket is definiálni. Például az alábbi\n", ">```python\n", "lambda x,y:x**2-1/y\n", "```\n", "\n", "kifejezés a\n", "\n", ">```python\n", "def fxy(x,y):\n", " return x**2-1/y\n", "```\n", "\n", "függvénnyel ekvivalens." ] } ] }