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.
Anteckning
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.