2.5. Einfache Datentypen, Strings und Operatoren#

In Python sind die wichtigsten Datentypen vordefiniert:

  • Ganzzahlen: Integers (int), z.B. 3

  • Gleitkommazahlen: Floats (float), z.B. 3.0

  • Boolesche Wahrheitswerte: Booleans (bool), d.h. True und False

  • Zeichenketten: Strings (str), z.B. "Kafka" oder 'Kafka' (Anführungszeichen!)

  • Listen, Tupel, …. (-> nächste Woche)

Manche davon sind “einfache Datentypen”, das heißt, dass sie nicht weiter unterteilt werden können (Integers, Floats, Booleans). Strings sind dagegen ein “sequentieller Datentyp”. Dazu kommen wir später.

Ähnlich wie bei unserem Beispiel mit der Lampe kann man mit Objekten je nach Datentyp verschiedene Dinge “tun”. Was genau, das besprechen wir in diesem Abschnitt. Neben den typabhängigen Operationen gilt für alle Integer, Floats, Booleans und Strings:

  • Mit der Funktion print() können Objekte auf dem Bildschirm, also zur Ansicht für die Nutzer:innen, ausgegeben werden.

  • Der Datentyp eines Objekts kann mit der Funktion type() abgefragt werden.

  • Um den Datentyp eines Objekts zu ändern, gibt es spezialisierte Funktionen, zum Beispiel int(3.9) konvertiert die Gleitkommazahl 3.9 zur Ganzzahl 3, und float(3) konvertiert die Ganzzahl 3 zur Gleitkommazahl 3.0.

Beispiele:

2 
345682389 
4.6 # Punkt statt Komma!
"4.6"
True
False
"Hello World" # Anführungszeichen!
"Ein ganz langer Satz! Mit mehreren Satzzeichen. Und einer Zahl: 34."
'Ein ganz langer Satz! Mit mehreren Satzzeichen. Und einer Zahl: 34.'

Verständnisfragen

  • Haben 4.6 und “4.6” denselben Datentyp?

  • Welchen Datentyp hat der Satz “Ein ganz langer Satz! … “?

  • Warum wird nur die letzte Zeile aus unserer Codezelle ausgegeben?

# Überprüfen wir es! 
type(4.6)
float
type("4.6")
str
type("Ein ganz langer Satz! Mit mehreren Satzzeichen. Und einer Zahl: 34.")
str
# Typ ändern ("Type conversion")
type(int(4.6))
int

Note

Ein Ausdruck besteht aus Objekten und Operatoren und hat immer einen Typ: den Typ des Werts, zu dem er evaluiert wird (-> siehe “Grundbegriffe”).

2.5.1. Operatoren auf Integers und Floats#

Arithmetische Operatoren sind aus der Schulmathematik bekannt. Es handelt sich dabei um Operatoren wie -, +, *, / sowie % und **. % ist der modulo Operator, damit kann bei einer Division der Rest berechnet werden. ** wird zum Exponieren verwendet.

Beispiele:

5+6 
11
4+5/3
5.666666666666667
# Klammern legen die Reihenfolge fest, in der der Ausdruck evaluiert wird
(4+5)/3 
3.0
50456*4523
228212488

Die Beispiele oben verwenden Integers. Was passiert aber, wenn Integers und Floats in einem Ausdruck kombiniert werden?

Für +, - und * gilt:

  • wenn beide Werte ints sind, ist das Ergebnis ein int

  • wenn einer oder beide Werte floats sind, ist das Ergebnis ein float

Für / gilt:

  • das Ergebnis ist immer ein float

Beispiele:

type(3+5)
int
type(5.0+3)
float
type(5.0*3.0)
float
type(45/5)
float

2.5.2. Logische Operatoren und Vergleichsoperatoren#

