You are on page 1of 46

Programiranje

Funkcije
Smjer: Održavanje računalnih sustava
Nastavnik: Vladimir Bralić pred., mag. inf.

Akademska godina 2019./2020.


Uvod u funkcije
• Funkcije koristimo od početka ovog kolegija. Npr.
funkciju type() ili funkciju int(). Na ovom
predavanju ćemo naučiti pisati vlastite funkcije.

>>> a="slova"
>>> b=5 Funkciji type predan je objekt imena „a”
>>> type(a)
<class 'str'>
>>> type(b) Funkcija je vratila poruku
<class 'int'> o podatkovnom tipu
>>> float(b) objekta „a”.
5.0
Uvod u funkcije (2)
• Funkcije su „mali” programi tj. blokovi koda koje glavni
program po potrebi može pozvati.

• Matematika definira funkciju kao odnos između skupa


ulaznih i izlaznih vrijednosti sa napomenom da za svaki
ulaz postoji samo jedan, određeni izlaz. Npr: f(x)=x+2.

• Funkcije u programiranju rade na sličan način ali odnos


ulaza i izlaza nije nužno definiran matematičkom
operacijom (već može biti bilo kakav proces koji je
moguće opisati u programskom jeziku) te ulaz i izlaz
nisu obavezni.
Uvod u funkcije (3)
• Funkcije omogućavaju višestruko korištenje istog
programskog koda i, u kombinaciji sa modulima,
jednostavnu upotrebu istog koda u više programa.

• Većina funkcija čine samostalnu cjelinu unutar


programa.

• Upotrebom funkcija moguće je napisati modularni


program kojega je kasnije lakše promijeniti ili prenijeti
neke dijelove u drugi program jer ne moramo uvijek
mijenjati (ili prenositi) cijeli program već samo njegove
dijelove (funkcije).
Uvod u funkcije (4)
• Funkcije mogu ali ne moraju primiti jedan ili više
parametara tj. ulaznih podataka.

• Ako funkcija ne prima parametre iza imena kojim


pozivamo funkciju pišemo prazne zagrade - ().

• Isto tako, funkcije mogu ali ne moraju vratiti neku


vrijednost. Funkcija može vratiti više od jedne
vrijednosti upotrebom sekvenca tj. liste ili n-torke.
Opća sintaksa funkcije
def mojaFunkcija ([inPar1], [inParX], … ):
naredbaFunkcije1
naredbaFunkcijeX

[return izlaznaVrijednost]

• Funkciju počinjemo pisati sa def izrazom kojeg


prate zagrade. U zagrade upisujemo imena ulaznih
parametara koje će funkcija koristiti. Funkcija
završava sa, opcionalnim, return izrazom koji vraća
(najviše) jednu vrijednost ili jedan niz.
Ulazni parametri funkcije
• Predstavljaju ulazne podatke koje koristi funkcija.

• Funkcija može primati nijedan, jedan ili više ulaznih


parametara.

• Ako funkcija ne prima parametre, unutar zagrada


iza imena funkcije se ne nalazi ništa:

naziv_funkcije()
Ulazni parametri funkcije (2)
• Ako funkcija prima jedan parametar, unutar zagrada
se nalazi naziv parametra koji će se koristiti unutar
funkcije:
naziv_funkcije(ulazniBroj)

• Ako funkcija prima više parametara, potrebno je za


svaki odrediti naziv, te ih odvojiti zarezom:

naziv_funkcije(prviParametar, drugiParametar)
Ulazni parametri funkcije (3)
• Predani parametri se prevode u interne vrijednosti
funkcije prema redoslijedu kojim su predani pri
pozivu funkcije i definiciji funkcije.

