> For the complete documentation index, see [llms.txt](https://wiki.girlsgoit.md/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.girlsgoit.md/python/flow-control.md).

# Control Flow

La fel ca și în viața reală, uneori codul nostru trebuie să fie capabil să ia decizii.

Până acum, tot ce am scris împreună în *Python* putea să urmeze doar un singur fir logic: fie că am adunat două numere sau fie că am afișat ceva. Codul nostru, însă, nu putea lua decizii de sine-stătător în privința a ce instrucțiuni să execute în dependență de o careva condiție. Conceptul de **Control Flow** oferă posibilitate programului de a alege ce să facă.

Pentru a intra în esența conceptului de Control Flow, trebuie să definim câteva noțiuni importante.

{% hint style="success" %}
[Operatorii de comparație](/python/operatori.md#comparatoarele) au un rol major in conceptul de Control Flow.
{% endhint %}

## **Operațiile Boolean**

Operațiile `boolean` compară careva afirmații, rezultatul acestei comparații fiind o valoare `boolean`. Există trei operații de tip `boolean`:

### `and`

***And*** verifică dacă *ambele* afirmații sunt `True`.&#x20;

{% hint style="info" %}
*De exemplu:*&#x20;

Eu voi cumpăra pâine dacă:

1. Voi avea bani .

**ȘI (AND)** &#x20;

1. Dacă va fi pâine la magazin.
   {% endhint %}

### `or`

***Or*** verifică dacă *cel puțin* o afirmație este `True`.

{% hint style="info" %}
*De exemplu:*&#x20;

Eu voi fi fericit/fericită dacă:

1. Se termină pandemia.

&#x20;   **SAU (OR)** &#x20;

&#x20;  2\. Dacă mă vaccinez.
{% endhint %}

### `not`

Not este *opusul* afirmației.

{% hint style="info" %}
*De exemplu:*&#x20;

Eu voi sta acasă dacă:

&#x20;**NU (NOT)**  se deschide școala.
{% endhint %}

În acest context, aflați că:

```python
 - True  and True  este True;
 - True  and False este False;
 - False and True  este False;
 - False and False este False;

 - True  or True  este True;
 - True  or False este True;
 - False or True  este True;
 - False or False este False;

 - Not True  este False;
 - Not False este True.
```

Să mergem mai departe.

Să zicem că avem următoarea expresie *Python*: `1 < 2 and 2 < 3`.

Rezultatul acestei expresii va fi `True` sau `False`? Pentru a răspunde la această întrebare, să apelăm la tabelul de mai sus.

`1 < 2` este `True`. `2 < 3` este la fel `True`. `True and True` ce va fi? Corect! `True`!

Dar care vor fi rezultatele următoarelor expresii?

`1 < 2 and 2 > 3` (*False*)&#x20;

`1 < 2 or 2 > 3` (*True*)&#x20;

`1 > 2 or 2 > 3` (*False*)

`not False` (*True*)&#x20;

`not 41 > 40` (*False*)

{% hint style="warning" %}
Operațiile `boolean` nu sunt pur și simplu evaluate de la stânga la dreapta. La fel ca operațiile aritmetice, operațiile `boolean` au o ordine de execuție:

1. `not` este evaluat primul;
2. `and` este evaluat al doilea;
3. `or` este evaluat ultimul.
   {% endhint %}

De exemplu, `True or not False and False` returnează `True`. De ce?

`not` este evaluat primul, astfel noi avem `True or True and False`. Deoarece `and`-ul e următorul evaluat, avem `True or False`. Așa după cum am văzut mai sus, `True or False` este `True`, astfel valoarea finală este `True`!

## **Sintaxa condiționalelor**

Dacă tot am învățat mai devreme cum să comparăm datele între ele, acum putem să punem și condiții.

Condiția `if` este considerată cea mai simplă dintre cele trei și ia o decizie în funcție dacă condiția e adevărată sau nu. Dacă condiția este adevărată, imprimă expresia indentată. Dacă condiția este falsă, omite imprimarea expresiei indentate.&#x20;

```python
if 100 == 100:          # specificam conditia, si ne amintim sa punem ':'
    print("I'm happy!")   # toate instructiunile care urmeaza dupa ':'  
                        # trebuie sa fie indentate!!!
                        # daca conditia este adevarata, executam instructiunea
```

{% hint style="success" %}
&#x20;Este foarte important să **indentăm** corect codul când folosim conditionalul if.
{% endhint %}

In caz contrar vom obține eroarea de mai jos.

```python
# de ce avem eroare?
if 100 == 150:         
print("I'm happy!")
```

Dar ce înseamnă indentare?

{% hint style="info" %}
**Indentarea** se referă la spațiile de la începutul unei linii de cod.
{% endhint %}

În cazul în care în alte limbaje de programare indentarea în cod este doar pentru lizibilitate, indentarea în Python este foarte importantă.

Python folosește indentare pentru a indica un bloc de cod.

Pentru a deplasa o linie de cod spre dreapta la distanța cerută de Python, utilizăm tasta `tab`

![](/files/-Mj4jh2uYvdrP-Sz4NJf)

&#x20;Sa vedem care e structura **condiționalului if**

![](/files/-Mj4k22KcqjRuy1BsNv0)

{% hint style="success" %}
Când folosim `else`?

Când avem doar 2 opțiuni.
{% endhint %}

De exemplu vrem să ne logăm pe pagina noastră de Facebook și trebuie să ne introducem numele. În spatele acestei funcționalități se află un `if` care verifică dacă numele pe care l-am introdus se află în sistemul Facebook-ului sau nu.

```python
# Hai sa improvizam aici un astfel de algoritm
in_facebook_system_name = 'Anna'
my_name = 'Ana'

if my_name == in_facebook_system_name:
    print('Numele este corect')
else:
    print('Numele este gresit')
```

{% hint style="success" %}
Dar dacă avem mai mult de 2 opțiuni?

Atunci folosim `elif` care e de fapt este `else + if`.
{% endhint %}

```python
# vrem să știm cât de accesibil este prețul unei înghețate pentru bugetul nostru
ice_cream_price = 50
accessibility = ''

if ice_cream_price == 0:
    accessibility = 'Gratuit'
elif ice_cream_price <= 10:
    accessibility = 'Mediu'
else:
    accessibility = 'Scump'
 

print(accessibility) # observați că print() se află în afara if-ului
```

> **Some day, someone will construct a** [**list** ](/python/liste.md)**of 500 Great Programming Quotes, and this will be one of them.**
