for petlja - ★★ Fog Developer ★★

Novo

6/recent/ticker-posts

for petlja

8.3 for petlja 

Petlju koju inače nazivamo for petlja se u suštini sastoji iz dve naredbe: for i in. Gradi se na sledeći način:
for promenljiva in nešto:
    blok naredbi
Ummm.... Nešto? Promenljiva?
Čekaj sada ću sve objasniti....
Komande for i in su samo još jedna verzija komandi za kreiranje nekih petlji. One rade na sledeći način: Mi ne moramo da definišemo promenljivu bilo gde u programu, već je definišemo u samoj naredbi, dakle for promenljiva, i toj promenljivoj obično dajemo neko kratko ime, tipa i, y ili bilo koje drugo slovo (zato što nam ta promenljiva treba samo za ovu petlju). Ta promenljiva će da dobije vrednost prve stavke u nekoj sekvenci.
A šta je sekvenca?
Dobro pitanje! Sekvence su vrste podataka kroz koje možemo da prolazimo sa for petljom :) Šalu na stranu, sekvence su samo skup različitih podataka na jednom mestu u memoriji računara, za sada poznaješ samo jednu vrstu sekvenci, a to su stringovi, i za početak će nam biti dovoljni, no idemo dalje...
Kada se završi definisan blok naredbi ispod for … in.... definicije petlje, promenljiva dobija vrednost sledeće stavke u sekvenci (ukoliko je to string – sledeće slovo!), pa opet prolazi kroz blok, i tako dalje, sve dok ne dobije vrednost poslednje stavke u nizu, zatim Python zna da treba da izađe iz petlje i nastavi dalje. Znači for petlja prolazi kroz niz predmeta, odnosno prolazi kroz svaku stavku u nizu. Pokazaću ti više o sekvencama (neki objekti u nekom nizu) detaljnije u kasnijem delu tutorijala. Ono što treba da zapamtiš na ovom mestu je to da je sekvenca samo kolekcija (nekih) stavki u (nekom) određenom rasporedu.
Ajde da ti dam primer sa stringom, možda ti bude jasnije:
>>> kuca = 'Džukela' 
>>> for i in kuca: 
...     print(i) 
... else: 
...     print('pobegao....') 
... 
D 
ž 
u 
k 
e 
l 
a 
pobegao.... 
>>> 
Ili, malko da gvirnemo u te „famozne“ sekvence:
>>> ponuda = 'koktel', 'pivo', 'sok', 'bambus', 'špricer' 
>>> for i in ponuda: 
...     print('Hoćeš:') 
...     print(i, '?') 
... else: 
...     print('\n\nNemam ni dinara...') 
...     print('pa ako je džaba, može :)') 
... 
Hoćeš: 
koktel ? 
Hoćeš: 
pivo ? 
Hoćeš: 
sok ? 
Hoćeš: 
bambus ? 
Hoćeš: 
špricer ? 