Wir haben gesehen, dass Ausdrücke mit arithmetischen Operatoren immer zu einem Zahlwert ausgewertet werden: entweder zu einem Wert vom Typ int oder zu einem Wert vom Typ float. Daneben gibt es Ausdrücke, die immer zu einem Wahrheitswert, also entweder zu True oder zu False, evaluiert werden. Solche Ausdrücke werden mithilfe von logischen Operatoren oder Vergleichsoperatoren gebildet. Diese Operatoren können sowohl auf ints und floats als auch auf strings angewendet werden; allerdings nur so, dass es sinnvoll ist zu fragen, ob die Aussage wahr oder falsch ist (-> Grundbegriffe!).

  • Logische Operatoren und Vergleichsoperatoren ermöglichen es, Werte zu vergleichen und die Richtigkeit einer logischen Aussage zu überpüfen.

Operator

Bedeutung

<

kleiner

>

größer

<=

kleiner oder gleich

>=

größer oder gleich

==

genau gleich

!=

ungleich

not x

wenn x falsch ist, dann True, sonst False

x or y

wenn x wahr ist, x, sonst y

x and y

wenn x falsch ist, x, sonst y

is; is not

feststellen, ob zwei Namen auf dasselbe Objekt verweisen

-5 < -10
False
5 >= 5
True
3 != 5 
True
"Hallo" != "Hello"
True
3 == 3 and 4 == 4
True
3 == 3 or 4 == 5
True
# Vorsicht: Wenn keine logische Aussage überprüft wird, dann werden Werte zurückgegeben 
3 or 5
3
not True == False 
True
True == (not False)
True
"a" < "c"
True
"Eine Rose ist eine Pflanze" == "Eine Rose ist keine Pflanze" 
False
3 == "c"
False
# 3 > "Hallo"

Verständnisfragen

  • Warum wird der Ausdruck 3 == 3 and 4 == 4 zu True evaluiert?

  • Warum wird auch der Ausdruck 3 == 3 or 4 == 5 zu True evaluiert?

  • Was passiert, wenn man fragt, ob ein String “größer” als ein anderer ist?

  • Gebt den Ausdruck aus dem letzten Beispiel in eine neue Codezelle in eurem Jupyter Notebook ein und führt die Zelle aus. Was passiert?

2.5.3. Zugriffsoperatoren und Operationen auf Strings#

Wir haben gesehen, dass der Ausdruck "a" < "c" zu True evaluiert wird und dass es keine Fehlermeldung gibt. Warum ist das so? Um das zu verstehen, müssen wir uns ansehen, was Strings eigentlich genau sind.

Strings sind Zeichenketten, also eine Sequenz von Zeichen. Sie werden deswegen auch als “sequentieller Datentyp” bezeichnet. Sie sind also eigentlich keine einfachen Datentypen. Jedes Zeichen wird im Computer durch eine Zahlenfolge repräsentiert. Wie genau diese Folge aussieht, hängt davon ab, welche Kodierung (Encoding) dazu verwendet wird. Eine der ersten Kodierungen war ASCII, mit der allerdings nur Zeichen aus dem lateinischen Alphabet repräsentiert werden können. Heutzutage gibt es mit Unicode einen international anerkannten Standard-Zeichensatz. Dieser Zeichensatz ordnet nicht nur allen Zeichen im lateinischen Alphabet, sondern allen Zeichen in allen Schriftsprachen und sogar Symbolen wie Emojis einen einzigartigen Zahlenwert zu. Solche Unicode-Zahlenwerte heißen “Codepunkte”. Zeichenketten, die als Unicode-Codepunkte repräsentiert werden, können mithilfe von Kodierungen wie UTF-8 in Zahlenfolgen, die nur aus Nullen und Einsen bestehen (Bytes) umgewandelt werden. In Python 2, also der Python-Version vor der aktuellen Version Python 3, wurden Objekte mit dem Datentyp str per Default in UTF-8, also als Bytes, dargestellt. In Python 3 ist dagegen der Default Unicode: Objekte mit dem Datentyp str behandelt der Computer in Python 3 also als Unicode-Codepunkte. Erst, wenn Strings in einer Datei gespeichert werden, werden die Unicode-Codepunkte mithilfe der Kodierung UTF-8 in eine Folge aus Einsen und Nullen umgewandelt.

