Datentyp-Hierarchie

Ich beschränke die folgenden Betrachtungen auf die, wie ich meine, wichtigsten in Python integrierten Datentypen. Es gibt weitere, die Du in der Python-Dokumentation nachlesen kannst. Die Datentypen von Python lassen sich in Form einer Hierarchie logisch anordnen.

Python Datentyphierarchie
Datentyp-Hierarchie in Python

Ganze Zahlen

Bitte akzeptiere YouTube-Cookies, um dieses Video abzuspielen. Wenn Du das akzeptierst, greifst Du auf Inhalte von YouTube zu, einem Dienst, der von einer externen dritten Partei bereitgestellt wird.

YouTube-Datenschutzrichtlinie

Wenn Du diesen Hinweis akzeptierst, wird Deine Wahl gespeichert und die Seite wird aktualisiert.

Ganze Zahlen werden in Python mittels des Datentyps int repräsentiert. Üblicherweise werden die Werte ganzer Zahlen als Dezimalzahlen angegeben. Die bestehen aus den Ziffern 0 bis 9 und optional einem positiven oder negativen Vorzeichen. Die erste Ziffer darf keine 0 sein.

Alternativ kannst Du ganzzahlige Literale zu den Basen 2 (Binärzahlen), 8 (Oktalzahlen) und 16 (Hexadezimalzahlen) schreiben.

  • Binärzahlen bestehen aus den Ziffern 0 und 1. Zur Kennzeichnung besitzen sie den Präfix 0b oder 0B. Beispiel: 0b101010.
  • Oktalzahlen bestehen aus den Ziffern 0 bis 7. Zur Kennzeichnung besitzen sie den Präfix 0o oder 0O. Beispiel: 0o52.
  • Hexadezimalzahlen bestehen aus den Ziffern 0 bis 9 und den Zeichen a bis f beziehungsweise A bis F. Über Groß-/Kleinschreibung entscheidest Du selbst. Zur Kennzeichnung besitzen diese Zahlen den Präfix 0x oder 0X. Beispiel: 0x2A.

Die angegebenen Beispiele sind alles alternative Literale für die dezimale Ganzzahl 42.

Ganze Zahlen unterliegen in Python keinem konkret eingeschränkten Wertebereich. Sie können nahezu beliebig groß werden. Limitierend wirkt lediglich der verfügbare Hauptspeicher des Computers. Auf den ganzen Zahlen sind die folgenden arithmetischen Operationen definiert.

Operation Beschreibung
x + y Addition: Summe von x und y
x - y  Subtraktion: Differenz von x und y
x * y  Multiplikation: Produkt von x und y
x / y  Gleitkommadivision: Quotient von x und y
x // y ganzzahlige/abgerundete Division: Quotient von x und y
x % y Restwertdivision/Modulo: Rest beim Teilen von x durch y
x ** y Potenz: x hoch y
+x unäres Vorzeichen: Plus
-x unäres Vorzeichen: Minus

Die Restwertdivision beziehungsweise Restwertbildung folgt in Python der mathematischen Konvention! – Wenn Du Dich für Details interessierst, empfehle ich Dir hierzu meinen Hintergrundartikel „Modulare Arithmetik“. Der erläutert Dir die Arithmetik, wie Computer beziehungsweise Programmiersprachen sie ausführen im Detail.

Bei der Gleitkommadivision ist das Ergebnis immer eine Gleitkommazahl.

Ganze Zahlen können exakt im Computer kodiert werden. Alle mit Ihnen durchgeführten Berechnungen sind, sofern das Ergebnis keine Gleitkommazahl ist, ebenfalls exakt.

Im Rahmen von Zuweisungen existieren Kurzschreibweisen. Statt x = x + y darfst Du x += y schreiben. Ganz analog gilt das auch für die anderen Operatoren.

Ganze Zahlen sind unveränderlich. Du kannst aus einer 42 keine 1 machen. Beide besitzen Ihre eigenen IDs und Speicheradressen. Weist Du  einer Variablen erst den Wert 42 und danach den Wert 1 zu, verweist die Variable auf jeweils unterschiedliche Speicherbereiche. Jedes Objekt besitzt in Python eine Identität, eine eindeutige Nummer/Adresse.  Du kannst sie Dir mit id() zurückgeben lassen.

Neben den arithmetischen Operationen kannst Du auf ganzen Zahlen auch Bit-Operationen ausführen. In der Regel tut man dies auf den positiven ganzen Zahlen. Bit-Operationen sind jedoch auch auf den negativen ganzen Zahlen definiert.

Operation Beschreibung
x & y bitweise UND-Verknüpfung von x und y
x | y bitweise ODER-Verknüpfung von x und y
x ^ y bitweise EXKLUSIV-ODER-Verknüpfung von x und y
~x bitweises Komplement von von x
x << n Bit-Verschiebung um n Stellen nach links
x >> n Bit-Verschiebung um n Stellen nach rechts

