2.2. Proměnné a základní typy

Proměnná je jméno, které pomocí operátoru = svážete s hodnotou. Po přiřazení lze toto jméno použít všude tam, kde lze použít danou hodnotu:

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

Nejprve se vyhodnotí pravá strana =, a poté se výsledek sváže se jménem nalevo. Čtení jména, kterému nikdy nebyla přiřazena hodnota, vyvolá NameError.

Proměnná je jen štítek. Ukazuje na hodnotu – hodnota žije jinde a tatáž hodnota může mít libovolný počet štítků.

Tři štítky ukazující na tři zarámované hodnoty; přiřazením štítku znovu se posune šipka, nikoli hodnota.

Proměnné jsou štítky ukazující na hodnoty. Opětovné přiřazení proměnné posune štítek; nemění hodnotu, na kterou štítek dříve ukazoval.

2.2.1. Pravidla pojmenování

  • Jména začínají písmenem nebo podtržítkem a mohou obsahovat písmena, číslice a podtržítka. frame_count a _internal jsou v pořádku; 1st_frame je syntaktická chyba.

  • Na velikosti písmen ve jménech záleží: Width a width jsou dvě různé proměnné.

  • Vyhněte se opětovnému použití vestavěných jmen jako list, str, id() nebo print() – jejich zastínění nevyvolá chybu, ale původní vestavěné jméno se po zbytek skriptu stane nedostupným.

  • Konvence: snake_case pro proměnné a funkce, ALL_CAPS pro konstanty, které neplánujete měnit, CamelCase pro názvy tříd.

2.2.2. Základní typy

Každá hodnota v Pythonu má typ, který určuje, jaké operace podporuje. Čtyři typy, které budete psát nejčastěji, jsou:

  • int – celá čísla, kladná i záporná. Celá čísla v MicroPythonu rostou tak velká, jak dovolí paměť. Literály se zapisují jako prosté číslice: 0, 42, -7. Platné a užitečné pro registry a bitové masky jsou také hexadecimální (0x1A), osmičkové (0o17) a binární (0b1010) literály.

  • float – čísla s desetinnou čárkou nebo exponentem: 3.14, 1.0, -0.5, 2e6 (= 2 000 000,0). Všechny float hodnoty na kameře jsou 32bitové podle IEEE 754 – přesné zhruba na sedm platných číslic.

  • bool – jeden ze dvou literálů True nebo False (všimněte si velkých počátečních písmen).

  • str – text zapsaný jako znaky mezi jednoduchými nebo dvojitými uvozovkami: "hello", 'OpenMV'. Oba styly uvozovek jsou rovnocenné; zvolte ten, který vám umožní vyhnout se escapování uvozovek vyskytujících se uvnitř řetězce.

Existuje i pátá hodnota, kterou stojí za to znát hned:

  • None – jediná hodnota typu NoneType. Používá se ve významu „žádná hodnota“ nebo „dosud nenastaveno“. Funkce, které nic explicitně nevracejí, implicitně vracejí None.

2.2.3. Kontrola a převod typů

Vestavěná funkce type() vrací typ libovolné hodnoty:

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

Každý typ slouží zároveň jako převodní funkce. Předejte jí hodnotu jiného typu a dostanete zpět ekvivalentní hodnotu nového typu – pokud je převod jednoznačně definován:

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

Převody, které nejsou jednoznačně definovány, vyvolají 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. Opětovné přiřazení a dynamické typování

Jméno lze kdykoli znovu přiřadit hodnotě libovolného typu. Následující je přípustné:

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

Python nesvazuje proměnnou s typem. Kód, který závisí na tom, že x je celé číslo, jednoduše očekává celé číslo v místě, kde jej použije; pokud dostane něco jiného, dojde za běhu k chybě TypeError.

Poznámka

Opětovné přiřazení x nemění hodnotu, na kterou ukazovala stará vazba. Pokud dvě jména sdílejí tutéž hodnotu, opětovné přiřazení jednoho neovlivní druhé:

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

Mutace sdílené hodnoty je něco jiného: metoda jako list.append mění hodnotu, na kterou vazba ukazuje, takže každé další jméno ukazující na tutéž hodnotu změnu uvidí.