For petlja (loop)

Možda jedna od najmoćnijih sposobnosti računara je što mogu da ponavljaju stvari (programske segmente) brzo i neumorno. Postoji više načina na koje se stavri mogu ponavljati u Pythonu, a najčešće se to postiže for petljama.

Primeri for petlje

Primer 1

Sledeći program će štampati Hello deset puta:

for i in range(10):
    print('Hello')

Struktura for petlje je sledeća:

for naziv_varijable in range(broj_ponavljanja):
    naredbe koje treba ponavljati

Ovde je sintaksa jako važna. Reč for mora biti napisana malim slovima, prva linija se mora završiti sa dve tačke, a neredbe koje treba ponavljati moraju na početku imati razmak. Pomoću tog razmaka Python zna koje naredbe treba ponavljati.

Primer 2

Donji program traži od korisnika da unese neki broj a onda štampa njegov kvardrat, pa onda sve to ponavlja tri puta. Na kraju program štampa poruku da je petlja završena.

for i in range(3):
    broj = eval(input('Unesite broj: '))
    print ('Kvadrat vašeg broja je', broj*broj)
print('For petlja je završena.')

Rezultat izvršavanja programa:

Unesite broj: 3
Kvadrat vašeg broja je 9
Unesite broj: 5
Kvadrat vašeg broja je 25
Unesite broj: 23
Kvadrat vašeg broja je 529
For petlja je završena.

Pošto su druga i treća linija programa napisane sa razmakom na početku Python zna da te naredbe treba ponavljati. Četvrta linija nije sa razmakom pa zato nije deo petlje i biće izvršena tek nakon što se petlja završi.

Primer 3

Donji program će štampati A, pa onda B, a onda će štampati naizmenično C i D pet puta i na kraju će završiti štampanjem slova E jedanput.

print('A')
print('B')
for i in range(5):
    print('C')
    print('D')
print('E')

Prve dve print naredbe će biti izvršene samo jedanput, najpre štampanjem slova A a zatim i slova B. Kao sledeće, slova C i D će biti štampana naizmenično pet puta . Uočite da neće biti štampano C pet puta pa zatim D pet puta. Način na koji petlja radi je da se štampa C, zatim D, a zatim se vraćamo na početak petlje da ponovo štampamo C i D, i tako dalje, sve dok se petlja ne završi. Nakon što se petlja završi biće štampano slovo E.

Primer 4

Da smo želeli da gornji program štampa pet C slova, a zatim pet D slova, umesto da ih štampa naizmenično, mogli smo da uradimo sledeće:

print('A')
print('B')
for i in range(5):
    print('C')
for i in range(5):
    print('D')
print('E')

Varijabla for petlje

U for petlji jedan deo je posebno zanimljiv, a to je varijabla petlje. U primeru dole varijabla petlje je i. Izlaz iz ovog programa biće brojevi 0, 1, …, 99, svaki štampan u posebnoj liniji.

for i in range(100):
    print(i)

Kada se program startuje, Python postavlja varijablu i na 0. Svaki put kad se vratimo na početak petlje, Python poveća vrednost varijable i za 1. To se ponavlja 100 puta, a svaki put se vrednost varijable i poveća za 1, sve dok se petlja ne ponovi 100 puta. U tom trenutku varijabla i ima vrednost 99. Možda vam izgleda čudno što varijabla i počinje sa 0 umesto sa 1. U računarskim naukama postalo je praksa da brojanje uvek počinje sa nulom. Na to se treba privići, za šta će vam trebati malo prakse. Pošto se varijabla i , povećava za 1 svaki put kad se ponovi petlja, ona može biti iskorišćena da se prati gde se nalazimo u procesu izvršavanja for petlje. Razmotrimo sledeći primer:

for i in range(3):
    print(i+1, '-- Hello')

1 -- Hello
2 -- Hello
3 -- Hello

Naziv for varijable

Nema ničeg specijalnog u nazivu i za našu for varijablu. Donji programi će proizvesti potpuno isti rezultat.

for i in range(100):            for neko_ime in range(100):
    print(i)                        print(neko_ime)

Međutim, po nekakvoj nepisanoj konvenciji, za varijablu petlje se najčešće koriste slova i, j, i k , osim ako ne postoji dobar razlog da koristimo neki drugi naziv ( recimo kojim se bolje opisuje priroda varijable ).

Funkcija range

Vrednost koju stavimo u range funkciju određuje koliko će puta biti ponovljena petlja. Način na koji radi funkcija range je da ona proizvodi niz brojeva počev od nule pa do broja koji smo stavili u funkciju umanjenog za jedan. Tako, range(5) proizvodi niz: 0, 1, 2, 3, i 4.

Ako želimo listu brojeva koja počinje nekom drugom vrednošću, a ne 0, to možemo postići tako da tu početnu vrednost zadamo u funkciji. Naredba range(1,5) će proizvesti listu 1, 2, 3, 4. To nam pokazuje jednu specifičnost range funkcije—ona se zaustavlja za jedan manje nego što očekujemo. Ako smo želeli da lista sadrži brojeve od 1 do 5 ( uključujući 5), onda smo trebali da napišemo range(1,6).

Jedna druga mogućnost range funkcije je da se vrednosti u listi ne povećavaju za jedan. Da to postignemo dovoljno je da dodamo još jedan opcioni argument pri pozivu range faunkcije. Tako se naredbom (1,10,2) proizvodi lista 1, 3, 5, 7, 9.

