Sunteți pe pagina 1din 18

Capitolul 3.

Bucle si operatori decizionali


Pag.
3.1 Notiuni introductive. Procesul de decizie, indentarea, Boolean 02
3.1.1 Procesul de decizie 02
3.1.2 Indentarea 02
3.1.3 Boolean 03
3.2 Lucrul cu operatori decizionali 03
3.2.1 Lucrul cu if, elif, else 03
3.2.2 Operatori utilizati in conditii numerice 05
3.2.3 Conditionare multipla cu sau fara operatorii or si and 05
3.2.4 Despre logica conditiilor 08
3.2.5 Operatorii in, is, not 08
3.2.6 Luarea deciziilor. Una, doua sau mai multe optiuni 09
3.2.7 Operatori (functii) utile pentru compararea stringurilor 11

3.3 Bucle while si for 12


3.3.1 Buclele while 12
3.3.2 Clauzele pass, continue, break 15
3.3.3 Buclele for 16

3.4 Recapitulare 18
3.4.1 Recapitulare 18

1
3.1 Notiuni introductive. Procesul de decizie, indentarea, Boolean

3.1.1 Procesul de decizie

Asa cum spuneam in capitolul 1, calculatorul va face ceea ce vrem in masura in


care pasii de urmat sunt foarte clar definiti. In programare sunt multiple situatiile in
care pot aparea evenimente nedorite si/sau neprevazute, care de cele mai multe ori duc
la erori si la intreruperea functionarii programelor. Programatorul va cauta sa se asigure
ca stabileste pasi de urmat pentru cele mai multe dintre aceste evenimente. Printre
instrumentele cu care realizeaza acest lucru se numara si operatorii decizionali si
buclele.
Cu ajutorul operatorilor decizionali stabilim ramuri decizionale de urmat, in
functie de anumite conditii care trebuie indeplinite. Conditiile sunt enuntate cu ajutorul
operatorilor si al operanzilor.
Cu ajutorul buclelor realizam operatiuni repetitive, de rutina (aceleasi
instructiuni executate pentru seturi de date multiple).
Combinarea buclelor si a operatorilor decizionali este inevitabila si se constituie
in instrumente puternice de programare.

3.1.2 Indentarea

In python, blocurile de instructiuni sunt delimitate cu ajutorul indentarii.


Principalele instructiuni in care apar blocurile de instructiuni si implicit indentarea
sunt: instructiunile decizionale, buclele, functiile, metodele, clasele, etc.
Indentarea se realizeaza practic prin scrierea blocurilor de instructiuni imbricate
(nested blocks) in mod diferentiat fata de blocul principal. Diferentierea consta in
scrierea codului cu un numar de spatii mai la dreapta (in mod obisnuit 4 spatii sau un
tab).
Indentarea este foarte stricta in Python, fiind parte a sintaxei. Nerespectarea
regulilor de indentare va genera o eroare. Pentru a intelege cum functioneaza priviti
imaginea urmatoare:
Block 1 inceput
2
Block 2 - inceput
Block 3 inceput / sfarsit
Block 2 continuare / sfarsit
Block 1 continuare / sfarsit
Practic, terminarea unui bloc se face prin revenirea la blocul mai apropiat de
marginea din stanga. In exemplul dat, continuarea blocului 2 (revenirea la nivelul de
indentare corespunzator acestui bloc) coincide cu terminarea blocului 3. Similar,
revenirea la nivelul blocului 1 duce la terminarea blocului 2.

3.1.3 Boolean

In python avem doi operatori pentru Boolean. Acestia sunt: True si False. Cu
ajutorul acestora exprimam valoarea de adevar a unei expresii, True pentru adevarat,
False pentru fals. Acesti operatori pot fi utilizati in scrierea conditiilor in structurile
decizionale si in bucle.

3.2 Lucrul cu operatori decizionali

3.2.1 Lucrul cu if, elif, else