def funkcija( a, b, c ):
print(a,b,c)
Unutar funkcije:
a=2
b=3
funkcija (2, 3, 1) c=1
Parametar i argument
• Kada govorimo o ulaznim podacima funkcije (ili
metode) često pojavljuje i termin argument.
• U kontekstu funkcija termini nisu striktno definirani (od
strane lingvista) ali, u računarstvu, razlikujemo termin
parametar od argumenta:
• Parametar se odnosi na formalnu definiciju ulaznog
podatka.
• Argument se odnosi na sam podatak koji je predan
funkciji.
• Ovi termini se često koriste kao sinonimi, ili se koristi
samo jedan ili drugi. Ako nije nužno naglasiti razliku, na
ovom kolegiju koristimo termin parametar za oba
značenja.
Vraćanje vrijednosti iz funkcije
• Vrijednosti iz funkcije moguće je vratiti na mjesto
poziva funkcije pomoću ključne riječi return.

• Kod poziva funkcije u programu povratnu vrijednost


potrebno je zapisati u varijablu (ili iskoristiti u
nekom izrazu), npr.:

rezultat = funkcija(a, b, c)
Vraćanje vrijednosti iz funkcije (2)
• Iz funkcije je moguće vratiti više od jedne
vrijednosti upotrebom liste ili n-torke.

• U ovom slučaju listu ili n-torku je potrebno


definirati unutar funkcije ili u samom return izrazu.
Vraćanje vrijednosti iz funkcije (3)
Primjer vraćanja Primjer vraćanja liste
n-torke iz return definirane prije
izraza: return izraza:

def test(): def test():


a=3 a=3
b=5 b=5
return a,b lista=[a,b]
return lista
Primjer funkcije
• Funkcija vraća najveći od tri predana broja.

def najveciOdTri(a,b,c):
najveci=a
if najveci<b:
najveci=b
if najveci<c:
najveci=c
return najveci
Primjer poziva funkcije -
najveciOdTri
prviBroj=input("Unesite prvi broj: ")
drugiBroj=input("Unesite drugi broj: ")
treciBroj=input("Unesite treci broj: ")

rezultat=najveciOdTri(prviBroj,drugiBroj,treciBroj)

print ("Najveci broj je ", rezultat)


Python Tutor – funkcija
najveciOdTri
• Python Tutor – funkcija najveciOdTri
Zadatak – površina kvadrata
Napišite funkciju koja prima dužinu dvije stranice i
računa površinu pravokutnika.
Rješenje zadatka – površina
kvadrata
def pov(a,b):
return a*b

x=int(input("stranica a: "))
y=int(input("stranica b: "))
print("povrsina je:",pov(x,y))
Ulazni podaci
• Kod prijenosa parametara (tj. argumenata) u
funkciju njihova vrijednost se kopira na drugu
lokaciju u memoriji i unutar funkcije se koristi ta
kopirana vrijednost.
• To znači da sve promjene nad kopijom vrijednosti
neće utjecati na originalnu vrijednost iz dijela
programa iz kojeg je pozvana funkcija i predana
ulazna vrijednost.
• Taj način prenošenja parametra se često naziva i
„call by value”.
Parametri (2)
def funkcija(a):
a+=1
return a

a=10
print(a)
print(funkcija(a))
print(a)
Funkcije – zadani parametri
• Funkcije mogu unaprijed odrediti parametre (engl.
default value) za slučaj da ih program koji poziva
funkciju ne proslijedi.

• Sintaksa za unaprijed zadane parametre je:

def imeFunkcije([paramtar=vrijednost]*):
Funkcije – zadani parametri (2)
• Primjer prikazuje upotrebu unaprijed zadane
vrijednosti za funkciju koja računa y potenciju broja x.

• U slučaju da program funkciji proslijedi samo jedan


parametar funkcija pretpostavlja da program želi
kvadrat tog broja.

def pot(x,y=2):
return x**y

print (pot(3))
print (pot(3,3))
Funkcije – nepoznati broj
parametra
• Funkcija može primiti nepoznati broj parametra.
• Ukoliko želimo koristiti ovu funkcionalnost zadnji
parametar u funkciji označavamo sa *.
• Svi parametri koji su poslani funkciji ali nisu dodijeljeni
ranijim parametrima biti će smješteni u ovaj, zadnji,
parametar koji je tipa n-torka (engl. tuple).
• Sintaksa za nepoznati broj parametara je:

def imeFunkcije([*parametar]):
Funkcije – nepoznati broj
parametra (2)
• Donji primjer funkcije prima nepoznati broj
parametara te ih ispisuje.

