Najpre definiši radnju, a zatim je pozovi kada ti zatreba.
Osnovni životni ciklus funkcije je: definicija → zapamćene instrukcije → poziv → izvršavanje tela → nastavak programa. Definicija ne izvršava svoje telo odmah.
def greet():
print("Hello")def govori Pythonu da definišeš funkciju. greet je ime funkcije, () je sintaksa funkcije, a : označava početak njenog tela. Uvučeni print("Hello") pripada funkciji, ali ga Python ne izvršava kada prvi put pročita definiciju. Prazne zagrade znače da ova funkcija još ne prima vrednosti; sledeći koncept će pokazati kako funkcije mogu da primaju podatke.
def greet(): definiše radnju i pamti njene instrukcije. greet() poziva tu radnju. Samo poziv ulazi u telo funkcije i izvršava print("Hello").
Zapamti ovaj životni ciklus: definiši → Python pamti instrukcije → pozovi → izvrši telo → nastavi. Zato funkciju možeš pozvati više puta bez ponavljanja njene definicije.
print("Before")
def greet():
print("Hello")
print("Defined")
greet()
print("After")Python ispisuje Before, pamti definiciju bez ispisa Hello, a zatim ispisuje Defined. Kod greet(), Python ulazi u telo i ispisuje Hello. Kada se telo završi, izvršavanje se vraća na sledeći red i ispisuje After.
def show_welcome():
print("Welcome!")
show_welcome()
show_welcome()
show_welcome()Bez funkcije, ista print instrukcija bila bi kopirana tri puta. Funkcija daje ime jednoj radnji i omogućava ti da je pozoveš kad god ti zatreba. Ako se radnja kasnije promeni, menjaš njenu definiciju na jednom mestu.
def ring_bell():
print("Ding!")
ring_bell()
ring_bell()
ring_bell()Svaki poziv ponovo izvršava isto uvučeno telo. Definicija se piše jednom, dok se radnja može dogoditi onoliko puta koliko programu treba.
greet()
def greet():
print("Hello")Python izvršava program odozgo nadole. Kada stigne do prvog greet(), to ime još nije definisano, pa poziv ne može da uspe. Stavi definiciju pre poziva koji Python treba da izvrši.
greet()
show_menu()
print_report()
display_message()Jasno ime funkcije pomaže čitaocu da predvidi šta će se dogoditi kada je pozove. Koristi opisna imena u snake_case obliku umesto nejasnih imena kao što su x(), thing() ili do_it().
def greet():
print("Hello")
print("Outside")Uvučeni print pripada funkciji greet(). print("Outside") nije uvučen, zato nije deo funkcije i izvršava se u okolnom programu.
Praktičan kontrolni spisak za čitanje funkcija
- Pronađi definicijuGde
defdefiniše funkciju i koje ime daje radnji? - Pronađi teloKoje uvučene instrukcije pripadaju toj funkciji?
- Pronađi svaki pozivGde program koristi
()da pozove funkciju? - Prati redosled izvršavanjaŠta se izvršava pre poziva, tokom tela i nakon povratka iz poziva?
- Prebroj poziveSvaki poziv ponovo izvršava telo, zato prebroj koliko puta se radnja događa.
Česte početničke greške
- Očekivanje da definicija izvršava svoje telo
def greet():samo definiše funkciju. Bezgreet()ne ispisujeHello. - Zaboravljanje zagrada pri pozivu
greet()poziva funkciju. Na ovom nivou, čitajgreetkao njeno ime, agreet()kao instrukciju da je pozoveš. - Pozivanje pre nego što je funkcija definisanaPython prolazi kroz kod odozgo nadole, zato definiši funkciju pre poziva do kog stigne.
- Zaboravljanje dvotačke
def greet()nije potpuna definicija. Dvotačka započinje telo funkcije:def greet():. - Neispravno uvlačenjeTelo funkcije mora biti uvučeno kako bi Python znao koje se instrukcije izvršavaju kada se funkcija pozove.
- Mešanje definicije i pozivaVizuelno razlikuj
def greet():, koji definiše radnju, odgreet(), koji je izvršava.
