2.2. Muuttujat ja perustyypit

Muuttuja on nimi, jonka sidot arvoon =-operaattorilla. Sijoituksen jälkeen nimeä voi käyttää kaikkialla, missä arvoakin voi:

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

=-merkin oikeanpuoleinen osa evaluoidaan ensin, minkä jälkeen tulos sidotaan vasemmalla olevaan nimeen. Nimen lukeminen, jota ei ole koskaan sijoitettu, nostaa virheen NameError.

Muuttuja on vain nimilappu. Se osoittaa arvoon – arvo asuu jossain muualla, ja samalla arvolla voi olla mikä tahansa määrä nimilappuja.

Kolme nimilappua osoittamassa kolmeen laatikoituun arvoon; nimilapun uudelleensijoittaminen siirtää nuolta, ei arvoa.

Muuttujat ovat arvoihin osoittavia nimilappuja. Muuttujan uudelleensijoittaminen siirtää nimilappua; se ei muuta arvoa, johon nimilappu aiemmin osoitti.

2.2.1. Nimeämissäännöt

  • Nimet alkavat kirjaimella tai alaviivalla ja voivat sisältää kirjaimia, numeroita ja alaviivoja. frame_count ja _internal ovat kelvollisia; 1st_frame on syntaksivirhe.

  • Nimet ovat kirjainkokoriippuvaisia: Width ja width ovat kaksi eri muuttujaa.

  • Vältä sisäänrakennettujen nimien kuten list, str, id() tai print() uudelleenkäyttöä – niiden varjostaminen ei nosta virhettä, mutta alkuperäinen sisäänrakennettu funktio muuttuu saavuttamattomaksi skriptin loppuosaksi.

  • Käytäntö: snake_case muuttujille ja funktioille, ALL_CAPS vakioille joita et aio muuttaa, CamelCase luokkanimille.

2.2.2. Perustyypit

Jokaisella Python-arvolla on tyyppi, joka määrää mitä operaatioita se tukee. Neljä tyyppiä joita kirjoitat eniten ovat:

  • int – kokonaisluvut, positiiviset tai negatiiviset. MicroPythonin kokonaisluvut kasvavat niin suuriksi kuin muisti sallii. Literaalit kirjoitetaan pelkillä numeroilla: 0, 42, -7. Myös heksadesimaali- (0x1A), oktaali- (0o17) ja binääriliteraalit (0b1010) ovat kelvollisia ja hyödyllisiä rekistereille ja bittimaskeille.

  • float – luvut, joissa on desimaalipiste tai eksponentti: 3.14, 1.0, -0.5, 2e6 (= 2 000 000.0). Kaikki kameran liukuluvut ovat IEEE 754 -muotoisia 32-bittisiä – tarkkoja noin seitsemään merkitsevään numeroon asti.

  • bool – jompikumpi kahdesta literaalista True tai False (huomaa isot alkukirjaimet).

  • str – tekstiä, kirjoitettuna merkkeinä yksittäisten tai kaksoislainausmerkkien välissä: "hello", 'OpenMV'. Molemmat lainausmerkkityylit ovat samanarvoisia; valitse se, joka antaa sinun välttää merkkijonon sisällä esiintyvien lainausmerkkien suojaamisen.

On myös viides arvo, joka kannattaa tietää heti:

  • None – tyypin NoneType ainoa arvo. Käytetään tarkoittamaan ”ei arvoa” tai ”ei vielä asetettu”. Funktiot, jotka eivät nimenomaisesti palauta mitään, palauttavat implisiittisesti None.

2.2.3. Tyyppien tarkistaminen ja muuntaminen

Sisäänrakennettu type()-funktio palauttaa minkä tahansa arvon tyypin:

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

Jokainen tyyppi toimii myös muunnosfunktiona. Anna sille eri tyyppinen arvo, niin saat takaisin vastaavan uuden tyypin arvon – silloin kun muunnos on hyvin määritelty:

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

Muunnokset, jotka eivät ole hyvin määriteltyjä, nostavat virheen 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. Uudelleensijoitus ja dynaaminen tyypitys

Nimi voidaan uudelleensijoittaa minkä tahansa tyyppiseen arvoon milloin tahansa. Seuraava on sallittua:

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

Python ei sido muuttujaa tyyppiin. Koodi, joka olettaa muuttujan x olevan kokonaisluku, yksinkertaisesti odottaa kokonaislukua siinä kohdassa, jossa se sitä käyttää; jos se saa jotain muuta, saat ajonaikaisen virheen TypeError.

Muista

Muuttujan x uudelleensijoittaminen ei muuta arvoa, johon vanha sidonta osoitti. Jos kaksi nimeä jakaa saman arvon, toisen uudelleensijoittaminen ei vaikuta toiseen:

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

Jaetun arvon muuttaminen on eri asia: metodi kuten list.append muuttaa arvoa, johon sidonta osoittaa, joten jokainen muu samaan arvoon osoittava nimi näkee muutoksen.