Zum Inhalt
wannacode

Variablen und Typen

Kurz gesagt: Eine Variable ist ein Name, unter dem ein Programm einen Wert speichert; der Typ kommt vom Wert: int eine ganze Zahl, float eine Kommazahl, bool ja oder nein, str Text.

Problem

Der Preis steht an drei Stellen

In einem Onlineshop taucht ein Preis an mehreren Stellen auf: im Katalog, im Warenkorb und an der Kasse. Steht er überall als Zahl da, passiert Folgendes:

print("Kopfhörer: 49.90 €")
print("Im Warenkorb: Kopfhörer, 49.90 €")
print("Zu zahlen: 49.90 €")

Morgen sind die Kopfhörer im Angebot. Du musst jedes 49.90 finden und ändern. Vergisst du eins, sieht der Kunde zwei verschiedene Preise.

Die Idee

Eine Variable: ein Name für einen Wert

Schreib den Preis einmal hin und gib ihm einen Namen. Danach schreibst du überall den Namen.

price = 49.90
print(f"Kopfhörer: {price} €")
print(f"Im Warenkorb: Kopfhörer, {price} €")
print(f"Zu zahlen: {price} €")
Ausgabe
Kopfhörer: 49.9 €
Im Warenkorb: Kopfhörer, 49.9 €
Zu zahlen: 49.9 €

price = 49.90 erzeugt eine Variable: einen Namen (price), unter dem das Programm einen Wert (49.90) speichert. Wo im Code price steht, holt das Programm den Wert von dort. Den Typ schreibst du nicht: Python erkennt ihn am Wert. Um Typen geht es auf der nächsten Karte.

f vor den Anführungszeichen macht einen f-String: einen Text, in den du einen Wert direkt in geschweiften Klammern schreibst, {price}. Bei der Ausgabe steht an dieser Stelle der Wert.

Die Null am Ende ist verschwunden: Aus 49.90 wurde 49.9. Für die Zahl ist das dasselbe. Wie du den Preis mit zwei Nachkommastellen zeigst, siehst du in der Lektion über Eingabe und Ausgabe.

Genauer, für Neugierige
  • Ein Name beginnt mit einem Buchstaben und hat keine Leerzeichen. Schreib ihn klein und verbinde die Wörter mit einem Unterstrich: price, price_per_night. Groß- und Kleinbuchstaben zählen: price und Price sind zwei verschiedene Namen.
  • Die Sprache erlaubt auch Namen mit Umlauten (größe), aber tu es nicht. Code auf der ganzen Welt hat lateinische Namen ohne Sonderzeichen, und so schreiben auch deine Kollegen.
  • Einen Namen, dem du noch keinen Wert gegeben hast, kannst du nicht benutzen. Python bricht mit NameError: name 'total' is not defined ab, wenn es diese Zeile erreicht.
  • Text und eine Zahl lassen sich nicht mit + verbinden:
stock = 12
print("Auf Lager: " + stock + " Stück")
Ausgabe
TypeError: can only concatenate str (not "int") to str

Python achtet auf den Typ der Werte und macht aus der Zahl nicht von selbst einen Text. Deshalb schreiben wir einen f-String. Wenn du + willst, mach aus der Zahl einen Text: "Auf Lager: " + str(stock) + " Stück".

Die Idee

Arten von Werten

Der Typ sagt, was die Variable speichern kann. Das sind die wichtigsten:

name = "Rucksack"
price = 39.90
stock = 12
on_sale = True
size = "M"
print(f"{name}, Größe {size}")
print(f"Preis: {price} €")
print(f"Auf Lager: {stock} Stück")
print(f"Im Angebot: {on_sale}")
Ausgabe
Rucksack, Größe M
Preis: 39.9 €
Auf Lager: 12 Stück
Im Angebot: True
  • int: eine ganze Zahl, zum Beispiel eine Anzahl.
  • float: eine Kommazahl, zum Beispiel ein Preis oder ein Gewicht. Im Code ist das Dezimaltrennzeichen ein Punkt: 39.90.
  • bool: ja oder nein, True oder False, mit Großbuchstaben.
  • str: Text, in Anführungszeichen: "Rucksack". Das ist ein String (eine Zeichenkette), eine Folge von Zeichen. Einen eigenen Typ für ein einzelnes Zeichen gibt es nicht: "M" ist ein Text der Länge 1.