Sintaxa pentru operatorii decizionali if, elif, else este de forma:


if conditie 1 :
expresie 1 ( sau bloc de expresii)
elif conditie 2: # optional
expresie 2 ( sau bloc de expresii)]
...............
elif conditie n: # optional
expresie n ( sau bloc de expresii)]
else: # optional
expresie default ( sau bloc de expresii)]
3
Conditiile pot fi numerice, de tip Boolean sau compararea de siruri de caractere.
Conditiile vor fi testate de la 1 la n, dar pana la prima conditie adevarata. Vor fi
executate instructiunile corespunzatoare conditiei adevarate, urmatoarele conditii nu
vor mai fi testate.
Existenta uneia sau mai multor ramuri elif este optionala ca si a else. Practic, elif
stabileste o noua cale de urmat, iar else o clauza default pentru situatii in care niciuna
din conditii nu a fost indeplinita.
Dupa if conditie, elif conditie si respectiv else se va pute intotdeauna caracterul
: (colon). Conditiile vor fi scrise incepand cu randul urmator, indentate fata de
operator.
Putem avea mai multe blocuri if, elif, else imbricate si aici intervine din nou
indentarea, un nou bloc imbricat va fi indentat fata de precedentul.

if cu conditii de tip Boolean


Conditia in if poate fi unul din operatorii True, caz in care blocul de instructiuni
corespunzator va fi executat de fiecare data, conditia fiind considerata intotdeauna
adevarata. Similar cu False, caz in care nu va fi executat nimic, conditia fiind
considerata falsa.
if ( True ) : expresie4 # expresie4 va fi returnata de fiecare data
if ( False ): expresie5 # nu returneaza nimic de fiecare data

>>>if ( True ):
print ( 'Va fi listat intotdeauna' )
>>>if ( False ):
print ( 'Nu va fi listat niciodata')
Un comportament similar cu True il va avea if cu o constanta numerica
diferita de zero sau un sir de caractere diferit de empty string si respectiv similar cu
False in cazul zero si empty string.

4
3.2.2 Operatori utilizati in conditii numerice

Principalii operatori utilizati in conditiile numerice sunt urmatorii:


Operator Semnificatia Exemplu Rezultat
== Egal 7 == 7 True
!= Diferit 7 != 7 False
> Mai mare 7>7 False
>= Mai mare sau egal 7 >= 7 True
< Mai mic 7<7 False
<= Mai mic sau egal 7>7 True

Atentie la conditiile care testeaza egalitatea. Operatorul folosit este == .


Operatorul = este utilizat pentru atribuirea de valori variabilelor, deci au semnificatii
complet diferite.
>>>if x < 0 :
print ( 'Numar negativ' )
>>>elif x > 0:
print ( 'Numar pozitiv' )
>>>else:
print ( 'Zero' )

3.2.3 Conditionare multipla cu sau fara operatorii or si and

Conditii multiple separate. Fiecare conditie este de sine statatoare si va produce


un rezultat:
>>>if x % 2 == 0 : # x % 2 inseamna x modulo 2. Returneaza restul
impartirii la 2
print ( 'Divizibil cu 2' )
>>>if x % 5 == 0 :
print ('Divizibil cu 5' )
5
Conditii multiple imbricate. Conditiile sunt legate si doar daca ambele conditii
sunt adevarate se va executa blocul de instructiuni corespunzator:
>>>if x % 2 == 0 :
if x % 5 == 0 :
print ( 'Divizibil cu 10' )

6
Conditii multiple simultane (cu operatorul and). Conditiile sunt legate, dar in
loc de if-uri imbricate folosim operatorul and. Si de aceasta data, doar daca ambele
conditii sunt adevarate se va executa blocul de instructiuni corespunzator:
>>>if x % 2 == 0 and x % 5 == 0 :
print ( 'Divizibil cu 10' )

