Vorlesungsskript 07

Objekte und Literale

Computer rechnen für uns und verarbeiten alle möglichen Daten. Dafür müssen die Daten natürlich im Speicher des Computers irgendwie repräsentiert werden. Das geschieht auf die eine oder andere Weise immer mit Folgen von Nullen und Einsen. Zum Beispiel wird die Zahl 42 wie folgt im Speicher abgelegt:

00101010
Und die Zeichenfolge Hello, world! wie folgt:
01001000 01100101 01101100 01101100 01101111 00101100 00100000
01110111 01101111 01110010 01101100 01100100 00100001

Eine wichtige Aufgabe von Programmiersprachen wie Python ist es, zwischen diesem Wust von Nullen und Einsen und einer für Menschen lesbaren Form zu übersetzen. Wir können das ausprobieren, indem wir von der Shell aus den Python-Interpreter im interaktiven Modus starten und die obigen Beispieldaten eingeben:

$ python3
>>> 42
42
>>> 'Hello, world!'
'Hello, world!'

Wenn wir zum Beispiel 42 eingeben, erstellt Python im Arbeitsspeicher eine computerfreundliche Repräsentation dieser Zahl (so etwas wie 00101010) übersetzt diese anschließend zurück in die menschenfreundliche Form 42 und gibt diese aus. Ähnliches passiert, wenn wir eine Zeichenfolge (in Anführungszeichen) eingeben.

42 und 'Hello, world!' sind in Python so genannte Literale (engl.: literals). Literale werden von Python automatisch in Werte (engl. values) übersetzt, also Stückchen von Daten, die im Arbeitsspeicher abgelegt werden. Zu Werten sagen wir auch Objekte (engl. objects). Manche Programmiersprachen unterscheiden zwischen Werten und Objekten, aber in Python sind die Begriffe austauschbar.

Ab sofort sagen wir auch so Sachen wie: „das Objekt 42“ oder „das Objekt 'Hello, world!'“. Gemeint sind damit die Objekte, in die Python die jeweiligen Literale übersetzt.

Es gibt verschiedene Typen (engl.: types) von Objekten, auch genannt Datentypen (engl. data types). Jeder Typ hat einen bestimmten Namen in Python. 42 ist zum Beispiel eine Ganzzahl (engl.: integer), und der Typ dafür heißt int. 'Hello, world!' ist eine Abfolge von Buchstaben und anderen Zeichen, fachsprachlich eine Zeichenkette (engl. string), und der Typ dafür heißt str. Hier ist eine Übersicht über die wichtigsten Datentypen in Python:

Typname Beschreibung (deutsch) Beschreibung (englisch) Beispiel-Literale
int Ganzzahl integer 42, 1, 0, -2, 0b101010, 0o52, 0x2a
float Gleitkommazahl floating-point number 2.5, 3.141592653589793, 10.0, 0.01
str Zeichenkette string 'Hello, world!', '你好', '42', ''
bool Boole’scher Wert boolean True, False
NoneType None None None
list Liste list [42, 'Hello, world!', 2.5], [1, 2, 3, 4], []
dict Dictionary dictionary {'a': 1, 'b': 2, 'c': 3}, {}, {'dog': 1, 2: 'cat'}

Ganzzahlen

int-Literale werden normalerweise ganz normal im Zehnersystem geschrieben. Mit den Vorsätzen 0b, 0o und 0x können sie aber auch im Zweier-, Achter- oder Sechzehnersystem geschrieben werden. Mit einem Minuszeichen davor lassen sich negative Zahlen schreiben. Python beherrscht Ganzzahlen mit unbegrenzt großem Betrag, auch Zahlen mit absurd vielen Stellen wie 10000000000000000000000000000000000000000000000000000 sind also möglich.

Gleitkommzahlen

Zu Gleitkommazahlen gäbe es viel zu sagen, aber wir beschränken uns hier auf ein paar kurze Hinweise. Gleitkommazahlen ermöglichen es, reelle Zahlen darzustellen, allerdings nur näherungsweise, da manche reellen Zahlen unendlich viele Nachkommastellen haben und natürlich nur eine gewisse Anzahl von Nachkommastellen im Arbeitsspeicher gespeichert werden kann. Daher treten beim Rechnen mit Gleitkommazahlen unvermeidlich manchmal Rundungsfehler auf.

float-Literale werden wie Dezimalbrüche geschrieben, allerdings wie im englischsprachigen Raum üblich mit einem Punkt und nicht mit einen Komma. Es kann auch die Exponenzialschreibweise verwendet werden. Das ist in Python für sehr kleine und sehr große Gleitkommazahlen die Standard-Darstellung, sodass die Ausgabe ggf. in einer anderen Form zurückkommt als die Eingabe:

>>> 0.0001
0.0001
>>> 0.00001
1e-05
>>> 1000000000000000.0
1000000000000000.0
>>> 10000000000000000.0
1e+16

Strings

