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.5croissant = 1.5total = 3 * coffee + 2 * croissantchange = 20 - totalprint(f"Gesamt: {total} €")print(f"Rückgeld: {change} €")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 - 3ist 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 = 3fee = 5print("Gesamt: " + tickets * 8 + fee)* wird zuerst berechnet: tickets * 8 ist 24. Dann von links nach rechts: "Gesamt: " + 24 ist Text + eine Zahl, und Python bricht ab: TypeError: can only concatenate str (not "int") to str. Mit einem f-String steht die Rechnung in den geschweiften Klammern, und es kommt 29 heraus: f"Gesamt: {tickets * 8 + fee}".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 = 135hours = minutes / 60print(f"{hours} Std.")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 = 5physics = 6english = 6whole = (math + physics + english) // 3print(f"Ganzzahliger Teil: {whole}")Schritt für Schritt, in Worten
- Drei Noten, jede in einem int: 5, 6, 6.
- Zuerst die Klammern: 5 + 6 + 6 = 17. Auch die Summe ist ein int.
- 17 // 3: Wie viele ganze Gruppen zu 3 passen in 17? 5.
- Der Rest 2 (also 17 % 3) wird abgeschnitten. Das Ergebnis ist die ganze Zahl 5.
- 5 wird in whole gespeichert. Das Ergebnis von // mit ganzen Zahlen ist ein int, ohne .0.
- 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 = 135hours = minutes // 60rest = minutes % 60print(f"{hours} Std. {rest} Min.")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 // 2ist -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)-411.5- Eine Division durch 0 bricht das Programm ab:
ZeroDivisionError: division by zero. In Python gilt das auch für Kommazahlen:5.0 / 0bricht ebenfalls ab.
Probier es aus
Flaschen in Kisten
In eine Kiste passen 6 Flaschen. Du hast 17.
Was gibt das Programm aus?
bottles = 17per_case = 6print(f"{bottles // per_case} Kisten")print(f"{bottles % per_case} bleiben übrig")17 // 6 sind 2 volle Kisten (12 Flaschen), und 17 % 6 ist der Rest: 5 Flaschen, die keine Kiste füllen.
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 + 6average = total / 3print(average)print(f"{average:.2f}")whole = int(9.99)print(whole)5.6666666666666675.679Eine 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.
ordergibt den Code, undchrmacht aus einem Code ein Zeichen:
print(ord("A"))print(chr(66))max_int = 2147483647print(max_int + 1)65B2147483648- In Java und C# reicht
intbis 2 147 483 647, und eins mehr „springt“ zu einer negativen Zahl. In Python hatintkeine 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.
// ist die Ganzzahldivision: 125 // 3 ist 41, und der Nachkommateil wird abgeschnitten. Das Format .2f zeigt 41 danach als 41.00. Für eine Division mit Kommazahl ist es /: share = bill / people.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 = 20purchases = 0balance -= 4.5purchases += 1balance -= 3.5purchases += 1print(f"{purchases} Einkäufe, es bleiben {balance} €")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++aprint(a)5Wenn 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 ** 2small = 2 * math.pi * 10 ** 2print(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))Eine 30-cm-Pizza: 706.9 cm²Zwei 20-cm-Pizzen: 628.3 cm²12.07.5Eine 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))245.68roundrundet „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.
566Durchschnitt: 5.672. 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.
37251 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?
10Volumen: 4188.79 cm³4. Celsius in Fahrenheit. F = C · 9 / 5 + 32. Lies die Temperatur in Grad Celsius ein.
3737.0 °C = 98.6 °FWeitere 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 mitinput()[0]. Was das bedeutet, siehst du in der Lektion über Text.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Dein erstes Programm · Variablen und Typen · Eingabe und Ausgabe
- Geht weiter in: Bedingungen · Schleifen · Listen · Zweidimensionale Arrays
- Aufgaben zum Thema: Sprachgrundlagen