Conditii multiple simultane (cu operatorul or). Conditiile sunt legate, dar in loc
de if-uri imbricate folosim operatorul or. In acest caz, daca doar una dintre conditii este
adevarata se va executa blocul de instructiuni corespunzator:
>>>if x > 10 or x == 10 :
print ( 'Mai mare sau egal ca 10' )

7
3.2.4 Despre logica conditiilor

La scriearea conditiilor va trebui sa realizam o succesiune logica a acestora, mai


ales in structurile complexe cu mai multe ramuri, astfel incat sa nu existe conditii care
sa nu fie executate niciodata, dat fiind ca situatiile acestora sunt incluse in conditii
anterioare. Iata cateva exemple:

>>>if x < 0 :
print ( 'Numar negativ' )
>>>elif x >= 0:
print ( 'Numar pozitiv' )
>>>else:
print ( 'Zero' ) # aceasta nu se va intampla niciodata

>>>x = 10
>>>if x < 100 :
print ( 'Numar mic' )
>>>elif x >= 100 :
print ( 'Numar mediu' )
>>> elif x > 100000 :
print ( 'Numar mare' ) # aceasta nu se va intampla niciodata

3.2.5 Operatorii in, is, not

Operatorul in testeaza existenta unui subsir intr-un sir.


>>>if 'cord' in 'Concorde' :
print ( 'Adevarat' )

8
Negarea (operatorul not). Cu ajutorul acestui operator se inverseaza valoarea
de adevar:
>>>if not ( x % 2 != 0 and x % 5 != 0 ):
print ( 'Divizibil cu 10' )

Operatorul is. Cu ajutorul acestui operator se testeaza daca doua siruri ocupa
acelasi spatiu de memorie. Obtinem acelasi rezultat si cu egal (==).
>>>if 'sir1' is 'sir2':
print ( 'Egale' )
>>>id ('sir1') # returneaza adresa portiunii de memorie
ocupata

3.2.6 Luarea deciziilor. Una, doua sau mai multe optiuni

O singura optiune. Avem un singur if. Conditia indeplinita va duce la executarea


blocului de instructiuni.

9
Doua optiuni. Avem o ramura if si una else. Procesul este directionat pe una
dintre cele doua ramuri, in functie de conditie.

Decizii multiple. Sunt decizii cu mai multe ramuri, in care avem unul sau mai
multi elif.

In functie de situatia concreta putem utiliza oricare din aceste metode.


10
3.2.7 Operatori (functii) utile pentru compararea stringurilor

In compararea sirurilor de caractere putem utiliza cativa dintre operatorii


numerici (==, !=, >, <).

Putem, de asemenea, sa utilizam metodele specifice sirurilor de caractere, cum


ar fi:
>>>if '256987'.isdigit() :
print ( 'Contine doar cifre' )
>>>elif '256987'.isalpha() :
print ( 'Contine doar litere' )
In plus avem cateva functii specifice sirurilor de caractere, care pot fi utilizate la
scrierea conditiilor si anume:

Functia ord ( 'caracter' ). Returneaza numarul asociat unui caracter UNICODE


primit ca parametru.
>>>ord ( 'a' )
97
>>>ord ( '' )
1200
>>> if ord ( ' ' ) == 32 :
print ( 'Spatiu' )
Spatiu

Functia chr ( 'caracter' ). Returneaza caracterul UNICODE alocat numarului


primit ca parametru.
>>>chr ( 10 )
'\n'

11
>>>chr ( 120 )
'x'
>>> if chr ( 42 ) == '*' :
print ( 'Steluta' )
Steluta
Atentie, in Python 2.x ambele functii se aplica pentru caracterele ASCII.

Functia len ( 'sir de caractere' ). Returneaza numarul de caractere al sirului.


>>>len ( 'sir de caractere' )
16
>>>len ( 'Python' )
6
>>> if len ( 'InfoAcademy' ) >= 11 :
print ( 'InfoAcademy' )
InfoAcademy
In exemplele prezentate, in locul unui sir poate fi o variabila care contine un sir.

