post

Python ro:Controlul execuţiei

Contents

Introducere

În programele pe care le-am văzut până acum erau o serie de declaraţii şi Python le executa credincios în aceeaşi ordine. Dar dacă am fi vrut să schimbam fluxul sau modul lui de lucru? De exemplu, vreţi ca programul să ia nişte decizii şi să facă procesări diferite în diferite situaţii, precum a tipări ‘Bună ziua’ sau ‘Bună seara’ în funcţie de ora la care se execută programul?

Cum poate aţi ghicit, asta se poate face cu declaraţii de control al execuţiei. Există trei declaraţii de control al execuţiei în Python – if, for şi while.

Declaraţia if

Declaraţia if este folosită pentru a testa o condiţie şi, dacă aceasta este adevărată, să ruleze un bloc de declaraţii (numit ‘blocul if’), iar în caz contrar să ruleze alt bloc de declaraţii (blocul ‘else’). Clauza ‘else’ este optională.

Exemplu:

#!/usr/bin/python
# Fişier: if.py

număr = 23
ghici = int(input('Introduceţi un întreg: '))

if ghici == număr:
    print('Felicitări, aţi ghicit,') # Noul bloc începe aici
    print('(dar nu câştigaţi niciun premiu!)') # Noul bloc se încheie aici

elif ghici < număr:
    print('Nu, e un pic mai mare.') # Alt bloc
    # Poti face ce vrei într-un bloc ...
else:
    print('Nu, e un pic mai mic.')
    # Ca să ajungeţi aici e sigur ca ghici > număr

print('Gata')
# Aceasta ultimă declaraţie este executată întotdeauna, după declaraţia if

Rezultat:

   $ python if.py
   Introduceţi un întreg: 50
   Nu, e un pic mai mic.
   Gata

   $ python if.py
   Introduceţi un întreg: 22
   Nu, e un pic mai mare.
   Gata

   $ python if.py
   Introduceţi un întreg: 23
   Felicitări, aţi ghicit,
   dar nu câştigaţi niciun premiu!
   Gata

Cum funcţionează:

În acest program preluăm de la utilizator încercări de a ghici numărul şi verificăm dacă este numărul memorat. Setăm variabila număr la ce valoare vrem, să zicem 23. Apoi preluăm numărul încercat de utilizator folosind funcţia input(). Funcţiile sunt nişte porţiuni de program reutilizabile. Vom afla mai multe despre ele în capitolul următor.

Furnizăm un şir funcţiei implicite input() care îl tipăreşte pe ecran şi aşteaptă introducerea de informaţie de la utilizator. Îndată ce introducem ceva (ENTER – rom. a intra/introduce) şi apăsăm tasta ENTER, funcţia input() dă ca rezultat ceea ce am introdus, sub formă de şir. Convertim acest şir întrun întreg folosind declaraţia int şi stocăm valoarea în variabila ghici. De fapt int este o clasă, dar ce trebuie să ştiţi în acest moment este că îl folosiţi pentru a converti un şir într-un întreg (presupunând că şirul conţine un întreg valid în text).

În continuare comparăm alegerea utilizatorului cu numărul stabilit de noi. Dacă acestea sunt egale, tipărim un mesaj de succes. Observaţi că folosim nivele de indentare pentru a-i spune Pythonului cărui bloc aparţine fiecare declaraţie. Iată de ce este indentarea atat de importantă în Python. Sper că v-aţi ataşat de regula indentării consistente. Este aşa?

Observaţi cum declaraţia if conţine semnul două puncte la sfârşit – aşa îi spunem Pythonului că urmează un bloc de declaraţii.

Mai departe, testăm dacă numărul furnizat de utilizator este mai mic decât numărul şi, dacă este aşa, informăm utilizatorul că trebuie să ţintească mai sus de atât. Ce am folosit aici este clauza elif care de fapt combină două declaraţii if else-if else într-o singură declaraţie if-elif-else. Asta face programul mai uşor şi reduce numărul de indentări necesar.

Şi clauzele elif şi else trebuie să aibă la sfârşitul liniei logice semnul două puncte după care poate urma blocul lor de declaraţii (cu indentarea adecvată, desigur).

Puteţi pune o altă declaraţie if în interiorul blocului ‘if’ al declaraţiei if s.a.m.d. – în acest caz declaraţiile if se numesc imbricate (engl. nested).

Clauzele elif şi else sunt opţionale. O declaraţie if minimală este:

if True:
    print('Da, e adevarat.')