Strings sind in der Computerlinguistik von besonderer Bedeutung, da mit ihnen u.a. natürliche Sprache dargestellt wird. String-Literale beginnen und enden jeweils mit einem Anführungszeichen. Diese Anführungszeichen gehören nicht zum eigentlichen String, sondern sie dienen dazu, dass Python weiß, wo ein String aufhört und wo endet. Wenn man tatsächlich ein Anführungszeichen in einem String haben will, muss man aufpassen, dass Python nicht denkt, dass der String da endet. Dafür gibt es verschiedene Tricks. Nehmen wir als Beispiel den Satz Don't do it, in dem als Apostroph dasselbe Zeichen verwendet wurde, dass wir auch als einfaches Anführungszeichen verwenden, um Python-Strings zu begrenzen. Wie machen wir aus diesem Satz ein String-Literal?

Zum einen ist es Python egal, ob wir zum Begrenzen von String-Literalen einfache oder doppelte Anführungszeichen verwenden, solange am Anfang und am Ende das gleiche Anführungszeichen steht. Wir können in diesem Fall also einfach doppelte Anführungszeichen verwenden, sodass das einfache in dem String Python nicht durcheinanderbringt:

>>> "Don't do it"
"Don't do it"

Entsprechend können wir in einem von einfachen Anführungszeichen begrenzten String-Literal problemlos doppelte verwenden:

>>> '"Hold it", she said.'
'"Hold it", she said.'

Wenn wir in einem String sowohl einfache als auch doppelte Anführungszeichen verwenden wollen, müssen wir tiefer in die Trickkiste greifen. Nehmen wir als Beispiel diesen Satz: "Don't do it", she said. Zur Begrenzung unseres String-Literals wählen wir einfache Anführungszeichen. Dann müssen wir das Zeichen, dass in dem Satz als Apostroph erscheint, maskieren (engl.: to escape), indem wir einen Backslash davorsetzen. Hierdurch verliert es seine spezielle Funktion, das String-Literal zu beenden:

>>> '"Don\'t do it", she said.'
'"Don\'t do it", she said.'

Eine andere Möglichkeit ist es, den String durch dreifache einfache oder dreifache doppelte Anführungszeichen zu begrenzen:

>>> '''"Don't do it", she said.'''
'"Don\'t do it", she said.'

Ob Sie einfache, doppelte, dreifache einfache oder dreifache doppelte Anführungszeichen als Begrenzungszeichen verwenden, spielt für das im Arbeitsspeicher erzeugte Objekt keine Rolle. Wie Sie an den beiden vorhergehenden Beispielen sehen, hat es auch keinen Einfluss darauf, wie das Objekt in Pythons Antwort dargestellt wird.

Neben \' und \" gibt es noch einige weitere Escape-Sequenzen (engl. escape sequences), bestehend aus einem Backslash und einem weiteren Zeichen, die automatisch zu anderen Zeichen umgewandelt werden, wenn sie in einem String-Literal vorkommen. Hier ist eine Übersicht über die wichtigsten:

Escape-Sequenz Wird umgewandelt zu…
\' '
\" "
\\ \
\n einem Newline-Zeichen.
\t einem Tabulator-Zeichen.

Boole’sche Werte

Es gibt nur zwei verschiedene Objekte mit dem Typ bool: True und False. Sie sind immer dann wichtig, wenn Programme Entscheidungen treffen müssen. Wir kommen darauf zurück.

None

Es gibt nur ein Objekt mit dem Typ NoneType: None. Dieses Objekt steht für fehlende oder nicht definierte Objekte. Anders ausgedrückt, es wird als Platzhalter verwendet, wenn irgendwo ein Objekt erwartet wird, aber keins vorhanden ist. Wir kommen auch darauf zurück.

Listen

Listen sind ein so genannter Sammeldatentyp, da Listen wiederum andere Objekte enthalten können. Diese werden die Elemente der Liste genannt. Wie die Beispiele oben zeigen, können diese Objekte jedweden Typs sein. Auch verschiedene Typen innerhalb einer Liste sind in Python erlaubt, im Gegensatz zu vielen anderen Programmiersprachen. Listen-Literale werden von eckigen Klammern umschlossen, und die Elemente stehen dazwischen, durch Kommata getrennt, z.B.: ['Mia', 'Peter', 'Lucy']. Listen können beliebig viele Elemente haben. Sie können auch leer sein. Das Literal, das eine leere Liste erzeugt, sieht so aus: [].

Dictionarys

Dictionarys sind ein weiterer wichtiger Sammeldatentyp. Sie ermöglichen es, bestimmten Objekten andere Objekte zuzuordnen. Die Objekte, denen etwas zugeordnet wird, heißen Schlüssel (engl. keys) und die Objekte, die ihnen zugeordnet werden, heißen Werte (engl. values). Ein Anwendungsbeispiel ist ein Telefonbuch: es dient dazu, Personen Telefonnummern zuzuordnen. Die Schlüssel wären hier also die Namen der Personen, und die Werte wären ihre Telefonnummern. Als Python-Dictionary geschrieben könnte ein Telefonbuch so aussehen:

{'Mia': '0162-8010112',
 'Peter': '00316-19555386',
 'Lucy': '0172-5948130'}

Wie das Beispiel zeigt, werden Dictionary-Literale von geschweiften Klammern begrenzt, darin stehen die Schlüssel-Wert-Paare durch Kommata getrennt; zwischen Schlüssel und Wert steht jeweils ein Doppelpunkt. So wie es leere Listen gibt, gibt es auch leere Dictionarys. Das Literal dazu: {}.