3.3 Bucle while si for

3.3.1 Bucle while

In programare intalnim destul de des situatii in care trebuie sa efectuam operatii


repetitive, cum ar fi, de exemplu ridicarea la putere a lui 2 pentru puteri intre 1 si 64.
Este destul de frustrant sa facem acest lucru cu 64 de instructiuni. Putem sa utilizam o
bucla si cu o conditie bine pusa efectuam toate calculele dintr-o singura instructiune.

12
Sintaxa pentru o bucla while este urmatoarea:
while (conditie) :
bloc de instructiuni

>>> x = 1
>>>while x <= 64 :
print ( 2 ** x )
x += 1
print ( 'Terminat' )

Bucla se executa pana cand conditia devine falsa. Observati ca am incerementat


valoarea lui x pentru a trece la urmatoarea iteratie. Daca nu am fi facut asta am fi avut
o bucla infinita care returna doar valoarea lui 2 la puterea 1. O bucla infinita este o
bucla in care conditia este indeplinita intotdeauna. O bucla infinita poate fi obtinuta
si inlocuind conditia cu (True). Instructiunile de la acelasi nivel de indentare cu while
se vor executa numai dupa ce se iese din bucla.
13
In exemplul urmator putem observa o bucla infinita:

In aceste exemplu am uitat sa decrementam valoarea lui x, astfel incat, la un


moment dat, x sa devina mai mic sau egal cu zero. Acelasi efect l-am fi obtinut si cu
while(True).

Un alt exemplu, prezentat mai jos, arata o bucla care nu se va executa niciodata.
Conditia este pusa de asa natura, incat este falsa de la inceput.

14
3.3.2 Clauzele pass, continue, break

Clauza break este utilizata pentru oprirea iteratiilor unei bucle. Clauza break va
fi cuprinsa intr-o instructiune if. Bucla oprita poate sa fie o bucla infinita sau o bucla
normala.

In acest caz, in mod normal, iteratiile ar fi fost de la x = 7 pana la x = 1. Prin


punera clauzei break iteratiile se opresc la x = 3.

Continue va relua bucla de la inceput.

15
Pass nu are niciun efect asupra unei bucle. Se poate utiliza atunci cand nu avem
un bloc de instructiuni de executat.

3.3.3 Buclele for

Sintaxa unei bucle for este urmatoarea:


for variabila in expresie :
bloc de instructiuni
variabila este generic si nu trebuie definita inainte de a utiliza for. In locul
cuvantului variabila putem utiliza orice denumire care respecta regulile de denumire
ale variabilelor. Aceasta variabila poate fi utilizata in instructiunile din blocul de
instructiuni.
expresie poate fi un sir de caractere sau alt tip de obiect iterabil (lista, tuplu,
dictionar).
Break, pass si continue pot fi utilizate si impreuna cu for.

16
Putem utiliza for si pentru a obtine diverse serii de numere:
Range simplu:
for var in range(nr) :
print (var) # printeaza numerele de la 0 la (nr 1)

>>> for var in range( 7 ) : # listeaza numerele de la 0 la 6


print (var)

Range cu pas:
for var in range(0, nr1, nr2) :
print (var) # printeaza numerele de la 0 la nr1 incrementand
nr2

>>> for var in range( 0, 25, 3 ) : # listeaza numerele de la 0 la 24, cu pas de 3


(0, 3, ..., 21, 24)
print (var) # 25 nu ar fi fost cuprins, chiar daca ar fi fost in pasul
dat

>>> for var in range( 2, 23, 7 ) : # returneaza 2, 9, 16


print (var)

Range cu pas negativ


for var in range(nr1, 0, nr3) :
print (var) # printeaza numerele de la nr1 la nr2 decrementand
nr3

>>> for var in range( 10, 0, -2 ) : # returneaza 10, 8, 6, 4, 2


print (var)

17
3.4 Recapitulare

3.4.1 Recapitulare

18