<class'tuple'>
def varl(*y):
3
print(type(y))
---------------
for x in y:
<class 'tuple'>
print(x)
3
5
varl(3)
brod
print("-"*15)
12
varl(3,5,"brod",12)
Globalne i lokalne varijable
• Varijable koje su definirane unutar funkcije zovu se lokalne varijable i
mogu se koristiti samo unutar funkcije.
• Svi ulazni parametri, osim listi, su lokalni.
• Ovo znači da te varijable ne možemo referencirati iz programa koji je
pozvao funkciju (niti iz drugih funkcija koje je pozvao program).

• Ovo ne vrijedi u obrnutom smjeru. Funkcija može koristiti varijable koje


joj nisu predane ali su definirane u programu koji ju je pozvao. Ovakve
varijable, definirane u programu, zovemo globalne varijable.

• Da bi funkciju lakše mogli iskoristiti u drugom programu preporuka je da


funkcija koristi samo ulazne parametre i lokalne varijable. Ovo je
olakšano mogućnošću da lokale varijable imaju isto ime kao i globalne.
U ovom slučaju funkcija uvijek pristupa lokalnoj varijabli.
Globalne i lokalne varijable (2)
def funkcija(a):
a+=1 #lokana varijabla
d=a+2 #lokalna varijabla
return (a)

a=10
a=funkcija(a)
print(a)
print(d)
• Varijabla „d” nije vidljiva izvan funkcije, štoviše u gornjem slučaju ona u
trenutku poziva više ni ne postoji. Gornji program vraća grešku.

Traceback (most recent call last):


File "<pyshell#7>", line 1, in <module>
print(d)
NameError: name 'd' is not defined
Globalne i lokalne varijable (3)
• Globalnim varijablama možemo pristupiti (iz funkcije) tako da pozovemo njihovo
ime. Npr.:

a=2 #globalna varijabla


b=3 #globalna varijabla
def funkcija():
print("U funkciji")
print(a) #pristup globalnoj varijabli
b=1 #lokalna varijbla – različita od globanog b!
print(b)
funkcija()
print ("Izvan funckije")
print(a)
print(b)

• Primjer u PythonTutoru.
Globalne i lokalne varijable (4)
• Globalne varijable ne možemo promijeniti (iz funkcije) tako da pozovemo
njihovo ime. Npr.:

a=2 #globalna varijabla

def funkcija():
a+=1 #promjena globalne varijable

funkcija()

• Gornji program javlja grešku:

UnboundLocalError: local variable 'a' referenced before


assignment

• Jer smo pokušali promijeniti globalnu varijablu.


Globalne i lokalne varijable (5)
• Globalne varijable možemo promijeniti (iz funkcije) upotrebo ključne riječi global
koja stvara referencu na globalnu varijablu. Npr.:

a=2 #globalna varijabla

def funkcija():
global a
a+=1 #promjena globalne varijable

funkcija()
print("Globalni a je",a)

• U ovom primjeru funkcija je uspješno promijenila globalnu varijablu.

• PythonTutor primjer.
Memorijski okvir funkcije
• U Pythonu svaki poziv funkcije dobiva svoj
memorijski okvir (engl. frame) u koji se pohranjuju
lokalne varijable i koji se briše u trenutku kada
funkcija završi.

• Ovi okviri dio su Pythonovog stoga i pišu se iza


„globalnog” okvira.
Python tutor – memorijski okviri
funkcija
• Python Tutor – memorijski okviri funkcija
Liste i funkcije
• Funkciji je moguće predati listu kao ulazni parametar.

• Također funkcija može return izrazom vratiti listu.

• Za razliku od varijabli predane liste nisu lokalne u


funkciji! Dakle kada su predane funkciji ne stvara se
zasebna (lokalna) kopija podataka. Ova iznimka postoji
jer lista može biti jako velika (memorijski zahtjevna).

• Liste koje su stvorene u funkciji jesu lokalne i nisu


vidljive izvana (ako ih ne vratimo sa return funkcijom.)
Liste i funkcije (2)
• Primjer liste koja je vraćena iz funkcije:

