Zum Inhalt
wannacode

Operatoren und Arithmetik

Kurz gesagt: Die arithmetischen Operatoren +, -, *, / und % rechnen mit Zahlen: / ergibt eine Kommazahl, // teilt ganzzahlig und ergibt den ganzzahligen Teil, und % ergibt den Rest.

Problem

Die Rechnung am Tisch

Du hast drei Kaffees zu 2,50 € und zwei Croissants zu 1,50 € bestellt. Du zahlst mit einem 20-€-Schein. Wie hoch ist die Rechnung, und wie viel Rückgeld bekommst du?

Im Kopf geht das. Aber die Kasse im Café macht so eine Rechnung hunderte Male am Tag, mit anderen Preisen und Mengen. Das Programm muss selbst rechnen.

Die Idee

Die arithmetischen Operatoren

Du rechnest wie auf Papier: + addiert, - subtrahiert, * multipliziert, / dividiert. Diese Zeichen heißen Operatoren.

coffee = 2.5
croissant = 1.5
total = 3 * coffee + 2 * croissant
change = 20 - total
print(f"Gesamt: {total} €")
print(f"Rückgeld: {change} €")
Ausgabe
Gesamt: 10.5 €
Rückgeld: 9.5 €

Die Reihenfolge ist wie in der Mathematik: zuerst * und /, dann + und -. Deshalb ist 3 * coffee + 2 * croissant gleich 7,5 + 3. Willst du eine andere Reihenfolge, setzt du Klammern: (2 + 3) * 4 ist 20.

Es gibt noch einen fünften Operator, %. Um ihn geht es in der nächsten Idee.

Genauer, für Neugierige
  • Operatoren mit gleichem Vorrang werden von links nach rechts berechnet: 20 - 5 - 3 ist 12, nicht 18.
  • - vor einer Zahl macht sie negativ: -total.
  • Bei Text addiert + nicht, sondern hängt an, aber nur Text an Text. Text + eine Zahl bricht das Programm ab. Das ist die Falle in der nächsten Karte.

Probier es aus

Konzertkarten

Drei Karten zu 8 € und 5 € Bestellgebühr.

Was gibt das Programm aus?

tickets = 3
fee = 5
print("Gesamt: " + tickets * 8 + fee)
Antwort

Problem

2,25 Stunden statt 2 Std. 15 Min.

Der Film dauert 135 Minuten. Du willst ihn als Stunden und Minuten zeigen: 2 Std. 15 Min. Der erste Versuch:

minutes = 135
hours = minutes / 60
print(f"{hours} Std.")
Ausgabe
2.25 Std.

In Python ergibt / immer eine Kommazahl, auch wenn beide Zahlen ganz sind: 6 / 3 ist 2.0, und 17 / 3 ist 5.666666666666667. Hier brauchst du aber zwei ganze Stunden und die übrigen Minuten. Wie bekommst du nur den ganzzahligen Teil?

Die Idee

Ganzzahldivision: // und %

// teilt und behält nur den ganzzahligen Teil: 135 // 60 ist 2, und 17 // 3 ist 5. Der Nachkommateil wird abgeschnitten. Das nennt man Ganzzahldivision.

Hier ist sie Schritt für Schritt, mit der Summe von drei Noten:

math = 5
physics = 6
english = 6
whole = (math + physics + english) // 3
print(f"Ganzzahliger Teil: {whole}")
Schritt für Schritt, in Worten
  1. Drei Noten, jede in einem int: 5, 6, 6.
  2. Zuerst die Klammern: 5 + 6 + 6 = 17. Auch die Summe ist ein int.
  3. 17 // 3: Wie viele ganze Gruppen zu 3 passen in 17? 5.
  4. Der Rest 2 (also 17 % 3) wird abgeschnitten. Das Ergebnis ist die ganze Zahl 5.
  5. 5 wird in whole gespeichert. Das Ergebnis von // mit ganzen Zahlen ist ein int, ohne .0.
  6. Ausgegeben wird „Ganzzahliger Teil: 5“. Der Nachkommateil (5,67) ist nicht im Ergebnis: Dafür gibt es /.

Was abgeschnitten wird, ist nicht ganz verloren. Der Operator % ergibt den Rest der Division: 17 % 3 ist 2, denn 17 = 5 · 3 + 2.

Zusammen teilen die beiden eine Menge in ganze Teile und einen Rest. Der Film dauert 135 Minuten:

minutes = 135
hours = minutes // 60
rest = minutes % 60
print(f"{hours} Std. {rest} Min.")
Ausgabe
2 Std. 15 Min.

