3,659 pregleda

Serijal tekstova: Zajedno naučimo Python (8. dio) – Funkcije

3

Pozdrav svima! Dobrodošli u osmi Python tutorial. Do ovog smo tutoriala obradili već dosta toga – od varijabli, pa sve do rječnika. Samim time, imamo znanja i mogućnosti pisati razne programe, a što više znamo, kompleksnije zadatke možemo rješavati.

Kod kompliciranijih zadataka imamo relativno puno redaka koda, često i dijelova koji se ponavljaju, ali su nam potrebni pri samoj izvedbi programa. Kako bismo izbjegli ponavljanje i ponovno pisanje istog ili sličnog koda, koristimo funkcije.

Funkcije su grupirani dio koda koji izvršava određenu radnju. Primjerice, imamo program gdje na različitim dijelovima zbrajamo i ispisujemo vrijednost. Ako to želimo raditi bez funkcija, nekoliko puta moramo pisati isti kod. S druge strane, uporabom funkcije, to nam neće biti potrebno.

Funkcije mogu biti ugrađene u programski jezik, a mogu ih pisati i korisnici. S ugrađenim funkcijama smo se sreli: print(), len(), del().., dok funkcije koje piše korisnik tek trebamo objasniti.

Kod već ugrađenih funkcija vidimo da se samo imenom funkcije i korištenjem argumenata (tj. vrijednosti unutar zagrada) lako može doći do konačne vrijednosti koja nam je potrebna. Tako ne pišemo dodatne redove koda, nego uz pomoć funkcije jednostavno izvršimo određeni zadatak.

Na isti način djeluju i funkcije koje napiše korisnik. Ono što čini funkciju je ključna riječ def, nakon toga ime funkcije, pa zagrade unutar kojih možemo upisati argumente te dvotočka i uvučeni blok naredbi nakon toga:

def ime_funkcije():
// blok naredbi

Na ovaj način je definirana funkcija, dok se ona poziva na sljedeći način:

ime_funkcije()

Zapravo, sve je isto kod poziva funkcije kao i kod ugrađenih funkcija programskog jezika. Da sve to ne bi bila samo teorija, riješit ćemo jedan primjer uz pomoć funkcija. Zadatak koji ćemo riješiti je zbrajanje brojeva uz pomoć funkcija.

Prvo nam je potrebno definirati funkciju. Nazvat ćemo ju zbrajanje. Sljedeće što nam treba je unutar tijela funkcije napisati kod koji će tražiti unos dva broja te ispisati njihov zbroj. To će izgledati ovako:

Python 08 Slika 01

Nakon što smo definirali funkciju, potrebno ju je pozvati kako bi se ona mogla izvršiti. Pošto ćemo napraviti program koji zbraja brojeve pet puta, koristit ćemo for iteraciju:

Python 08 Slika 02

Sada smo gotovi s izradom i pozivanjem funkcije te možemo pokrenuti program:

Python 08 Slika 03

Kao što vidite, korištenje funkcija nam je skratilo vrijeme pisanja programa jer smo za zbrajanje i ispis samo jednom pisali kod i nije bilo potrebno kasnije to sve pisati ponovo. Druga pozitivna stvar je povećanje čitkosti koda. Na vrhu nam se nalazi funkcija u kojoj piše što se radi, dok se kasnije ona samo poziva da izvrši određeni zadatak.

No, treba napomenuti jednu stvar. Funkcija mora biti definirana prije pozivanja iste, jer će program inače javiti pogrešku (u našem primjeru funkcija je napisana odmah na početku, a kasnije je tek pozivana).

Sljedeća stvar koju ćemo spomenuti su argumenti. Njih smo već sreli, i to kod gotovo svih ugrađenih funkcija koje smo koristili. Argumenti su vrijednosti koje prosljeđujemo funkciji. Prosljeđujemo ih tako da unutar zagrade napišemo vrijednost ili ime varijable, liste i sl. koja sadržava određenu vrijednost.

print(“Pozdrav”)

U ovom primjeru vidimo da funkcija print() ima argument “Pozdrav”. Pošto je to funkcija ispisa, ona ispisuje upravo vrijednost tog argumenta.

Kod funkcija definiranih od strane korisnika, korisnik sam određuje koliko će argumenata biti potrebno za izvođenje određene funkcije. Za primjer ćemo uzeti funkciju koja množi dva broja i ispisuje vrijednost. Prvo ćemo definirati dvije varijable, gdje će se u svaku spremiti vrijednost koju korisnik unese. Nakon toga će se funkcija pozivati, a u zagradi će se nalaziti proslijeđeni argumenti (brojevi koje je unio korisnik).

Python 08 Slika 04

