2.2. Varijable i osnovni tipovi

Varijabla je ime koje vežete uz vrijednost operatorom =. Nakon dodjele, ime se može koristiti svugdje gdje se može koristiti i vrijednost:

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

Desna strana znaka = se prvo vrednuje, a zatim se rezultat veže uz ime s lijeve strane. Čitanje imena koje nikad nije bilo dodijeljeno podiže NameError.

Varijabla je samo oznaka. Ona pokazuje na vrijednost – vrijednost živi negdje drugdje, a ista vrijednost može imati bilo koji broj oznaka.

Tri oznake pokazuju na tri uokvirene vrijednosti; ponovna dodjela oznake pomiče strelicu, a ne vrijednost.

Varijable su oznake koje pokazuju na vrijednosti. Ponovna dodjela varijable pomiče oznaku; ona ne mijenja vrijednost na koju je oznaka prije pokazivala.

2.2.1. Pravila imenovanja

  • Imena započinju slovom ili podvlakom i mogu sadržavati slova, znamenke i podvlake. frame_count i _internal su u redu; 1st_frame je sintaksna pogreška.

  • Imena razlikuju velika i mala slova: Width i width su dvije različite varijable.

  • Izbjegavajte ponovno korištenje ugrađenih imena poput list, str, id() ili print() – njihovo zasjenjivanje ne podiže pogrešku, ali izvorni ugrađeni element postaje nedostupan do kraja skripte.

  • Konvencija: snake_case za varijable i funkcije, ALL_CAPS za konstante koje ne namjeravate mijenjati, CamelCase za imena klasa.

2.2.2. Osnovni tipovi

Svaka vrijednost u Pythonu ima tip koji određuje koje operacije podržava. Četiri tipa koja ćete najviše pisati su:

  • int – cijeli brojevi, pozitivni ili negativni. MicroPython cijeli brojevi rastu onoliko koliko memorija dopušta. Literali se pišu kao obične znamenke: 0, 42, -7. Heksadekadski (0x1A), oktalni (0o17) i binarni (0b1010) literali također su valjani i korisni za registre i bitmaske.

  • float – brojevi s decimalnom točkom ili eksponentom: 3.14, 1.0, -0.5, 2e6 (= 2.000.000,0). Svi float brojevi na kameri su IEEE 754 32-bitni – precizni do otprilike sedam značajnih znamenki.

  • bool – jedan od dva literala True ili False (pripazite na velika slova).

  • str – tekst, napisan kao znakovi između jednostrukih ili dvostrukih navodnika: "hello", 'OpenMV'. Oba stila navodnika su ekvivalentna; odaberite onaj koji vam omogućuje izbjegavanje escapeanja navodnika koji se pojavljuju unutar niza.

Postoji i peta vrijednost koju vrijedi odmah upoznati:

  • None – jedina vrijednost tipa NoneType. Koristi se za značenje „nema vrijednosti” ili „još nije postavljeno”. Funkcije koje eksplicitno ne vraćaju ništa implicitno vraćaju None.

2.2.3. Provjera i pretvorba tipova

Ugrađena funkcija type() vraća tip bilo koje vrijednosti:

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

Svaki tip ujedno služi i kao funkcija pretvorbe. Predajte joj vrijednost drugog tipa i dobit ćete ekvivalentnu vrijednost novog tipa natrag – kada je pretvorba dobro definirana:

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

Pretvorbe koje nisu dobro definirane podižu 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. Ponovna dodjela i dinamičko tipiziranje

Ime se u bilo kojem trenutku može ponovno dodijeliti vrijednosti bilo kojeg tipa. Sljedeće je dopušteno:

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

Python ne veže varijablu uz tip. Kod koji ovisi o tome da je x cijeli broj jednostavno očekuje cijeli broj na mjestu gdje ga koristi; ako dobije nešto drugo, dobit ćete TypeError tijekom izvođenja.

Napomena

Ponovna dodjela vrijednosti varijabli x ne mijenja vrijednost na koju je staro vezivanje pokazivalo. Ako dva imena dijele istu vrijednost, ponovna dodjela jednog ne utječe na drugo:

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

Mutiranje dijeljene vrijednosti je drugačije: metoda poput list.append mijenja vrijednost na koju vezivanje pokazuje, pa svako drugo ime koje pokazuje na tu istu vrijednost vidi promjenu.