240 likes | 430 Views
Python. Funkcije. Vgrajene funkcije. Kaj je funkcija? Nek "kos" programske kode, ki nekaj dela! Doslej Vgrajene funkcije: print , input , random.random , float , int , math.sqrt , … Opravijo neko delo in Vrnejo rezultat math.sqrt , random.random , input , int …
E N D
Python Funkcije
Vgrajene funkcije • Kaj je funkcija? • Nek "kos" programske kode, ki nekaj dela! • Doslej • Vgrajene funkcije: print, input, random.random, float, int, math.sqrt, … • Opravijo neko delo in • Vrnejo rezultat • math.sqrt, random.random, input , int… • imajo le učinek • print
Kaj se zgodi, ko "pokličemo" funkcijo • Definicija funkcije vsebuje neko zaporedje stavkov • Ko jo pokličemo (navedemo njeno ime), se začno ti stavki, ki jih je avtor funkcije napisal, izvajati • Ko pridemo do konca (ko se izvede zadnji stavek), se "vrnemo" tja, kjer smo funkcijo poklicali • x = 2 + math.sqrt(14) + 3 – math.sqrt(2) • Če jo pokličemo drugič, se spet začno izvajati ti stavki
"podatki" za funkcije • Imenujemo jih parametri • Vrednosti izrazov, ki jih navedemo ob klicu • Povemo, s čim naj funkcija začne računati, kakšna je določena začetna vrednost spremenljivk "znotraj" v funkciji zapisanega postopka • math.sqrt(12.5) • Povemo, da želimo izračunati koren števila 12.5 • Funkcije imajo lahko • En parameter • int(7 + 6.7) • Več parametrov • max(12, x, 1 + 5, 66, 12) • Ali pa so brez • random.random()
Primer def vsotaStevil(a, b): vsota = a + b return vsota Shranimo: MojeFun.py • Uporaba importMojeFun prvoStevilo = int(input('Prvi podatek: ')) • drugoStevilo = int(input(Drugipodatek: ')) • rez = MojeFun.vsotaStevil(prvoStevilo, drugoStevilo) • print(rez)
Kako ustvarimo svojo funkcijo • Glava • Rezervirane beseda def • sledi ime funkcije • ime naj bo takšno, da lahko iz njega sklepamo, kaj funkcija počne • ( • Obvezno, tudi če ni parametrov! • imena parametrov • Če je parametrov več, jih ločimo s vejicami. • ) : • Telo • stavki, ki se bodo izvršili vsakič, ko bomo funkcijo poklicali. • zamik stavkov obvezen • enak
Konec funkcije • Ko se izvede zadnji stavek v telesu • Ali ko se izvede ukaz return
return • return izraz • Funkcijakotsvojrezultatvrnevrednostizraza • Običajno je to zadnjistavek v funkciji • Ni pa nujno (pogojnistavki) • V telesu je lahkovečukazov return • Čeimafunkcija le učinek • Ukaza return ni
Zgled • Sestavimo funkcijo, ki iz trimestnega naravnega število naredi novo število tako, da prvotnemu "obrne" vrstni red števk • Iz 124 dobimo 421 • Iz 793 dobimo 397 • Iz 112 dobimo 211 • Ideja 0: • Število razbijemo na enice, desetice in stotice • Izpišemo najprej enice, nato desetice in potem stotice
Funkcija Opisni komentar, izpiše se s help(VseTrimestno.obrniTrimestno) def obrniTrimestno(n): ''' Funkcijaobrnetrimestnonaravnoštevilo Predpostavljamo, da je podano res trimestno število ''' enice = n % 10 desetice = n // 10 % 10 stotice = n // 100 print('Iz ', n, ' smonaredili ', / enice, desetice, stotice, sep = '') Shranimo na VseTrimestno.py nadaljevanje vrstice
Testna opisna datoteka (skripta) # Testnookoljezaobračanjetromestnihštevil import VseTrimestno # tu so ustreznefunkcije prvo = 234 VseTrimestno.obrniTrimestno(prvo) TestTromestno.py
Razlika med opisno datoteko in datoteko z definicijo funkcije • Opisna datoteka (skripta) • Vsebuje ukaze, kot bi jih tipkali neposredno v ukazno lupino • Ukazi se izvajajo drug za drugim, kot so napisani • Z uporabo F5 izvedemo vse ukaze, ki so na opisni datoteki • Definicija funkcije • Vsebuje opis, kako deluje funkcija • Ukazi se bodo izvedli šele, ko funkcijo pokličemo • Če uporabimo F5, se bo ukazna lupina le "naučila" te definicije • Drugega se ne izvede nič • Lahko pa sedaj to funkcijo kličemo v ukazni lupini • Navedemo le njeno ime • ni potrebno • importimeDatoteke • imeDatoteke.imeFunkcije
Ideja 1 • Zakaj ideja 0 ni prav? • Saj dobimo izpis • Iz 234 smo naredili 432 • Hočemo novo število in ne le "pravi izpis" • Nova ideja: • Število razbijemo na enice, desetice in stotice • Enice množimo s 100, desetice z 10 in stotice z 1 ter seštejemo
Funkcija po ideji 1 def obrniTrimestno1(n): ''' Funkcijaobrnetrimestnonaravnoštevilo Predpostavljamo, da je podano res trimestnoštevilo ''' enice = n % 10 desetice = n // 10 % 10 stotice = n // 100 novoŠtevilo = enice * 100 + desetice * 10 + stotice print('Iz ', n, ' smonaredili ', novoŠtevilo)
Ampak še vedno ni čisto v redu • Zakaj? • Denimo, da želimo izračunati razliko med prvotnim in obrnjenim številom. • Si lahko pomagamo z našo funkcijo? • Ne, saj ne dobimo rezultata • Le učinek (izpis) • Na konec dodamo • returnnovoŠtevilo
Različica 2 def obrniTrimestno2(n): ''' Funkcijavrneobrnjenotrimestnonaravnoštevilo Predpostavljamo, da je podano res trimestnoštevilo ''' enice = n % 10 desetice = n // 10 % 10 stotice = n // 100 novoŠtevilo = enice * 100 + desetice * 10 + stotice print('Iz ', n, ' smonaredili ', novoŠtevilo) return novoStevilo
Ampak … • Po nepotrebnem "packamo" po zaslonu • Kdo pravi, da želimo obrnjeno število izpisati • Pravilo: • V funkciji ne izpisujemo nič • Razen seveda, če hočemo početi le to! • Tisti, ki funkcijo pokliče, se odloči, kaj bo naredil z rezultatom • Izpisal, uporabil pri nadaljnjem računanju, oboje …
Zato … def obrniTrimestno3(n): ''' Funkcijavrneobrnjenotrimestnonaravnoštevilo Predpostavljamo, da je podano res trimestnoštevilo ''' enice = n % 10 desetice = n // 10 % 10 stotice = n // 100 novoŠtevilo = enice * 100 + desetice * 10 + stotice return novoŠtevilo
Ideja 2 • Število razbijemo na enice, desetice in stotice • Števila pretvorimo v nize • Ustrezno "zlepimo" skupaj nize • In niza naredimo spet število
Koda def obrniTrimestno4(n): ''' Funkcijavrneobrnjenotrimestnonaravnoštevilo Predpostavljamo, da je podano res trimestnoštevilo ''' enice = n % 10 desetice = n // 10 % 10 stotice = n // 100 # sestavimo novo število novoNiz = str(enice) + str(desetice) + str(stotice) # zlepimoštevke novoŠtevilo = int(novoNiz) # naredimoiztegaspetštevilo return novoŠtevilo
Funcija kliče funkcijo • Vsaka "naša" funkcija se obnaša kot vgrajena • Zato jo lahko kličemo tudi pri drugih naših funkcijah • Če je definirana v isti datoteki • imeFunkcije • Če je definirana v drugi datoteki • Najprej: importimeDatoteke • Klic: imeDatoteke.imeFunkcije
Zgled • Sestavimo funkcijo, ki izpiše razliko med številom in obrnjenim tem številom
Koda def razlikaZObratom(število): ''' izpišemorazliko med številomstevilo in obrnjenimštevilom ''' obŠtevilo = obrniTrimestno4(število) razlika = število - obŠtevilo print('Razlika med', število, 'in njegovimoobratom je', razlika)
Zgled • Za dano trimestno število ugotovi, ali je "palindrom" • Torej, ali se naprej prebere enako kot nazaj • Sestavimo funkcijo, ki izpiše • 212 je palindrom • oziroma • 231 ni palindrom • Ideja: • Izračunamo razliko • Če je … • Težave … • Eni stavki, če je razlika 0 in drugi, če drugače!