Ono što može biti zbunjujuće su imena argumenata pri definiranju i pozivu funkcije. Kod definiranja funkcije, imena argumenata možemo odabrati svojevoljno i ne moraju imati ista imena koja će kasnije u ostatku programa biti korištena. Međutim, u samoj definiciji funkcije, imena argumenata unutar zagrada i u tijelu funkcije moraju biti ista.

Ovo funkcionira tako da se pri pozivu funkcije stvore tipovi podataka (varijable, liste…) iste kao i proslijeđeni tip podataka, a vrijednosti se preslikaju u njih. Kada funkcija završi, ti se pomoćni tipovi podataka brišu iz memorije.

Upravo iz razloga da se pomoćni podaci korišteni u funkcijama brišu, odnosno, nakon izvršavanja funkcije da se oslobodi korištena memorija, postoji mogućnost da funkcija vrati vrijednost. Zašto? Čisto iz praktičnih razloga, odnosno, ako neku vrijednost iz funkcije trebamo koristiti u daljnjem dijelu programa bilo bi korisno da tu vrijednost sačuvamo.

Kako bismo to postigli koristimo naredbu return. Uzet ćemo za primjer zadatak gdje izračunavamo aritmetičku vrijednost liste.

Python 08 Slika 05

Na početku smo definirali funkciju koja prolazi kroz listu i računa aritmetičku vrijednost. Nakon toga, definirali smo varijablu a_sred u koju ćemo spremiti vraćenu vrijednost. Naravno, kako bi u varijablu spremili vraćenu vrijednost, koristimo znak pridruživanja. Ovo bi mogao biti primjer dijela programa gdje računamo prosjek nekog učenika i studenta koji kasnije koristimo u neke druge svrhe.

Iako funkcije imaju još mnoštvo mogućnosti, neću vas kod uvoda u ovaj programski jezik još dodatno mučiti s tim. Međutim, obradit ćemo još jednu jako, jako korisnu stvar, a to su rekurzivne funkcije. Iako će na prvi pogled možda izgledati komplicirano i možda će neki reći da to nisam trebao uvrstiti u ovaj serijal jer je to samo uvod, ipak jesam.

Rekurzivna funkcija je funkcija koja poziva sama sebe. U nastavku ću napisati funkciju za izračun faktorijela:

Python 08 Slika 06

Iako možda rekurzija nije i dalje jasna, našao sam jednu sliku koja to relativno dobro objašnjava:

Python 08 Slika 07

Radi se o tome da funkcija u ovom slučaju poziva samu sebe tako dugo dok vrijednost varijable broj ne bude manja ili jednaka 1, odnosno, ako je vrijednost varijable 1, funkcija će vratiti broj 1 (neće se više pozivati funkcija) i počet će se množiti vrijednosti dok se ne dođe do njihovog umnoška.

Razlog korištenju uvjeta je sljedeći: da ga nemamo, funkcija bi se pozivala neograničen broj puta, što svakako nebi bilo dobro. Upravo zato, zadali smo granicu do koje se ide u “dubinu”, odnosno do broja 1, koji će biti zadnji pozitivni cijeli broj.

Nakon svega ovog, vrijeme je za praktični zadatak. :) Na trenutak ćemo zaboraviti još uvijek zbunjujuću rekurziju i prihvatiti se ovog zadatka. Prošli put smo radili jedan zanimljiv zadatak sa studentima. Danas ćemo napraviti nešto slično, ali uz pomoć funkcija.

Današnji zadatak je napraviti program koji će omogućavati dodavanje, brisanje i promjenu podataka građana te ispis tablice istih. Promjena u odnosu na prošli tutorial je dodavanje izbornika, preko kojeg ćemo koristiti funkcije, te naravno, bolja čitljivost koda.

Prva stvar koja nam treba je rječnik u kojem ćemo naći određene podatke o građanima. U današnjem programu koristit ćemo samo četiri podatka; OIB, ime, prezime i mjesto stanovanja.

Python 08 Slika 08Sljedeće stvari koje ćemo napraviti su funkcije za unos korisnika, brisanje korisnika i promjenu podataka o korisniku. U tu svrhu napravit ćemo tri funkcije i to: unos(), brisanje(), promjena(). Ipak, pošto radimo s rječnikom, napravit ćemo i jednu pomoćnu funkciju koju ćemo nazvati provjera(), a pomoću nje ćemo provjeravati da li je u rječniku uneseni OIB već upotrijebljen ili ne.

Python 08 Slika 09

Nakon toga slijedi funkcija za unos korisnika koju ne treba previše predstavljati:

Python 08 Slika 10