Nemam ni dinara... 
pa ako je džaba, može :) 
>>> 
Neki put nam u for petlji ni ne treba vrednost promenljive:
>>> for i in 1, 2, 3, 4, 5: 
...     print('Ha', end = '') 
... else: 
...     print() 
... 
HaHaHaHaHa 
>>> 
Iako ovo u ovom trenutku deluje čudno, jer smo isto mogli postići i na mnogo lakši način, postoje situacije gde može biti korisno (kao ponavljanje određenih komandi tačno onoliko puta koliko je to predviđeno).
Na ovom mestu moram da napomenem jednu stvar koja ti može promaći.... Šta ako odlučimo da prolazimo kroz neki string (ili sekvencu objekata, sve jedno) koji je ogroman? Na primer – par gigabajta? Python mora imati taj string (ili niz brojeva, kao u prethodnom primeru) u memoriji. Sledi pitanje: imaš li ti toliko memorije ugrađene u računar (misli se na RAM i SWAP - radnu memoriju računara , RAM je Random Acces Memory, dok je SWAP poznatiji kao virtuelni RAM – mesto na Hard Disku koje je predviđeno da radi na istom principu kao i RAM)?
Imam 4 giga RAM-a...
Dobro... Ti imaš, ali da li imaju i svi oni koji će koristiti tvoj program?
Ajde da te ne gnjavim previše, nisi prvi, a ni poslednji, koji lupa glavu nad ovim problemom. Čak šta više, problem je prilično čest, tako da mnogi upadaju u njega.
Ali Python ima rešenja za sve, zar ne?
Postoji podgrupa podataka koji spadaju u sekvence koji se nazivaju iteratori. Ako ne znaš značenje naziva: to su podaci koji su predviđeni da se kroz njih nešto radi. Oni jesu sekvence, ali oni nisu komplet u memoriji, već služe da daju Pythonu jednu vrednost u jednom trenu!
Prvi iterator koji ću ti pokazati je funkcija range().
>>> for i in range(1, 6): 
...     print(i) 
... 
1 
2 
3 
4 
5 
>>> 
Znači funkcija range() za nas generiše neki niz brojeva (takve funkcije se inače nazivaju generatori). Ova funkcija se (uglavnom) koristi u for petljama, jer:
>>> i = range(5) 
>>> i 
range(0, 5) 
>>> i 
range(0, 5) 
>>> i 
range(0, 5) 
>>> 
Izgleda da bez for petlje i ne dobijaš željeni rezultat?
No, da se vratimo na prethodni primer. Ono šta smo mi uradili je to da prosleđujemo dva broja range funkciji, koja će nam vraćati niz brojeva (koji počinje od prvog broja, ali ide samo do drugog broja - znači da taj drugi broj nije uključen u niz koji nam ona vraća). Na primer, range(1,5) daje nam sekvencu brojeva 1, 2, 3, 4 . Ali pogledaj čudo:
>>> for i in range(1, 16, 2): 
...     print(i) 
... 
1 
3 
5 
7 
9 
11 
13 
15 
>>> 
Po „default-u“, range funkcija kreira sekvencu sa podrazumevanim korakom koji ima vrednost 1. Ako mi prosledimo i treći broj range funkciji, onda taj broj postaje korak brojanja. Na primer, range(1,5,2) će nam dati 1 i 3 (tj. 1, 1+2). Zapamti da opseg koji želiš se proteže DO drugog broja, odnosno da ne sadrži drugi broj
Takođe primeti da ako funkciji range() prosledim samo jedan broj, ona će da shvati da ja od nje želim niz brojeva koji počinje od nule pa do tog broja (opet je do, tj ne i taj broj).
Opet ponavljam da range() generiše niz brojeva, ali će generisati samo jedan broj u jednom trenutku, kada to od njega for-petlja bude zahtevala, tj kada joj bude potreban za sledeći prolaz kroz blok naredbi.
Da bih ti prikazao, na šta mislim kada sam govorio o memoriji i preopterećenosti iste, otvori neki vizuelni program koji ti pokazuje trenutno stanje računara, tipa task menadžera, pa probaj ovo:
>>> k = range(1, 100000000) 
>>> for i in k: 
...     print(i) 
..........
...........
5150289 
5150290 
5150291 
5150292 
5150293 
5150294 
^C5150295 
Traceback (most recent call last): 
  File "<stdin>", line 2, in <module> 
KeyboardInterrupt 
>>> 
(prekinuh, da ne bih čekao dugo, dugo...)
Kod mene slika izgleda ovako:
 CPU je očekivano opterećen, ali memorija je „normalna“...
Ali šta sad sa ovim?
Hajde da pokušamo isto to, samo sa svim podacima u memoriji računara:
Pre toga moraš da znaš nešto: ako želiš da odmah „dobiješ“ celu sekvencu brojeva, koristimo funkciju, o kojoj ćemo pričati i malo kasnije: list() - ona jednostavno kreira nešto što se zove lista i njih ćemo raditi kasnije. U našem slučaju će to izgledati kao list(range()).
>>>> h = list(range(500000)) 
>>> h = list(range(50000000)) 
>>> for i in h: 
...     print(i) 
1648186 
1648187 
1648188 
1648189 
1648190 
^C1648191 
Traceback (most recent call last): 
  File "<stdin>", line 2, in <module> 
KeyboardInterrupt 
(Nisam ni smeo onako velik broj da postavim....)
I ovo ne izgleda obećavajuće:
Memorija je.... Odlepila....
Pouka je da – mora da se pazi!
Da se vratimo na for petlju?
Kao i ostale naredbe koje koristimo zbog kontrole izvršavanja programa, i for... in... može da ima else blok koji, naravno, nije obavezan. Ako smo definisali else blok, on se izvršava samo jednom, nakon što se for petlja završi, osim ako је ne prekinemo sa break naredbom koju ćemo isprobati sledeću. 
for petlja može da se primeni na svaku sekvencu. U primerima sam pokazao string, listu brojeva koje generiše range funkcija, itd. ali mi, generalno, možemo koristiti bilo koji niz bilo koje vrste objekata!  Za sada, da ostavimo ovu ideju za kasnije?
Ukoliko si se susretao sa C/C++/Java/C# programskim jezicima: 
Python for petlja je totalno drugačija od C/C++ for petlje. C# programeri primećuju da for-petlja u Python-u je slična foreach petlji u C#. Java programeri će primetiti da je slična for (int i : IntArray) u Javi 1.5. 
U C/C++ programskim jezicima, ako napišeš for (int i = 0; i < 5; i++) , to bi u Python-u napisao kao for i in range(0,5) . Kao što vidiš, for-petlja je jednostavnija, lakše čitljiva i manja je verovatnoća da načiniš grešku ukoliko je pišeš u Python-u!

8.2 while komanda Indeks 8.4 break komanda

Постави коментар

0 Коментари