Naredba break

8.4 Naredba break

Problem: Upomoć! Zaglavio sam se u WC-u! Vidi:
>>> while True: 
...     print('Ne uznemiravaj!\nU WC-u sam!') 
......
......
Ne uznemiravaj! 
U WC-u sam! 
Ne uznemiravaj! 
U WC-u sam! 
Ne uznemiravaj! 
U WC-u sam! 
Ne uznemiravaj! 
U WC-u sam! 
Ne uznemiravaj! 
U WC-u sam! 
Ne uznemiravaj! 
U WC-u sam! 
.....
.....
Rešenje: Nemoj da ideš u WC koji nema kvaku na vratima! Ovo je sasvim normalna pojava, šta više, ukoliko si pojeo nešto pokvareno je i poželjna, zato se navikni se na nju.
Ma šta ti to pričaš!?!
Pa, ako pokvariš stomak.... Ma, nije bitno.... Bitno je da da shvatiš da pre nego što si osmislio petlju u koju si „gurnuo“ program si trebao i da osmisliš, kako iz te petlje da izađeš! Tvoj primer je pravi primer beskonačne petlje – koja se može prekinuti samo „nasilno“ - prekidom izvršavanja programa!
Pa, budući da sam ti već rekao da su beskonačne petlje u mnogim slučajevima (kada ti, kao programer, ne možeš biti siguran koliko će određena operacija da traje), mora postojati nešto unutar te petlje što bi je prekinulo. I postoji, i to je naredba break. 
Naredba break se koristi da bi se prekinulo izvršavanje neke petlje, tj. ova komanda momentalno zaustavlja izvršavanje bloka naredbi neke petlje, čak i ako uslov izvršavanja petlje nije postao False ili nije završen prolazak kroz sekvencu. Drugim rečima, ukoliko Python u bloku naredbi neke while petlje naleti na komandu break, on automatski „iskače“ iz tog bloka, takođe i ako Python naleti na komandu break negde unutar bloka naredbi u for … in …. opet će „iskočiti“ iz tog bloka, bez obzira što je ostalo još nekih objekata u sekvenci, kroz koje promenljiva nije „prošla“.
Evo primera:
 >>> for i in 'Ovo je rad.\n Ovo je lenjost': 
...     if i == '.': 
...             print('Koji konjina je stavio tačku usred rečenice?') 
...             break 
...     elif i == 'O' or i == 'o' or i == 'a' or i == 'e': 
...             print(i, 'je samoglasnik.') 
...     else: 
...             print(i, 'je suglasnik.') 
... 
O je samoglasnik. 
v je suglasnik. 
o je samoglasnik. 
  je suglasnik. 
j je suglasnik. 
e je samoglasnik. 
  je suglasnik. 
r je suglasnik. 
a je samoglasnik. 
d je suglasnik. 
Koji konjina je stavio tačku usred rečenice? 
>>> 
Kao što vidiš, Python nije završio petlju, već je pobegao iz nje...
Važno je da ti napomenem da ako se for ili while petlje prekidaju sa komandom break, ukoliko smo petlji napisali i odgovarajuć else-blok, on se NEĆE izvršiti.
Evo primera:
>>> for i in 'Molimo putnike da ne iskaču iz aviona.': 
...     print(i) 
... else: 
...     print('Al opet to rade.') 
... 
M 
o 
l 
i 
m 
o 
 
p 
u 
t 
n 
i 
k 
e 
 
d 
a 
 
n 
e 
 
i 
s 
k 
a 
č 
u 
 
i 
z 
 