După ce Python a terminat execuţia întregii declaraţii if inclusiv clauzele elif şi else, el trece la următoarea declaraţie din blocul care conţine declaraţia if. În acest caz este vorba de blocul main (rom. principal), unde începe întotdeauna execuţia programului, iar instrucţiunea următoare este declaraţia print('Gata'). După aceasta, Python vede sfârşitul programului şi încheie.

Deşi acesta este un program foarte simplu, am indicat o mulţime de lucruri care trebuie observate. Toate acestea sunt destul de directe (şi simple pentru cei care au cunoştinţe de C/C++) şi iniţial necesită să deveniţi constienţi de ele, dar apoi vor deveni uzuale şi vă vor părea ‘naturale’.

Notă pentru programatorii în C/C++
Nu există declaraţia switch în Python. Puteţi utiliza declaraţia if..elif..else pentru a face acelaşi lucru (şi în unele cazuri, puteţi folosi o structură de date pentru a rezolva repede).

Declaraţia while

Declaraţia while ne permite să executăm repetat un bloc de declaraţii atât timp cât o condiţie rămâne adevărată. O declaraţie while este un exemplu de instrucţiune de ciclare. Poate avea şi clauza else.

Exemplu:

#!/usr/bin/python
# Fişier: while.py

număr = 23
ciclu = True

while ciclu:
    ghici = int(input('Introduceţi un întreg: '))

    if ghici == număr:
        print('Felicitări, aţi ghicit!')
        ciclu = False # asta face ciclul să se întrerupă
    elif ghici < număr:
        print('Nu, este puţin mai mare.')
    else:
        print('Nu, este puţin mai mic..')
else:
    print('Bucla s-a încheiat.')
    # Aici puteţi face ce prelucrări vreţi

print('Gata')

Rezultat:

   $ python while.py
   Introduceţi un întreg: 50
   Nu, este puţin mai mic.
   Introduceţi un întreg: 22
   Nu, este puţin mai mare
   Introduceţi un întreg: 23
   Felicitări, aţi ghicit.
   Bucla s-a încheiat.
   Gata

Cum funcţionează:

În acest program jucăm tot jocul cu ghicirea numărului, dar avantajul este ca utilizatorul poate continua încercările până când ghiceşte – nu trebuie să ruleze programul de fiecare dată, cum am facut în programul precedent. Ceea ce este chiar o demostraţie de declaraţie while.

Deplasăm declaraţiile input şi if în interiorul buclei while şi iniţializăm variabila ciclu cu True înaintea buclei. La început testăm dacă variabila ciclu este True şi apoi continuăm cu executarea blocului while. După ce blocul a fost executat, condiţia este evaluată din nou şi, în acest caz, condiţia este variabila ciclu. Dacă este True, executăm blocul while din nou, altfel verificăm dacă există o clauză else ca s-o executăm.

Blocul else este executat atunci cand condiţia de ciclare devine False – asta poate fi chiar şi prima dată când se testează condiţia. Dacă exista un bloc else la bucla while, ea va fi întotdeauna executată, dacă nu se iese forţat din buclă cu o declaraţie break.

Valorile True şi False sunt numite booleene şi pot fi considerate a fi echivalente cu valorile 1 şi respectiv 0.

Notă pentru programatorii în C/C++
Reţineţi că poate exista o clauză else la bucla while.

Bucla for

Declaraţia for..in este o declaraţie de ciclare care iterează elementele unei secvenţe de obiecte. Vom afla mai multe despre secvenţe în capitolele următoare. Ce trebuie ştiut acum este că o secvenţă este pur şi simplu o colecţie ordonată de elemente.
Exemplu:

#!/usr/bin/python
# Fişier: for.py

for i in range(1, 5):
    print(i)
else:
    print('Bucla s-a terminat')

Rezultat:

   $ python for.py
   1
   2
   3
   4
   Bucla s-a terminat

Cum funcţionează:

În acest program, tipărim o secvenţă de numere. Generăm secvenţa cu ajutorul funcţiei predefinite range.

Noi dăm funcţiei range două numere şi ea ne dă secvenţa de numere începând cu primul număr şi până la cel de-al doilea. De exemplu, range(1,5) înseamnă secvenţa [1, 2, 3, 4]. Implicit, range are pasul 1. Dacă îi dăm şi un al treilea număr, range acela devine pasul secvenţei. De exemplu range(1,5,2)[1,3]. Reţineţi că gama de numere (engl. range) se extinde până la al doilea număr, dar nu’ îl şi include.

Aşadar bucla for iterează peste acesta gamă – for i in range(1,5) este echivalent cu for i in [1, 2, 3, 4] ceea ce este ca şi cum s-ar atribui fiecare obiect din secvenţă lui i, pe rând, şi executarea blocului de declaraţii pentru fiecare valoare a lui i. În acest caz, nu facem altceva decât să tipărim valoarea obiectului.

