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.

Trei etichete care indică trei valori încadrate; reatribuirea unei etichete mută săgeata, nu valoarea.

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.