type(...) sagt dir den Typ eines Werts. Wenn du diese Zeilen ans selbe Programm anhängst:

print(type(name))
print(type(price))
print(type(stock))
print(type(on_sale))
print(type(size))
Ausgabe
<class 'str'>
<class 'float'>
<class 'int'>
<class 'bool'>
<class 'str'>
Genauer, für Neugierige

In Python hat int keine Grenze: Eine ganze Zahl kann so viele Ziffern haben, wie du willst, und Rechnungen damit sind exakt. float ist wie double in Java und C#: eine Kommazahl in 8 Byte mit etwa 15 bis 16 gültigen Ziffern. Unterstriche zwischen den Ziffern machen sie nur besser lesbar:

population = 8_100_000_000
weight = 1.5
huge = 123_456_789_012_345_678_901_234_567_890
print(f"{population} {weight}")
print(huge + 1)
Ausgabe
8100000000 1.5
123456789012345678901234567891

float speichert Zahlen im Binärsystem, und manche Kommazahlen wie 0.1 lassen sich nicht exakt darstellen: 0.1 + 0.2 ist 0.30000000000000004. Für Geld verwenden echte Programme Decimal aus dem Modul decimal. Im Kurs schreiben wir Preise der Kürze halber als float.

Probier es aus

Finde den Fehler

Das Programm soll „Heft: 3 Stück zu je 2.4 €“ ausgeben. Es läuft, gibt aber „Heft: 3 Stück zu je (2, 40) €“ aus. In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

Die Idee

= speichert eine Kopie

Das Zeichen = ist nicht „gleich“ wie in der Mathematik. Es bedeutet: Nimm den Wert rechts und speichere ihn in die Variable links. Das heißt Zuweisung. Der alte Wert der Variable ist weg.

Steht rechts eine andere Variable, wird eine Kopie ihres Werts in diesem Moment gespeichert. Die beiden Variablen bleiben nicht verbunden:

seats = 40
seats_at_start = seats
seats = 37
print(f"Am Anfang: {seats_at_start}")
print(f"Jetzt: {seats}")
Ausgabe
Am Anfang: 40
Jetzt: 37

seats_at_start bekommt 40. Danach wird seats zu 37, aber die Kopie in seats_at_start bleibt 40.

Genauer, für Neugierige

Genauer gesagt: In Python macht = keine Kopie. Es gibt seats_at_start denselben Wert, 40. Wenn danach seats = 37 kommt, bekommt seats einen neuen Wert, und seats_at_start behält 40. Bei Zahlen und Text verhält sich das genau wie eine Kopie. Den Unterschied siehst du bei den Listen.

Probier es aus

Welcher Wert bleibt?

Was gibt das Programm aus?

room_a = 12
room_b = 20
room_a = room_b
room_b = 25
print(f"{room_a} und {room_b}")
Antwort

Problem

Die Maße sind vertauscht

Ein Programm für Fotoabzüge bekommt die Maße vertauscht: Breite 120 und Höhe 80, dabei sollten sie 80 x 120 sein. Es sieht so aus, als müsstest du nur das eine ins andere speichern und zurück:

width = 120
height = 80
width = height
height = width
print(f"{width} x {height}")
Ausgabe
80 x 80

Herausgekommen ist 80 x 80. Wo ist die 120 geblieben?

Sieh es dir an

Tauschen mit einer Hilfsvariable

width = 120
height = 80
temp = width
width = height
height = temp
print(f"{width} x {height}") # 80 x 120
Schritt für Schritt, in Worten
  1. Breite und Höhe wurden vertauscht eingegeben: 120 und 80.
  2. temp = width: Eine Kopie von 120 kommt in temp. In width bleibt 120.
  3. width = height: Eine Kopie von 80 kommt in width. Die alte 120 ist dort weg, aber in temp gesichert.
  4. height = temp: 120 kommt aus temp zurück in height.
  5. Getauscht: 80 x 120.

In der naiven Version speichert width = height die 80 in width, und die alte 120 ist weg. Wenn danach height = width kommt, steht in width schon 80, und die wird zurückkopiert.

