Python za radoznale: Funkcije

389 views
Skip to first unread message

Hrvoje Katić

unread,
Dec 17, 2011, 9:55:36 AM12/17/11
to hrprog...@googlegroups.com
Funkcije

Funkcije su neovisni dijelovi programa koje izvršavaju određenu zadaću,
i vrlo su važan dio svakog programskog jezika. Svaka funkcija ima svoje
jedinstveno ime, pomoću kojeg ju pozivamo, te na taj način izvršavamo
blok naredbi napisan unutar te funkcije. Uporabom funkcija, uštedit ćemo
si puno vremena, jer nećemo morati ponavljati isti programski kod svako
malo kroz program svaki put kad nam zatreba, nego ćemo taj kod koji nam
često treba napisati unutar funkcije, i onda ćemo jednostavno pozvati tu
funkciju na svakom mjestu gdje nam je to nužno. Osim uštede vremena,
funkcije će nam omogućiti i puno manje linija programskog koda, što
znači i puno brži, jednostavniji i čitljiviji program, a isto tako će
olakšati i ispravljanje grešaka u programskom kodu. Funkcije mogu
primati informacije (argumente) koje im program ili krajnji korisnik
pošalje, te vraćati neku vrijednost po potrebi. Vrijednost koju funkcije
vraćaju može biti bilo koji Python objekt, kao što je string, broj,
lista itd.
U Python programskom jeziku, funkciju definiramo pomoću ključne riječi
def. Sintaksa definiranja funkcije je sljedeća:
def ime_funkcije(argument1, argument2, argument3):
# slijedi tijelo funkcije
Također i ovdje možete primijetiti da iza definicije funkcije slijedi
znak dvotočke, po ćemu znamo da blok naredbi koji se nalazi u tijelu
funkcije uvlačimo za x slovnih mjesta u desno. To naravno znači da ako
smo linije koda unutar funkcije uvukli za 4 slovnih mjesta u desno,
ukoliko unutar funkcije rabimo if naredbe, petlje i sl., njihove blokove
naredbi morat ćemo uvlačiti za još dodatnih 4 slovnih mjesta, a ako
dodatno koristimo npr. if naredbe unutar if naredbi (grananje), njihove
blokove naredbi morat ćemo također uvlačiti za još dodatnih 4 slovnih
mjesta.
Nakon ključne riječi def, Python interpretator očekuje ime funkcije, te
nakon toga argumente unutar okruglih zagrada odvojene zarezom. Ukoliko
definiramo funkciju koja ne traži nikakve argumente, potrebno je staviti
prazne zagrade ().
Kod pozivanja funkcije u onom dijelu programa gdje nam je dotična
funkcija potrebna, koristimo sljedeću sintaksu:
ime_funkcije(argument1, argument2, argument3)
Dakle, potrebno je unijeti ispravno ime funkcije koju pozivamo, a zatim
okrugle zagrade u kojima navodimo vrijednosti pojedinih argumenata
definirane funkcije, odvojene zarezom. Ukoliko funkcija ne prima
argumente, moraju biti prazne zagrade ().
Krenimo sa jednostavnim primjerom funkcije, koji napišimo u datoteci
primjer14.py.
def napisi_ime():
print "Ja se zovem Perica Peric Dangubic."
print "Moji inicijali su PPD."
for i in range(0, 5):
napisi_ime()
raw_input()
U ovom programu smo napravili sljedeće:
1. Definirali smo funkciju kojoj smo dali naziv napisi_ime, dakle takav
naziv smo joj dali s obzirom na zadaću koju obavlja.
2. Budući da ne želimo da funkcija prima argumente, ostavili smo prazne
zagrade.
3. U tijelu funkcije napisali smo naredbu koja na ekranu ispisuje ime
"Perica Perić Dangubić", a u drugoj liniji unutar funkcije napisali smo
naredbu koja ispisuje poruku "Moji inicijali su PPD.".
4. Primijetili ste da nakon toga u sljedećoj liniji koda više nema
indentacije. To je zato jer je naša funkcija završena, te je stoga blok
naredbi unutar funkcije zaključen.
5. U glavnom tijelu programa, definirali smo petlju koja 5 puta poziva
funkciju napisi_ime, koju smo malo prije definirali. To znaći da će se
ove dvije poruke ispisati 5 puta za redom na ekranu kada se ovaj primjer
pokrene.
Napomena kod imenovanja funkcije: Imenovanje funkcija ima ista pravila
kao i imenovanje varijabli.
Ovo je dakle bio primjer najjednostavnije funkcije u Python jeziku. No,
što ako želimo napraviti funkciju koja npr. uzima nečije ime i broj
godina, te na temelju tih informacija ispisuje ili vraća neki podatak?
Za takve situacije postoje argumenti! Argument je informacija koju
funkcija prima od programa kod svog pozivanja, a broj argumenata u
funkciji je neograničen. Slijedi drugi primjer, koji napišimo u datoteci
primjer15.py.
def ispis(ime, godine):
print "Vi se zovete", ime
if godine >= 90:
print "Vi ste mnogo stari."
ispis("Perica Peric Dangubic", 90)
raw_input()
Da objasnimo sada što smo napravili:
1. Definirali smo funkciju s nazivom ispis, te joj dali dva argumenta,
ime i godina. Argumenti se također imenuju kao i varijable, a nazive
argumenata koristimo unutar tijela funkcije tamo gdje su oni potrebni
npr. argument naziva ime upotrijebit ćemo unutar funkcije na mjestu gdje
je potrebno napisati ime korisnika.
2. U prvoj liniji tijela funkcije je naredba print koja ispisuje ime
korisnika, pa stoga uzima vrijednost argumenta ime.
3. Zatim, također u tijelu funkcije slijedi if naredba koja ispituje da
li korisnik ima 90 ili više godina, na način da uzima vrijednost
argumenta godine. Ako ima više od 90, na ekranu se ispisuje poruka "Vi
ste mnogo stari.", a u suprotnom ne ispisuje se ništa i taj dio se preskače.
4. Ovdje je kraj tijela funkcije i sada pozivamo funkciju koju smo
definirali te joj prosljeđujemo argumente. Prvom argumentu (ime)
prosljeđujemo string "Perica Perić Dangubić", a drugom argumentu
(godine) prosljeđujemo broj 90.
Kada pokrenemo ovaj program, na ekranu će pisati:
Vi se zovete Perica Peric Dangubic
Vi ste mnogo stari.
No, pokušajmo sada izmijeniti liniju koda koja poziva našu funkciju, te
umjesto prethodnog imena napisati neko drugo ime i broj godina manji od 80.
ispis("Slavko Puskar", 50)
U tom slućaju, program će nakon pozivanja funkcije na ekranu napisati
sljedeće:
Vi se zovete Slavko Puskar
Dakle, sada će se ispisati ime Slavko Puškar, budući da je taj string
proslijeđen funkciji kao prvi argument. Druga poruka se neće ispisati,
jer unesen broj godina nije 90 ili više.
Napomene:
1. Kod pozivanja funkcija, vrijednosti argumenata koje navodimo moraju
se navesti onim redoslijedom ovisno o tome kako su argumenti navedeni
kod definiranja funkcije. Dakle, ne možemo broj godine navoditi prije
imena korisnika, ako smo ime stavili kao prvi argument. Ako to učinimo,
javit će se pogreška i program se neće izvršiti, jer program nije dobio
očekivan podatak. U ovoj funkciji, program očekuje da će argument ime
biti string objekt, a godine cjelobrojni objekt, pa je iz tog razloga
redoslijed unosa vrijednosti argumenata bitan.
2. Ukoliko želimo programu reći kojem argumentu prosljeđujemo
vrijednost, te na taj način izbjeći konflikte, kod pozivanja funkcija
unutar zagrade ćemo navesti ime argumenta, zatim znak jednakosti te
vrijednost argumenta. Evo kako:
ispis(ime="Perica Peric Dangubic", godine=50)
Ovdje je važno napomenuti da ukoliko ste na ovakav način odlučili
proslijediti argumente funkcijama, ne možete to napraviti samo sa prvim
argumentom a sa ostalima ne, ali možete recimo ako funkcija prima 3
argumenta, drugom i trećem ili samo trećem argumentu možete dodijeliti
vrijednost tako da napišete ime argumenta, znak jednakosti i njegovu
vrijednost, dok prvom argumentu možete odmah unijeti vrijednost bez
unosa njegovog imena i znaka jednakosti.
Argumentima funkcija također možemo dodijeliti početne vrijednosti. Bez
početnih vrijednosti, ukoliko funkcija traži argument, ali se ne unesu
vrijednosti za svaki pojedini argument ili za nijedan od njih, javit će
se pogreška da funkcija očekuje određeni broj argumenata, ali ih je
uneseno manje ili ništa. Prepišimo sada prethodni primjer, te napravimo
izmjenu tako da argumenti funkcije ispis imaju svoje početne vrijednosti.
def ispis(ime="Perica Peric Dangubic", godine=90):
print "Vi se zovete", ime
if godine >= 90:
print "Vi ste mnogo stari."
ispis()
raw_input()
Dakle, ovdje smo objema argumentima dali početne vrijednosti. Sada kad
smo pozvali funkciju ispis, nismo proslijedili nikakve vrijednosti
argumentima, ali nije se javila pogreška, jer je program sada uzeo
početne vrijednosti navedene prilikom definicije funkcije, te stoga je
navođenje vrijednosti argumenata nepotrebno. No, ukoliko mi ponovo
pozovemo funkciju, i unesemo vrijednosti za sve argumente, početne
vrijednosti će se zanemariti i koristit će se one koje su bile navedene
kod pozivanja funkcije. Također, u ovom slućaju ako recimo navedemo
vrijednost za prvi argument, a za drugi ne, onda će prvi argument dobiti
novu vrijednost, dok će drugi koristiti početnu.
Napomena, nije potrebno unositi početnu vrijednost za sve argumente, već
samo za one kod kojih to želimo napraviti, ali onda će nam za one
argumente koji nemaju početnu vrijednost biti nužno navesti njihovu
vrijednost kako bi se funkcija odnosno program izvršili.
Za kraj osnovne rasprave o funkcijama, objasnit ćemo kako funkcije
vraćaju neku vrijednost. Zašto je to uopće potrebno? Ovo je svakako
potrebno ako želimo da funkciju koju definiramo možemo dodijeliti
varijablama, koristiti u if naredbama, petljama i sl. Primjerice, želimo
napraviti funkciju koja uzima korisnikovo ime i prezime, izvlaći prvo
slovo imena i prezimena te na taj način stvara inicijale. Nakon toga u
nekom kasnijem dijelu programa, želimo ispitati pomoću if naredbe da li
ta osoba ima takve inicijale rabeći funkciju koju smo definirali za
izvlaćenje inicijala. Ukoliko funkcija ne vraća inicijale, beskorisna je
u takvim situacijama.
Na početku ovog poglavlja spomenuli smo da funkcija može vraćati bilo
koji Python objekt koji ukljućuju stringovi, cjelobrojne vrijednosti,
Boolean vrijednosti, liste i sl. Stoga, ukoliko, recimo, definiramo
funkciju koja vraća string, i dodijelimo je kasnije nekoj varijabli, ta
varijabla će onda sadržavati string vraćen od strane te funkcije.
Vraćanje vrijednosti vrši se pomoću ključne riječi return, iza ćega je
potrebno navesti vrijednost ili objekt koji će funkcija vratiti. Primjerice:
return True
return "Perica Peric Dangubic"
return 52
return ime
i sl.
Naredba return rabi se samo unutar funkcija. Upotreba ove naredbe izvan
funkcija rezultirat će pogrešku.
Slijedi primjer vraćanja vrijednosti u funkcijama.
primjer16.py:

