Datentypen, Operatoren und Variablen

Datentypen

Jeder Wert in Python hat einen bestimmten Datentyp. Dieser hängt davon ab, wie der Wert eingegeben wurde. Es ist nicht nötig, den Typ explizit zu deklarieren. Python erkennt den Typ automatisch. Wir können den Datentype durch Aufruf der Funktion type() ermitteln.


In [ ]:
type(1)

In [ ]:
type('Hello world')

Da Python im Kern eine objektorientierte Sprache ist (alles ist ein Objekt im Sinne der objektorientierten Programmierung) gibt es potentiell beliebig viele Typen, weil selbstgeschriebene Klassen eigene Typen darstellen. Die für den Einstieg wichtigsten Typen sind: int, float, bool und str.

Die numerische Datentypen int und float

Der Datentyp int (Integer) repräsentiert eine Ganzzahl, der Datentyp float eine Kommazahl (Float). Beiden Typen können im Prinzip beliebig groß werden, ihre Größe ist nur durch den vorhanden Hauptspeicher begrenzt.


In [ ]:
type(12345), type(3.14)

Rechnen: die mathematischen Operatoren

Python kennt natürlich die Grundrechnungsarten:

  • +: Addition
  • -: Subtraktion
  • *: Multiplikation
  • /: Division

