{"id":168,"date":"2019-01-04T19:27:32","date_gmt":"2019-01-04T19:27:32","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=168"},"modified":"2020-04-22T09:28:53","modified_gmt":"2020-04-22T09:28:53","slug":"alamprogramm-funktsioon","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/alamprogramm-funktsioon\/","title":{"raw":"Alamprogramm. Funktsioon","rendered":"Alamprogramm. Funktsioon"},"content":{"raw":"Arvutiprogrammi v\u00f5ib jagada v\u00e4iksemateks osadeks ehk alamprogrammideks. N\u00e4iteks v\u00f5ib pangaautomaadi programmis olla alamosa, mis tegeleb kontoj\u00e4\u00e4gi n\u00e4itamisega. Programmis juhtub sageli, et sarnast alamprogrammi kasutatakse mitmes erinevas kohas. Selle asemel, et korduvat alamprogrammi k\u00f5ikjal eraldi v\u00e4lja kirjutada, on arukam see alamprogramm kirjeldada t\u00e4pselt \u00fches kohas ning edaspidi sellele kohale viidata. Sellist lahendust nimetame <strong>funktsiooniks<\/strong>.\r\n<h2>Funktsiooni oleme juba kasutanud<\/h2>\r\nJuba esimestes programmides kasutasime n\u00e4iteks funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> teksti kuvamiseks ja funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> kasutajalt sisendi saamiseks. Funktsioonidel on tihti sulgudes antavad argumendid (teise s\u00f5naga parameetrid), mis funktsiooni t\u00f6\u00f6d m\u00f5jutavad, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">forward(100)<\/code> liigutab kilpkonna 100 sammu edasi.\r\n\r\nSeni oleme kasutanud sisseehitatud funktsioone, mille on kirjutanud Pythoni arendajad. M\u00f5ned neist on laetud automaatselt (n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code>), teised vajavad esmalt neid sisaldava mooduli importimist (n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">forward<\/code> kasutamiseks tuleb laadida moodul <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">turtle<\/code>). Kuna olemasolevatest funktsioonidest meile alati ei piisa, kasutame v\u00f5imalust funktsioone ise juurde luua.\r\n<h2>Funktsiooni defineerimine<\/h2>\r\nFunktsiooni kirjeldamiseks ehk defineerimiseks kasutame v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def<\/code>. V\u00f5tmes\u00f5nale j\u00e4rgneb funktsiooni nimi, mille j\u00e4rgi me seda funktsiooni edaspidi v\u00e4lja kutsuda saame. Nimevalik on k\u00fcllaltki vaba (sarnaselt muutujale nime valimisega), kuid hea programmeerimise stiil on valida nimi, mis funktsiooni tehtavat kirjeldab. Funktsiooni nimele j\u00e4rgnevad sulud, kus m\u00e4\u00e4ratakse funktsiooni argumendid (selles n\u00e4ites argumente pole). P\u00e4rast sulge tuleb koolon. K\u00f5ik funktsiooni sisus olevad read peavad olema esimese rea suhtes taandatud. Defineerime \u00fche funktsiooni:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\r\nNende ridadega defineerime funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code>, kuid ridu k\u00e4ivitades ei ilmu ekraanile midagi, sest funktsiooni me ei k\u00e4ivitanud. Defineerimisega n\u00e4itasime Pythonile, kuidas tegutseda siis, kui k\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> edaspidi v\u00e4lja kutsutakse.\r\n\r\nKutsume n\u00fc\u00fcd funktsiooni v\u00e4lja, kasutades selleks funktsioonile antud nime:\r\n\r\n<strong>N\u00e4iteprogramm. tr\u00fckiAB defineerimine ja v\u00e4ljakutsumine<\/strong>\r\n<pre class=\"EnlighterJSRAW\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")\r\n \r\nprint(\"C\")\r\ntr\u00fckiAB()\r\nprint(\"D\")\r\ntr\u00fckiAB()<\/pre>\r\nKatseta, mis ilmub ekraanile. Nagu n\u00e4ed, on <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print(\"C\")<\/code> esimene rida, mis reaalselt k\u00e4ivitatakse. Sellele j\u00e4rgneb funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> esimene k\u00e4ivitamine. T\u00fchi rida definitsiooni ja p\u00f5hiprogrammi sisu vahele lisatakse loetavuse huvides, programmi k\u00e4itumist see ei m\u00f5juta.\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"20\"]<\/code>\r\n<h3>Defineerida tuleb enne v\u00e4ljakutsumist<\/h3>\r\nFunktsiooni puhul on oluline, et defineerimine toimuks enne, kui funktsioon v\u00e4lja kutsutakse. Vastasel juhul ei oska Python sellise nimega funktsiooni korral kuidagi k\u00e4ituda ning annab veateate. Proovi j\u00e4rgmist n\u00e4idet:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">tr\u00fckiAB()\r\ndef tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\r\nVeateatest on t\u00fc\u00fcpiliselt v\u00f5imalik lugeda, kus t\u00f5rge tekkis.\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"21\"]<\/code>\r\n<h3>Funktsioon ts\u00fcklis<\/h3>\r\nFunktsiooni saame v\u00e4lja kutsuda ka ts\u00fcklis. Selles n\u00e4ites kutsutakse funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> v\u00e4lja k\u00fcmme korda:\r\n\r\n<strong>N\u00e4iteprogramm. Funktsioon ts\u00fcklis<\/strong>\r\n<pre class=\"EnlighterJSRAW\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")\r\n \r\nfor i in range(10):\r\n    tr\u00fckiAB()<\/pre>\r\n<h3>Ts\u00fckkel funktsioonis<\/h3>\r\nFunktsiooni kirjelduses saame kasutada erinevaid struktuure, nende seas ka meile tuntud ts\u00fckleid.\r\n\r\nKirjutame programmi, mis loendab k\u00fcmnest alla, kasutades funktsiooni:\r\n\r\n<strong>N\u00e4iteprogramm. K\u00fcmnest alla loendav funktsioon<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla():\r\n    i = 10\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)\r\n \r\nloe_alla()<\/pre>\r\nJ\u00e4lgi, et ts\u00fckli sisu oleks funktsiooni sisu suhtes \u00f5igesti taandatud.\r\n<h3>Funktsioon teise funktsiooni kirjelduses<\/h3>\r\nMe juba kasutasime sisseehitatud funktsiooni\u00a0 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print<\/code> enda funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> kirjeldamisel. Samamoodi saame kasutada enda loodud funktsioone edasiste funktsioonide defineerimisel.\r\n\r\n<strong>N\u00e4iteprogramm. Funktsioon teise funktsiooni definitsioonis<\/strong>\r\n<pre class=\"EnlighterJSRAW\">def funktsioon_a():\r\n    print(\"a\")\r\ndef funktsioon_b():\r\n    funktsioon_a()\r\n    print(\"b\")<\/pre>\r\nEndiselt ei k\u00e4ivitata kumbagi funktsiooni enne, kui neid edasises koodis v\u00e4lja kutsutakse.\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"22\"]<\/code>\r\n<h3>Video<\/h3>\r\nVaata ka <a href=\"https:\/\/www.uttv.ee\/naita?id=24050\">kokkuv\u00f5tvat videot<\/a>.\r\n<h3>Funktsioon iseenda kirjelduses (rekursioon)<\/h3>\r\nTegelikult saab funktsioon v\u00e4lja kutsuda ka iseennast. Sellist olukorda nimetatakse rekursiooniks ja see on kindlates olukordades m\u00f5juv l\u00e4henemine. Rekursiooni abil saab n\u00e4iteks sugupuust (v\u00f5i muust puulaadsest struktuurist) konkreetset nime \u00fcles otsida. Rekursioon on k\u00fcllaltki keeruline teema ja siinsetes materjalides me sellega ei tegele.\r\n<h3>Funktsiooni argumendid<\/h3>\r\nFunktsioone v\u00f5ib tinglikult jaotada kahte r\u00fchma: \u00fcht t\u00fc\u00fcpi funktsioonide puhul me tahame, et nad midagi \u00e4ra teeksid ja teiste puhul, et nad midagi arvutaksid ning meile tulemuse tagastaksid. Senised selle osa funktsioonid tegid midagi \u00e4ra - n\u00e4iteks v\u00e4ljastasid midagi ekraanile. Tegelikult on selline ka funktsioon <em>print<\/em>, mida oleme korduvalt varem kasutanud. Funktsioonile <em>print<\/em> andsime argumendiks s\u00f5ne, mida tahtsime ekraanile saada:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"Sisesta PIN-kood:\")<\/pre>\r\nFunktsioonile etteantavaid suurusi nimetatakse argumentideks ning need pannakse funktsiooni v\u00e4ljakutsel funktsiooni nimele j\u00e4rgnevate sulgude sisse (nii tegime ka funktsiooniga <em>print<\/em>). Argumentidest tuleb juttu j\u00e4rgmises peat\u00fckis. Samuti tuleb seal juttu funktsioonidest, mille p\u00f5hiroll ei ole millegi \u00e4rategemine, vaid hoopis mingisuguse tulemuse arvutamine.\r\n<h3>K\u00e4sureaaken<\/h3>\r\n<p class=\"vspace\">Lisaks sellele, et funktsiooni saab rakendada programmi sees, saab seda teha ka Thonny k\u00e4sureaaknas. See on Thonny osa, mille tiitelribale on kirjutatud <em>Shell<\/em> ja iga rea ees on <strong><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&gt;&gt;&gt;<\/code><\/strong>.<\/p>\r\n<p class=\"vspace\">Olgu meil programm, milles on ainult funktsiooni kirjeldus, aga selle funktsiooni rakendamist pole:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\r\nKui nagu tavaliselt valida roheline nupp, F5 v\u00f5i <em>Run<\/em>-men\u00fc\u00fcst <em>Run current script<\/em>, siis k\u00e4sureaaknas n\u00e4idatakse vaid, mis failis olev programm k\u00e4ivitati:\r\n\r\n<span style=\"color: #ff0000\"><img class=\"alignnone size-medium wp-image-172\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-300x211.png\" alt=\"\" width=\"300\" height=\"211\" \/><\/span>\r\n\r\n<span style=\"color: #000000\">Kui k\u00e4sureale kirjutada <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tr\u00fckiAB()<\/code> ja reavahetusklahvi vajutada, siis see funktsioon k\u00e4ivitatakse: <\/span>\r\n\r\n<span style=\"color: #ff0000\"><img class=\"alignnone size-medium wp-image-173\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-300x212.png\" alt=\"\" width=\"300\" height=\"212\" \/><\/span>\r\n\r\nMeie j\u00e4tkame ikkagi nii, et funktsiooni v\u00e4ljakutsumine toimub programmiteksti sees. See-eest on k\u00e4surea abil v\u00f5imalik funktsiooni toimimist mugavalt kontrollida.\r\n\r\nVaata ka <a href=\"https:\/\/www.uttv.ee\/naita?id=24051\">kokkuv\u00f5tvat videot<\/a>.","rendered":"<p>Arvutiprogrammi v\u00f5ib jagada v\u00e4iksemateks osadeks ehk alamprogrammideks. N\u00e4iteks v\u00f5ib pangaautomaadi programmis olla alamosa, mis tegeleb kontoj\u00e4\u00e4gi n\u00e4itamisega. Programmis juhtub sageli, et sarnast alamprogrammi kasutatakse mitmes erinevas kohas. Selle asemel, et korduvat alamprogrammi k\u00f5ikjal eraldi v\u00e4lja kirjutada, on arukam see alamprogramm kirjeldada t\u00e4pselt \u00fches kohas ning edaspidi sellele kohale viidata. Sellist lahendust nimetame <strong>funktsiooniks<\/strong>.<\/p>\n<h2>Funktsiooni oleme juba kasutanud<\/h2>\n<p>Juba esimestes programmides kasutasime n\u00e4iteks funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> teksti kuvamiseks ja funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> kasutajalt sisendi saamiseks. Funktsioonidel on tihti sulgudes antavad argumendid (teise s\u00f5naga parameetrid), mis funktsiooni t\u00f6\u00f6d m\u00f5jutavad, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">forward(100)<\/code> liigutab kilpkonna 100 sammu edasi.<\/p>\n<p>Seni oleme kasutanud sisseehitatud funktsioone, mille on kirjutanud Pythoni arendajad. M\u00f5ned neist on laetud automaatselt (n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code>), teised vajavad esmalt neid sisaldava mooduli importimist (n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">forward<\/code> kasutamiseks tuleb laadida moodul <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">turtle<\/code>). Kuna olemasolevatest funktsioonidest meile alati ei piisa, kasutame v\u00f5imalust funktsioone ise juurde luua.<\/p>\n<h2>Funktsiooni defineerimine<\/h2>\n<p>Funktsiooni kirjeldamiseks ehk defineerimiseks kasutame v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def<\/code>. V\u00f5tmes\u00f5nale j\u00e4rgneb funktsiooni nimi, mille j\u00e4rgi me seda funktsiooni edaspidi v\u00e4lja kutsuda saame. Nimevalik on k\u00fcllaltki vaba (sarnaselt muutujale nime valimisega), kuid hea programmeerimise stiil on valida nimi, mis funktsiooni tehtavat kirjeldab. Funktsiooni nimele j\u00e4rgnevad sulud, kus m\u00e4\u00e4ratakse funktsiooni argumendid (selles n\u00e4ites argumente pole). P\u00e4rast sulge tuleb koolon. K\u00f5ik funktsiooni sisus olevad read peavad olema esimese rea suhtes taandatud. Defineerime \u00fche funktsiooni:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\n<p>Nende ridadega defineerime funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code>, kuid ridu k\u00e4ivitades ei ilmu ekraanile midagi, sest funktsiooni me ei k\u00e4ivitanud. Defineerimisega n\u00e4itasime Pythonile, kuidas tegutseda siis, kui k\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> edaspidi v\u00e4lja kutsutakse.<\/p>\n<p>Kutsume n\u00fc\u00fcd funktsiooni v\u00e4lja, kasutades selleks funktsioonile antud nime:<\/p>\n<p><strong>N\u00e4iteprogramm. tr\u00fckiAB defineerimine ja v\u00e4ljakutsumine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")\r\n \r\nprint(\"C\")\r\ntr\u00fckiAB()\r\nprint(\"D\")\r\ntr\u00fckiAB()<\/pre>\n<p>Katseta, mis ilmub ekraanile. Nagu n\u00e4ed, on <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print(\"C\")<\/code> esimene rida, mis reaalselt k\u00e4ivitatakse. Sellele j\u00e4rgneb funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> esimene k\u00e4ivitamine. T\u00fchi rida definitsiooni ja p\u00f5hiprogrammi sisu vahele lisatakse loetavuse huvides, programmi k\u00e4itumist see ei m\u00f5juta.<\/p>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-20\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-20\" class=\"h5p-iframe\" data-content-id=\"20\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-1-misilmub\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>Defineerida tuleb enne v\u00e4ljakutsumist<\/h3>\n<p>Funktsiooni puhul on oluline, et defineerimine toimuks enne, kui funktsioon v\u00e4lja kutsutakse. Vastasel juhul ei oska Python sellise nimega funktsiooni korral kuidagi k\u00e4ituda ning annab veateate. Proovi j\u00e4rgmist n\u00e4idet:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">tr\u00fckiAB()\r\ndef tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\n<p>Veateatest on t\u00fc\u00fcpiliselt v\u00f5imalik lugeda, kus t\u00f5rge tekkis.<\/p>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-21\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-21\" class=\"h5p-iframe\" data-content-id=\"21\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-1-mitmesrida\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>Funktsioon ts\u00fcklis<\/h3>\n<p>Funktsiooni saame v\u00e4lja kutsuda ka ts\u00fcklis. Selles n\u00e4ites kutsutakse funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> v\u00e4lja k\u00fcmme korda:<\/p>\n<p><strong>N\u00e4iteprogramm. Funktsioon ts\u00fcklis<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")\r\n \r\nfor i in range(10):\r\n    tr\u00fckiAB()<\/pre>\n<h3>Ts\u00fckkel funktsioonis<\/h3>\n<p>Funktsiooni kirjelduses saame kasutada erinevaid struktuure, nende seas ka meile tuntud ts\u00fckleid.<\/p>\n<p>Kirjutame programmi, mis loendab k\u00fcmnest alla, kasutades funktsiooni:<\/p>\n<p><strong>N\u00e4iteprogramm. K\u00fcmnest alla loendav funktsioon<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla():\r\n    i = 10\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)\r\n \r\nloe_alla()<\/pre>\n<p>J\u00e4lgi, et ts\u00fckli sisu oleks funktsiooni sisu suhtes \u00f5igesti taandatud.<\/p>\n<h3>Funktsioon teise funktsiooni kirjelduses<\/h3>\n<p>Me juba kasutasime sisseehitatud funktsiooni\u00a0 <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print<\/code> enda funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">tr\u00fckiAB<\/code> kirjeldamisel. Samamoodi saame kasutada enda loodud funktsioone edasiste funktsioonide defineerimisel.<\/p>\n<p><strong>N\u00e4iteprogramm. Funktsioon teise funktsiooni definitsioonis<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">def funktsioon_a():\r\n    print(\"a\")\r\ndef funktsioon_b():\r\n    funktsioon_a()\r\n    print(\"b\")<\/pre>\n<p>Endiselt ei k\u00e4ivitata kumbagi funktsiooni enne, kui neid edasises koodis v\u00e4lja kutsutakse.<\/p>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-22\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-22\" class=\"h5p-iframe\" data-content-id=\"22\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-1-mitukorda\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>Video<\/h3>\n<p>Vaata ka <a href=\"https:\/\/www.uttv.ee\/naita?id=24050\">kokkuv\u00f5tvat videot<\/a>.<\/p>\n<h3>Funktsioon iseenda kirjelduses (rekursioon)<\/h3>\n<p>Tegelikult saab funktsioon v\u00e4lja kutsuda ka iseennast. Sellist olukorda nimetatakse rekursiooniks ja see on kindlates olukordades m\u00f5juv l\u00e4henemine. Rekursiooni abil saab n\u00e4iteks sugupuust (v\u00f5i muust puulaadsest struktuurist) konkreetset nime \u00fcles otsida. Rekursioon on k\u00fcllaltki keeruline teema ja siinsetes materjalides me sellega ei tegele.<\/p>\n<h3>Funktsiooni argumendid<\/h3>\n<p>Funktsioone v\u00f5ib tinglikult jaotada kahte r\u00fchma: \u00fcht t\u00fc\u00fcpi funktsioonide puhul me tahame, et nad midagi \u00e4ra teeksid ja teiste puhul, et nad midagi arvutaksid ning meile tulemuse tagastaksid. Senised selle osa funktsioonid tegid midagi \u00e4ra &#8211; n\u00e4iteks v\u00e4ljastasid midagi ekraanile. Tegelikult on selline ka funktsioon <em>print<\/em>, mida oleme korduvalt varem kasutanud. Funktsioonile <em>print<\/em> andsime argumendiks s\u00f5ne, mida tahtsime ekraanile saada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"Sisesta PIN-kood:\")<\/pre>\n<p>Funktsioonile etteantavaid suurusi nimetatakse argumentideks ning need pannakse funktsiooni v\u00e4ljakutsel funktsiooni nimele j\u00e4rgnevate sulgude sisse (nii tegime ka funktsiooniga <em>print<\/em>). Argumentidest tuleb juttu j\u00e4rgmises peat\u00fckis. Samuti tuleb seal juttu funktsioonidest, mille p\u00f5hiroll ei ole millegi \u00e4rategemine, vaid hoopis mingisuguse tulemuse arvutamine.<\/p>\n<h3>K\u00e4sureaaken<\/h3>\n<p class=\"vspace\">Lisaks sellele, et funktsiooni saab rakendada programmi sees, saab seda teha ka Thonny k\u00e4sureaaknas. See on Thonny osa, mille tiitelribale on kirjutatud <em>Shell<\/em> ja iga rea ees on <strong><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&gt;&gt;&gt;<\/code><\/strong>.<\/p>\n<p class=\"vspace\">Olgu meil programm, milles on ainult funktsiooni kirjeldus, aga selle funktsiooni rakendamist pole:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def tr\u00fckiAB():\r\n    print(\"A\")\r\n    print(\"B\")<\/pre>\n<p>Kui nagu tavaliselt valida roheline nupp, F5 v\u00f5i <em>Run<\/em>-men\u00fc\u00fcst <em>Run current script<\/em>, siis k\u00e4sureaaknas n\u00e4idatakse vaid, mis failis olev programm k\u00e4ivitati:<\/p>\n<p><span style=\"color: #ff0000\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-172\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-300x211.png\" alt=\"\" width=\"300\" height=\"211\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-300x211.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-65x46.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-225x158.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1-350x246.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida1.png 732w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/span><\/p>\n<p><span style=\"color: #000000\">Kui k\u00e4sureale kirjutada <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tr\u00fckiAB()<\/code> ja reavahetusklahvi vajutada, siis see funktsioon k\u00e4ivitatakse: <\/span><\/p>\n<p><span style=\"color: #ff0000\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-173\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-300x212.png\" alt=\"\" width=\"300\" height=\"212\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-300x212.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-65x46.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-225x159.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2-350x247.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kasurida2.png 732w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/span><\/p>\n<p>Meie j\u00e4tkame ikkagi nii, et funktsiooni v\u00e4ljakutsumine toimub programmiteksti sees. See-eest on k\u00e4surea abil v\u00f5imalik funktsiooni toimimist mugavalt kontrollida.<\/p>\n<p>Vaata ka <a href=\"https:\/\/www.uttv.ee\/naita?id=24051\">kokkuv\u00f5tvat videot<\/a>.<\/p>\n","protected":false},"author":12,"menu_order":1,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-168","chapter","type-chapter","status-publish","hentry"],"part":166,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":14,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/168\/revisions"}],"predecessor-version":[{"id":555,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/168\/revisions\/555"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/166"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/168\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=168"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=168"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=168"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}