Vodič za Pajton 2.6/Primeri naprednih funkcija

Izvor: Викикњиге

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 promenljiva b dobija vrednost 2 koja joj je dodeljena.

Šta onda?
Linija if b == 0: je pokrenuta. Otkad b ima vrednost 2 ovo je netačno pa je linija return 0 preskočena.

I šta onda?
Linija пауза = множ(a, b - 1) je pokrenuta. Ova linija postavlja lokalnu promenljivu пауза vrednosti множ(a, b - 1). Vrednost a je 3 i vrednost b 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 i b ima vrednost 1. Pošto su ovo lokalne vrednosti one ne utiču na prethodne vrednosti a i b.

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 i b 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 pokretanje return 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 je return pozvano, idemo nazad na pokretanje множ(3, 2).

Gde smo bili u множ(3, 2)?
Imali smo promenljive a = 3 i b = 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 вредност na 3 + 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 je 3 * 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 je 3 * 2 prevedeno u 3 + 3 * 1. Zatim 3 * 1 je prevedeno u 3 + 3 * 0. Onda znamo da bilo koji broj puta 0 je 0 pa 3 * 0 je 0. Zatim možemo izračunati 3 + 3 * 0 je 3 + 0 što je 3. Sada znamo šta je 3 * 1 pa možemo izračunati 3 + 3 * 1 i to je 3 + 3 što je 6.

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.) Функција "бројање_уназад" иницира овде


Šablon:Vodič za Pajton 2.6/Navigation