Die Lösung ist eine dritte Variable, eine Hilfsvariable temp. Sie hebt die 120 auf, bevor width überschrieben wird. Danach kommt die 120 aus temp in height, und die Maße sind 80 x 120.

Genauer, für Neugierige
In Python kannst du den Tausch auch in einer Zeile schreiben. Rechts werden beide Werte auf einmal genommen und erst danach links gespeichert:
width = 120
height = 80
width, height = height, width
print(f"{width} x {height}")
Ausgabe
80 x 120

Das wirst du in fremdem Code sehen. Hier schreiben wir es mit temp, damit du Schritt für Schritt siehst, was passiert.

Probier es aus

Bring den Tausch in die richtige Reihenfolge

Im Shop tauschen zwei Kollegen ihre Schichten. morning ist „Ivan“, und evening ist „Maria“. Bring die Zeilen in die richtige Reihenfolge, damit die beiden tauschen.

  1. evening = temp
  2. morning = evening
  3. temp = morning
  4. print(f"Morgens: {morning}, abends: {evening}")

Die Idee

Der Typ gehört zum Wert

In Python schreibst du den Typ der Variable nicht. Er gehört zum Wert: 3 ist ein int, "drei" ist ein str. Deshalb kann dieselbe Variable später einen Wert von einem anderen Typ bekommen:

nights = 3
print(type(nights))
nights = "drei"
print(type(nights))
Ausgabe
<class 'int'>
<class 'str'>

Python beschwert sich nicht. Das heißt dynamische Typisierung: Der Typ steht erst fest, während das Programm läuft. Das ist praktisch, führt aber auch schnell zu Fehlern: Ist nights an einer Stelle eine Zahl und an einer anderen Text, bricht die Rechnung damit ab. Speichere in einer Variable nur eine Art von Wert.

Genauer, für Neugierige

Du kannst den Typ als Hinweis dazuschreiben: nights: int = 3. Das heißt Typannotation. Python prüft sie nicht, und nights = "drei" geht danach trotzdem durch. Geprüft wird sie von eigenen Programmen wie mypy. Im Kurs verwenden wir sie nicht.

Übung

Deine Variablen

Löse die Aufgaben in deinem Editor. Die Werte stehen im Code, ohne Eingabe über die Tastatur. Das Einlesen kommt in der nächsten Lektion.

1. Tausch. Im oberen Regal stehen 15 Bücher, im unteren 27. Speichere sie in zwei Variablen, tausche ihre Werte und gib sie vorher und nachher aus.

Ausgabe
Vorher: oben 15, unten 27
Nachher: oben 27, unten 15

2. Alter. Speichere einen Namen und ein Alter in zwei Variablen und gib sie in einem Satz aus.

Ausgabe
Maria ist 19 Jahre alt.

3. Eine Hotelkarte. Speichere in Variablen den Namen des Hotels (Text), die Sterne (eine ganze Zahl), die Bewertung (eine Kommazahl), ob es Frühstück gibt (ja oder nein) und die Kategorie (ein Zeichen). Gib sie aus.

Ausgabe
Hotel „Seestern“
Sterne: 4
Bewertung: 8.7
Frühstück: True
Kategorie: B

Weitere Aufgaben

  • Drei im Kreis. Drei Kassen haben zu Tagesbeginn 120, 85 und 240 €. Verschiebe die Beträge im Kreis: Der erste kommt in die zweite Kasse, der zweite in die dritte, der dritte in die erste. Verwende eine Hilfsvariable. Gib 240 120 85 aus.
  • Die Typen. Gib mit type() den Typ jedes Werts aus Aufgabe 3 aus.
  • Ein Fehler mit Absicht. Verbinde Text und eine Zahl mit +: print("Sterne: " + stars). Lies, was Python sagt. Schreib danach die Bewertung mit Komma, rating = 8,7, und sieh dir an, was ausgegeben wird.

Test

Teste dich

1. Was macht die Zeile count = 5?
2. Welchen Typ hat 12.99 in Python?
3. a = 5, b = a, a = 9. Was ist b?
4. Warum braucht der Tausch zweier Werte eine dritte Variable?
5. nights = 3, danach nights = "drei". Was passiert?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·