2.2. Variabile și tipuri de bază#

O variabilă este un nume pe care îl legi de o valoare cu operatorul =. După atribuire, numele poate fi folosit oriunde poate fi folosită valoarea:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

Partea dreaptă a lui = este evaluată prima, apoi rezultatul este legat de numele din stânga. Citirea unui nume care nu a fost niciodată atribuit ridică NameError.

O variabilă este doar o etichetă. Ea indică o valoare – valoarea se află în altă parte, iar aceeași valoare poate avea oricâte etichete.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

Variabilele sunt etichete care indică valori. Reatribuirea unei variabile mută eticheta; nu schimbă valoarea pe care eticheta o indica anterior.#

2.2.1. Reguli de denumire#

  • Numele încep cu o literă sau cu o liniuță de subliniere și pot conține litere, cifre și liniuțe de subliniere. frame_count și _internal sunt în regulă; 1st_frame este o eroare de sintaxă.

  • Numele sunt sensibile la majuscule: Width și width sunt două variabile diferite.

  • Evită reutilizarea numelor încorporate precum list, str, id() sau print() – mascarea lor nu ridică o eroare, dar funcția încorporată originală devine inaccesibilă pentru restul scriptului.

  • Convenție: snake_case pentru variabile și funcții, ALL_CAPS pentru constantele pe care nu intenționezi să le modifici, CamelCase pentru numele de clase.

2.2.2. Tipuri de bază#

Fiecare valoare din Python are un tip care determină ce operații acceptă. Cele patru tipuri pe care le vei scrie cel mai des sunt:

  • int – numere întregi, pozitive sau negative. Numerele întregi din MicroPython cresc atât de mari cât permite memoria. Literalii se scriu ca simple cifre: 0, 42, -7. Literalii hexazecimali (0x1A), octali (0o17) și binari (0b1010) sunt, de asemenea, valizi și utili pentru registre și măști de biți.

  • float – numere cu virgulă zecimală sau cu un exponent: 3.14, 1.0, -0.5, 2e6 (= 2.000.000,0). Toate numerele în virgulă mobilă de pe cameră sunt IEEE 754 pe 32 de biți – precise până la aproximativ șapte cifre semnificative.

  • bool – unul dintre cei doi literali True sau False (atenție la majuscule).

  • str – text, scris ca o serie de caractere între ghilimele simple sau duble: "hello", 'OpenMV'. Ambele stiluri de ghilimele sunt echivalente; alege-l pe cel care îți permite să eviți escaparea caracterelor de ghilimele care apar în interiorul șirului.

Mai există și o a cincea valoare pe care merită să o cunoști imediat:

  • None – singura valoare de tip NoneType. Folosită pentru a însemna „nicio valoare” sau „neatribuită încă”. Funcțiile care nu returnează explicit nimic returnează implicit None.

2.2.3. Verificarea și conversia tipurilor#

Funcția încorporată type() returnează tipul oricărei valori:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

Fiecare tip funcționează și ca funcție de conversie. Dă-i o valoare de un alt tip și primești înapoi valoarea echivalentă de noul tip – atunci când conversia este bine definită:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

Conversiile care nu sunt bine definite ridică ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. Reatribuire și tipare dinamică#

Un nume poate fi reatribuit unei valori de orice tip în orice moment. Următorul cod este valid:

x = 42
x = "now I'm a string"
x = 3.14

Python nu leagă o variabilă de un tip. Codul care depinde de faptul că x este un număr întreg pur și simplu așteaptă un număr întreg în punctul în care îl folosește; dacă primește altceva, obții o TypeError la execuție.

Notă

Reatribuirea lui x nu schimbă valoarea pe care o indica vechea legătură. Dacă două nume împart aceeași valoare, reatribuirea unuia nu îl afectează pe celălalt:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

Modificarea unei valori partajate este diferită: o metodă precum list.append schimbă valoarea pe care o indică legătura, astfel încât orice alt nume care indică aceeași valoare vede modificarea.