Auch auf die Bit-Operationen lässt sich die oben genannte Kurzschreibweise anwenden. So entspricht x &= y der längeren Notation x = x & y.

Um die Operationen besser zu verstehen, hilft es, sich eine ganze Zahl in ihrer jeweiligen Binärkodierung vorzustellen. Hier ein Beispiel:

>>> 13 & 7   # 13: 1101 UND 7: 0111    ergibt     0101: 5
    5

13:   1101   Bei UND ist das Ergebnis 1, wenn beide Operanden an
 7:   0111   der gleichen Stelle eine 1 haben, sonst 0.
----------
      0101: 5
=============

Gleitkommazahlen

Bitte akzeptiere YouTube-Cookies, um dieses Video abzuspielen. Wenn Du das akzeptierst, greifst Du auf Inhalte von YouTube zu, einem Dienst, der von einer externen dritten Partei bereitgestellt wird.

YouTube-Datenschutzrichtlinie

Wenn Du diesen Hinweis akzeptierst, wird Deine Wahl gespeichert und die Seite wird aktualisiert.

Der Datentyp für Gleitkommazahlen heißt in Python float. Statt eines Dezimalkommas, wie im Deutschen üblich, wird ein Dezimalpunkt in Gleitkomma-Literalen geschrieben. Zudem ist die wissenschaftliche Notation mit einem e oder E erlaubt. Solch ein e oder E liest Du als „mal 10 hoch“. Gleitkommazahlen-Literale werden immer zur Basis 10 notiert.

Gleitkommazahlen werden hardwarenah, gemäß dem Standard IEEE 754, abgebildet. Sie stellen lediglich eine Näherung an die reellen Zahlen dar, die Du aus der Mathematik kennst. Dabei lässt sich nicht jede dezimale Gleitkommazahl exakt kodieren. Eine scheinbar „handelsübliche Zahl“ wie 0.3 kann im digitalen Computer nicht exakt abgebildet werden. Die Kodierung der Zahlen bestimmt auch deren Wertebereich und ist ursächlich für etwaige Rechenungenauigkeiten, die sich daraus ergeben.

Zulässige Gleitkommazahlen liegen im Intervall ±1.7976931348623157e308. Die kleinste von Null verschiedene Gleitkommazahl ist ±2.2250738585072014e-308.

Nutze IDLE, um ein paar arithmetische Ausdrücke mit Gleitkommazahlen auszuprobieren.

>>> 1.5 * 3.0
    4.5
>>> 2.0**0.5
    1.4142135623730951
>>> 16.4 / 8.1 
    2.0246913580246915
>>> 16.4 // 8.1
    2.0
>>> 16.4 % 8.1
    0.1999999999999993

Bei der letzten Berechnung erkennst Du die Ungenauigkeit, mit welcher Gleitkommazahlen behaftet sind. Statt des exakten Werts von 0.2 wird 0.1999999999999993 ausgegeben. Diese Ungenauigkeiten machen Gleichheitsvergleiche mit Gleitkommazahlen oftmals unbrauchbar. Gleichheitsvergleich werden mittels eines doppelten Gleichheitszeichens durchgeführt. Das Ergebnis ist True, wenn der Vergleich wahr ist, andernfalls False.

>>> 16.4 % 8.1 == 0.2
    False

Gemäß den mathematischen Kenntnissen, die wir in der Schule erworben haben, sollte der Vergleich True ergeben. Nach den obigen Berechnungen wissen wir aber um die Ungenauigkeiten, die mit Gleitkommazahlen verbunden sein können. Sind derartige Vergleiche erforderlich, so muss man sie, eingedenk der möglichen Ungenauigkeiten, geschickt formulieren.

>>> abs(16.4 % 8.1 - 0.2) <= 1.0e-15
    True

Python bietet uns eine Betragsfunktion, die den Absolutwert bestimmt. Ihre Verwendung vermeidet hier Fallunterscheidungen. In der Tat ist die Differenz im Beispiel negativ. Durch die Verwendung der \verb|abs()|-Funktion erhalten wir einen positiven Wert. Den vergleichen wir mit einer sehr kleinen Zahl, die Mathematiker gern als Epsilon bezeichnen. Epsilon wird so gewählt, wie es der von uns gewünschten Genauigkeit entspricht. Im konkreten Fall prüfen wir, ob der Betrag der Differenz aus Restwertdivision und dem ursprünglichen Vergleichswert kleiner oder gleich dem Epsilon-Wert ist. Ist das der Fall, wird angenommen, dass die Werte als gleich zu betrachten sind, die Rechenungenauigkeit vernachlässigt werden kann.

