2.2. Variablen und Grundtypen¶
Eine Variable ist ein Name, den Sie mit dem Operator = an einen Wert binden. Nach der Zuweisung kann der Name überall dort verwendet werden, wo der Wert verwendet werden kann:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
Die rechte Seite von = wird zuerst ausgewertet, dann wird das Ergebnis an den Namen auf der linken Seite gebunden. Das Lesen eines Namens, der nie zugewiesen wurde, löst einen NameError aus.
Eine Variable ist nur ein Etikett. Sie zeigt auf einen Wert – der Wert lebt anderswo, und derselbe Wert kann beliebig viele Etiketten haben.
Variablen sind Etiketten, die auf Werte zeigen. Die Neuzuweisung einer Variablen verschiebt das Etikett; sie ändert nicht den Wert, auf den das Etikett zuvor zeigte.¶
2.2.1. Benennungsregeln¶
Namen beginnen mit einem Buchstaben oder Unterstrich und dürfen Buchstaben, Ziffern und Unterstriche enthalten.
frame_countund_internalsind in Ordnung;1st_frameist ein Syntaxfehler.Bei Namen wird zwischen Groß- und Kleinschreibung unterschieden:
Widthundwidthsind zwei verschiedene Variablen.Vermeiden Sie es, eingebaute Namen wie
list,str,id()oderprint()wiederzuverwenden – ein Überschatten löst zwar keinen Fehler aus, aber die ursprüngliche eingebaute Funktion wird für den Rest des Skripts unerreichbar.Konvention:
snake_casefür Variablen und Funktionen,ALL_CAPSfür Konstanten, die Sie nicht zu ändern beabsichtigen,CamelCasefür Klassennamen.
2.2.2. Grundtypen¶
Jeder Wert in Python hat einen Typ, der bestimmt, welche Operationen er unterstützt. Die vier Typen, die Sie am häufigsten schreiben werden, sind:
int – ganze Zahlen, positiv oder negativ. MicroPython-Ganzzahlen wachsen so groß, wie es der Speicher zulässt. Literale werden als einfache Ziffern geschrieben:
0,42,-7. Hexadezimale (0x1A), oktale (0o17) und binäre (0b1010) Literale sind ebenfalls gültig und nützlich für Register und Bitmasken.float – Zahlen mit Dezimalpunkt oder Exponent:
3.14,1.0,-0.5,2e6(= 2.000.000,0). Alle Gleitkommazahlen auf der Kamera sind IEEE 754 mit 32 Bit – genau auf etwa sieben signifikante Stellen.bool – eines der beiden Literale
TrueoderFalse(beachten Sie die Großschreibung).str – Text, geschrieben als Zeichen zwischen einfachen oder doppelten Anführungszeichen:
"hello",'OpenMV'. Beide Anführungsstile sind gleichwertig; wählen Sie denjenigen, der es Ihnen erlaubt, das Escapen der innerhalb der Zeichenkette vorkommenden Anführungszeichen zu vermeiden.
Es gibt auch einen fünften Wert, den man sofort kennen sollte:
None – der einzige Wert vom Typ
NoneType. Wird verwendet, um „kein Wert“ oder „noch nicht gesetzt“ auszudrücken. Funktionen, die nicht explizit etwas zurückgeben, geben implizitNonezurück.
2.2.3. Typen prüfen und konvertieren¶
Die eingebaute Funktion type() gibt den Typ eines beliebigen Werts zurück:
>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>
Jeder Typ dient zugleich als Konvertierungsfunktion. Übergeben Sie ihm einen Wert eines anderen Typs, und Sie erhalten den entsprechenden Wert des neuen Typs zurück – sofern die Konvertierung wohldefiniert ist:
>>> 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)
Konvertierungen, die nicht wohldefiniert sind, lösen einen ValueError aus:
>>> int("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10
2.2.4. Neuzuweisung und dynamische Typisierung¶
Ein Name kann jederzeit auf einen Wert eines beliebigen Typs neu zugewiesen werden. Folgendes ist zulässig:
x = 42
x = "now I'm a string"
x = 3.14
Python bindet eine Variable nicht an einen Typ. Code, der davon abhängt, dass x eine ganze Zahl ist, erwartet einfach eine ganze Zahl an der Stelle, an der er sie verwendet; bekommt er etwas anderes, erhalten Sie zur Laufzeit einen TypeError.
Bemerkung
Die Neuzuweisung von x ändert nicht den Wert, auf den die alte Bindung zeigte. Wenn zwei Namen denselben Wert teilen, wirkt sich die Neuzuweisung des einen nicht auf den anderen aus:
a = [1, 2, 3]
b = a # both point at the same list
a = "different now"
print(b) # still [1, 2, 3]
Das Mutieren eines geteilten Werts ist etwas anderes: eine Methode wie list.append ändert den Wert, auf den die Bindung zeigt, sodass jeder andere Name, der auf denselben Wert zeigt, die Änderung sieht.