# 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.**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.girlsgoit.md/python/flow-control.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