def ostario(godine):
if godine >= 50:
return True
else:
return False
# ovdje zavrsava funkcija

def ime_programera():
return "Hrvoje Katic"
# ovdje zavrsava funkcija

ime = ime_programera()
print ime
if ostario(24):
print "Mlad je."
raw_input()
# kraj programa
Objašnjenje:
1. Ovaj program ima definirane dvije funkcije, i obje vraćaju
vrijednost. Prva funkcija je ostario, koja vraća Boolean vrijednost True
ili False ovisno o tome da li je u argumentu godine navedena vrijednost
broj 50 ili više, ili broj manji od 50. Ako je broj 50 ili više,
funkcija vraća Boolean True, a u suprotnom vraća False. Druga funkcija
je jednostavna, jer ne traži argumente, i vraća string sa imenom.
2. Nakon što smo definirali obje funkcije i unijeli potrebne zadatke
unutar istih, prvo smo stvorili varijablu kojoj smo dodijelili funkciju
ime_programera, dakle drugu definiranu funkciju koja vraća string sa
imenom. Nakon toga smo pomoću print naredbe ispisali sadržaj varijable
ime, te se na ekranu ispisalo ime "Hrvoje Katic", dakle ime koje vraća
funkcija ime_programera.
3. Na kraju, dodali smo if naredbu u kojoj pozivamo funkciju ostario, te
unijeli broj 24 kao vrijednost argumenta godine. Tada je if naredbi
proslijeđen Boolean izraz False koji je funkcija ostario vratila, budući
da je unesen broj bio manji od 50.
4. Zadnje linije koda mislim da nije potrebno posebno komentirati.

Reply all
Reply to author
Forward
0 new messages