MicroPython

Von Zahlen und Buchstaben – Variablen

Du speicherst Zahlen und Texte, rechnest damit und liest Eingaben ein.

Werte aufbewahren

Variablen! Du kennst sie aus dem Matheunterricht, und in der Programmierung haben sie eine ähnliche Bedeutung. Eine Variable ist wie eine Schublade, in der du Daten aufbewahrst – Text, Zahlen oder ganze Bilder.

Ein Schrank mit drei beschrifteten Schubladen: summand1 enthält 5, summand2 enthält 8, die herausgezogene Schublade summe bekommt den Wert 13

Sie hat einen Namen, den du selbst wählst, und einen Wert, den du ihr zuweist. Wähle den Namen so, dass er den Inhalt beschreibt – über ihn greifst du später auf die Variable zu.

So kannst du Daten festhalten und überall in deinem Programm wieder verwenden.

Die Beispiele auf dieser Seite geben über die Konsole ein und aus. Du kannst sie im PicoBoy Studio direkt ausprobieren, auch ohne Gerät: Die Konsole sitzt dort unter dem Programmfenster.

Die Programme auf dieser Seite kommen ohne die Zeilen from picoboy import PicoBoy und pb = PicoBoy() aus, denn print() und input() gehören zu Python selbst. Die beiden Zeilen brauchst du erst, wenn du Display, LEDs oder Joystick ansprichst.

Welche Namen erlaubt sind

Ein Variablenname besteht aus Buchstaben, Ziffern und dem Unterstrich _. Dazu kommen ein paar Regeln:

  • Leerzeichen sind verboten: meine zahl ergibt einen SyntaxError. Schreibe meineZahl oder meine_zahl.
  • Der Name darf nicht mit einer Ziffer beginnen: 2zahl geht nicht, zahl2 schon.
  • Groß- und Kleinschreibung zählt: summe und Summe sind zwei verschiedene Variablen.
  • Wörter, die Python selbst braucht, wie if oder while, kannst du nicht als Namen verwenden.
  • Verzichte auf Umlaute und ß: besser groesse als „größe“.

Beispiel 1: Rechnen mit Variablen

summand1 = 5                 # Neue Variable "summand1" auf 5 setzen
summand2 = 8                 # Neue Variable "summand2" auf 8 setzen
summe = summand1 + summand2  # Variante 1: Ergebnis in "summe" aufheben
                             # Grundrechenarten: "+", "-", "*" und "/"
print(summe)                 # Den Wert von "summe" ausgeben
print(summand1 + summand2)   # Variante 2: Erst bei der Ausgabe rechnen

Bei einer Zuweisung rechnet Python zuerst die rechte Seite aus. Das Ergebnis landet dann in der Variablen links. Die dritte Zeile rechnet also 5 + 8 und legt 13 in summe ab. Das Programm gibt zweimal 13 aus. Der Unterschied: Bei Variante 1 steht das Ergebnis danach noch in summe, und du kannst es weiterverwenden. Bei Variante 2 ist es nach der Ausgabe weg.

Achte auf die Anführungszeichen: print(summe) gibt den Wert der Variablen aus, also 13. print("summe") gibt das Wort „summe“ aus.

Hast du dich beim Namen vertippt und schreibst zum Beispiel print(Summe), bricht das Programm so ab:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
NameError: name 'Summe' isn't defined

Python kennt nur Namen, denen du vorher einen Wert zugewiesen hast. Die Meldung nennt den unbekannten Namen und die Zeile. Sieh dort nach, ob du dich vertippt hast.

Das Gleichheitszeichen weist zu

In Mathe wäre punkte = punkte + 5 falsch. In Python ist es eine ganz normale Zeile, denn = bedeutet hier nicht „ist gleich“, sondern „lege das Ergebnis von rechts in der Variablen links ab“:

punkte = 10          # "punkte" bekommt den Wert 10
punkte = punkte + 5  # Erst rechts 10 + 5 rechnen, dann in "punkte" ablegen
print(punkte)        # Ausgabe: 15

Der alte Wert 10 ist danach überschrieben. So zählst du später Punkte und Runden.

Geteilt, ganzzahlig geteilt, Rest

Beim Teilen gibt es drei Möglichkeiten. Außerdem gilt wie in Mathe Punkt vor Strich:

