2.2. Variabler och grundläggande typer#
En variabel är ett namn som du binder till ett värde med operatorn =. Efter tilldelningen kan namnet användas överallt där värdet kan användas:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
Högerledet av = utvärderas först, sedan binds resultatet till namnet till vänster. Att läsa ett namn som aldrig tilldelats orsakar NameError.
En variabel är bara en etikett. Den pekar på ett värde – värdet finns någon annanstans, och samma värde kan ha hur många etiketter som helst.
Variabler är etiketter som pekar på värden. Att tilldela om en variabel flyttar etiketten; det ändrar inte värdet som etiketten brukade peka på.#
2.2.1. Namngivningsregler#
Namn börjar med en bokstav eller ett understreck och får innehålla bokstäver, siffror och understreck.
frame_countoch_internalär bra;1st_frameär ett syntaxfel.Namn är skiftlägeskänsliga:
Widthochwidthär två olika variabler.Undvik att återanvända inbyggda namn som
list,str,id()ellerprint()– att skugga dem orsakar inget fel, men den ursprungliga inbyggda funktionen blir oåtkomlig under resten av skriptet.Konvention:
snake_caseför variabler och funktioner,ALL_CAPSför konstanter som du inte tänker ändra,CamelCaseför klassnamn.
2.2.2. Grundläggande typer#
Varje värde i Python har en typ som bestämmer vilka operationer det stöder. De fyra typer du kommer att skriva mest är:
int – heltal, positiva eller negativa. MicroPython-heltal växer så stora som minnet tillåter. Litteraler skrivs som vanliga siffror:
0,42,-7. Hexadecimala (0x1A), oktala (0o17) och binära (0b1010) litteraler är också giltiga och användbara för register och bitmasker.float – tal med ett decimaltecken eller en exponent:
3.14,1.0,-0.5,2e6(= 2 000 000,0). Alla flyttal på kameran är IEEE 754 32-bitars – exakta till ungefär sju signifikanta siffror.bool – en av de två litteralerna
TrueellerFalse(observera den stora bokstaven).str – text, skriven som tecken mellan enkla eller dubbla citationstecken:
"hello",'OpenMV'. Båda citatformerna är likvärdiga; välj den som låter dig undvika att escapa de citationstecken som förekommer inuti strängen.
Det finns också ett femte värde som är värt att känna till omedelbart:
None – det enda värdet av typen
NoneType. Används för att betyda ”inget värde” eller ”inte satt ännu”. Funktioner som inte uttryckligen returnerar något returnerar implicitNone.
2.2.3. Kontrollera och konvertera typer#
Den inbyggda funktionen type() returnerar typen för vilket värde som helst:
>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>
Varje typ fungerar också som en konverteringsfunktion. Ge den ett värde av en annan typ så får du tillbaka motsvarande värde av den nya typen – när konverteringen är väldefinierad:
>>> 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)
Konverteringar som inte är väldefinierade orsakar 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. Omtilldelning och dynamisk typning#
Ett namn kan tilldelas om till ett värde av valfri typ när som helst. Följande är tillåtet:
x = 42
x = "now I'm a string"
x = 3.14
Python binder inte en variabel till en typ. Kod som är beroende av att x är ett heltal förväntar sig helt enkelt ett heltal på den punkt där den använder det; om den får något annat får du ett TypeError vid körning.
Observera
Att tilldela om x ändrar inte värdet som den gamla bindningen pekade på. Om två namn delar samma värde påverkar omtilldelning av det ena inte det andra:
a = [1, 2, 3]
b = a # both point at the same list
a = "different now"
print(b) # still [1, 2, 3]
Att mutera ett delat värde är något annat: en metod som list.append ändrar värdet som bindningen pekar på, så varje annat namn som pekar på samma värde ser ändringen.