Darüber hinaus gibt es folgende Operatoren:

  • **: Potenzierung
  • %: Module (Rest einer Division

Übungen

Wie viel ist 43 plus 99 durch 5 mal 3? Versuchen Sie das Ergebnis zu ergründen. Versuchen Sie, Teilausdrücke zu klammern.


In [ ]:
43 + 99 / 5 * 3

Versuchen Sie, durch Multiplikation oder Potenzierung eine richtig große Zahl zu erzeugen.


In [ ]:

Wieviel bleibt Rest, wenn man 481 durch 17 dividiert?


In [ ]:

Was passiert, wenn man einen Floatwert zu einem Integerwert addiert. Welchen Datentyp hat das Ergebnis?


In [ ]:

Der Datentyp bool (Boolean, Wahrheitswert)

Dieser Datentyp kennt nur zwei Werte: True oder False (Achtung: der Großbuchstabe am Beginn ist wichtig!)


In [ ]:
type(True), type(False)

Der Datentyp str (String, Zeichenkette)

Ein String ist eine Sequenz von einzelnen Zeichen. String-Werte müssen in Anführungszeichen stehen (egal ob einfache oder doppelte).


In [ ]:
type('abc'), type("abc")

In [ ]:
'"Das ist praktisch", sagte er, "weil man im String das jeweils andere Anführungszeichen verwenden kann."'

Lange Strings

Manchmal muss man lange Strings erzeugen, die auch über mehrere Zeilen reichen können. Python bietet hier zwei elegante Möglchkeiten. Entwedert man verwendet als Stringbegrenzer drei Anführungszeichen (egal ob doppelte oder einfache)


In [ ]:
"""Das ist ein ziemlicher langer String, der 
über mehrere Zeilen reicht."""

oder man klammert mehrere einzelne Strings:


In [ ]:
('Das ist eine ziemlich langer String, der '
 'über mehrere Zeilen reicht.')

Escape-Sequenzen in Strings

In Strings dient der Backslash (\) als Escape-Zeichen, das die Bedeutung des unmittelbar darauf folgenden Zeichens verändert. Es gibt eine Reihe solcher Escape-Sequenzen, hier nur ein paar Beispiele:

  • \' und \" können dazu verwendet werden, in einen String Anführungszeichen einzufügen, wenn das jeweilige Zeichen bereits zur Begrenzung des Strings verwendet wurde:

In [ ]:
'Sie sagte: \'Escape-Sequenzen sind manchmal recht nützlich\''
  • \n fügt eine Zeilenumbruch (Linefeed) ein. Das ist ein normales, in der Regel nicht sichtbares Zeichen (Codepoint 10)

In [ ]:
print("Zeile 1\nZeile2")
  • \t fügt ein Tabulatorzeichen ein

In [ ]:
print('abd\tefg')
  • Will man einen Backslash in einem String verwenden, muss dieser durch einen zweiten Backslash escaped werden.

In [ ]:
print('Die Escape-Sequenz \\t steht für einen Tabulator')
  • Zeichen, die nicht auf dem Keyboard vorkommen, können über ihren Unicode-Codepoint eingegeben werden:

In [ ]:
print('Ein Sigma sieht so aus: \u03A3')

Hinweise für erfahrene Programmierer

  • Python kennt keine Primitives
  • Sogar ganz einfache Typen wie bool oder int sind von Klassen abgeleitete Objekte
  • Typen sind in Python also nicht anderes als Klassen

Warum sind Typen wichtig?

Der Datentyp legt fest, wie ein Wert intern repräsentiert wird.

Aus Programmiererersicht am wichtigsten ist, was man mit bestimmten Datentypen machen kann und was nicht. Die Methode upper() des String-Typs wandelt alle Zeichen in Großbuchstaben um.


In [ ]:
'abc'.upper()

upper() in Zusammenhang mit Integern macht dagegen keinen Sinn und führt zu einem Error:


In [ ]:
123.upper()

Auch Operatoren bewirken für unterschiedliche Datentypen Unterschiedliches:


In [ ]:
1 + 1

In [ ]:
'1' + '1'

In [ ]:
'1' + 1 # führt zu TypeError

Typumwandlungen (Casts)

Im letzten Beispiel haben wir gesehen, dass die Addition einen Strings mit einem Integer zu einem Fehler führt. Das können wir bei Bedarf umgehen, indem wir Python anweisen, eine Typumwandlung durchzuführen.


In [ ]:
'1' + str(1)

In [ ]:
int('1') + 1

Natürlich kann aber auch diese Typumwandlung scheitern:


In [ ]:
int('abc')

Operatoren

Mathematische Operatoren

Die mathematischen Operatoren (+, -, *, /, **, %) haben wir oben bereits kennengelernt. Manche sind für nicht-numerische Typen umdefiniert, wie z.B. der Plus-Operator zum Konkatenieren von Strings ('abc' + 'def').

Vergleichsoperatoren

Vergleichsoperatoren werden dazu verwendet, zwei Werte miteinander zu vergleichen.

Man kann z.B. testen, ob zwei Wert gleich sind. Der entsprechende Operator ist == (zwei Istgleich-Zeichen!). Jeder Vergleich liefert einen Wahrheitswert (also True oder False).

123 == 123
True

'Graz' == 'Wien'
False

Natürlich kann man auch berechnete Werte miteinander vergleichen:

100 / 4 == 75 / 3

In [ ]:
# Übung: Lässt sich 3459 durch 7 teilen? 
# Hinweis: eine Zahl ist durch eine andere Zahl teilbar, wenn bei der Division Rest 0 bleibt

Python kennt eine Reihe von Vergleichsoperatoren:

  • == liefert True, wenn beide Werte gleich sind
  • != liefert True, wenn beide Werte ungleich sind
  • < liefert True, wenn der linke Wert kleiner als der rechte Wert ist
  • <= liefert True, wenn der linke Wert kleiner gleich dem rechten Wert ist
  • > liefert True, wenn der linke Wert größer als der rechte Wert ist
  • >= liefert True, wenn der linke Wert größer gleich dem rechten Wert ist

In [ ]:
'abc' != 'def'

In [ ]:
5 > 4

In [ ]:
7 <= 7

In [ ]:
'a' < 'b'

Zusätzlich kann man auf Objektidentität testen. Die entsprechenden Operatoren sind is und is not. Sie liefern nur True wenn beide Werte dasselbe Objekt darstellen. In der Praxis sollten diese beide Operatoren nur für diese Datentypen verwendet werden: bool und None (kommt später noch).


In [ ]:
True is True

In [ ]:
True is False

In [ ]:
5 is None

Variablen

Variablen sind Namen für Werte. (Unter Informatikern hört man öfter, dass Python keine echten Variablen hat, sondern dass man besser den Begriff Name dafür verwenden sollte, wir bleiben aber bei Variable, weil das ein in fast allen Programmiersprachen verwendeter Begriff ist.)

Eine Variable ist also ein Name (den wir selbst festlegen müssen), der auf einen bestimmten Wert zeigt:


In [ ]:
vorname = 'Gunter'
print(vorname)

Dabei können beliebig viele Variablen auf ein und denselben Wert zeigen:


In [ ]:
vorname = 'Wolfgang Amadeus'
firstname = vorname
vorname, firstname

Wir können überprüfen, ob die beiden Variablen wirklich auf denselben Wert zeigen, indem wir die Funktion id() verwenden. Jedes Objekt hat eine eindeutige Id, die mit der Funktion id() ausgelesen werden kann:


In [ ]:
id(vorname), id(firstname)

Weisen wir hingegen zweimal einen (und zwar denselben) Wert zu, zeigen die beiden Variablen auf unterschiedliche Objekte:


In [ ]:
vorname = 'Wolfgang Amadeus'
firstname = 'Wolfgang Amadeus'
id(vorname), id(firstname)

Variablen sind variabel

Wie der Name schon ausdrückt, kann einer Variable zur Laufzeit beliebig oft ein neuer Wert zugewiesen werden (das gilt aber nicht für streng funktionale Sprachen!)


In [ ]:
vorname = 'Wolfgang Amadeus'
vorname

In [ ]:
print(vorname)
vorname = 'Ludwig'
print(vorname)

Variablen und Nicht-Werte

Python kennt einen speziellen Datentyp NoneType, der genau einen Wert annehmen kann: None.


In [ ]:
type(None)

None ist ein Nicht-Wert, der überall dort verwendet wird, wo kein Wert vorhanden ist. Beispielsweise kann eine Variable zunächst mit dem Wert None initialisert werden und erst später im Programmablauf einen anderen Wert bekommen. Will man testen, ob der Wert einer Variable auf None steht, sollte man den is-Operator verwenden:


In [ ]:
firstname = None
firstname is None

Variablen und Datentypen

Weil Variablen (Namen) auf Werte mit bestimmten Datentypen zeigen, sagt man, dass eine Variable einen bestimmten Typ hat. vorname im Beispiel oben ist vom Typ str.


In [ ]:
vorname = 'Gunter'
type(vorname)

Python als dynamisch typisierte Sprache

Anders als bei statisch typisierten Sprache wie C oder Java, wo man den Typ einer Variable beim Initialisieren angeben muss, und diese Variablen den Datentyp während der gesamten Laufzeit beibehält, ist Python eine dynamische Sprache. Das bedeutet, dass einer Variable zur Laufzeit ein neuer Wert mit einem anderen Datentyp zugewiesen werden kann.


In [ ]:
alter = 29
print(alter, type(alter))
alter = 'alt'
print(alter, type(alter))

Python als stark typisierte Sprache

Anders als bei schwach typisierten Sprachen wie z.B. JavaScript, wo sich der Typ eines Wertes zur Laufzeit ändern kann, behält ein Wert während seiner Existenz immer denselben Datentyp. Deshalb spricht man von einer stark aber dynamisch typisierten Sprache.

Auf Variablentyp testen

Da Variablen (nicht Werte!) ihren Typ im Programmablauf ändern können, braucht es manchmal eine Möglichkeit zu testen, ob eine Variable einen bestimmten Typ hat. Dazu dient die Funktion isistance():


In [ ]:
alter = 29
isinstance(alter, int)

In [ ]:
isinstance(alter, str)

Vertiefende Literatur

Ich empfehle ausdrücklich, mindestens eine der folgenden Ressourcen zur Vertiefung zu lesen!