% wirst du oft brauchen. Eine Zahl ist gerade, wenn n % 2 gleich 0 ist. Die letzte Ziffer einer Zahl ist n % 10.

Genauer, für Neugierige
  • Bei negativen Zahlen rundet // nach unten, zur kleineren Zahl hin: -7 // 2 ist -4, nicht -3 wie in Java und C#. Der Rest hat das Vorzeichen des Divisors. % funktioniert auch mit Kommazahlen:
print(-7 // 2)
print(-7 % 2)
print(7.5 % 2)
Ausgabe
-4
1
1.5
  • Eine Division durch 0 bricht das Programm ab: ZeroDivisionError: division by zero. In Python gilt das auch für Kommazahlen: 5.0 / 0 bricht ebenfalls ab.

Probier es aus

Flaschen in Kisten

In eine Kiste passen 6 Flaschen. Du hast 17.

Was gibt das Programm aus?

bottles = 17
per_case = 6
print(f"{bottles // per_case} Kisten")
print(f"{bottles % per_case} bleiben übrig")
Antwort

Die Idee

Umwandlung zwischen Typen

In Python ergibt / schon eine Kommazahl, und der Notendurchschnitt stimmt sofort. Eine Umwandlung brauchst du in die andere Richtung: von Kommazahl zu ganzer Zahl.

total = 5 + 6 + 6
average = total / 3
print(average)
print(f"{average:.2f}")
whole = int(9.99)
print(whole)
Ausgabe
5.666666666666667
5.67
9

Eine Typumwandlung schreibst du mit dem Namen des Typs: int(9.99) macht ein int, und float(17) macht 17.0. Das nennt man Typumwandlung (Cast). int(...) schneidet den Nachkommateil ab: int(9.99) ist 9, nicht 10.

Von int nach float geht nichts verloren, und die Umwandlung passiert von selbst: 10 + 0.5 ist ein float, 10.5. Ist eine Seite ein float, ergibt auch // ein float: 17 // 3.0 ist 5.0.

Genauer, für Neugierige
  • int("25") aus der Lektion über die Eingabe ist dieselbe Funktion: Sie macht sowohl aus Text als auch aus einer Kommazahl eine ganze Zahl.
  • Jedes Zeichen hat einen Code, eine Zahl in der Zeichentabelle. ord ergibt den Code, und chr macht aus einem Code ein Zeichen:
print(ord("A"))
print(chr(66))
max_int = 2147483647
print(max_int + 1)
Ausgabe
65
B
2147483648
  • In Java und C# reicht int bis 2 147 483 647, und eins mehr „springt“ zu einer negativen Zahl. In Python hat int keine Grenze, deshalb ergibt die dritte Zeile 2147483648.

Probier es aus

Finde den Fehler

Die Stromrechnung beträgt 125 € und wird auf drei Mitbewohner aufgeteilt. Das Programm sagt, jeder zahlt 41,00 €, es sollten aber 41,67 € sein. In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

Die Idee

Kurzschreibweisen: += und -=

Oft änderst du einen Wert auf Basis von sich selbst: Das Guthaben auf der Karte sinkt mit jedem Einkauf, ein Zähler steigt um eins. Dafür gibt es kurze Schreibweisen:

balance = 20
purchases = 0
balance -= 4.5
purchases += 1
balance -= 3.5
purchases += 1
print(f"{purchases} Einkäufe, es bleiben {balance} €")
Ausgabe
2 Einkäufe, es bleiben 12.0 €
Du schreibst Das bedeutet
balance -= 4.5 balance = balance - 4.5
total += price total = total + price
x *= 2, x /= 2, x //= 2, x %= 2 dasselbe mit *, /, // und %
purchases += 1 purchases = purchases + 1
seats -= 1 seats = seats - 1

Python hat kein ++ und --. Ein Zähler steigt mit += 1.

+= funktioniert auch mit Text: message += "!" hängt ein Ausrufezeichen ans Ende.

Genauer, für Neugierige

a++ ist in Python SyntaxError: invalid syntax. Tückischer ist ++a: Das ist kein Fehler, sondern zwei Pluszeichen vor der Zahl, +(+a). Der Wert ändert sich nicht:

a = 5
++a
print(a)
Ausgabe
5

Wenn du von einer anderen Sprache kommst, pass auf: Der Zähler bleibt gleich, und Python sagt nichts.

Die Idee

math: Wurzel, Potenz, Runden

Eine Pizzeria verkauft eine 30-cm-Pizza zum selben Preis wie zwei 20-cm-Pizzen. Was ist mehr? Die Fläche eines Kreises ist π · r². Für Potenzen hat Python einen Operator: **. 15 ** 2 ist 225. Für π und für die Quadratwurzel gibt es Fertiges im Modul math: Die Zeile import math ganz oben lädt es, und dann schreibst du math., den Namen und in Klammern die Zahlen. Das sind Funktionen, fertige Codestücke. Eigene schreibst du im Modul „Funktionen“.

import math
big = math.pi * 15 ** 2
small = 2 * math.pi * 10 ** 2
print(f"Eine 30-cm-Pizza: {big:.1f} cm²")
print(f"Zwei 20-cm-Pizzen: {small:.1f} cm²")
print(math.sqrt(144))
print(abs(-7.5))
Ausgabe
Eine 30-cm-Pizza: 706.9 cm²
Zwei 20-cm-Pizzen: 628.3 cm²
12.0
7.5

Eine große Pizza ist mehr als zwei kleine.

Du schreibst Was es ergibt
math.sqrt(x) die Quadratwurzel
x ** n oder math.pow(x, n) x hoch n
abs(x) den Betrag (ohne Vorzeichen), ohne math.
round(x) Runden auf eine ganze Zahl, ohne math.
math.pi die Zahl π, 3,14159…

math.sqrt und math.pow liefern ein float, auch wenn das Ergebnis eine ganze Zahl ist (deshalb 12.0). ** mit ganzen Zahlen ergibt ein int: 15 ** 2 ist 225. Brauchst du ein int, wandle es um: int(math.sqrt(144)).

Genauer, für Neugierige
  • Runden von 2,5: Die Sprachen liefern verschiedene Ergebnisse.
print(round(2.5))
print(round(3.5))
print(round(5.678, 2))
Ausgabe
2
4
5.68
  • round rundet „die Hälfte“ zur geraden Zahl: 2,5 wird zu 2, und 3,5 wird zu 4. So runden die Banken (daher der englische Name „banker's rounding“). C# macht es genauso. Mit einem zweiten Argument rundest du auf so viele Nachkommastellen: round(5.678, 2) ist 5,68.
  • f-Strings richten sich nicht nach den Spracheinstellungen des Computers: Der Punkt bleibt überall ein Punkt.

Übung

Lass das Programm rechnen

Löse die Aufgaben in deinem Editor. Jede Zahl der Eingabe steht in einer eigenen Zeile.

1. Durchschnitt von drei Zahlen. Lies drei ganze Zahlen ein und gib ihren Durchschnitt mit zwei Nachkommastellen aus. Hier brauchst du eine Division mit Kommazahl.

Eingabe
5
6
6
Ausgabe
Durchschnitt: 5.67

2. Sekunden in Stunden. Lies eine Anzahl Sekunden ein und teile sie in Stunden, Minuten und Sekunden auf. Tipp: Eine Stunde hat 3600 Sekunden, und % ergibt, was übrig bleibt.

Eingabe
3725
Ausgabe
1 Std. 2 Min. 5 Sek.

3. Volumen einer Kugel. Lies den Radius ein und gib das Volumen aus: V = 4/3 · π · r³. Hier ist 4 / 3 gleich 1.333…, wie es sein soll. Aber was wäre 4 // 3?

Eingabe
10
Ausgabe
Volumen: 4188.79 cm³

4. Celsius in Fahrenheit. F = C · 9 / 5 + 32. Lies die Temperatur in Grad Celsius ein.

Eingabe
37
Ausgabe
37.0 °C = 98.6 °F

Weitere Aufgaben

  • Zoll in Zentimeter. Ein Zoll sind 2,54 cm. Für 12 Zoll: 30.48 cm.
  • Fläche eines Rechtecks. Lies Länge und Breite ein und gib die Fläche aus (Länge · Breite).
  • Fläche eines Quadrats. Lies die Seitenlänge ein und gib die Fläche aus. Mach es einmal mit * und einmal mit **.
  • Bogenmaß in Grad. Grad = Bogenmaß · 180 / π. Für 3.14159: 180.00°.
  • Stunden in Sekunden. Lies eine Anzahl Stunden ein und gib aus, wie viele Sekunden das sind. Für 2 Stunden: 7200.
  • Der Code eines Zeichens. Lies ein Zeichen ein und gib seinen Code aus. Für A: 65. Das erste Zeichen des eingelesenen Texts bekommst du mit input()[0]. Was das bedeutet, siehst du in der Lektion über Text.

Test

Teste dich

1. Was ist 17 // 5?
2. Was ist 17 % 5?
3. Was ist 17 / 5 in Python?
4. Was ergibt int(9.99)?
5. Was macht print("Summe: " + 2 + 3)?

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