print(7 / 2)                # Geteilt: 3.5
print(10 / 2)               # Auch hier ist das Ergebnis eine Kommazahl: 5.0
print(7 // 2)               # Geteilt, nur der ganzzahlige Anteil: 3
print(7 % 2)                # Nur der Rest der Division: 1
print(2 + 3 * 4)            # Punkt vor Strich: 14
print((2 + 3) * 4)          # Klammern wie in Mathe: 20

/ liefert immer eine Kommazahl, auch wenn die Division aufgeht. Python schreibt Kommazahlen mit Punkt. Den Rest mit % brauchst du öfter, als man denkt: Eine Zahl ist zum Beispiel genau dann gerade, wenn beim Teilen durch 2 der Rest 0 bleibt.

Die Zeichenbefehle für das Display verlangen ganze Zahlen. pb.pixel(128 / 2, 32, 1) bricht deshalb mit TypeError: can't convert float to int ab, weil 128 / 2 die Kommazahl 32.0 ergibt. Schreibe stattdessen 128 // 2.

Kommazahlen sind auf dem PicoBoy nicht beliebig genau. Er speichert sie in 32 Bit, das reicht für etwa sieben Stellen. print(1 / 3) ergibt 0.33333334, und aus 123456789.0 wird 123456790.0. Für Spiele und Messwerte genügt das.

Beispiel 2: Einlesen von Zeichenketten

# Zeigt den Text an und legt das Eingetippte in der Variablen "name" ab
name = input("Gib deinen Namen ein und drücke Enter: ")
print(name)  # Die Variable "name" ausgeben

input() zeigt den Text in den Klammern an und wartet dann. Das Programm steht so lange still, bis du in die Konsole geklickt, etwas getippt und die Eingabetaste gedrückt hast. Was du getippt hast, gibt input() an das Programm zurück, und das Gleichheitszeichen legt es in name ab. Eingaben kommen also immer über die Konsole, nicht über den Joystick.

Beispiel 3: Einlesen von Zahlen

Zahlen und Texte sind Daten unterschiedlicher Datentypen. input() liefert immer einen Text. Damit du mit der Eingabe rechnen kannst, musst du sie erst umwandeln: mit int() in eine ganze Zahl oder mit float() in eine Kommazahl.

summand1 = int(input("Summand1: "))  # Eingabe in eine ganze Zahl wandeln
summand2 = int(input("Summand2: "))  # Dasselbe für den zweiten Wert
print(summand1 + summand2)           # Die Summe der beiden ausgeben

Probiere aus, was passiert, wenn du das int() weglässt: Aus „2“ und „3“ wird dann nicht 5, sondern „23“ – Python hängt zwei Texte aneinander, statt zu rechnen.

Wenn die Eingabe keine Zahl ist

Tippst du bei int(input(...)) Buchstaben ein, kann Python sie nicht in eine Zahl wandeln:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

Das Programm bricht ab, und das Studio erklärt den Fehler zusätzlich in einem kleinen Fenster. Starte das Programm einfach noch einmal. Dasselbe passiert, wenn du bei int() eine Kommazahl wie 2.5 eingibst. Dafür ist float() da. Tippe die Zahl dabei mit Punkt ein: 2.5 geht, 2,5 ergibt einen ValueError.

Text und Zahl verbinden

Auch in die andere Richtung gibt es einen typischen Fehler. Willst du eine Zahl an einen Text hängen, geht das mit + nicht:

punkte = 42
print("Punkte: " + punkte)

Das ergibt TypeError: unsupported types for __add__: 'str', 'int'. str steht für Text und int für ganze Zahl. Das Zeichen + addiert zwei Zahlen oder hängt zwei Texte aneinander, aber es kann nicht beides mischen. Du hast zwei Möglichkeiten:

punkte = 42
print("Punkte: " + str(punkte))   # str() macht aus der Zahl 42 den Text "42"
print("Punkte:", punkte)          # Mit Komma trennt print() die Teile selbst

Zahlen auf dem Display

pb.text() erwartet immer Text. Eine Zahl wandelst du deshalb auch hier mit str() um. Weil dieses Programm das Display benutzt, stehen die beiden Zeilen vom Anfang wieder da:

from picoboy import PicoBoy

pb = PicoBoy()

# Den Teil oberhalb dieser Zeile nicht verändern

punkte = 42                                   # Eine Zahl in "punkte" ablegen

pb.fill(0)                                    # Bildspeicher schwarz füllen
pb.text("Punkte: " + str(punkte), 0, 27, 1)   # Text und Zahl zusammensetzen
pb.show()                                     # Auf das Display übertragen

Lässt du str() weg, meldet Python TypeError: can't convert 'int' object to str implicitly.

Übung

  1. Schreibe ein Programm, das Breite und Höhe eines Rechtecks einliest und die Fläche ausgibt.
  2. Füge im letzten Programm vor pb.fill(0) die Zeile punkte = punkte + 8 ein. Welche Zahl erwartest du auf dem Display?