Ist eine der Zahlen in einem Term eine Gleitkommazahl, wird Gleitkommaarithmetik ausgeführt. Das bedeutet, das ganze Zahlen erst in Gleitkommazahlen konvertiert werden müssen um Gleitkommaarithmetik anwenden zu können. Das kann unerwartete Auswirkungen haben, wenn man nicht vorsichtig ist.

>>> 99**456
    1022465673059605960732438023108064814758352891456534032255433719009582814
    8524647829434758748644493300390504582941069823801903573042540544983049533
    4907133569342129778409249809456857822453444268692106799535892996312139460
    6630531000060621883781695725141302847848971493368564818020732286211635635
    5556867665106317536010693355475943991281802054446480595912035733670693612
    7106453194048328777303777557251808050032411328934483913436872658289331288
    9765919286815739745429437836582550619701508329714987476768951307538816373
    9053700845840703835390319328371774519278007775511341592463002151265323851
    0547893860455139488914660780191207067945781570216136517797879054926760763
    8382847265051335819595731935143973188049748752608670490371538988708420408
    5239218004669793101245823616591356777104568430583270575481154127165411275
    6047682896726978576201466506485923188300077653760809645076485909672666944
    44816510588357842824712140717354401
>>> 99**456-1.0
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        99**456-1.0
    OverflowError: int too large to convert to float

Die Potenz besteht ausschließlich aus ganzen Zahlen. Sie kann problemlos berechnet werden. Im zweiten Term wird die Potenz zuerst berechnet. Der Potenzoperator besitzt die höchste Auswertungspriorität. Um nun die Subtraktion von 1.0 vornehmen zu können, ist der Wert der Potenz in eine Gleitkommazahl zu wandeln. Der Wert liegt jedoch außerhalb des Wertebereichs von Gleitkommazahlen, weshalb es zu einem Fehler kommt.

Die auf den Gleitkommazahlen definierten arithmetischen Operationen sind identisch zu denen der ganzen Zahlen. Analoges gilt in Bezug auf deren Unveränderlichkeit.

Komplexe Zahlen

Bei den meisten Programmiersprachen stehen dem Programmierer komplexe Zahlen nur über Zusatzbibliotheken zur Verfügung. In Python sind sie ein integrierter Datentyp.

Die Notation ist gegebenenfalls gewöhnungsbedürftig. In Python wird ein j verwendet, um den imaginären Teil einer komplexen Zahl zu kennzeichnen. Im Schulunterricht wird gewöhnlich ein i geschrieben. Das in Python verwendete j korrespondiert mit der Notation, die in der Elektrotechnik verwendet wird.

j ist die sogenannte imaginäre Einheit mit der Eigenschaft \(j^2 = -1\). Sollte Dich das verwirren, weil Du bislang nichts mit komplexen Zahlen am Hut hattest, ignoriere die komplexen Zahlen vorerst. Es reicht aus, sich mit Ihnen zu befassen, wenn Du sie benötigst.

Vergleiche zwischen numerischen Datentypen

Numerische Datentypen lassen sich mit den üblichen Vergleichsoperatoren vergleichen. Das Ergebnis ist ein Wahrheitswert, True oder False.

Operation Entsprechung
x == y wahr, wenn x und y gleich sind, sonst falsch
x != y wahr, wenn x und y ungleich sind, sonst falsch
x < y wahr, wenn x kleiner y ist, sonst falsch
x <= y wahr, wenn x kleiner oder gleich y ist, sonst falsch
x > y wahr, wenn x größer y ist, sonst falsch
x >= y wahr, wenn x größer oder gleich y ist, sonst falsch

Anmerkung: Bezüglich der komplexen Zahlen (complex) sind nur die Vergleiche auf Gleichheit und Ungleichheit definiert. Komplexe Zahlen können prinzipiell nicht der Größe nach angeordnet werden. Auf ihnen ist keine Größenrelation definiert.

Konvertierungen zwischen numerischen Datentypen

Alle numerischen Datentypen lassen sich ineinander konvertieren. Dabei wird dem Zieldatentypen in Klammern der zu konvertierende Wert übergeben. Technisch wird hierbei der Konstruktor des Zieldatentyps aufgerufen. Beachten, dass dabei eventuell Informationseinbußen in Kauf zu nehmen sind. Beispiel: Beim Konvertieren einer Gleitkommazahl in eine ganze Zahl gehen die Nachkommastellen verloren.

>>> int(3.14)
    3

Lässt sich ein Wert verlustfrei konvertieren, wobei auf den Wertebereich keine Rücksicht genommen wird, so erfolgt eine Konvertierung auch automatisch, ohne explizites Zutun. Ganze Zahlen werden, wenn erforderlich implizit in Gleitkommazahlen konvertiert. Ebenso erfolgt einer Konvertierung in Richtung der komplexen Zahlen automatisch, wenn erforderlich.