a 
v 
i 
o 
n 
a 
. 
Al opet to rade. 
>>> 
Ukoliko brejkujemo:
>>> for i in 'Molimo putnike da ne iskaču iz aviona.': 
...     if i == ' ': 
...             break 
...     else: 
...             print(i) 
... else: 
...     print('Al opet to rade.') 
... 
M 
o 
l 
i 
m 
o 
>>> 
Eto, vidiš... else blok se nije izvršio – kao da nije ni postojao!
I, za tebe, imam još jednu napomenu:
>>> for i in 'Molimo putnike da ne iskaču iz aviona.': 
...     if i == ' ': 
...             break 
...             print('Nešto.') 
...     else: 
...             print(i) 
... else: 
...     print('Al opet to rade.') 
... 
M 
o 
l 
i 
m 
o 
>>> 
Možda si se u ovom primeru zapitao zašto Python nije uradio print('Nešto.')? Pa, po definiciji naredbe break, Python kad je vidi, momentalno iskače iz petlje, a ova naredba koja treba da prikaže nešto na ekranu se nalazi posle naredbe break – drugim rečima Python nikada neće moći da dođe do nje! Dešava se i najboljima da slučajno previde takve situacije, pa čak i da isprogramiraju cele blokove naredbi koje se – nikada neće izvršiti. Takve naredbe se obično nazivaju „mrtav kod“, u suštini, Pythona baš briga, možeš ga imati koliko hoćeš, ali za čoveka koji čita tvoj program to može biti zbunjujuće. A sem toga, program će ti biti i nepotrebno duži. Prosto rečeno – izbegavaj da pišeš delove programa koji se nikada neće i ne mogu izvršavati, jer ih sam Python ne može videti, niti doći do njih!
Ajde sad da napišemo program (mrzi me da otvaram tekst editor, može i u interaktivnom promptu, ukoliko se ne buniš?) u kojem pitamo korisnika da ukuca nešto, a zatim mu prikažemo dužinu ukucanog stringa. Ideja je da podesimo i poseban uslov za zaustavljanje programa, tako što bi korisnik jednostavno ukucao reč 'izlaz'. Sada je to jednostavno! Mi zaustavljamo program sa break komandom koja će program "izbaciti" iz petlje. 
Problem koji imamo je određivanje dužine nečega. Mi možemo to da postignemo možda na ovaj način?
>>> b = 0 
>>> for i in 'rečenica': 
...     b += 1 
... 
>>> print(b) 
8 
>>> 
Mi jednostavno kreiramo neku promenljivu (koja se naziva i brojač, i veoma je česta, na primer u programiranju video igrica za čuvanje rezultata) i prilikom svakog prolaza kroz nešto ovu promenljivu uvećavamo za broj 1. Ali, ima li svrhe na ovako jednostavnom primeru koristiti ovakvo rešenje? Odgovor je – nema!
Python ima u sebi ugrađenu funkciju koja nam može dati dužinu neke sekvence. Ta funkcija je len(). Evo primera:
>>> len("Mišin lukac") 
11
>>> len('ja') 
2 
>>> a = 1, 2, 3 
>>> len(a) 
3 
>>> 
Eto... U len() funkciju jednostavno prosledimo neku sekvencu, i ona nam momentalno vraća broj stavki u njoj.
Sada sve znamo što nam je korisno za konstrukciju ovog programa.
>>> while True: 
...     print('Unesi željeni string.') 
...     print('(Unesi izlaz za izlaz iz programa.)') 
...     s = input('>>> ') 
...     if s == 'izlaz': 
...             print('\nHvala i doviđenja!') 
...             break 
...     else: 
...             print('Dužina stringa je', len(s)) 
... 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> Ja sam majmun. 
Dužina stringa je 14 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> Ja sam konj. 
Dužina stringa je 12 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> rep 
Dužina stringa je 3 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> griva 
Dužina stringa je 5 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> izlaz 

Hvala i doviđenja! 
>>> 
Hehe... U ovom programu sam uradio jedan „trik“. Podesio sam da moj „prompt“ (ono što program prikazuje kada pita nešto korisnika – znači ono u input() funkciji) da izgleda isto kao i Python prompt! Čisto da te malo zbuni, jer sada ne znaš kada je program gotov, zar ne? U stvari, tačno znaš – program je gotov onoga trena kada ukucaš reč izlaz! U suprotnom:
>>> while True: 
...     print('Unesi željeni string.') 
...     print('(Unesi izlaz za izlaz iz programa.)') 
...     s = input('>>> ') 
...     if s == 'izlaz': 
...             print('\nHvala i doviđenja!') 
...             break 
...     else: 
...             print('Dužina stringa je', len(s)) 
... 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> print('Čamim čekajući.') 
Dužina stringa je 24 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> break 
Dužina stringa je 5 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> Ajd izađi molim te.... 
Dužina stringa je 22 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> Opet sam se zaglavio u WC-u? 
Dužina stringa je 28 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> Ili nisam? 
Dužina stringa je 10 
Unesi željeni string. 
(Unesi izlaz za izlaz iz programa.) 
>>> izlaz 

Hvala i doviđenja! 
>>> 
Zbunjujuće? I treba da bude... Pokušaj za domaći da napraviš skriptu koja ovo radi. Tada ćeš shvatiti gde je ono što te „zabunjuje“, a nama je vreme da krenemo dalje....

8.3 for petlja Indeks 8.5 continue naredba

Коментари

Popularno

Tehnički problemi (i ostala tehnička čudesa) u najavi (i u bliskoj istoriji)

Izvršavanje Python programa

Instalacija uz pomoć WUBI-ja

Vredela si svakoga stiha

Python tutorijal - indeks postova

Izbor uređivača teksta (Editora)

Kreiranje izvorne datoteke

Sistem te laže?!? (prvi deo - pitanja)

Prevelika očekivanja

Kako blokirati neželjene oglase koje AdSense pokazuje na Vašoj web lokaciji