Da dobijemo listu koja će ići unatrag, možemo koristiti treći argument ( korak ) sa negativnim predznakom, na primer -1. Tako će range(5,1,-1) proizvesti vrednosti 5, 4, 3, 2, tim redosledom. (Uočite da se range funkcija zaustavila pre završne vrednosti 1). Evo još nekoliko primera:

Naredba

Generisane vrednosti

range(10)

0,1,2,3,4,5,6,7,8,9

range(1,10)

1,2,3,4,5,6,7,8,9

range(3,7)

3,4,5,6

range(2,15,3)

2,5,8,11,14

range(9,2,-1)

9,8,7,6,5,4,3

Sledi primer programa koji broji unazad od 5 a zatim štampa neku poruku.

for i in range(5,0,-1):
    print(i, end=' ')
print('Uzlećemo!!')

5 4 3 2 1 Uzlećemo!!!

Opcija end=' ' čini da sve ostane u istoj liniji.

Malo složeniji primer

Posmatrajmo jedan problem u kojem ćemo iskoristiti varijablu petlje. Donji program štampa pravougaonik čija je visina 4 reda širina 6 kolona.

for i in range(4):
    print('*'*6)

Pravougaonik koji se proizvodi gornjim kodom je prikazan levo. Kod '*'*6 je konstrukcija o kojoj ćemo govoriti kasnije; pomoću nje se simbol zvezdice ponavlja 6 puta.

******                        *
******                        **
******                        ***
******                        ****

Pretpostavimo da želimo da napravimo trougao. To možemo da postignemo veoma jednostavnom promenom gornjeg programa. Umesto sto uvek štampamo 6 zvezdica u svakoj od četiri linije, mogli bi da umesto 6 štampamo i+1 zvezdica, imajući na umu da varijabla i uzima vrednosti 0, 1, 2 i 3. Dakle rešenje je u tome da u programu zamenimo 6 sa i+1. Svaki put kad ponovimo naredbu u petlji biće štampano i+1 zvezdica, umesto 6 zvezdica, jer varijabla petlje dobija redom vrednosti 0, 1, 2, i 3. Korišćenjem ove mogućnosti možemo da menjamo broj zvezdica u liniji. Evo programa koji štampa trougao:

for i in range(4):
    print('*'*(i+1))

Vežbe

2.1 Napišite program koji štampa vaše ime 100 puta.

2.2 Napišite program kojim se ceo ekran ( i horizontalno i vertikalno ) popunjava vašim imenom. [Uputstvo: dodajte opciju end=’ ‘ u print funkciji da popunite ekran horizontalno.]

2.3 Napišite program koji štampa 100 linija, sa brojevima od 1 do 100 na početku linije i vašim imenom u svakoj liniji. Izlaz treba da izgleda ovako:

1 Vaše ime
2 Vaše ime
3 Vaše ime
4 Vaše ime
...
100 Vaše ime

2.4 Napišite program koji štampa listu celih brojeva od 1 do 20 i njihove kvadrate. Izlaz treba da izgleda ovako:

1 --- 1
2 --- 4
3 --- 9
...
20 --- 400

2.5 Napišite program koji koristi for petlju da štampa brojeve 8, 11, 14, 17, 20, …, 83, 86, 89.

2.6 Napišite program koji koristi for petlju da štampa brojeve 100, 98, 96, …, 4, 2.

2.7 Napišite program koji koristi četiri for petlje da štampa dole prikazani niz slova.

AAAAAAAAAABBBBBBBCDCDCDCDEFFFFFFG

2.8 Napišite program koji traži od korisnika da unese svoje ime i koliko će puta ime biti štampano. Program treba da šatmpa korisnikovo ime uneti broj puta.

2.9 Fibonačijevi brojevi su brojni niz prikazan dole, kod kojeg su prva dva člana jednaka 1, a svaki sledeći je suma prethodna dva. Napišite program koji traži od korisnika koliko Fibonačijevih brojeva treba štampati, pa te brojeve i štampa.

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

2.10 Iskoristite for petlju da štampate pravougaonik kao onaj prikazan dole. Omogućite korisniku da specificira dužinu i širinu pravougaonika, tako što će te vrednosti uneti na početku programa. [Uputstvo: print('*'*10) štampa 10 zvezdica.]

*******************
*******************
*******************
*******************

2.11 Iskoristite for petlju da štampate pravougaonika kao onaj prikazan dole. Omogućite korisniku da specificira dužinu i širinu pravougaonika

*******************
*                 *
*                 *
*******************

2.12 Iskoristite for petlju da štampate trougao kao onaj prikazan dole. Omogućite korisniku da specificira visinu trougla.

*
**
***
****

2.13 Iskoristite for petlju da štampate trougao kao onaj prikazan dole. Omogućite korisniku da specificira visinu trougla.

****
***
**
*

2.14 Iskoristite for petlju da štampate dijamant kao onaj prikazan dole. Omogućite korisniku da specificira visinu dijamanta.

   *
  ***
 *****
*******
 *****
  ***
   *

2.15 Napišite program kojim se štampa gigantsko slovo A kao ono prikazano dole. Omogućite korisniku da specificira koliko će slovo biti veliko.

    *
   * *
  *****
 *     *
*       *