def funkcija(ua,ub):
l=[ua,ub]
return l

a='Ana'
b='Ivo'
izlaz=funkcija(a,b)
print (izlaz)
Python Tutor – funkcija koja vraća
listu
• Python Tutor – funkcija koja vraća listu.
Liste i funkcije (3)
• Primjer liste koja je predana funkciji, promijenjena u
funkciji i nikad vraćena.
• Iz ovog primjera vidljivo je da je vanjsku listu moguće
promijeniti unutar funkcije. Također listu nije bilo
nužno predati, ali je ovo preporučljiv način pisanja zbog
prenosivosti funkcije.

def funkcija(a):
a[0]='Maja'
a=['Ana','Ivo',3]
funkcija(a)
print (a)
Python Tutor – funkcija koja
mijenja globalnu listu
• Python Tutor – funkcija koja mijenja globalnu listu
1. zadatak
Napišite program koji učitava jedan prirodni broj s
tipkovnice i ispisuje znamenke učitanog prirodnog
broja počevši od krajnje desne znamenke.

Za određivanje i ispis znamenki napišite funkciju koja


prima kao ulazni parametar učitani cijeli broj i
ispisuje znamenke (ne mora ih vratiti već samo
ispisati na ekran).
1. zadatak rješenje
• Rješenje aritmetičkim operacijama:

def znamenkeNum(a):
while a>0:
print (a%10)
a//=10

• Rješenje obradom stringa:

def znamenkeStr(a):
sa=str(a)
i=len(sa)-1
while i>-1:
print (sa[i])
i-=1
2. zadatak
Napišite program koji učitava 10 cijelih brojeva u
listu.

U funkciji izračunajte koliko iznosi aritmetička sredina


učitanih brojeva i rezultat vratite pozivatelju koji ga
ispisuje.
2. zadatak rješenje
def arSr(l):
suma=0
for i in range(0,10):
suma+=l[i]
a=suma/len(l)
return a

lista=[]
while len(lista)<10:
lista.append(int(input("Unesite broj: ")))
print ("Aritmeticka sredina je:",arSr(lista))
3. zadatak
Napišite program koji generira i ispisuje slučajne
cijele brojeve iz raspona [0,10] dok se ne pojavi
(generira) nula.
Nakon što se pojavi nula program mora prekinuti
izvođenje.
Za generiranje broja napišite funkciju.
Funkcija mora vratiti generirani broj pozivatelju koji
će generirani broj ispisati ili prekinuti program (ako
se radi o nuli).
3. zadatak rješenje
def nasum():
from random import randint as ra
return ra(0,6)

while True:
a=nasum()
if a!=0:
print (a)
else:
break
4. zadatak
Napišite program koji će slučajnim odabirom brojeva
generirati 10 cjelobrojnih vrijednosti između 1 i 10,
te ih pohraniti u prvu listu.
Nakon toga je od korisnika potrebno zatražiti unos 10
cjelobrojnih vrijednosti koje također moraju biti
vrijednosti između 1 i 10, te ih spremiti u drugu listu.
Napišite funkciju „usporediListe“ koja prima oba dvije
liste i vraća koliko je brojeva korisnik pogodio. Osim
samih vrijednosti, kod usporedbe se moraju
poklapati i mjesta unutar liste.
4. zadatak rješenje
def usporediListe(a,b): from random import randint as ra
isti=0 for i in range(10):
listaA.append(ra(1,10))
for i in range(0,10):
if a[i]==b[i]: while len(listaB)<10:
listaB.append(int(input('Unesite broj: ')))
isti+=1
return isti r=usporediListe(listaA,listaB)
print(listaA)
print(listaB)
listaA=[] print(r)
listaB=[]
CodeRunner vježba iz funkcija
U CodeRunner vježbi pišete samo funkcije, dakle nije
potrebno pisati naredbe za unos i ispis podatka niti
za poziv funkcije.
Dakle u vježbi iz funkcija vaš kod počinje s ključnom
riječi def i završava s return.
Pri testiranju slobodno dodajte naredbe i izvan
funkcije ali predajte samo funkciju.
Pitanja?

You might also like