Daraus folgt für unser Beispiel: Der Computer wertet den Ausdruck "a" < "c" aus, indem er die Zahlenfolge vergleicht, welche die Zeichen a und b repräsentieren. Unicode-Codepunkte haben die Form U+irgendeine Hexadezimalzahl, also z.B. U+0061 für den Buchstaben a und U+0063 für den Buchstaben c. Als Dezimalzahl ausgedrückt ist 0061 dasselbe wie die Zahl 97 und 0063 dasselbe wie die Zahl 99. Der Computer vergleicht Buchstaben also nicht wie wir “visuell”, sondern er vergleicht die Zahlenfolge, welche für diesen Buchstaben steht. Und weil 0061 bzw. 97 kleiner ist als 0063 bzw. 99, evaluiert er den Ausdruck zu True.

  • Strings sind “case sensitive”: d.h. “Hallo” == “hallo” evaluiert zu False

  • Strings haben eine Länge, die mithilfe der Funktion len() abgefragt werden kann (Achtung: Die Länge unterscheidet sich je nach Encoding; das wird hier diskutiert.)

  • Mithilfe der Funktion ord() kann man einen String in einen Unicode-Codepunkt umwandeln.

  • Jedes Zeichen hat einen Index, über den mithilfe eines Zugriffsoperators auf einzelne Zeichen zugegriffen werden kann. Für den Zugriff auf ein Zeichen werden eckige Klammern mit dem Index des Zeichens verwendet: [Index]. Für den Zugriff auf eine Teilsequenz werden eckige Klammern mit einem Start- und einem Stoppindex sowie einer Schrittgröße verwendet: [Startindex:Stoppindex:Schritt].

  • Strings können mithilfe des Konkatenations-Operators + mit anderen Strings verkettet werden.

  • Strings oder Untersequenzen von Strings können mithilfe des Multiplikationsoperators * vervielfacht werden.

  • Mithilfe den sogenannten Mitgliedschafts-Operatoren in und not in kann überprüft werden, ob ein String eine Untersequenz enthält.

  • Ein leerer String ist False, d.h. not "" wird zu False evaluiert.

# Strings verketten 
"Hallo" + " " + "Welt"
'Hallo Welt'
# Strings vervielfachen 

"Hallo"*2
'HalloHallo'
# Prüfen, ob ein String eine Zeichenfolge enthält 

"o" in "Hallo"
True
# Leerer String ist False

not ""
True
# Das hier ist eine Variable (-> lernen wir gleich)
wort = "Hallo"
# Zugriff auf das erste Zeichen mit dem Zugriffsoperator []
wort[0] 
'H'
# Zugriff auf die ersten drei Zeichen mit dem Slicing-Operator [::]
wort[2:4:1]
'll'

Zeichenketten kann man natürlich nicht nur untereinander vergleichen und auf einzelne Zeichen zugreifen, sondern es gibt eine ganze Reihe von Operationen, die darüberhinaus für Strings vordefiniert sind, ganz ähnlich wie in unserem Beispiel mit der Lampe, die man ein- und ausschalten kann. Man kann zum Beispiel alle Zeichen in einem String in Kleinbuchstaben umwandeln, oder den ersten Buchstaben zu einem Großbuchstaben machen. Solche speziellen Operationen, die nur für Objekte vom Typ String definiert sind, heißen Methoden, und Methoden sind eine Art von Funktionen. Was das ist, lernen wir also noch. Ein Überblick über alle Operationen, die speziell für Objekte vom Typ String definiert sind, findet ihr hier: https://docs.python.org/3/library/stdtypes.html#string-methods.

Klasse str Objekt vom Typ str



Beispiele:

# Methode capitalize()

wort.capitalize()
'Hallo'
# Methode lower()

wort.lower()
'hallo'
# Wo sind unsere Änderungen? (-> nächstes Kapitel!)
print(wort)
Hallo
# Methode islower()

wort.islower()
False

2.5.4. Zuweisungsoperatoren#

