{"id":187,"date":"2019-01-09T13:27:01","date_gmt":"2019-01-09T13:27:01","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=187"},"modified":"2025-12-12T11:46:54","modified_gmt":"2025-12-12T11:46:54","slug":"argumendid-muutujad","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/argumendid-muutujad\/","title":{"raw":"Argumendid, muutujad","rendered":"Argumendid, muutujad"},"content":{"raw":"<h2>Mitu funktsiooni koos<\/h2>\r\n<p class=\"vspace\">Vaatame programmi, kus funktsioone kasutatakse nii, et \u00fche v\u00e4\u00e4rtus on teise argumendiks:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">\u00fcmardatud_sisestatud_arv = round(float(input(\"Sisestage arv \")))\r\nprint(\"See arv \u00fcmardatult on \" + str(\u00fcmardatud_sisestatud_arv))<\/pre>\r\n<p class=\"vspace\">Katseta seda suhteliselt kokkusurutud programmi. Selle esimesel real sooritatakse hulk tegevusi. Tegevused algavad \u201cseestpoolt\u201d.<\/p>\r\n\r\n<ul>\r\n \t<li>Funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> k\u00fcsitakse kasutaja k\u00e4est arv. Funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> v\u00e4\u00e4rtus on s\u00f5net\u00fc\u00fcpi.<\/li>\r\n \t<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">float<\/code> v\u00f5tab argumendiks s\u00f5ne ja tema enda v\u00e4\u00e4rtuseks saab vastav ujukomaarv. Teiste s\u00f5nadega: funktsioon tagastab vastava ujukomaarvu. V\u00f5i veel k\u00f5nekeelsemalt: funktsioon muudab s\u00f5ne vastavaks ujukomaarvuks.<\/li>\r\n \t<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">round<\/code> v\u00f5tab argumendiks ujukomaarvu ja \u00fcmardab selle t\u00e4isarvuks.<\/li>\r\n<\/ul>\r\nL\u00f5puks m\u00e4\u00e4ratakse see t\u00e4isarv muutuja <em>\u00fcmardatud_sisestatud_arv<\/em> v\u00e4\u00e4rtuseks.\r\n<p class=\"vspace\">Niimoodi teise funktsiooni argumendiks saab olla ainult v\u00e4\u00e4rtust tagastav funktsioon. Sellisena saab muidugi kasutada ka isekirjeldatud funktsioone:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    return x + y\r\n\r\na = summa(summa(1, 3)*2, 4)<\/pre>\r\n<h3>Video<\/h3>\r\nVaata ka eelmise \u00fclesande kohta k\u00e4ivat <a href=\"https:\/\/youtu.be\/L02Nzv4AN38\">kokkuv\u00f5tvat videot<\/a>.\r\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\r\n<code>[h5p id=\"26\"]<\/code>\r\n<h2>Erinevad argumendid. Mitu tagastatavat v\u00e4\u00e4rtust<\/h2>\r\n<p class=\"vspace\">Eelnevates n\u00e4idetes olid funktsioonide argumentideks tavaliselt arvud v\u00f5i s\u00f5ned. Olenevalt funktsioonist v\u00f5ivad argumendid olla ka hoopis muud t\u00fc\u00fcpi. Nagu me eespool n\u00e4gime, v\u00f5ib argumentide arv olla funktsioonidel erinev. Samuti ei pea \u00fche funktsiooni argumendid olema omavahel sama t\u00fc\u00fcpi.<\/p>\r\nK\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code> tagastab ainult \u00fche v\u00e4\u00e4rtuse. Kui on vaja tagastada mitu v\u00e4\u00e4rtust, tuleb esmalt moodustada sobiv andmestruktuur, mis teisi v\u00e4\u00e4rtusi h\u00f5lmab.\r\n<p class=\"vspace\">Koostame funktsiooni, mille argumendiks on fail ja tagastatakse s\u00f5nede j\u00e4rjend, mille elemendid on read sellest failist:<\/p>\r\n<strong>N\u00e4iteprogramm. Failist lugemise funktsioon<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def failistS\u00f5nej\u00e4rjendisse(fail):\r\n    j\u00e4rjend = []\r\n    for rida in fail:\r\n        j\u00e4rjend += [rida.strip()]  # alternatiivselt: j\u00e4rjend.append(rida.strip())\r\n                                   # strip() v\u00f5tab l\u00f5pust \u00e4ra reavahetuse\r\n    fail.close()\r\n    return j\u00e4rjend\r\n\r\nfailinimi = input(\"Sisestage failinimi \")\r\nfail = open(failinimi, encoding=\"UTF-8\")\r\ns\u00f5ned = failistS\u00f5nej\u00e4rjendisse(fail)\r\nprint(s\u00f5ned)\r\nprint(s\u00f5ned[3])<\/pre>\r\n<div class=\"line number9 index8 alt2\"><code class=\"python plain\"><\/code><\/div>\r\nMeie loodud funktsioon tagastab j\u00e4rjendi. See on \u00fcks viis, kuidas mitut v\u00e4\u00e4rtust tagastada.\r\n<h2>Vaikev\u00e4\u00e4rtus<\/h2>\r\n<p class=\"vspace\">M\u00f5nikord on konkreetse argumendi v\u00e4\u00e4rtus peaaegu alati sama ja oleks t\u00fc\u00fctu seda iga kord uuesti ette anda. Sellisel juhul saame kasutada <strong>vaikev\u00e4\u00e4rtust<\/strong>. Kui funktsiooni v\u00e4ljakutsel pole seda argumenti n\u00e4idatud, siis saab argumendi v\u00e4\u00e4rtuseks vaikev\u00e4\u00e4rtus:<\/p>\r\n<strong>N\u00e4iteprogramm. Vaikev\u00e4\u00e4rtusega funktsioon<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def kasKiiruse\u00dcletamine(kiirus, piirkiirus = 90):\r\n    return kiirus &gt; piirkiirus\r\n \r\nprint(kasKiiruse\u00dcletamine(100))\r\nprint(kasKiiruse\u00dcletamine(90, 70))<\/pre>\r\nVaikev\u00e4\u00e4rtus on ka funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> argumendil <em>end<\/em>, millega m\u00e4\u00e4ratakse v\u00e4ljastatava s\u00f5ne l\u00f5ppu lisatav(ad) s\u00fcmbol(id). Vaikimisi on l\u00f5pus reavahetus, sest argument on vaikimisi <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">end = \"\\n\"<\/code><\/code>. Me v\u00f5ime sellele argumendile anda ka teistsuguse v\u00e4\u00e4rtuse:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"V\u00e4ljastatav tekst \", end = \"l\u00f5ppu juurde\")<\/pre>\r\n<h2>Meetodid<\/h2>\r\nS\u00f5nede peat\u00fckis kasutasime funktsioone, mis on s\u00f5nega \u00fchendatud punktiga:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"tartu\".capitalize())\r\nprint(\"Tartu\".endswith(\"tu\"))\r\nprint(\"Tartu\".upper())\r\nlinn = \"Tartu\"\r\nprint(linn.lower())<\/pre>\r\nTundub, nagu sellisel juhul pole argument mitte sulgudes, vaid hoopis funktsiooni ees. P\u00f5him\u00f5tteliselt see nii ongi. Selliseid funktsioone nimetatakse <strong>meetoditeks<\/strong> ja need on v\u00e4ga tavalised objektorienteeritud programmeerimises. Siinsetes materjalides me k\u00fcll kasutame meetodeid (eriti s\u00f5nede puhul), aga p\u00f5hjalikumalt neid ei k\u00e4sitle.\r\n<h2>Lokaalsed ja globaalsed muutujad<\/h2>\r\nEelmises peat\u00fckis mainisime, et funktsiooni sees loodavad muutujad ei ole k\u00e4ttesaadavad funktsioonist v\u00e4ljaspool. Loome n\u00e4iteks funktsiooni:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\r\nProgrammi t\u00f6\u00f6le pannes saame ekraanile arvu 6, mis ongi 1 + 2 + 3 korral oodatud tulemus. Lisame programmile rea <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summa)<\/code><\/code>:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(summa)<\/pre>\r\nSaame veateate tekstiga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">NameError: name 'summa' is not defined<\/code> ehk nimi <em>summa<\/em> ei ole defineeritud (kirjeldatud). Kuna funktsiooni sees toimuv on funktsiooni \"siseasi\", siis t\u00f5epoolest pole muutujat <em>summa<\/em> v\u00e4ljaspool funktsiooni olemas. Sellist funktsiooni kehas (kirjelduses) defineeritud muutujat nimetatakse <strong>lokaalseks muutujaks<\/strong>. Kui sooritame printimise funktsiooni kirjelduse sees, toimib see tavap\u00e4raselt:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    print(summa)\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\r\nN\u00fc\u00fcd ilmub 6 ekraanile kahel korral: esmalt funktsiooni sees oleva <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summa)<\/code><\/code> t\u00f5ttu ja teist korda <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summaFunktsioon(1, 2, 3))<\/code> t\u00f5ttu.\r\n\r\nSamuti on lokaalsed ka funktsiooni argumendid. Muutuja <em>b<\/em> on funktsiooni sees t\u00e4iesti olemas:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    print(b)\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\r\nFunktsioonist v\u00e4ljas aga mitte:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(b)<\/pre>\r\n<p class=\"vspace\">Lokaalsed muutujad luuakse funktsiooni igal k\u00e4ivitamisel uuesti ja nad h\u00e4vivad, kui funktsioon t\u00f6\u00f6 l\u00f5petab. Lokaalsed muutujad on funktsiooni siseasi, v\u00e4ljast neid n\u00e4ha pole. Neile saab panna sama nime, mis juba on programmi p\u00f5hiosas (v\u00f5i m\u00f5nes teises funktsioonis) kasutuses olnud.<\/p>\r\n<p class=\"vspace\">N\u00e4iteks on j\u00e4rgmises programmis nii funktsioonis kui p\u00f5hiprogrammis muutuja <em>summa<\/em>:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nsumma = 10\r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(summa)<\/pre>\r\n<p class=\"vspace\">N\u00e4eme, et viimases reas on muutuja <em>summa<\/em> v\u00e4\u00e4rtus just see, mis ta p\u00f5hiprogrammis sai - funktsioonis toimuv tema v\u00e4\u00e4rtust ei muuda.<\/p>\r\n<p class=\"vspace\">P\u00f5hiprogrammis defineeritud muutujad on <strong>globaalsed muutujad<\/strong>. Nende v\u00e4\u00e4rtusi saab kasutada nii p\u00f5hiprogrammis kui ka funktsioonide sees. Kui aga funktsioonis on sama nimega lokaalne muutuja, siis samanimelist globaalset muutujat seal kasutada ei saa. Eelmises n\u00e4ites just nii oligi.<\/p>\r\n<p class=\"vspace\">J\u00e4rgmises n\u00e4ites saab globaalset muutujat funktsioonis kasutada, sest sellenimelist lokaalset muutujat funktsioonis pole:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c + gm\r\n    return summa\r\n \r\ngm = 17   # globaalne muutuja\r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\r\nTeatud juhtudel on globaalsete muutujate kasutamine funktsioonis ebasoovitav, kuid seda me siinsetes materjalides ei vaatle.\r\n<h2>Kokkuv\u00f5te<\/h2>\r\n<p class=\"vspace\">Funktsioonid ehk alamprogrammid v\u00f5imaldavad (sageli k\u00fcllalt keerulise) programmil\u00f5igu panna kirja \u00fcks kord, aga kasutada seda mitmes erinevas kohas.<\/p>\r\n<p class=\"vspace\">Funktsiooni <em>definitsiooni<\/em> (kirjelduse) ehk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def<\/code>-lause kehas olevad laused j\u00e4etakse esialgu lihtsalt meelde. Neid saab hiljem k\u00e4ivitada, kirjutades funktsiooni nime koos sulgudega. Sellist tegevust nimetatakse funktsiooni <em>v\u00e4ljakutseks<\/em> ehk rakendamiseks.<\/p>\r\n<p class=\"vspace\">Funktsiooni defineerimisel saab j\u00e4tta m\u00f5ned detailid lahtiseks. T\u00e4pne t\u00f6\u00f6 s\u00f5ltub etteantud argumentide v\u00e4\u00e4rtustest.<\/p>\r\n<p class=\"vspace\">Funktsioone v\u00f5ib jaotada kahte gruppi \u2013 \u00fched teevad midagi \u00e4ra ja teised arvutavad ja tagastavad midagi.<\/p>\r\n<p class=\"vspace\">Selleks, et funktsiooni saaks kasutada avaldises, peab ta arvutatud v\u00e4\u00e4rtuse tagastama. V\u00e4\u00e4rtuse tagastamiseks kasutatakse v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>.<\/p>\r\n<p class=\"vspace\">Programmi p\u00f5hiosas defineeritud muutujaid nimetatakse <em>globaalseteks muutujateks<\/em>, funktsiooni sees defineeritud muutujaid <em>lokaalseteks muutujateks<\/em>.<\/p>\r\n\r\n<h2>Video<\/h2>\r\nVaata ka funktsioone kokkuv\u00f5tvat videot:\r\n\r\nhttps:\/\/www.youtube.com\/watch?v=zbIttaEY7ZQ","rendered":"<h2>Mitu funktsiooni koos<\/h2>\n<p class=\"vspace\">Vaatame programmi, kus funktsioone kasutatakse nii, et \u00fche v\u00e4\u00e4rtus on teise argumendiks:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">\u00fcmardatud_sisestatud_arv = round(float(input(\"Sisestage arv \")))\r\nprint(\"See arv \u00fcmardatult on \" + str(\u00fcmardatud_sisestatud_arv))<\/pre>\n<p class=\"vspace\">Katseta seda suhteliselt kokkusurutud programmi. Selle esimesel real sooritatakse hulk tegevusi. Tegevused algavad \u201cseestpoolt\u201d.<\/p>\n<ul>\n<li>Funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> k\u00fcsitakse kasutaja k\u00e4est arv. Funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">input<\/code> v\u00e4\u00e4rtus on s\u00f5net\u00fc\u00fcpi.<\/li>\n<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">float<\/code> v\u00f5tab argumendiks s\u00f5ne ja tema enda v\u00e4\u00e4rtuseks saab vastav ujukomaarv. Teiste s\u00f5nadega: funktsioon tagastab vastava ujukomaarvu. V\u00f5i veel k\u00f5nekeelsemalt: funktsioon muudab s\u00f5ne vastavaks ujukomaarvuks.<\/li>\n<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">round<\/code> v\u00f5tab argumendiks ujukomaarvu ja \u00fcmardab selle t\u00e4isarvuks.<\/li>\n<\/ul>\n<p>L\u00f5puks m\u00e4\u00e4ratakse see t\u00e4isarv muutuja <em>\u00fcmardatud_sisestatud_arv<\/em> v\u00e4\u00e4rtuseks.<\/p>\n<p class=\"vspace\">Niimoodi teise funktsiooni argumendiks saab olla ainult v\u00e4\u00e4rtust tagastav funktsioon. Sellisena saab muidugi kasutada ka isekirjeldatud funktsioone:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summa(x,y):\r\n    return x + y\r\n\r\na = summa(summa(1, 3)*2, 4)<\/pre>\n<h3>Video<\/h3>\n<p>Vaata ka eelmise \u00fclesande kohta k\u00e4ivat <a href=\"https:\/\/youtu.be\/L02Nzv4AN38\">kokkuv\u00f5tvat videot<\/a>.<\/p>\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-26\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-26\" class=\"h5p-iframe\" data-content-id=\"26\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Funktsioon-3-muutujav\u00e4\u00e4rtus\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h2>Erinevad argumendid. Mitu tagastatavat v\u00e4\u00e4rtust<\/h2>\n<p class=\"vspace\">Eelnevates n\u00e4idetes olid funktsioonide argumentideks tavaliselt arvud v\u00f5i s\u00f5ned. Olenevalt funktsioonist v\u00f5ivad argumendid olla ka hoopis muud t\u00fc\u00fcpi. Nagu me eespool n\u00e4gime, v\u00f5ib argumentide arv olla funktsioonidel erinev. Samuti ei pea \u00fche funktsiooni argumendid olema omavahel sama t\u00fc\u00fcpi.<\/p>\n<p>K\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code> tagastab ainult \u00fche v\u00e4\u00e4rtuse. Kui on vaja tagastada mitu v\u00e4\u00e4rtust, tuleb esmalt moodustada sobiv andmestruktuur, mis teisi v\u00e4\u00e4rtusi h\u00f5lmab.<\/p>\n<p class=\"vspace\">Koostame funktsiooni, mille argumendiks on fail ja tagastatakse s\u00f5nede j\u00e4rjend, mille elemendid on read sellest failist:<\/p>\n<p><strong>N\u00e4iteprogramm. Failist lugemise funktsioon<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def failistS\u00f5nej\u00e4rjendisse(fail):\r\n    j\u00e4rjend = []\r\n    for rida in fail:\r\n        j\u00e4rjend += [rida.strip()]  # alternatiivselt: j\u00e4rjend.append(rida.strip())\r\n                                   # strip() v\u00f5tab l\u00f5pust \u00e4ra reavahetuse\r\n    fail.close()\r\n    return j\u00e4rjend\r\n\r\nfailinimi = input(\"Sisestage failinimi \")\r\nfail = open(failinimi, encoding=\"UTF-8\")\r\ns\u00f5ned = failistS\u00f5nej\u00e4rjendisse(fail)\r\nprint(s\u00f5ned)\r\nprint(s\u00f5ned[3])<\/pre>\n<div class=\"line number9 index8 alt2\"><code class=\"python plain\"><\/code><\/div>\n<p>Meie loodud funktsioon tagastab j\u00e4rjendi. See on \u00fcks viis, kuidas mitut v\u00e4\u00e4rtust tagastada.<\/p>\n<h2>Vaikev\u00e4\u00e4rtus<\/h2>\n<p class=\"vspace\">M\u00f5nikord on konkreetse argumendi v\u00e4\u00e4rtus peaaegu alati sama ja oleks t\u00fc\u00fctu seda iga kord uuesti ette anda. Sellisel juhul saame kasutada <strong>vaikev\u00e4\u00e4rtust<\/strong>. Kui funktsiooni v\u00e4ljakutsel pole seda argumenti n\u00e4idatud, siis saab argumendi v\u00e4\u00e4rtuseks vaikev\u00e4\u00e4rtus:<\/p>\n<p><strong>N\u00e4iteprogramm. Vaikev\u00e4\u00e4rtusega funktsioon<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def kasKiiruse\u00dcletamine(kiirus, piirkiirus = 90):\r\n    return kiirus &gt; piirkiirus\r\n \r\nprint(kasKiiruse\u00dcletamine(100))\r\nprint(kasKiiruse\u00dcletamine(90, 70))<\/pre>\n<p>Vaikev\u00e4\u00e4rtus on ka funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> argumendil <em>end<\/em>, millega m\u00e4\u00e4ratakse v\u00e4ljastatava s\u00f5ne l\u00f5ppu lisatav(ad) s\u00fcmbol(id). Vaikimisi on l\u00f5pus reavahetus, sest argument on vaikimisi <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">end = \"\\n\"<\/code><\/code>. Me v\u00f5ime sellele argumendile anda ka teistsuguse v\u00e4\u00e4rtuse:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"V\u00e4ljastatav tekst \", end = \"l\u00f5ppu juurde\")<\/pre>\n<h2>Meetodid<\/h2>\n<p>S\u00f5nede peat\u00fckis kasutasime funktsioone, mis on s\u00f5nega \u00fchendatud punktiga:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(\"tartu\".capitalize())\r\nprint(\"Tartu\".endswith(\"tu\"))\r\nprint(\"Tartu\".upper())\r\nlinn = \"Tartu\"\r\nprint(linn.lower())<\/pre>\n<p>Tundub, nagu sellisel juhul pole argument mitte sulgudes, vaid hoopis funktsiooni ees. P\u00f5him\u00f5tteliselt see nii ongi. Selliseid funktsioone nimetatakse <strong>meetoditeks<\/strong> ja need on v\u00e4ga tavalised objektorienteeritud programmeerimises. Siinsetes materjalides me k\u00fcll kasutame meetodeid (eriti s\u00f5nede puhul), aga p\u00f5hjalikumalt neid ei k\u00e4sitle.<\/p>\n<h2>Lokaalsed ja globaalsed muutujad<\/h2>\n<p>Eelmises peat\u00fckis mainisime, et funktsiooni sees loodavad muutujad ei ole k\u00e4ttesaadavad funktsioonist v\u00e4ljaspool. Loome n\u00e4iteks funktsiooni:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\n<p>Programmi t\u00f6\u00f6le pannes saame ekraanile arvu 6, mis ongi 1 + 2 + 3 korral oodatud tulemus. Lisame programmile rea <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summa)<\/code><\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(summa)<\/pre>\n<p>Saame veateate tekstiga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">NameError: name 'summa' is not defined<\/code> ehk nimi <em>summa<\/em> ei ole defineeritud (kirjeldatud). Kuna funktsiooni sees toimuv on funktsiooni &#8220;siseasi&#8221;, siis t\u00f5epoolest pole muutujat <em>summa<\/em> v\u00e4ljaspool funktsiooni olemas. Sellist funktsiooni kehas (kirjelduses) defineeritud muutujat nimetatakse <strong>lokaalseks muutujaks<\/strong>. Kui sooritame printimise funktsiooni kirjelduse sees, toimib see tavap\u00e4raselt:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    print(summa)\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\n<p>N\u00fc\u00fcd ilmub 6 ekraanile kahel korral: esmalt funktsiooni sees oleva <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summa)<\/code><\/code> t\u00f5ttu ja teist korda <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print(summaFunktsioon(1, 2, 3))<\/code> t\u00f5ttu.<\/p>\n<p>Samuti on lokaalsed ka funktsiooni argumendid. Muutuja <em>b<\/em> on funktsiooni sees t\u00e4iesti olemas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    print(b)\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\n<p>Funktsioonist v\u00e4ljas aga mitte:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(b)<\/pre>\n<p class=\"vspace\">Lokaalsed muutujad luuakse funktsiooni igal k\u00e4ivitamisel uuesti ja nad h\u00e4vivad, kui funktsioon t\u00f6\u00f6 l\u00f5petab. Lokaalsed muutujad on funktsiooni siseasi, v\u00e4ljast neid n\u00e4ha pole. Neile saab panna sama nime, mis juba on programmi p\u00f5hiosas (v\u00f5i m\u00f5nes teises funktsioonis) kasutuses olnud.<\/p>\n<p class=\"vspace\">N\u00e4iteks on j\u00e4rgmises programmis nii funktsioonis kui p\u00f5hiprogrammis muutuja <em>summa<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c\r\n    return summa\r\n \r\nsumma = 10\r\nprint(summaFunktsioon(1, 2, 3))\r\nprint(summa)<\/pre>\n<p class=\"vspace\">N\u00e4eme, et viimases reas on muutuja <em>summa<\/em> v\u00e4\u00e4rtus just see, mis ta p\u00f5hiprogrammis sai &#8211; funktsioonis toimuv tema v\u00e4\u00e4rtust ei muuda.<\/p>\n<p class=\"vspace\">P\u00f5hiprogrammis defineeritud muutujad on <strong>globaalsed muutujad<\/strong>. Nende v\u00e4\u00e4rtusi saab kasutada nii p\u00f5hiprogrammis kui ka funktsioonide sees. Kui aga funktsioonis on sama nimega lokaalne muutuja, siis samanimelist globaalset muutujat seal kasutada ei saa. Eelmises n\u00e4ites just nii oligi.<\/p>\n<p class=\"vspace\">J\u00e4rgmises n\u00e4ites saab globaalset muutujat funktsioonis kasutada, sest sellenimelist lokaalset muutujat funktsioonis pole:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">def summaFunktsioon(a, b, c):\r\n    summa = a + b + c + gm\r\n    return summa\r\n \r\ngm = 17   # globaalne muutuja\r\nprint(summaFunktsioon(1, 2, 3))<\/pre>\n<p>Teatud juhtudel on globaalsete muutujate kasutamine funktsioonis ebasoovitav, kuid seda me siinsetes materjalides ei vaatle.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p class=\"vspace\">Funktsioonid ehk alamprogrammid v\u00f5imaldavad (sageli k\u00fcllalt keerulise) programmil\u00f5igu panna kirja \u00fcks kord, aga kasutada seda mitmes erinevas kohas.<\/p>\n<p class=\"vspace\">Funktsiooni <em>definitsiooni<\/em> (kirjelduse) ehk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def<\/code>-lause kehas olevad laused j\u00e4etakse esialgu lihtsalt meelde. Neid saab hiljem k\u00e4ivitada, kirjutades funktsiooni nime koos sulgudega. Sellist tegevust nimetatakse funktsiooni <em>v\u00e4ljakutseks<\/em> ehk rakendamiseks.<\/p>\n<p class=\"vspace\">Funktsiooni defineerimisel saab j\u00e4tta m\u00f5ned detailid lahtiseks. T\u00e4pne t\u00f6\u00f6 s\u00f5ltub etteantud argumentide v\u00e4\u00e4rtustest.<\/p>\n<p class=\"vspace\">Funktsioone v\u00f5ib jaotada kahte gruppi \u2013 \u00fched teevad midagi \u00e4ra ja teised arvutavad ja tagastavad midagi.<\/p>\n<p class=\"vspace\">Selleks, et funktsiooni saaks kasutada avaldises, peab ta arvutatud v\u00e4\u00e4rtuse tagastama. V\u00e4\u00e4rtuse tagastamiseks kasutatakse v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">return<\/code>.<\/p>\n<p class=\"vspace\">Programmi p\u00f5hiosas defineeritud muutujaid nimetatakse <em>globaalseteks muutujateks<\/em>, funktsiooni sees defineeritud muutujaid <em>lokaalseteks muutujateks<\/em>.<\/p>\n<h2>Video<\/h2>\n<p>Vaata ka funktsioone kokkuv\u00f5tvat videot:<\/p>\n<p><iframe loading=\"lazy\" id=\"oembed-1\" title=\"Informaatika valikkursus g\u00fcmnaasiumile - Funktsioon\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/zbIttaEY7ZQ?feature=oembed&#38;rel=0\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"author":12,"menu_order":3,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-187","chapter","type-chapter","status-publish","hentry"],"part":166,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/187","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":6,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/187\/revisions"}],"predecessor-version":[{"id":581,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/187\/revisions\/581"}],"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\/187\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=187"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=187"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}