Tip:
Highlight text to annotate it
X
U poslednjih par snimaka smo ovde napisali lep, mali program
koji korisnika pita za neki ulaz
i onda izračunava faktorijel tog broja
i zatim ga prikazuje.
I to je lepo, ali mogli biste da zamislite svet u kome
biste želeli da računate faktorijel na više mesta
ili u više različitih programa
ili biste želeli da u istom programu računate
faktorijel više puta.
I ne želite da pišete ovaj kod
iznova i iznova svaki put
kada želite da izračunate faktorijel.
Dakle, ono što ću uraditi u ovom snimku,
jeste da definišem funkciju koja izračunava faktorijel
i onda bismo mogli da koristimo tu funkciju
svaki put kada želimo da izračunamo faktorijel.
Dakle, u suštini, ono što će ova funkcija raditi,
jeste da smesti sav ovaj kod,
sav ovaj kod upravo ovde,
na jedno mesto i onda bilo koji drugi
program u kom želim da izračunam faktorijel,
mogu jednostavno da ponovo pozovem taj kod.
Ne moram da ga napišem.
Dakle, hajde da vam jednostavno pokažem o čemu pričam.
Dakle, definisaću funkciju
i ključnu reč u Python-u,
znači, to je neka vrsta posebne reči
koja govori interpreteru da će se nešto
posebno desiti.
Ključna reč u Python-u za definisanje funkcije je "def".
Dakle, definisaću funkciju,
nazvaću je faktorijel funkcija.
I inače je dobra ideja
da nazovete stvari kao naznaku na to šta one zapravo rade.
Ponekad programeri početnici imaju običaj da
nazivaju stvari poput "x245"
i neko ko kasnije dođe
neće imati predstavu šta ta promenljiva
ili ta funkcija predstavlja.
Znači, definitivno dajte neki naziv
koji daje ideju o tome šta bi to trebalo da radi.
Moja funkcija se zove factorial (prevod: faktorijel)
i kada korisnik zove factorial,
treba da kaže funkciji factorial
od kog broja treba da napravim faktorijel.
Znači, proslediće argument koji se zove "number" (prevod: broj).
I ako ove reči izgledaju malo konfuzno
objasniću ih detaljno za sekund
ali ćete se, nadam se, što više ovo gledate,
i više upoznati sa ovim idejama.
I znači, proslediće broj
i ja treba da vratim
pozivajućem programu
i zapravo, nisam trebao da kažem
da će korisnik proslediti broj,
pozivajući program će proslediti broj
i ja treba da vratim faktorijel tog broja
pozivajućem programu.
Hajde, u stvari, da ovo zapišem kao komentar.
Dakle, vraća faktorijel argumenta "number".
I ponekad ćete čuti reč parametar
a ponekad ćete čuti reč argument.
Kada pravite definiciju funkcije,
ovo se formalnije zove parametar.
"Number" je jedan od parametara
factorial funkcije.
Pravi broj koji neko drugi prosleđuje do nje,
znači recimo da neko ovde pozove factorial sa 3,
onda bi formalnije taj broj 3 bio argument.
Dakle, vraća faktorijel argumenta "number".
I ovo je argument "number" upravo ovde.
Ne mislim ovo samo kao proizvoljno izabranu reč broj
bukvalno pričam o ovom broju ovde.
Možda da kažem argument "number".
Možda ću staviti u navodnike da bude jasno
da je ovo argument,
ne govorim o nekom opštem broju.
Hajde da to definišemo.
Dakle koristićemo praktično isti kod,
zapravo hajde da samo kopiram i nalepim,
hajde da samo kopiram i nalepim veći deo koji sam uzeo ovde.
Znači iseći ću to
i ponovo ću ga nalepiti ovde
ali moram da budem pažljiv sa uvlačenjem
jer na osnovu uvlačenja Python zna
šta je deo čega, zna kako da interpretira stvari.
Dakle sve što je deo ove definicije funkcije
mora da bude uvučeno i to radimo pomoću četiri razmaka.
Jedan, dva, tri, četiri.
I ovo je još jedna četvorka.
Jedan, dva, tri, četiri.
I ovo je deo for petlje.
Jedan, dva, tri, četiri.
I hajde da razmislimo šta za sada imamo.
Neki broj će biti prosleđen,
definišemo da je promenljiva product jednaka 1.
I pričaćemo još o dometu važenja promenljivih
ali ova promenljiva će moći da se koristi samo
unutar ove definicije faktorijela
jer prvi put kada je ovde definišem
je unutar ovog ovde
dakle, u budućnosti ćemo dublje zaći u domet važenja promenljivih.
I onda, uz istu logiku koju smo koristili ranije,
*"for i in range( number )"*,
sada ne dobijamo number korišćenjem input funkcije
već on samo biva prosleđen funkciji,
onda product je jednako *product × ( i + 1 )*.
Ista logika koju smo imali ranije.
Znači, kada prođete kroz ovu for petlju,
kada prođete kroz nju,
u stvari prolazite kroz nju number puta.
Product će sadržati faktorijel od number.
I umesto da to direktno prikažemo,
ono što mi želimo je da vratimo,
vratićemo to pozivajućem programu
i u sledećem snimku ću ovo da predstavim dijagramom
malo jasnije, ako vam ovo deluje pomalo zbunjujuće.
Vratiću product.
Dakle, ovo je u osnovi identičan kod koji smo imali ranije,
ali smo ga upakovali unutar funkcije,
definisali smo funkciju.
Ona uzima, ima parametar koji se zovi number,
ako želite faktorijel od 3
probajte faktorijel od 3
i 3 bi bio argument koji
se stavlja umesto promenljive number
ili ono na šta number pokazuje.
Definišete da je product jednak 1
i onda idete number broj puta.
Dakle, *for i in range( number )*,
objasnili smo logiku iza toga u prethodnom snimku.
Svaki put počinjete sa 1,
onda radite 1 × 1 što će dati 1,
onda će product biti 1
ali će onda i biti 1.
i počinje sa nulom,
dakle biće *1 × ( 0 + 1 )* što je 1,
onda je i jednak 2, pa će biti *1 × 1*,
oprostite, onda je i jednak 1
i biće *1 x (1 + 1)*, što je *1 x 2*,
znači onda će biti 2
i na taj način će nastaviti da inkrementira
i to smo detaljno objasnili u poslednjem snimku.
I na kraju će vratiti taj product.
Dakle, ako želimo da imamo isto ponašanje kao ranije,
ali sada koristimo ovu funkciju.
Šta bismo mogli da uradimo, mogli bi da kažemo,
i dalje imamo ulaz, znači, ovo je definicija naše funkcije,
ali unutar našeg glavnog programa,
smo definsiali našu funkciju
i sada bi mogli da kažemo:
"Vidi, od korisnika uzmi ne-negativan ceo broj
od kog će biti urađen faktorijel".
I hajde da to stavimo u,
hajde da to nazovemo promenljiva user_input.
I onda ću da
definišem još jednu promenljivu
koja će se zvati factorialofuser_input
i sada će ovo biti zanimljivo.
Pozvaću ovu funkciju ovde gore,
znači, ovo će biti jednako
faktorijelu od bilo čega što je korisnik uneo.
Dakle, faktorijel od user_input,
faktorijel od ove promenljive upravo ovde.
Faktorijel od korisničkog ulaza.
Znači, sada će factorialofuser_input čuvati,
pretpostavljam da bi trebali da kažemo,
pokazivaće zapravo na odgovor
i sada treba samo to da prikažemo.
Dakle, sada možemo da prikažemo factorialofuser_input.
Izgledaju kao rečenice
ali ovo su samo nazivi promenljivih
koje sam imenovao na ovaj način
kako biste zaista znali šta se nalazi unutar tih promenljivih
odnosno na šta zaista te promenljive pokazuju.
Dakle, factorialofuser_input.
Sada, znate da je trenutak istine
uvek kada sačuvate program i zapravo probate da ga pokrenete.
Znači, hajde sada da pokušamo da ga pokrenemo i vidimo šta će se desiti.
Hajde da vidimo šta se ovde dešava.
Znači, makar ništa nije puklo do sad,
i još jednom,
dakle, želim da budem jasan, program je počeo ovde
ali ovde gore smo samo ovo definisali
pa se ne kreira nikakva interakcija sa korisnikom,
zapravo se još ništa ne obrađuje,
dakle, to samo definiše ovu funkciju koja ide ovde dole
i kaže: "Ok, daj mi neki ulaz od korisnika"
i to je ono što radimo upravo ovde.
Nakon što unesemo ovde neki broj,
onda će se zapravo pozvati funkcija sa tim brojem
koji smo uneli, brojem koji smo uneli,
će biti stavljen u user_input
i onda će se pozvati factorial
sa user_input kao argumentom.
Dakle, hajde da probamo sa brojem 3.
I nije proradilo!
Oh, i vidim zašto nije proradilo,
jer sam imao ovaj zaostatak iz prethodnog programa
koji sada nema nikakvog smisla.
Hajde da se otarasim toga.
Ovo je dobra lekcija da retko kad iz prvog
puta nešto perfektno radi.
Hajde da probam ponovo!
To je bila samo glupost
da nisam ni primetio šta je tamo dole.
Dakle, hajde da pokušam ponovo.
I opet 3.
Dao mi je dobar odgovor.
Dao mi je faktorijel od 3
i sad je super to što, obzirom da
sada moj Python interpreter
pretpostavlja da je ova definicija napravljena
i ja mogu da pozovem factorial pravo iz interpretera,
ako imam drugi program
mogao bih da ga pozovem više puta
i sada bi trebalo da, nadam se, shvatate
zašto je super što smo napravili ovu definiciju funkcije,
jer možemo da izračunamo,
pošto sam definisao ovu funkciju factorial,
mogu da izračunamo faktorijel od 4.
To je 24.
Mogu da kažem faktorijel od 5 - faktorijel od 3.
114.
Mogu da uzmem faktorijel od 12
i možete reći kompjuteru,
čak iako on samo interpretira sve ovo,
pričaćemo više o interpretiranom nasuprot kompajliranom kodu,
neverovatno je brzo.
Brže nego što uopšte možemo da shvatimo.
Dakle, ovo je prava moć funkcije,
sada ne moram da ponovo pišem kod svaki put,
mogu samo da ga pozovem sa različitim argumentima.
Faktorijel od 2, mogu to da uradim svaki put,
ne moram da ponovo pokrećem program.
I ako budem pisao druge programe koji koriste faktorijel,
možda uradim nešto iz kombinatorike,
mogu jednostavno da koristim ovu funkciju.
u stvari, čak ne moram ni da znam
šta se dešava unutar funkcije.
To je još jedan od moćnih aspekata funkcije da,
recimo da napišem gomilu programa koji pozivaju,
znači, imam program baš ovde koji poziva factorial.
Ali recimo da vi smislite bolji način
da napišete ovo ovde.
Sve dok vaš program
radi istu stvar na drugačiji način,
krajnji korisnik neće ništa primetiti.
Možda ćete napisati brži način
ili jednostavniji način da se ovo uradi.
Način na koji se koristi manje memorije ili manje procesorske snage.
Onda biste mogli samo da ovo kasnije zamenite
i tada, bilo koji program koji to poziva,
sve dok i dalje radi,
radiće za taj program
i samo će raditi mnogo bolje.