2.2. Változók és alaptípusok

A változó egy név, amelyet a = operátorral kötsz egy értékhez. Az értékadás után a név bárhol használható, ahol az érték is:

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

A = jobb oldala értékelődik ki először, majd az eredmény a bal oldali névhez kötődik. Egy soha nem értékadott név olvasása NameError hibát vált ki.

A változó csak egy címke. Egy értékre mutat – az érték máshol él, és ugyanannak az értéknek tetszőleges számú címkéje lehet.

Három címke, amely három dobozolt értékre mutat; egy címke újraértékadása az nyilat mozgatja, nem az értéket.

A változók értékekre mutató címkék. Egy változó újraértékadása a címkét mozgatja; nem változtatja meg azt az értéket, amelyre a címke korábban mutatott.

2.2.1. Elnevezési szabályok

  • A nevek betűvel vagy aláhúzással kezdődnek, és tartalmazhatnak betűket, számjegyeket és aláhúzásokat. A frame_count és az _internal rendben van; az 1st_frame szintaktikai hiba.

  • A nevek megkülönböztetik a kis- és nagybetűket: a Width és a width két különböző változó.

  • Kerüld a beépített nevek, mint a list, str, id() vagy print() újrahasználatát – ezek elfedése nem vált ki hibát, de az eredeti beépített elem elérhetetlenné válik a szkript hátralévő részében.

  • Konvenció: snake_case a változókhoz és függvényekhez, ALL_CAPS azokhoz a konstansokhoz, amelyeket nem áll szándékodban megváltoztatni, CamelCase az osztálynevekhez.

2.2.2. Alaptípusok

A Pythonban minden értéknek van egy típusa, amely meghatározza, milyen műveleteket támogat. Az a négy típus, amelyet a legtöbbet fogsz írni:

  • int – egész számok, pozitívak vagy negatívak. A MicroPython egész számai akkorára nőhetnek, amekkorát a memória megenged. A literálokat egyszerű számjegyekként írjuk: 0, 42, -7. A hexadecimális (0x1A), oktális (0o17) és bináris (0b1010) literálok szintén érvényesek, és hasznosak regiszterekhez és bitmaszkokhoz.

  • float – tizedesponttal vagy kitevővel rendelkező számok: 3.14, 1.0, -0.5, 2e6 (= 2 000 000.0). A kamerán minden lebegőpontos szám IEEE 754 32 bites – körülbelül hét értékes jegyig pontos.

  • bool – a két literál egyike: True vagy False (figyeld a nagybetűsítést).

  • str – szöveg, egyszeres vagy kétszeres idézőjelek közé írt karakterek: "hello", 'OpenMV'. A két idézőjelstílus egyenértékű; azt válaszd, amelyik lehetővé teszi, hogy elkerüld a sztringen belül megjelenő idézőjel-karakterek escape-elését.

Van még egy ötödik érték is, amelyet érdemes azonnal megismerni:

  • None – a NoneType típus egyetlen értéke. A „nincs érték” vagy a „még nincs beállítva” jelentésére használjuk. Azok a függvények, amelyek nem adnak vissza kifejezetten semmit, implicit módon None értéket adnak vissza.

2.2.3. Típusok ellenőrzése és konvertálása

A beépített type() függvény bármely érték típusát visszaadja:

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

Minden típus konvertáló függvényként is szolgál. Adj át neki egy másik típusú értéket, és visszakapod az új típus megfelelő értékét – ha a konverzió jól definiált:

>>> 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)

A nem jól definiált konverziók ValueError hibát váltanak ki:

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

2.2.4. Újraértékadás és dinamikus típusosság

Egy név bármikor újraértékadható tetszőleges típusú értékre. A következő érvényes:

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

A Python nem köti egy változót egy típushoz. Az a kód, amely arra támaszkodik, hogy az x egy egész szám, egyszerűen egy egész számot vár azon a ponton, ahol használja; ha valami mást kap, futásidejű TypeError hibát kapsz.

Megjegyzés

Az x újraértékadása nem változtatja meg azt az értéket, amelyre a régi kötés mutatott. Ha két név ugyanazt az értéket osztja meg, az egyik újraértékadása nem érinti a másikat:

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

Egy megosztott érték módosítása más: egy olyan metódus, mint a list.append, megváltoztatja azt az értéket, amelyre a kötés mutat, így minden más, ugyanarra az értékre mutató név látja a változást.