{"id":181,"date":"2019-01-07T22:38:46","date_gmt":"2019-01-07T22:38:46","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=181"},"modified":"2020-04-22T09:31:52","modified_gmt":"2020-04-22T09:31:52","slug":"funktsioonil-on-vaartus","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/funktsioonil-on-vaartus\/","title":{"raw":"Funktsioonil on v\u00e4\u00e4rtus","rendered":"Funktsioonil on v\u00e4\u00e4rtus"},"content":{"raw":"<h2>\u00dcldistamine. Argumendid<\/h2>\r\n<p class=\"vspace\">\u00dcsna sageli on meil vaja peaaegu samasugust tegevust sooritada mitmes erinevas kohas. Kui eri kohtades on vaja sarnast, kuid teatud variatsiooniga koodi, siis on v\u00f5imalik kirjeldada funktsioon argumentide (parameetrite) abil. Sel juhul antakse v\u00e4ljakutsumisel funktsioonile sisendiks argumendid ja konkreetne tulemus s\u00f5ltub nende v\u00e4\u00e4rtustest.<\/p>\r\n<p class=\"vspace\">N\u00e4iteks allaloendamise funktsiooni v\u00f5ime teha \u00fcldisemaks nii, et anname ette, millisest arvust tuleb hakata lugema. Hetkel muutub programm sellest isegi l\u00fchemaks: meil pole enam vaja rida <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">i = 10<\/code><\/code>, sest me lisame muutuja <em>i<\/em> funktsiooni nime j\u00e4rel olevatesse sulgudesse:<\/p>\r\n<strong>N\u00e4iteprogramm. Argumendiga loendur<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla(i):\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)\r\n \r\nloe_alla(4)<\/pre>\r\n<p class=\"vspace\">N\u00fc\u00fcd on funktsioon palju paindlikum ja k\u00e4itub erinevalt olenevalt argumendi v\u00e4\u00e4rtusest. N\u00e4ites on funktsioon <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla<\/code><\/em> v\u00e4lja kutsutud argumendi v\u00e4\u00e4rtusega 4. Sellega saab <em>i<\/em> esialgseks v\u00e4\u00e4rtuseks 4. Ts\u00fckli j\u00e4tkamistingimus on t\u00e4idetud ja nii tehaksegi esimene samm <em>i<\/em> v\u00e4\u00e4rtusega 4, mis v\u00e4ljastatakse ekraanile. J\u00e4rgmine rida muudab <em>i<\/em> v\u00e4\u00e4rtuse \u00fche v\u00f5rra v\u00e4iksemaks ja nii edasi.<\/p>\r\n<p class=\"vspace\">Proovi funktsiooni v\u00e4lja kutsuda erinevate argumentide v\u00e4\u00e4rtustega, nt <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(8)<\/code><\/code>, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(1)<\/code>, <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(-1)<\/code><\/code>.<\/p>\r\n<p class=\"vspace\">Muudame n\u00fc\u00fcd ridade <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(i)<\/code> ja <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">i -= 1<\/code><\/code> j\u00e4rjekorda ja j\u00e4rgmise k\u00fcsimuse tarbeks kutsume selle funktsiooni v\u00e4lja argumendiga 6.<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla(i):\r\n    while i &gt; 0:       \r\n        i -= 1\r\n        print(i)\r\n        sleep(1)\r\n \r\nloe_alla(6)<\/pre>\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"23\"]<\/code>\r\n<h3>Video<\/h3>\r\nVaata ka <a href=\"https:\/\/www.youtube.com\/watch?v=RMYNksCwUPQ\">kokkuv\u00f5tvat videot<\/a>.\r\n<h2>V\u00e4\u00e4rtust tagastav funktsioon<\/h2>\r\n<p class=\"vspace\">Eelmised n\u00e4ited olid funktsioonidest, mis sooritasid mingisugused tegevused, n\u00e4iteks teksti ekraanile kuvamise. N\u00fc\u00fcd vaatame funktsioone, mis tagastavad v\u00e4\u00e4rtuse (\u00f5igemini on funktsioon ise selle v\u00e4\u00e4rtusega). Olemuselt on see sarnane funktsiooni m\u00f5iste matemaatilise k\u00e4sitlusega. Igale argumendile vastab teatud v\u00e4\u00e4rtus, mida nimetatakse selle funktsiooni v\u00e4\u00e4rtuseks antud argumendi korral. N\u00e4iteks ruutfunktsiooni x<sup>2<\/sup> korral vastab argumendile 4 funktsiooni v\u00e4\u00e4rtus 16, argumendile 5 vastab v\u00e4\u00e4rtus 25. Koosinusfunktsiooni korral vastab argumendile 0 funktsiooni v\u00e4\u00e4rtus 1, sest cos(0) = 1. Ruutjuure korral vastab argumendile 9 funktsiooni v\u00e4\u00e4rtus 3. Koosinuse ja ruutjuure jaoks on Pythonis funktsioonid olemas, vastavalt <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cos<\/code> ja <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sqrt<\/code><\/code>. Nende kasutamiseks tuleb need esmalt moodulist <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">math<\/code><\/em> importida (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from math import cos, sqrt<\/code>).<\/p>\r\nOlgu meil \u00fclesandeks luua funktsioon, mis tagastab arvu ruudu. Defineerime selle funktsiooni:\r\n\r\n<strong>N\u00e4iteprogramm. Arvu ruutu tagastav funktsioon<\/strong>\r\n<pre class=\"EnlighterJSRAW\">def ruutu(x):\r\n    return x**2\r\nprint(ruutu(4))<\/pre>\r\n<p class=\"vspace\">Selliste funktsioonide korral, mis peavad tulemuse tagastama, on oluline k\u00e4sk <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code>, millega funktsioon v\u00e4\u00e4rtuse omandab. Programmi kolmas rida on funktsiooni kirjelduse j\u00e4rel ja rakendab vastloodud funktsiooni argumendiga 4. Rida k\u00e4ivitades saab <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4)<\/code><\/code> v\u00e4\u00e4rtuse 16 ja seda saab kasutada nagu tavalist arvv\u00e4\u00e4rtust, mille me <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print<\/code> abil ekraanile v\u00e4ljastame. Saaksime seda ka avaldises kasutada, nt avaldise <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4) - 17<\/code><\/code> v\u00e4\u00e4rtus oleks -1.<\/p>\r\nFunktsiooni tagastatav suurus v\u00f5ib olla ka muud t\u00fc\u00fcpi kui arv. Funktsiooni kehas v\u00f5ib olla rohkem ridu, kuid\u00a0<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code>-reaga funktsioon l\u00f5petab oma t\u00f6\u00f6.\r\n<h2>Mitme argumendiga funktsioon<\/h2>\r\n<p class=\"vspace\">Funktsioonil v\u00f5ib olla argumente rohkem kui \u00fcks. Sel juhul eraldatakse need komadega. J\u00e4rgmine funktsioon tagastab t\u00f5ev\u00e4\u00e4rtuse:<\/p>\r\n<strong>N\u00e4iteprogramm. T\u00f5ev\u00e4\u00e4rtust tagastav mitme argumendiga funktsioon<\/strong>\r\n<pre class=\"EnlighterJSRAW\">def kas_raha_j\u00e4tkub(kghind, kogus, raha):\r\n    hind = kghind * kogus\r\n    if hind &lt;= raha:\r\n        return True\r\n    else:\r\n        return False\r\n \r\nif kas_raha_j\u00e4tkub(2, 4.5, 10):\r\n    print(\"Ostan\")<\/pre>\r\n<p class=\"vspace\">Kuna selle funktsiooni v\u00e4\u00e4rtus on t\u00f5ev\u00e4\u00e4rtust\u00fc\u00fcpi, siis saab seda kasutada n\u00e4iteks valikulause tingimuses. Antud juhul on <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub(2, 4.5, 10)<\/code> v\u00e4\u00e4rtuseks <code>True<\/code>.<\/p>\r\n<p class=\"vspace\">Kui funktsioon v\u00f5tab mitu argumenti, siis on oluline nende j\u00e4rjestus. Praegusel juhul antakse funktsiooni v\u00e4ljakutsumisel esimese argumendi v\u00e4\u00e4rtus muutujale <em>kghind<\/em>, teise v\u00e4\u00e4rtus muutujale <em>kogus<\/em> ja kolmanda v\u00e4\u00e4rtus muutujale <em>raha<\/em>. V\u00f5ib m\u00f5elda nii, et kui funktsioon argumentidega 2, 4.5 ja 10 v\u00e4lja kutsutakse, siis enne funktsioonis olevate lausete juurde minemist tehakse j\u00e4rgmised omistuslaused: <code>kghind = 2<\/code>, <code>kogus = 4.5<\/code> ja <code>raha = 10<\/code>. Tuleb m\u00e4rkida, et funktsiooni argumentide nimed on programmi seisukohalt suvalised, neist ei s\u00f5ltu programmi jaoks mitte midagi (nagu ka muutujate nimede puhul), kuid nimed v\u00f5iksid ikka olla sellised, mis annaksid programmi lugejale kasulikku infot koodi kohta.<\/p>\r\n<p class=\"vspace\">Tegelikult on funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub<\/code> v\u00f5imalik defineerida kahe reaga (\u00fcks rida funktsiooni nime ja argumentide jaoks ning \u00fcks rida <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-lause jaoks). Soovi korral p\u00fc\u00fca funktsiooni kirjeldus sellisena \u00fcmber kirjutada. Abiks v\u00f5ib olla teadmine, et <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code> j\u00e4rel ei pruugi olla ilmutatult <code>True<\/code> v\u00f5i <code>False<\/code>, vaid n\u00e4iteks avaldis <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">a * b &lt;= c<\/code><\/code>.<\/p>\r\n\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"24\"]<\/code>\r\n<h2>Tagastamine ja v\u00e4ljastamine<\/h2>\r\nMe oleme nendes materjalides kasutanud kahte k\u00fcllaltki sarnast terminit: <strong>v\u00e4ljastamine<\/strong> ja <strong>tagastamine<\/strong>. V\u00e4ljastamise all m\u00f5tleme p\u00f5hiliselt millegi ekraanile manamist (eelk\u00f5ige funktsiooni <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code><\/em> abil). Tagastamise all aga peame silmas funktsiooni v\u00e4\u00e4rtuse tagastamist (k\u00e4su <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em> abil). (Muudes materjalides v\u00f5ib s\u00f5nastus olla teistsugune.)\r\n\r\nKui me jaotasime funktsioone sellisteks, mis midagi \u00e4ra teevad, ja sellisteks, mis v\u00e4\u00e4rtuse tagastavad, siis kuhu kuulub j\u00e4rgmine funktsioon?\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    print(x + y)<\/pre>\r\n<p class=\"vspace\">Arvutamine ilmselt toimub. Tulemus aga v\u00e4ljastatakse ekraanile ja seda ei tagastata - <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code> puudub. Selline funktsioon kvalifitseerub millegi \u00e4ra tegijate hulka. Selline liigitamine on oluline seep\u00e4rast, et erinevatel liikidel on m\u00f5nev\u00f5rra erinevad rollid. V\u00e4\u00e4rtust tagastavad funktsioonid leiavad kasutust seal, kus saab kasutada arve, t\u00f5ev\u00e4\u00e4rtusi, s\u00f5nesid - oleneb sellest, mis t\u00fc\u00fcpi v\u00e4\u00e4rtus tagastatakse. N\u00e4iteks <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4)<\/code><\/code> sobib tehniliselt igale poole, kuhu k\u00f5lbaks 16. Igale poole, kuhu sobib <code>True<\/code>, sobib tehniliselt ka <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub(2, 4.5, 10)<\/code><\/code>. Nende v\u00e4\u00e4rtus ongi igal konkreetsel juhul see, mis vastavalt funktsiooni kirjeldusele ja etteantud argumentidele v\u00e4lja arvutatakse ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-rea abil tagastatakse.<\/p>\r\n<p class=\"vspace\">Neid funktsioone, milles <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-lauset pole, rakendatakse harilikult iseseisvate lausetena. Neid ei saa kasutada avaldistes.<\/p>\r\n<p class=\"vspace\">Proovime ekraanile v\u00e4ljastada sellise funktsiooni v\u00e4\u00e4rtust, kus midagi ei tagastata:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    print(x + y)\r\nprint(summa(1,3))<\/pre>\r\nProovime selle programmi k\u00e4ivitada. N\u00e4eme, et ekraanile ilmub\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">4\r\nNone<\/pre>\r\nMis siin juhtus? K\u00f5igepealt k\u00e4ivitati funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">summa(1,3)<\/code> ja v\u00e4ljastati 1 + 3 ehk 4. Seej\u00e4rel aga p\u00fc\u00fcti ekraanile v\u00e4ljastada funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">summa(1,3)<\/code> v\u00e4\u00e4rtus. Kuna seal <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-i sees pole, siis funktsioonil endal v\u00e4\u00e4rtust pole ja seda s\u00fcmboliseerib s\u00f5na <em>None<\/em> (eesti keeles \u201cmitte miski\u201d). Kui tahame teha funktsiooni, mis annab v\u00f5imaluse summa arvutada ja siis seda summat avaldistes edasi kasutada, siis peaksime kasutama <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em>-lauset:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    return x + y\r\nprint(summa(1,3))<\/pre>\r\nVaatame ka n\u00e4idet, kus me tahame kahe arvu summa funktsiooni abil leida nende keskmise v\u00e4\u00e4rtuse. Katsetame nii <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em>-lausega kui ilma:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaReturn(x,y):\r\n    return x + y\r\nprint(summaReturn(1,3)\/2)\r\ndef summaPrint(x,y):\r\n    print(x + y)\r\nprint(summaPrint(1,3)\/2)<\/pre>\r\nLisaks on veel v\u00f5imalik, et funktsioon nii v\u00e4ljastab kui tagastab mingisuguseid v\u00e4\u00e4rtusi. Seda saab kasutada n\u00e4iteks logifailide kirjutamiseks v\u00f5i vigade otsimiseks. Siiski tasuks liigset v\u00e4ljastamist v\u00e4ltida, sest see on v\u00f5rdlemisi ressursin\u00f5udlik.\r\n<h2>Funktsiooni argumentide k\u00e4ttesaadavus<\/h2>\r\nEespool v\u00e4itsime, et iga funktsiooni v\u00e4ljakutsel toimub esmalt argumendiks antavate v\u00e4\u00e4rtuste omistamine funktsiooni argumentidele. Funktsiooni argumentidest v\u00f5ib m\u00f5elda kui tavalistest muutujatest, kuid olulise kitsendusega: funktsiooni argumente ei saa kasutada funktsiooni kirjeldusest v\u00e4ljaspool. Proovi j\u00e4rgnevat programmi:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    tulemus = x + y\r\n    return tulemus\r\nprint(summa(1,3))\r\nprint(x)<\/pre>\r\nProgramm annab veateate, sest muutujat <em>x<\/em> ei eksisteeri funktsiooni kirjeldusest v\u00e4ljaspool. Sama juhtub muutujatega, mis on defineeritud funktsiooni kirjelduses. N\u00e4iteks kui p\u00fc\u00fcame rea <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(tulemus)<\/code><\/code> abil v\u00e4ljastada muutuja <em>tulemus<\/em> v\u00e4\u00e4rtust, siis seda saame teha vaid funktsiooni kirjelduses, v\u00e4ljaspool funktsiooni kirjeldust muutujat nimega <em>tulemus<\/em> ei eksisteeri. Lokaalsetest ja globaalsetest muutujatest tuleb p\u00f5hjalikumalt juttu j\u00e4rgmises peat\u00fckis.\r\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\r\n<code>[h5p id=\"25\"]<\/code>\r\n<h3>Video<\/h3>\r\n<p class=\"vspace\">Vaatleme programmi, mis k\u00fcsib isa brutopalga, ema brutopalga ning alaealiste laste arvu ja arvutab selle p\u00f5hjal pere kuusissetuleku. Oletame, et iga alaealise lapse kohta makstakse toetust 20\u20ac kuus. Esialgu v\u00f5ib eeldada, et m\u00f5lema vanema kuupalk on v\u00e4hemalt sama suur kui maksuvaba miinimum.<\/p>\r\n<p class=\"vspace\">J\u00e4rgnevates videotes on see \u00fclesanne lahendatud vastavalt <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=16829\" target=\"_blank\" rel=\"noopener noreferrer\">ilma uut funktsiooni defineerimata<\/a> ja <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=16895\" target=\"_blank\" rel=\"noopener noreferrer\">uue funktsiooni defineerimisega<\/a> . Videotes ei ole kasutatud keskkonda Thonny, kasutatud on keskkonda IDLE. Kuna videod on valminud juba m\u00f5ni aasta tagasi, siis rahasummad ei pruugi olla t\u00f5ep\u00e4rased.<\/p>","rendered":"<h2>\u00dcldistamine. Argumendid<\/h2>\n<p class=\"vspace\">\u00dcsna sageli on meil vaja peaaegu samasugust tegevust sooritada mitmes erinevas kohas. Kui eri kohtades on vaja sarnast, kuid teatud variatsiooniga koodi, siis on v\u00f5imalik kirjeldada funktsioon argumentide (parameetrite) abil. Sel juhul antakse v\u00e4ljakutsumisel funktsioonile sisendiks argumendid ja konkreetne tulemus s\u00f5ltub nende v\u00e4\u00e4rtustest.<\/p>\n<p class=\"vspace\">N\u00e4iteks allaloendamise funktsiooni v\u00f5ime teha \u00fcldisemaks nii, et anname ette, millisest arvust tuleb hakata lugema. Hetkel muutub programm sellest isegi l\u00fchemaks: meil pole enam vaja rida <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">i = 10<\/code><\/code>, sest me lisame muutuja <em>i<\/em> funktsiooni nime j\u00e4rel olevatesse sulgudesse:<\/p>\n<p><strong>N\u00e4iteprogramm. Argumendiga loendur<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla(i):\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)\r\n \r\nloe_alla(4)<\/pre>\n<p class=\"vspace\">N\u00fc\u00fcd on funktsioon palju paindlikum ja k\u00e4itub erinevalt olenevalt argumendi v\u00e4\u00e4rtusest. N\u00e4ites on funktsioon <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla<\/code><\/em> v\u00e4lja kutsutud argumendi v\u00e4\u00e4rtusega 4. Sellega saab <em>i<\/em> esialgseks v\u00e4\u00e4rtuseks 4. Ts\u00fckli j\u00e4tkamistingimus on t\u00e4idetud ja nii tehaksegi esimene samm <em>i<\/em> v\u00e4\u00e4rtusega 4, mis v\u00e4ljastatakse ekraanile. J\u00e4rgmine rida muudab <em>i<\/em> v\u00e4\u00e4rtuse \u00fche v\u00f5rra v\u00e4iksemaks ja nii edasi.<\/p>\n<p class=\"vspace\">Proovi funktsiooni v\u00e4lja kutsuda erinevate argumentide v\u00e4\u00e4rtustega, nt <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(8)<\/code><\/code>, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(1)<\/code>, <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">loe_alla(-1)<\/code><\/code>.<\/p>\n<p class=\"vspace\">Muudame n\u00fc\u00fcd ridade <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(i)<\/code> ja <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">i -= 1<\/code><\/code> j\u00e4rjekorda ja j\u00e4rgmise k\u00fcsimuse tarbeks kutsume selle funktsiooni v\u00e4lja argumendiga 6.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\ndef loe_alla(i):\r\n    while i &gt; 0:       \r\n        i -= 1\r\n        print(i)\r\n        sleep(1)\r\n \r\nloe_alla(6)<\/pre>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-23\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-23\" class=\"h5p-iframe\" data-content-id=\"23\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-2-esimenearv\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>Video<\/h3>\n<p>Vaata ka <a href=\"https:\/\/www.youtube.com\/watch?v=RMYNksCwUPQ\">kokkuv\u00f5tvat videot<\/a>.<\/p>\n<h2>V\u00e4\u00e4rtust tagastav funktsioon<\/h2>\n<p class=\"vspace\">Eelmised n\u00e4ited olid funktsioonidest, mis sooritasid mingisugused tegevused, n\u00e4iteks teksti ekraanile kuvamise. N\u00fc\u00fcd vaatame funktsioone, mis tagastavad v\u00e4\u00e4rtuse (\u00f5igemini on funktsioon ise selle v\u00e4\u00e4rtusega). Olemuselt on see sarnane funktsiooni m\u00f5iste matemaatilise k\u00e4sitlusega. Igale argumendile vastab teatud v\u00e4\u00e4rtus, mida nimetatakse selle funktsiooni v\u00e4\u00e4rtuseks antud argumendi korral. N\u00e4iteks ruutfunktsiooni x<sup>2<\/sup> korral vastab argumendile 4 funktsiooni v\u00e4\u00e4rtus 16, argumendile 5 vastab v\u00e4\u00e4rtus 25. Koosinusfunktsiooni korral vastab argumendile 0 funktsiooni v\u00e4\u00e4rtus 1, sest cos(0) = 1. Ruutjuure korral vastab argumendile 9 funktsiooni v\u00e4\u00e4rtus 3. Koosinuse ja ruutjuure jaoks on Pythonis funktsioonid olemas, vastavalt <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cos<\/code> ja <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sqrt<\/code><\/code>. Nende kasutamiseks tuleb need esmalt moodulist <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">math<\/code><\/em> importida (<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from math import cos, sqrt<\/code>).<\/p>\n<p>Olgu meil \u00fclesandeks luua funktsioon, mis tagastab arvu ruudu. Defineerime selle funktsiooni:<\/p>\n<p><strong>N\u00e4iteprogramm. Arvu ruutu tagastav funktsioon<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">def ruutu(x):\r\n    return x**2\r\nprint(ruutu(4))<\/pre>\n<p class=\"vspace\">Selliste funktsioonide korral, mis peavad tulemuse tagastama, on oluline k\u00e4sk <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code>, millega funktsioon v\u00e4\u00e4rtuse omandab. Programmi kolmas rida on funktsiooni kirjelduse j\u00e4rel ja rakendab vastloodud funktsiooni argumendiga 4. Rida k\u00e4ivitades saab <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4)<\/code><\/code> v\u00e4\u00e4rtuse 16 ja seda saab kasutada nagu tavalist arvv\u00e4\u00e4rtust, mille me <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">print<\/code> abil ekraanile v\u00e4ljastame. Saaksime seda ka avaldises kasutada, nt avaldise <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4) - 17<\/code><\/code> v\u00e4\u00e4rtus oleks -1.<\/p>\n<p>Funktsiooni tagastatav suurus v\u00f5ib olla ka muud t\u00fc\u00fcpi kui arv. Funktsiooni kehas v\u00f5ib olla rohkem ridu, kuid\u00a0<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code>-reaga funktsioon l\u00f5petab oma t\u00f6\u00f6.<\/p>\n<h2>Mitme argumendiga funktsioon<\/h2>\n<p class=\"vspace\">Funktsioonil v\u00f5ib olla argumente rohkem kui \u00fcks. Sel juhul eraldatakse need komadega. J\u00e4rgmine funktsioon tagastab t\u00f5ev\u00e4\u00e4rtuse:<\/p>\n<p><strong>N\u00e4iteprogramm. T\u00f5ev\u00e4\u00e4rtust tagastav mitme argumendiga funktsioon<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">def kas_raha_j\u00e4tkub(kghind, kogus, raha):\r\n    hind = kghind * kogus\r\n    if hind &lt;= raha:\r\n        return True\r\n    else:\r\n        return False\r\n \r\nif kas_raha_j\u00e4tkub(2, 4.5, 10):\r\n    print(\"Ostan\")<\/pre>\n<p class=\"vspace\">Kuna selle funktsiooni v\u00e4\u00e4rtus on t\u00f5ev\u00e4\u00e4rtust\u00fc\u00fcpi, siis saab seda kasutada n\u00e4iteks valikulause tingimuses. Antud juhul on <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub(2, 4.5, 10)<\/code> v\u00e4\u00e4rtuseks <code>True<\/code>.<\/p>\n<p class=\"vspace\">Kui funktsioon v\u00f5tab mitu argumenti, siis on oluline nende j\u00e4rjestus. Praegusel juhul antakse funktsiooni v\u00e4ljakutsumisel esimese argumendi v\u00e4\u00e4rtus muutujale <em>kghind<\/em>, teise v\u00e4\u00e4rtus muutujale <em>kogus<\/em> ja kolmanda v\u00e4\u00e4rtus muutujale <em>raha<\/em>. V\u00f5ib m\u00f5elda nii, et kui funktsioon argumentidega 2, 4.5 ja 10 v\u00e4lja kutsutakse, siis enne funktsioonis olevate lausete juurde minemist tehakse j\u00e4rgmised omistuslaused: <code>kghind = 2<\/code>, <code>kogus = 4.5<\/code> ja <code>raha = 10<\/code>. Tuleb m\u00e4rkida, et funktsiooni argumentide nimed on programmi seisukohalt suvalised, neist ei s\u00f5ltu programmi jaoks mitte midagi (nagu ka muutujate nimede puhul), kuid nimed v\u00f5iksid ikka olla sellised, mis annaksid programmi lugejale kasulikku infot koodi kohta.<\/p>\n<p class=\"vspace\">Tegelikult on funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub<\/code> v\u00f5imalik defineerida kahe reaga (\u00fcks rida funktsiooni nime ja argumentide jaoks ning \u00fcks rida <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-lause jaoks). Soovi korral p\u00fc\u00fca funktsiooni kirjeldus sellisena \u00fcmber kirjutada. Abiks v\u00f5ib olla teadmine, et <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/code> j\u00e4rel ei pruugi olla ilmutatult <code>True<\/code> v\u00f5i <code>False<\/code>, vaid n\u00e4iteks avaldis <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">a * b &lt;= c<\/code><\/code>.<\/p>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-24\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-24\" class=\"h5p-iframe\" data-content-id=\"24\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-2-olidtubli\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h2>Tagastamine ja v\u00e4ljastamine<\/h2>\n<p>Me oleme nendes materjalides kasutanud kahte k\u00fcllaltki sarnast terminit: <strong>v\u00e4ljastamine<\/strong> ja <strong>tagastamine<\/strong>. V\u00e4ljastamise all m\u00f5tleme p\u00f5hiliselt millegi ekraanile manamist (eelk\u00f5ige funktsiooni <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code><\/em> abil). Tagastamise all aga peame silmas funktsiooni v\u00e4\u00e4rtuse tagastamist (k\u00e4su <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em> abil). (Muudes materjalides v\u00f5ib s\u00f5nastus olla teistsugune.)<\/p>\n<p>Kui me jaotasime funktsioone sellisteks, mis midagi \u00e4ra teevad, ja sellisteks, mis v\u00e4\u00e4rtuse tagastavad, siis kuhu kuulub j\u00e4rgmine funktsioon?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    print(x + y)<\/pre>\n<p class=\"vspace\">Arvutamine ilmselt toimub. Tulemus aga v\u00e4ljastatakse ekraanile ja seda ei tagastata &#8211; <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code> puudub. Selline funktsioon kvalifitseerub millegi \u00e4ra tegijate hulka. Selline liigitamine on oluline seep\u00e4rast, et erinevatel liikidel on m\u00f5nev\u00f5rra erinevad rollid. V\u00e4\u00e4rtust tagastavad funktsioonid leiavad kasutust seal, kus saab kasutada arve, t\u00f5ev\u00e4\u00e4rtusi, s\u00f5nesid &#8211; oleneb sellest, mis t\u00fc\u00fcpi v\u00e4\u00e4rtus tagastatakse. N\u00e4iteks <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruutu(4)<\/code><\/code> sobib tehniliselt igale poole, kuhu k\u00f5lbaks 16. Igale poole, kuhu sobib <code>True<\/code>, sobib tehniliselt ka <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kas_raha_j\u00e4tkub(2, 4.5, 10)<\/code><\/code>. Nende v\u00e4\u00e4rtus ongi igal konkreetsel juhul see, mis vastavalt funktsiooni kirjeldusele ja etteantud argumentidele v\u00e4lja arvutatakse ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-rea abil tagastatakse.<\/p>\n<p class=\"vspace\">Neid funktsioone, milles <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-lauset pole, rakendatakse harilikult iseseisvate lausetena. Neid ei saa kasutada avaldistes.<\/p>\n<p class=\"vspace\">Proovime ekraanile v\u00e4ljastada sellise funktsiooni v\u00e4\u00e4rtust, kus midagi ei tagastata:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    print(x + y)\r\nprint(summa(1,3))<\/pre>\n<p>Proovime selle programmi k\u00e4ivitada. N\u00e4eme, et ekraanile ilmub<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">4\r\nNone<\/pre>\n<p>Mis siin juhtus? K\u00f5igepealt k\u00e4ivitati funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">summa(1,3)<\/code> ja v\u00e4ljastati 1 + 3 ehk 4. Seej\u00e4rel aga p\u00fc\u00fcti ekraanile v\u00e4ljastada funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">summa(1,3)<\/code> v\u00e4\u00e4rtus. Kuna seal <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>-i sees pole, siis funktsioonil endal v\u00e4\u00e4rtust pole ja seda s\u00fcmboliseerib s\u00f5na <em>None<\/em> (eesti keeles \u201cmitte miski\u201d). Kui tahame teha funktsiooni, mis annab v\u00f5imaluse summa arvutada ja siis seda summat avaldistes edasi kasutada, siis peaksime kasutama <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em>-lauset:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    return x + y\r\nprint(summa(1,3))<\/pre>\n<p>Vaatame ka n\u00e4idet, kus me tahame kahe arvu summa funktsiooni abil leida nende keskmise v\u00e4\u00e4rtuse. Katsetame nii <em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code><\/em>-lausega kui ilma:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaReturn(x,y):\r\n    return x + y\r\nprint(summaReturn(1,3)\/2)\r\ndef summaPrint(x,y):\r\n    print(x + y)\r\nprint(summaPrint(1,3)\/2)<\/pre>\n<p>Lisaks on veel v\u00f5imalik, et funktsioon nii v\u00e4ljastab kui tagastab mingisuguseid v\u00e4\u00e4rtusi. Seda saab kasutada n\u00e4iteks logifailide kirjutamiseks v\u00f5i vigade otsimiseks. Siiski tasuks liigset v\u00e4ljastamist v\u00e4ltida, sest see on v\u00f5rdlemisi ressursin\u00f5udlik.<\/p>\n<h2>Funktsiooni argumentide k\u00e4ttesaadavus<\/h2>\n<p>Eespool v\u00e4itsime, et iga funktsiooni v\u00e4ljakutsel toimub esmalt argumendiks antavate v\u00e4\u00e4rtuste omistamine funktsiooni argumentidele. Funktsiooni argumentidest v\u00f5ib m\u00f5elda kui tavalistest muutujatest, kuid olulise kitsendusega: funktsiooni argumente ei saa kasutada funktsiooni kirjeldusest v\u00e4ljaspool. Proovi j\u00e4rgnevat programmi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    tulemus = x + y\r\n    return tulemus\r\nprint(summa(1,3))\r\nprint(x)<\/pre>\n<p>Programm annab veateate, sest muutujat <em>x<\/em> ei eksisteeri funktsiooni kirjeldusest v\u00e4ljaspool. Sama juhtub muutujatega, mis on defineeritud funktsiooni kirjelduses. N\u00e4iteks kui p\u00fc\u00fcame rea <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(tulemus)<\/code><\/code> abil v\u00e4ljastada muutuja <em>tulemus<\/em> v\u00e4\u00e4rtust, siis seda saame teha vaid funktsiooni kirjelduses, v\u00e4ljaspool funktsiooni kirjeldust muutujat nimega <em>tulemus<\/em> ei eksisteeri. Lokaalsetest ja globaalsetest muutujatest tuleb p\u00f5hjalikumalt juttu j\u00e4rgmises peat\u00fckis.<\/p>\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-25\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-25\" class=\"h5p-iframe\" data-content-id=\"25\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-2-summa\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>Video<\/h3>\n<p class=\"vspace\">Vaatleme programmi, mis k\u00fcsib isa brutopalga, ema brutopalga ning alaealiste laste arvu ja arvutab selle p\u00f5hjal pere kuusissetuleku. Oletame, et iga alaealise lapse kohta makstakse toetust 20\u20ac kuus. Esialgu v\u00f5ib eeldada, et m\u00f5lema vanema kuupalk on v\u00e4hemalt sama suur kui maksuvaba miinimum.<\/p>\n<p class=\"vspace\">J\u00e4rgnevates videotes on see \u00fclesanne lahendatud vastavalt <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=16829\" target=\"_blank\" rel=\"noopener noreferrer\">ilma uut funktsiooni defineerimata<\/a> ja <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=16895\" target=\"_blank\" rel=\"noopener noreferrer\">uue funktsiooni defineerimisega<\/a> . Videotes ei ole kasutatud keskkonda Thonny, kasutatud on keskkonda IDLE. Kuna videod on valminud juba m\u00f5ni aasta tagasi, siis rahasummad ei pruugi olla t\u00f5ep\u00e4rased.<\/p>\n","protected":false},"author":12,"menu_order":2,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-181","chapter","type-chapter","status-publish","hentry"],"part":166,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/181","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":8,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/181\/revisions"}],"predecessor-version":[{"id":557,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/181\/revisions\/557"}],"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\/181\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=181"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=181"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}