Amintiţi-vă că clauza else este opţională. Când este inclusă, este executată întotdeauna o dată, după încheierea buclei for, cu excepţia cazului în care se întâlneşte o declaraţie break.

De reţinut că bucla for..in funcţionează pentru orice secvenţă. În acest caz avem doar o listă de numere, generată cu funcţia predefinită range, dar în general, putem folosi orice fel de secvenţă de orice fel de obiecte.

Notă pentru programatorii în C/C++/Java/C#
În Python bucla for este radical diferită de bucla for din C/C++. Programatorii C# vor reţine că bucla for din Python este similară cu bucla foreach din C#. Programatorii Java să observe că acelaşi lucru este similar cu for (int i: IntArray) în Java 1.5.
În C/C++, dacă vrei să scrii for (int i = 0; i < 5; i++), atunci în Python scrii doar for i in range(0,5). Aşa cum vedeţi, în Python bucla for este mai simplă, mai expresivă şi mai puţin predispusă la erori.

Declaraţia break

Declaraţia break este folosită pentru a întrerupe (engl. break) executarea unei declaraţii de ciclare, chiar şi dacă condiţia testată nu a devenit încă False sau secvenţa nu a fost parcursă complet.

O notă importantă este că dacă se întrerupe o bucla for sau while, nici clauza else nu va fi executată.

Exemplu:

#!/usr/bin/python
# Fişier: break.py

while True:
    s = (input('Introduceţi ceva:'))
    if s == 'quit':
        break
    print('Lungimea şirului introdus este', len(s))
print('Gata')

Rezultat:

   $ python break.py
   Introduceţi ceva: Programarea e mişto
   Lungimea şirului introdus este 15
   Introduceţi ceva: Când treaba e facută
   Lungimea şirului introdus este 20
   Introduceţi ceva: Dacă vrei să te şi distrezi:
   Lungimea şirului introdus este 27
   Introduceţi ceva:       foloseşte Python!
   Lungimea şirului introdus este 17
   Introduceţi ceva: quit
   Gata

Cum funcţionează:

În acest program, preluăm datele de intrare în mod repetat de la utilizator şi tipărim lungimea fiecărui şir introdus. Prevedem şi o condiţie specială pentru oprirea programului, prin căutarea cuvântului 'quit'. Oprim programul prin întreruperea buclei şi ajungerea la sfârşitul blocului de declaraţii.

Lungimea şirului de intrare poate fi găsită folosind funcţia predefinită len.

Reţineţi că declaraţia break poate fi folosită şi cu declaraţia for.

Poezia lui Swaroop despre Python

Ce am folosit aici drept intrare (de la utilizator) este un mini poem scris de mine, numit Swaroop’s Poetic Python (în limba engleză):

   Programming is fun
   When the work is done
   if you wanna make your work also fun:
       use Python!

Declaraţia continue

Declaraţia continue se foloseşte pentru a spune lui Python să treacă la următoarea iteraţie fără să execute instrucţiunile rămase din blocul declaraţiei de ciclare.

Exemplu:

#!/usr/bin/python
# Fişier: continue.py

while True:
    s = input('Introduceţi ceva: ')
    if s == 'quit':
        break
    if len(s) < 3:
        print('Prea puţin')
        continue
    print('Şirul introdus are lungime suficientă')
    # Faceţi alte procesări aici...

Rezultat:

   $ python test.py
   Introduceţi ceva: a
   Prea puţin
   Introduceţi ceva: 12
   Prea puţin
   Introduceţi ceva: abc
   Şirul introdus are lungime suficientă
   Introduceţi ceva: quit

Cum funcţionează:

În acest program acceptăm date de la utilizator, dar le procesăm doar dacă au cel puţin 3 caractere lungime. Aşadar, folosim funcţia len pentru a obţine lungimea şi, dacă aceasta este mai mică decât 3, sărim peste ce a mai rămas din iteraţia curentă folosind declaraţia continue. În caz contrar, restul declaraţiilor din buclă sunt executate şi putem să facem orice fel de procesare în zona unde este acel comentariu.

Retineţi că declaraţia continue funcţionează şi cu bucla for.

Rezumat

Am văzut cum se folosesc cele trei instrucţiuni de control al execuţiei – if, while şi for împreună cu asociatele lor, declaraţiile break şi continue. Acestea sunt unele dintre cele mai utilizate părţi din Python şi de aceea este esenţial să te obişnuieşti cu ele.

În continuare vom învăţa să construim şi să folosim funcţii.