Mit Zahlen kann man rechnen – schon deshalb macht es Sinn, für Zahlen eigene Datentypen zu haben. Aus zwei Zahlen wird mit einer Mathematischen Operation eine neue Zahl berechnet.
Der Computer muss aber Zahlen irgendwie abspeichern. Deshalb kennen die meisten Programmiersprachen mindestens zwei Datentypen für Zahlen. Diese unterscheiden sich darin, wie viel Speicherplatz sie belegen und wie die Daten codiert werden.
Python hat zwei Datentypen für unsere gängigen Zahlen:
int
- für Ganze Zahlen
vom Englischen integer float
- für Dezimalbrüche
vom Englischen floating point
int
Im Kapitel «Daten und Information» haben wir die binäre Darstellung von Zahlen kennengelernt. So kann Python ganze Zahlen abspeichern – einzig das Vorzeichen muss noch irgendwie codiert werden.
a = 18
b = -1
Im Gegensatz zu vielen anderen Programmiersprachen, gibt es keine feste Grössenbeschränkung für Ganze Zahlen in Python. Die Box wächst also bei Bedarf! Natürlich stellt der Speicher des Gerätes eine Obergrenze dar.
float
Dezimalbrüche werden vom Computer normalerweise in zwei Teilen abgespeichert, ähnlich wie bei der Exponentialschreibweise, wie man sie bei sehr kleinen und sehr grossen Konstanten – z.B. der Elementarladung oder der Plankschen Temperatur – verwendet:
Der Computer speichert sich z.B. für die Elementarladung
- eine gewisse Anzahl Ziffern, also
- die zugehörige Zehnerpotenz, also
Zusammengesetzt ergeben diese beiden Zahlen:
Somit können sehr grosse und auch sehr kleine Zahlen dargestellt werden – allerdings nur bis zu einer gewissen Genauigkeit:
e = 1.602176634e-19
Tp = 1.4165784e32
Natürlich kann man Dezimalbrüche auch ganz normal notieren, z.B.
x = 1.25
y = -0.098
mehr: grösste und kleinste floats
Die grösste und die kleinste Zahl, die mit dem Datentyp float
dargestellt werden kann, hängt vom System ab. Man kann sich diese Werte aber ausgeben lassen:
import sys
print(sys.float_info.max)
print(sys.float_info.min)
import sys
print(sys.float_info.max.hex())
print(sys.float_info.min.hex())
Grössere Zahlen erhalten in Python den Wert inf
, also «unendlich»:
import sys
print(2*sys.float_info.max)
Warnung: Rundungsfehler
Da floats
nicht beliebig exakt gespeichert werden können, entstehen Rundungsfehler. Bereits das folgende Beispiel liefert nicht das erwartete Ergebnis:
print(0.1 + 0.1 + 0.1)
Dies, weil der Computer die Ziffern als binäre Zahlen abspeichert.
Im Dezimalsystem haben wir ähnliche Probleme, wenn wir z.B. 1/3 als Dezimalbruch – also 0.3333… – darstellen wollen. Da reichen endlich viele Stellen nicht!
Arithmetische Operatoren
Diese werden verwendet, um mit Zahlen zu rechnen. Der ausgewertete Ausdruck ergibt wieder eine Zahl. Die Operatoren entsprechen mehr oder weniger den von der Mathematik bekannten Grundrechenarten:
Operand | Operation | Bemerkung |
---|---|---|
+ | Addition | Zusammenzählen |
- | Subtraktion | Minusrechnen |
* | Multiplikation | Malrechnen |
/ | Division | Durchrechnen, Ergebnis ist ein float |
// | ganzzahlige Division | Ergebnis ist ein int |
% | Modulo | Rest der ganzzahligen Division als int |
** | Potenzieren | Hochrechnen |
mehr: Ganzzahlige Division und Modulo:
also
Ausdrücke
Ein Ausdruck ist etwas, das Python auswerten, resp. berechnen kann. Wir können mit Variablen, Werten und Operatoren Ausdrücke programmieren:
z.B. könnten wir einen Ausdruck schreiben, der die Fläche eines Dreiecks berechnet:
s = float(input("gib die Seitenlänge ein: "))
h = float(input("gib die Höhe ein: "))
A_dreieck = s * h / 2
print("Die Fläche des Dreiecks beträgt:", A_dreieck)
Die Formel steckt in der dritten Zeile.
Bei der Auswertung gilt die «Punkt-vor-Strich»-Regel. Im Zweifelsfall können Klammern gesetzt werden:
ergebnis1 = 12 + 2 / 7
ergebnis2 = (12 + 2) / 7
ergebnis3 = 12 + (2 / 7)
print(ergebnis1, ergebnis2, ergebnis3)
Aufgabe: Klammern
Überlege dir, wie die Klammern im obenstehenden Beispiel die 3 «Ergebnis»-Werte beeinflussen. Überprüfe dann deine Vermutungen, indem du das Programm ausführst.
Aufgabe: Geometrie
Nimm das Programm zur Berechnung der Dreiecksfläche als Vorlage und schreibe ähnliche Programme zur Berechnung weiterer geometrischer Werte:
- Umfang und Fläche eines Kreises abhängig von dessen Radius
- Länge der Hypothenuse bei einem rechteckigen Dreieck mit Pythagoras bei gegebenen Kathetenlängen
- Umfang, Volumen und Fläche einer Kugel abhängig von dessen Radius
- …
Speichere jedes Programm unter einem aussagekräftigen Namen, z.B. kreisberechnung.py
ab.
Lösung: Geometrie
from math import pi
r = float(input("gib den Radius des Kreises ein: "))
A_kreis = r ** 2 * pi
U_kreis = 2 * r * pi
print("Die Fläche des Kreises beträgt:", A_kreis)
print("Der Umfang des Kreises beträgt:", U_kreis)
from math import sqrt
a = float(input("gib die Länge der ersten Kathete ein: "))
b = float(input("gib die Länge der zweiten Kathete ein: "))
c = sqrt(a**2 + b**2) # Variante 1: mit Quadratwurzel
c = (a**2 + b**2)**0.5 # Variante 2: mit «Hoch 1/2»
print("Die Hypothenuse hat eine Länge von:", c)
from math import pi
r = float(input("gib den Radius der Kugel ein: "))
V_kugel = (4/3) * pi * r**3
print("Das Volumen der Kugel beträgt:", V_kugel)
A_kugel = 4*pi * r**2
print("Die Oberfläche der Kugel beträgt:", A_kugel)
Zusatzaufgabe: Quadratische Gleichung
Schaffst du es, die Lösungsformel für Quadratische Gleichungen zu programmieren?
Du kennst also die drei Koeffizienten a
, b
und c
der Gleichung
und möchtest damit Lösungswerte für x
berechnen.
Vergleichsoperatoren
Mit zwei Zahlen kann man nicht nur rechnen, man kann sie auch vergleichen. Eigentlich ist das ja auch eine Berechnung – das Ergebnis ist nur keine Zahl, sondern ein Wahrheitswert:
Operand | Operation | Bemerkung |
---|---|---|
== | gleicher Wert | für Float gefährlich |
!= | nicht gleich | für Float gefährlich |
< | kleiner als | |
> | grösser als | |
<= | kleiner gleich | |
>= | grösser gleich |
print(12 >= 1)
print(12.1 < 12)
print(12.0 == 12)
print(1/3 > 0.333333)
print(3 * 0.1 == 0.3)
Zusatzaufgabe: Logik
Schau dir das folgende Programm an:
a = int(input("gib eine Zahl ein: "))
b = int(input("gib eine weitere Zahl ein: "))
print("<", a < b)
print(">", a > b)
print("<=", a <= b)
print(">=", a >= b)
print("")
print("==", a == b)
print("!=", a != b)
Wie könnten die Ergebnisse der Vergleiche mit ==
und !=
mit den vier obenstehenden Ergebnissen <
, >
, <=
und >=
für jede mögliche Kombination von a
und b
vorhergesagt werden?
Verkettung
Python bietet eine Spezialität unter den Programmiersprachen: Vergleichsoperatoren können verkettet werden:
zahl = int(input("Bitte gib eine Ganze Zahl ein: "))
resultat = 16 < zahl < 32
print("liegt diese Zahl zwischen 16 und 32?")
print(resultat)
zahl = int(input("Bitte gib eine Ganze Zahl ein: "))
resultat = 16 < zahl and zahl < 32
print("liegt diese Zahl zwischen 16 und 32?")
print(resultat)
mehr: Wieso ist das nicht selbstverständlich?
Die meisten Programmiersprachen werten einen Ausdruck wie 16 < zahl < 32
Schrittweise aus:
zahl = 19
resultat = 16 < zahl < 32
zahl = 19
resultat = 16 < 19 < 32
zahl = 19
resultat = (16 < 19) < 32
zahl = 19
resultat = True < 32
zahl = 19
resultat = (True < 32) // [!code error]
Da zuerst 16 < zahl
ausgewertet wird und das Ergebnis ein Wahrheitswert ergibt, gibt es beim nächsten Schritt einen Error: Es wird nämlich verglichen, ob der Wahrheitswert kleiner als 32
ist.
Python erkennt also so eine Verkettung und macht automatisch mehrere mit and
verknüpfte Ausdrücke daraus.