Außerdem gibt es Zuweisungsoperatoren wie = und +=, die im Zusammenhang mit Variablen verwendet werden (-> nächstes Kapitel!).

2.5.5. Auswertungsreihenfolge der Operatoren#

In Python gibt es eine feste Reihenfolge, in der Operatoren in einem Ausdruck ausgewertet werden. Diese Rangfolge bzw. Präzedenzregeln heißen auf Englisch Operator Precedence (zum Nachgoogeln). Die folgende Tabelle listet die bisher bekannten Operatoren nach Auswertungspriorität:

Rang

Operator

1

() Klammern

2

x[Index], x[index:index:schritt], funktion(x), x.attribut

3

**

4

*, /, %

5

+, -

6

in, not in, is, is not, <, <=, >, >=, !=, ==

7

not x

8

and

9

or

10

=, +=, -=, *=, /=

Note

Wenn zwei Operatoren in einem Ausdruck denselben Rang haben und einen Operanden teilen, wird der Ausdruck nach der sogenannten Assoziativität der Operatoren ausgewertet: wenn ein Operator linksassoziativ ist, dann heißt dass, dass ein Ausdruck von links nach rechts ausgewertet wird. Wenn ein Operator rechtsassoziativ ist, wird ein Ausdruck von rechts nach links ausgewertet. Daneben gibt es auch Operatoren, die nicht assoziativ sind. Als Daumenregel könnt ihr euch merken: Die meisten Operatoren in Python sind linksassoziativ, außer der Potenzierungsoperator ** (rechtsassoziativ) und die Vergleichsoperatoren <, <=, >, >=, ==, != (nicht assoziativ).

Linksassoziatitvität: ((4+5)+6)+1 = (9+6)+1 = 15+1 = 16

Rechtsassoziativität: 3**(4**5) = 3**1024 = eine sehr lange Zahl

Keine Assoziativität: 4 < 5 < 6 = 4 < 5 and 5 < 6

2.5.6. Quellen#

  1. Ana Bell. What is Computation? 2016. URL: https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/resources/lecture-1-what-is-computation/.

  2. Ana Bell. String Manipulation, Guess and Check, Approximations, Bisection. 2016. URL: https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/resources/lecture-3-string-manipulation-guess-and-check-approximations-bisection/.

  3. Sanket Gupta. A Guide to Unicode, UTF-8 and Strings in Python. 2019. URL: https://towardsdatascience.com/a-guide-to-unicode-utf-8-and-strings-in-python-757a232db95c.

  4. Meik Hellmund. Folien zur Vorlesung "Wissenschaftliches Programmieren in Python", Universität Leipzig. 2019. URL: https://www.math.uni-leipzig.de/~hellmund/teaching/python.html.

  5. David Lukes. How Computers Handle Text: A Gentle but Thorough Introduction to Unicode. 2016. URL: https://dlukes.github.io/unicode.html.

  6. Wikipedia. List of Unicode Characters. URL: https://en.wikipedia.org/wiki/List_of_Unicode_characters.

  7. Python 3.11.3 Documentation. Built-in Types. URL: https://docs.python.org/3/library/stdtypes.html.

  8. Python 3.11.3 Documentation. Common Sequence Operations. URL: https://docs.python.org/3/library/stdtypes.html?highlight=class%20str#common-sequence-operations.

  9. Python 3.11.3 Documentation. Fancier Output Formatting: Formatted String Literals. URL: https://docs.python.org/3/tutorial/inputoutput.html#formatted-string-literals.

  10. Python 3.11.3 Documentation. Glossary: Text Encoding. URL: https://docs.python.org/3/glossary.html#term-text-encoding.

  11. Python 3.11.3 Documentation. Operator Precedence. URL: https://docs.python.org/3/reference/expressions.html#operator-precedence.

  12. Python 3.11.3 Documentation. Standard Encodings. URL: https://docs.python.org/3/library/codecs.html#standard-encodings.

  13. Python 3.11.3 Documentation. String Methods. URL: https://docs.python.org/3/library/stdtypes.html#string-methods.