Što se funkcije za brisanje tiče, ovdje koristimo mogućnost provjere rječnika kao i pri unosu, odnosno, u slučaju unesenog OIB-a koji se nalazi u rječniku brišemo sadržaj, dok u suprotnom program ispisuje poruku: “Ne postoji korisnik s tim OIB-om.”.

Python 08 Slika 11

Ostala nam je funkcija promjena(). Kod ove funkcije, imat ćemo mogućnost promjene podataka o određenoj osobi. Opet ćemo raditi provjeru u rječniku, a zatim, ako postoji osoba s unesenim OIB-om, prvo će se ispisati pojedina vrijednost (OIB, ime…) te se, u slučaju praznog unosa, zadržava stara vrijednost, dok se u slučaju unosa nove vrijednosti zadržava unesena (omogućeno zahvaljujući if-else selekciji).

Python 08 Slika 12

Nakon napravljenih funkcija za modificiranje podataka, potrebna nam je još jedna koja se tiče ispisa. Dat ćemo joj zanimljiv naziv: ispis() :D Ispis tablice i zaglavlja ne trebam dodatno objašnjavati, ali u mom slučaju to izgleda ovako:

Python 08 Slika 13

I sada, kada izgleda da je sve gotovo – NIJE! Potreban nam je izbornik koji će nam omogućavati da pomoću našeg unosa pozovemo određenu funkciju. Ovdje ću koristiti if-elif-else selekciju gdje će se brojevima od 1 do 3 modificirati podaci, unosom broja 4 će se ispisati tablica, dok će se unosom broja 0 izlaziti iz programa. Također, izbornik će isto biti napisan kao funkcija, a radit će kao beskonačna petlja pomoću while iteracije. U ovom slučaju je korištenje while petlje dopušteno, jer ćemo u slučaju unosa broja 0 koristiti naredbu break.

Python 08 Slika 14

Pošto u prethodnoj slici vidite korištenje modula os, potrebno je na početak programa dodati sljedeći kod:

import os

Da bi program bio gotov i spreman za izvođenje, potrebno je na kraju programa pozvati funkciju:

izbornik()

S ovim, zapravo, završavamo s pisanjem programa. U nastavku se nalazi prikaz gotovog programa za određene funkcije. Unos novog korisnika:

Python 08 Slika 15

Opcija za brisanje korisnika:

Python 08 Slika 16

Modificiranje podataka za određenog korisnika:

Python 08 Slika 17

Ispis tablice tablice svih korisnika izgleda na sljedeći način:

Python 08 Slika 18

Ovim smo došli do kraja tutoriala. Želim vam još napomenuti da su funkcije važan dio svakog programskog jezika i bilo bi korisno da usvojite današnje gradivo. Pomoću funkcija možete pojednostaviti i skratiti kod, a opet povećati njegovu čitkost i efikasnost.

Što se zadataka tiče, mislim da ovdje nema previše nedoumica. Međutim, dat ću vam tri zadatka od kojih su dva vrlo jednostavna dok je treći za razmišljanje:

  1. Napišite program koji računa kvadrat unesenog broja te vraća rezultat. Program realizirajte pomoću funkcija.
  2. Napišite program u kojem korisnik unosi n brojeva. Pri svakom unosu se provjerava neparnost unesenog broja. Ako je broj paran, ponavlja se unos. Nakon toga, potrebno je izdvojiti najmanji i najveći broj, izračunati njihov umnožak te ga ispisati. Program realizirajte pomoću funkcija.
  3. Ovaj zadatak je za one koji žele malo razmišljati, a jako ga je jednostavno riješiti pomoću rekurzivne funkcije. Ispišite prvih n članova fibonaccijevog niza. (Niz počinje ovako: 1, 1, 2, 3, 5, 8, 13, 21… odnosno, zbroj prethodna dva broja dalje sljedeći broj u nizu).

Do sljedećeg puta,

Nikola

VN:F [1.9.22_1171]
Rating: 4.1/5 (9 votes cast)
Serijal tekstova: Zajedno naučimo Python (8. dio) - Funkcije, 4.1 out of 5 based on 9 ratings

Povezani članci:

App Inventor ponovo zaživ...
Naučite Vim tipkovničke n...
Kompiliranje kernela – ka...
Upoznajte CLI program top
LFS - Tvoja distra, tvoja...

3 Responses

  1. neupuceni kaže:

    Pozdrav!

    Tutoriali su super! Svaka cast! Samo napred… :)

    Imam jedno pitanje. Zasto posle svakog tutorial nepostavite pdf od njega samog?

    :)

  2. Lol kaže:

    WordPress mislim da ima generator članaka u PDF

Ostavi komentar

© 2014 Linux Za Sve. | Impressum | Sadržaj je licenciran pod CC-SA-3.0 ako nije drugačije naznačeno.
Proudly designed by Theme Junkie.