Vodič za Pajton 2.6/Primeri naprednih funkcija
Neki ljudi smatraju ovaj odeljak korisnim, a neki zbunjujućim. Ako smatrate da je zbunjujući možete ga preskočiti (ili samo pogledati primere.) Sada ćemo proći kroz sledeći program:
def множ(a, b):
if b == 0:
return 0
пауза = множ(a, b - 1)
вредност = a + пауза
return вредност
решење = множ(3, 2)
print "3 * 2 = ", решење
Otkrivena je petlja šablona: Šablon:Rešenje
основи овај програм ствара позитивну функцију множења
(on je daleko sporiji nego ugrađena funkcija množenja) i onda demonstrira ovu funkciju korišćenjem funkcije. Ovaj program prikazuje korišćenje rekurzije, to je oblik ponavljanja (ponavljanje) u kome se nalazi funkcija koja više puta sebe poziva dok izlaz uslov nije zadovoljen. Koristi ponovljene dopune koje daju isti rezultat kao množenje: npr. 3 + 3 (sabiranje) daje isti rezultat kao 3 * 2 (množenje).
NIZ 1
- Pitanje: Koja je prva stvar koju program radi?
- Odgovor: Prva urađena stvar je funkcija množ definisana u svim linijama osim u poslednjoj.
Otkrivena je petlja šablona: Šablon:Rešenje
- Ovo stvara funkciju koja uzima dva parametra i vraća vrednost kada se završi. kasnije ova funkcija može biti pokrenuta.
- Šta se događa sledeće?
- Sledeća linija posle funkcije,
резултат = множ(3, 2)
je pokrenuta.
- Šta radi ova linija?
- Ova linija će dodeliti povratnu vrednost
множ(3, 2)
promenljivojрезултат
.
- A šta
множ(3, 2)
vraća? - Moramo da prođemo kroz funkciju
множ
da saznamo.
NIZ 2
- Šta se događa sledeće?
- Promenljiva
a
dobija vrednost 3 koja joj je dodeljena i promenljivab
dobija vrednost 2 koja joj je dodeljena.
- Šta onda?
- Linija
if b == 0:
je pokrenuta. Otkadb
ima vrednost 2 ovo je netačno pa je linijareturn 0
preskočena.
- I šta onda?
- Linija
пауза = множ(a, b - 1)
je pokrenuta. Ova linija postavlja lokalnu promenljivuпауза
vrednostiмнож(a, b - 1)
. Vrednosta
je 3 i vrednostb
je 2 pa je poziv funkcijeмнож(3,1)
- Pa koja je vrednost
множ(3, 1)
? - Moramo da pokrenemo funkciju
множ
sa parametrima 3 i 1.
Otkrivena je petlja šablona: Šablon:Rešenje
NIZ 3
- Šta se događa sledeće?
- Lokalne promenljive u novom pokretanju funkcije su postavljene tako da
a
ima vrednost 3 ib
ima vrednost 1. Pošto su ovo lokalne vrednosti one ne utiču na prethodne vrednostia
ib
.
- I onda?
- Otkad
b
ima vrednost 1 ako je izjava netačna, onda sledeća linija postajeпауза = множ(a, b - 1)
.
- Šta ova linija radi?
- Ova linija će dodeliti vrednost
множ(3, 0)
ostalima.
- Dakle, šta je ta vrednost?
- Moraćemo da pokrenemo ovu funkciju još jednom da to saznamo. Ovoga puta
a
ima vrednost 3 ib
ima vrednost 0.
- Šta se događa sledeće?
- Prva linija u funkciji da je pokrenete je
if b == 0:
.b
ima vrednost 0 pa je sledeća linija za pokretanjereturn 0
- I rša radi linija
return 0
? - Ova linija vraća vrednost 0 van funkcije.
- Pa?
- Sada znamo da
множ(3, 0)
ima vrednost 0. Sada znamo šta je linijaпауза = множ(a, b - 1)
uradila kako smo pokrenuli funkcijuмнож
sa parametrima 3 i 0. Završili smo pokretanjeмнож(3, 0)
i sada se vraćamo pokretanjuмнож(3, 1)
. Promenljivaпауза
dobija vrednost 0.
- Koja linija se sledeća pokreće?
- Linija
вредност = a + пауза
je pokrenuta sledeća. U ovom pokretanju funkcije,a = 3
iпауза = 0
pa je sadaвредност = 3
.
- Šta se događa sledeće?
- Linija
return вредност
je pokrenuta. ovo vraća 3 iz funkcije. Ovo takođe izlazi iz vraćanja funkcijeмнож(3, 1)
. Nakon što jereturn
pozvano, idemo nazad na pokretanjeмнож(3, 2)
.
- Gde smo bili u
множ(3, 2)
? - Imali smo promenljive
a = 3
ib = 2
i ispitivali smo linijuпауза = множ(a, b - 1)
.
- Šta se događa sada?
- Promenljiva
пауза
uzima 3 što joj je dodeljeno. Sledeća linijaвредност = a + пауза
postavljaвредност
na3 + 3
ili 6.
- Šta se sada dešava?
- Sledeća linija se pokreće, ovo vraća 6 iz funkcije. Sada se vraćamo pokretanju linije
резултат = множ(3, 2)
. Sada vraćena vrednost može biti dodeljena promenljivojрезултат
.
- Šta se sledeće događa?
- Sledeća linija posle funkcije,
print "3 * 2 = ", резултат
je pokrenuta.
- Šta ovo radi?
- Štampa
3 * 2 =
i vrednostвредности
što je 6. Završena štampana linija je3 * 2 = 6
- Šta se sveukupno dešava?
- U suštini koristili smo dve činjenice da izračunamo množenje dva broja. Prvo je da bilo koji broj koji pomnožimo sa 0 je 0 (
x * 0 = 0
). Drugo je da je broj pomnožen drugim ustvari prvi broj plus prvi broj puta manje nego drugi broj(x * y = x + x * (y - 1)
). Šta se dešava je da je3 * 2
prevedeno u3 + 3 * 1
. Zatim3 * 1
je prevedeno u3 + 3 * 0
. Onda znamo da bilo koji broj puta 0 je 0 pa3 * 0
je 0. Zatim možemo izračunati3 + 3 * 0
je3 + 0
što je3
. Sada znamo šta je3 * 1
pa možemo izračunati3 + 3 * 1
i to je3 + 3
što je6
.
Ovo je kako cela stvar radi:
множ(3, 2) 3 + множ(3, 1) 3 + 3 + множ(3, 0) 3 + 3 + 0 3 + 3 6
Ukoliko i dalje imate problema sa ovim primerom, pogledajte proces unazad. Šta je poslednji korak
koji se događa? Mi možemo lako prepoznati da je rezultat множ(3, 0)
0
. Otkad b
je0
, funkcija множ(3, 0)
će vratiti 0
i stati.
Pa šta prethodni korak radi? множ(3, 1)
ne vraća 0
zato što b
nije 0
. Dakle, sledeće linije izvršavaju:
пауза = множ (a, b - 1)
, što je пауза = множ (3, 0)
,
što je 0
kao što smo upravo uradili. Sad promenljiva je пауза
postavljena na 0
.
Sledeća linija dodaje vrednost пауза
promenljivoj a
, i kako je a
3
i пауза
je 0
, rezultat je 3
.
Sada znamo da funkcija множ(3, 1)
vraća 3
. Ali želimo da
znamo rezultat множ(3,2)
. Stoga, moramo da skočimo nazad na
početak programa i izvršimo ga još jednom:
множ(3, 2)
postavlja пауза
na rezultat множ(3, 1)
. Znamo
iz poslednje runde da je ovaj rezultat 3
. Zatim вредност
se računa kao a + пауза
,
npr. 3 + 3
. Onda je rezultat od 3 * 2 štampan kao 6.
Suština ovog primera je da se funkcija множ(a, b)
započinje sama unutar
sebe. Radi ovo dok b
ne postigne 0
i onda računa rezultat kao što je iznad objašnjeno.
Rekurzija
[uredi]Programiranje sadrži ovu vrstu koja se zove rekurzivno i verovatno intuitivna definicija rekurzije je:
- Rekurzija
- Ako i dalje ne razumete, pogledajte rekurcija.
Poslednja dva dela su skorije napisana. Ako imate bilo kakve komentare, ako pronađete neke greške ili mislite da moram više/jasnije da objasnim molim Vas pošaljite mejl. Ja sam bio poznat u prošlosti da jednostavne stvari pravim neshvatljivim. Ako je ostatak vodiča je imalo smisla, ali ovaj deo nije, to je verovatno moja greška i želeo bih da znam. Hvala.
Primeri
[uredi]faktorijel.py
#дефинише функцију која израчунава факторијел
def факторијел(n):
if n <= 1:
return 1
return n * факторијел(n - 1)
print "2! =", факторијел(2)
print "3! =", факторијел(3)
print "4! =", факторијел(4)
print "5! =", факторијел(5)
Izlaz:
2! = 2 3! = 6 4! = 24 5! = 120
odbrojavanje.py
def број_уназад(n):
print n
if n > 0:
return број_уназад(n-1)
број_уназад(5)
Izlaz:
5 4 3 2 1 0
komentarisano_množenje.py
# Коментари испод су били нумерисани као кораци, да дају лакше објашњење
# кода. Молимо вас да прочитате у складу са тим корацима.
# (корак број 1, на пример, је на дну)
def множ(a, b): # (2.) Ова функција ће понављати себе, зато што....
if b == 0:
return 0
пауза = множ(a, b - 1) # (3.) ....Једном када достигне ОВО, секвенца почиње изнова и враћа се на врх!
вредност = a + пауза
return вредност # (4.) дакле, "врати вредност" се неће десити док се не добију 3 корака изнад
print "3 * 2 = ", множ(3, 2) # (1.) Функција "множ" ће се прво покренути овде
# "return вредност" на крају се може десити само
# једном када је b једнако нули (b се смањује за 1 сваки пут када се корак 3 догоди).
# И само тада може бити приказана штампана команда на дну.
# Видите то као врсту ефекта "скакања унаоколо". У суштини, све што
# треба стварно да разумете ја да се функција поново покреће
# У СЕБИ у кораку 3. Дакле, секвенца "скаче" назад
# на врх.
komentarisani_faktorijel.py
# Још један пример функције "скакања унаоколо":
def факторијел(n): # (2.) Још једном, ова функција ће се ПОНАВЉАТИ....
if n <= 1:
return 1
return n * факторијел(n - 1) # (3.) Јер се ПРЕ-покреће ОВДЕ, и иде назад на врх.
print "2! =", факторијел(2) # (1.) Функција "факторијел" је иницирана овом линијом
print "3! =", факторијел(3)
print "4! =", факторијел(4)
print "5! =", факторијел(5)
komentarisano_odbrojavanje.py
# Још једно "скакање унаоколо", лепо и лако:
def бројање_уназад(n): # (2.) Још једном, овај део ће понављати сам себе....
print n
if n > 0:
return бројање_уназад(n-1) # (3.) Пошто поново почиње овде, и враћа се на врх
бројање_уназад(5) # (1.) Функција "бројање_уназад" иницира овде