Datentypen in Python (v.a.: Zahlentypen)

https://oer-informatik.de/python_datentypen

tl/dr; (ca. 6 min Lesezeit): Zahlen, Zeichenketten, Wahrheitswerte: welche Datentypen bietet Python an? Der Schwerpunkt hier liegt auf den numerischen Typen für Gleitkomma- und Ganzzahlen: ist 0b1 eine gültige Zahl und 1e1? Und: warum in aller Welt ist das hier False: 0.1 + 0.2 == 0.3?!?

Python bietet eine Reihe von internen (build-in) Datentypen an, aus deren Kombination alle weiteren Datentypen erstellt werden können. Eine vollständige Liste findet sich in der Python Dokumentation. Für den Anfang genügen die Datentypen für Zahlen, Zeichen und Wahrheitswerte sowie Objektsammlungen.

Die wichtigsten einfachen Datentypen sind:

Datentyp Beschreibung Zuweisung
int Ganzzahlen anzahl = 12
float Gleitkommazahlen temperatur = 36.5
bool Wahrheitswerte istWahr = True
str Zeichenkette name='Hannes'

Zahlentypen

Im Gegensatz zu vielen anderen Programmiersprachen kennt Python von Haus aus nur zwei Zahlentypen: int für Ganzzahlen und float für Gleitkommazahlen. Die Wertebereiche beider Zahlen werden dynamisch angeglichen. Mit Hilfe der PythonShell lassen sich die Zahlentypen leicht erkunden:

Ganzzahlen

Bei vielen Programmiersprachen ist ein int auf 32 Bit Datenbreite begrenzt, die höchste abbildbare Zahl wäre also 232-1-1 (also 2.147.483.647), darüber hinaus gibt es häufig einen long-Datentyp mit 64 Bit (bis maximal 264-1-1, das sind 9.223.372.036.854.775.807).

In Python jedoch ist die Datenbreite von int dynamisch: Es lassen sich auch extrem große Zahlen darstellen, beispielsweise 2 hoch 100.000: eine Zahl mit ca. 10.000 Stellen:

(die PythonShell fragt dann gewöhnlich nach, ob man wirklich die gesamte Ausgabe sehen will…)

Ganzzahlen in anderen Zahlensystemen

Wir stellen Ganzzahlen üblicherweise im mit dezimalen Literalen dar ( Stellenwertsystem mit Ziffern [0-9]). In der Informatik sind häufig weitere Zahlensysteme relevant, die wir mit Python auch direkt als ganzzahlige Literale dieser Stellenwertsysteme darstellen können:

  • Dualzahlen (Binärsystem):

    Das Stellenwertsystem baut auf der Basis 2 auf, und verfügt über die Ziffern (Zeichenvorrat) 0 und 1 ([0-1]). Die Literale im Binärsystem werden mit vorangestelltem 0b notiert. Die Python-Shell übersetzt direkt ins Dezimalsystem:

  • Oktalzahlen [0-7]:

    Das Stellenwertsystem baut auf der Basis 8 auf, und verfügt über die Ziffern (Zeichenvorrat) 0 bis 7 ([0-7]).

  • Hexadezimalsystem (16er-System):

    Das Stellenwertsystem baut auf der Basis 16 auf, und verfügt über die Ziffern (Zeichenvorrat) 0 bis 9 und A bis F ([0-9A-F]).

Gleitkommazahlen

Gleitkommazahlen werden als Literal mit dem Dezimalpunkt eingegeben (Bsp.: 1.1). Literale nennt man in diesem Zusammenhang die Darstellungsform eines Wertes im Programmtext. In der Regel werden Zahlenwerte als Gleitkommazahl umgesetzt, wenn an den Operationen eine Gleitkommazahl beteiligt ist oder wenn eine Division (Bsp.: 10/4) vorgenommen wird.

Sehr kleine und sehr große Zahlen werden in der Exponentialschreibweise angegeben - wie etwa auch bei Taschenrechnern:

(Das entspricht 1.602176634*10-19 bzw. 6.02214076*1023)

Interne Speicherung von Gleitkommazahlen

Gleitkommazahlen werden in Python mit 64-Bit Datenbreite gespeichert. Intern werden Sie als binäre Exponentialzahl gespeichert, nach dem Schema (vereinfacht):

Gleitkommazahl = Vorzeichen * Mantisse * 2(Exponent)

Wobei der höchste Exponenten +1023 ist (11 Bit, Vorzeichenbehaftet) und die höchste Mantisse “fast” eins (0.5 + 0.25 + 0.125 +0.625… 52 Bit lang). Daraus ergibt sich die höchste Zahl zu annähernd 2(1023).

Wir lassen uns von Python helfen, um dies Zahl in eine Dezimale Exponentialzahl umzuwandeln. Der Exponent auf Basis der Zahl 10 wäre:

Die höchste Gleitkommazahl, die mit 64 Bit gespeichert werden kann, liegt also fast bei 2*10308 - eine Zahl mit 308 Stellen!

Randprobleme bei Gleitkommazahlen

Aus der internen Abbildung von Gleitkommazahlen folgen eine Reihe von Einschränkungen:

  • Viele einfache Dezimalzahlen lassen sich binär nicht präzise darstellen. Die Zahl 0.1 ist ein einfaches Beispiel. Daraus folgen ggf. unerwartete Probleme in der Programmierung:

  • viele Zahlen teilen sich die selbe Binärdarstellung. Beispielsweise sind theoretisch alle Zahlen 0, deren Mantisse 0 ist. Aber auch sonst können sich unverständliche Resultate einstellen:

    Fazit

Wenn wir Zahlen in Python speichern wollen unterscheiden wir also in der Regel zwischen Gleitkommazahlen und Ganzzahlen. Ganzzahlen können nahezu beliebig skaliert werden (es gibt in Python im Gegensatz zu anderen Programmiersprachen keine festgelegten Obergrenzen). Bei Gleitkommazahlen dürfen wir nie auf Gleichheit überprüfen, weil die interne Umrechnung ins Binärsystem einige einfache Dezimal-Gleitkommazahlen nicht präzise darstellen kann (einfaches Beispiel: 0.1).

Mit einem sicheren Verständnis für Datentypen können wir uns jetzt auf das nächste Thema stürzen: Operatoren.

Quellen und offene Ressourcen (OER)

Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich (soweit möglich in weiterbearbeitbarer Form) in folgendem git-Repository:

https://oer-informatik.gitlab.io/python-basics/erste-schritte-mit-python.

Sofern nicht explizit anderweitig angegeben sind sie zur Nutzung als Open Education Resource (OER) unter Namensnennung (H. Stein, oer-informatik.de) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).

Creative Commons Lizenzvertrag


Hinweis zur Nachnutzung

Dieses Werk und dessen Inhalte sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Erste Schritte mit Python” von Hannes Stein, Lizenz: CC BY 4.0. Die Quellen dieses Werks sind verfügbar auf GitLab.

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: