Unit 1: Variablen und Datentypen

Ausgabe mit print

In [47]:
print(1+1)
print('Hallo')
2
Hallo

Variablen und Datentypen

Atomare Datentypen

In [48]:
my_number_integer = 1
my_number_float = 1.2345
my_boolean_value_1 = True
my_boolean_value_2 = False
In [49]:
# Arithmetrische Operatoren
a = 1
b = 2 
c = 3

# Grundrechenarten
d = a + b
e = c - a
f = b * e
g = f / b

print(d)
print(e)
print(f)
print(g)
3
2
4
2.0

Achtung: Seit Python 3.0 ist die Standard-Division eine Gleitkommadivision, 5 / 2 ist also 2.5. In früheren Versionen wurde wurde standardmäßig eine ganzzahlige Division durchgeführt, also 5/2 = 2 (Rest 1).

In [50]:
# Potenzfunktionen
h = 2 ** 7  # 2^7 = 128
print(h)

# Wurzeln, Logarithmen etc. werden später behandelt.
128
In [51]:
# Weitere wichtige Operatoren
# Ganzzahlige Division

a = 5
b = 2
print(a // b)
2
In [52]:
# Modulo / Divisionsrest
# Tip 1: Nützlich, um zu prüfen, ob eine Zahl gerade ist.
# Tip 2: Auch nützlich, wenn man den Wertebereich einer Zahl begrenzen will.
print(a % b)
1
In [53]:
# Logische Operatoren
a = True
b = False

print(a and b)
print(a or b)
print(not a)
# Ersatz für XOR, nicht ganz unproblematisch
print(a != b)
False
True
False
True
In [54]:
# Vergleichsoperatoren
# Der Ergebniswert ist immer Boolean.
a = 90
b = 60
c = 60
print(a < b)
print(a > b)
print(a < a)
print(a <= a)
print(a >= a)
# Achtung: Wertevergleich oder Identitätsvergleich?
print(a == a)
print(b != c)
False
True
False
True
True
True
False

Komplexe Datentypen

Als komplexe Datentypen bezeichnet man solche, die eine adressierbare Struktur an Unterelementen haben.

Zeichenketten

In [55]:
# Zeichenkette
my_string_1 = 'UniBwM'
my_string_2 = "UniBwM"

# Die Wahl zwischen einfachen und doppelten Anführungszeichen erlaubt es elegant, 
# die jeweils andere Form innerhalb der Zeichenkette zu verwenden:
my_string_3 = "Die Abkürzung für unsere Universität lautet 'UniBwM'."
my_string_3 = 'Die Abkürzung für unsere Universität lautet "UniBwM".'

# Mehrzeilige Zeichenketten erfordern DREI Anführungszeichen:
my_long_string_1 = """Herr von Ribbeck auf Ribbeck im Havelland,
Ein Birnbaum in seinem Garten stand,
Und kam die goldene Herbsteszeit,
Und die Birnen leuchteten weit und breit,
Da stopfte, wenn’s Mittag vom Thurme scholl,
Der von Ribbeck sich beide Taschen voll,
Und kam in Pantinen ein Junge daher,
So rief er: 'Junge, wist’ ne Beer?'
Und kam ein Mädel, so rief er: 'Lütt Dirn'
Kumm man röwer, ick hebb’ ne Birn."""

my_long_string_2 = '''Herr von Ribbeck auf Ribbeck im Havelland,
Ein Birnbaum in seinem Garten stand,
Und kam die goldene Herbsteszeit,
Und die Birnen leuchteten weit und breit,
Da stopfte, wenn’s Mittag vom Thurme scholl,
Der von Ribbeck sich beide Taschen voll,
Und kam in Pantinen ein Junge daher,
So rief er: "Junge, wist’ ne Beer?"
Und kam ein Mädel, so rief er: "Lütt Dirn"
Kumm man röwer, ick hebb’ ne Birn.'''
In [ ]:
# Häufige Operationen mit Zeichenketten
# Addition
print('Ich studiere an der ' + my_string_1)
# Multiplikation
print('ABCD' * 3)
# Länge ermitteln
print(len(my_string))
In [74]:
# Umwandlung einer Zahl in eine Zeichenkette
a = 42
a_string = str(a)

# Was ist hier der Unterschied?
print(a * 2)
print(a_string * 2)
84
4242

Listen

Listen sind komplexe Variablen aus mehreren Unterelementen beliebigen Typs. Die Unterelemente können einzeln adressiert und auch geändert werden.

In [56]:
# Liste
my_list = [1, 2, 5, 9]
my_list_mixed = [1, True, 'UniBwM']
In [57]:
# Listenelemente können einzeln adressiert werden.
# Das erste Element hat den Index 0:
print(my_list[0])
print(my_list[1])
print(my_list[2])
1
2
5
In [58]:
# Sie können auch einzeln geändert werden:
my_list_mixed[2] = 'LMU München'
print(my_list_mixed)
[1, True, 'LMU München']
In [59]:
# Man kann auch Bereiche adressieren:
my_list = ['one', 'two', 'three', 'four', 'five']

# Alle ab dem zweiten Element
print(my_list[1:])
# Alle bis zum zweiten Element
print(my_list[:2])
# Alle vom zweiten bis zum dritten Element
print(my_list[1:3])
# Alle ohne die letzten beiden
print(my_list[:-2])
['two', 'three', 'four', 'five']
['one', 'two']
['two', 'three']
['one', 'two', 'three']
In [60]:
# Man kann auch Bereiche einer Liste ändern oder die Liste dadurch verkürzen oder verlängern:
my_list[1:3] = ['zwei', 'drei']
print(my_list)
['one', 'zwei', 'drei', 'four', 'five']
In [61]:
my_list = ['one', 'two', 'three', 'four', 'five']
my_list[0:2] = ['one_and_two']
print(my_list)
['one_and_two', 'three', 'four', 'five']
In [62]:
# Achtung: Wenn man einen ListenBEREICH ändert, muss man eine Liste übergeben. 
my_list = ['one', 'two', 'three', 'four', 'five']
my_list[0:2] = ['one_and_two']
print(my_list)
['one_and_two', 'three', 'four', 'five']
In [63]:
# Sonst Versucht python, den Wert als Liste seiner Unterelemente zu verstehen.
my_list = ['one', 'two', 'three', 'four', 'five']
my_list[0:2] = ['ABC']
print(my_list)
['ABC', 'three', 'four', 'five']
In [64]:
# Wenn man ein Listenelement ändert, muss man ein Element übergeben
my_list = ['one', 'two', 'three', 'four', 'five']
my_list[2] = 'drei'
print(my_list)
['one', 'two', 'drei', 'four', 'five']
In [65]:
# Wenn man an einer Position MEHRE neue Elemente einfügen will, 
# muss man diese Position als Bereich der Länge 1 adressieren.

my_list = ['one', 'two', 'three', 'four', 'five']
my_list[2:3] = ['drei_a', 'drei_b']
print(my_list)
['one', 'two', 'drei_a', 'drei_b', 'four', 'five']
In [66]:
# Sonst würde an dieser Stelle eine Liste als Element eingefügt:
my_list = ['one', 'two', 'three', 'four', 'five']
my_list[2] = ['drei_a', 'drei_b']
print(my_list)
['one', 'two', ['drei_a', 'drei_b'], 'four', 'five']
In [75]:
# Listen: append()
my_list = ['one', 'two']
my_list.append('three')
print(my_list)
['one', 'two', 'three']
In [76]:
# Listen: extend()
my_list = ['one', 'two']
my_list.extend(['three', 'four'])
print(my_list)
['one', 'two', 'three', 'four']
In [77]:
# Kontrollfrage:
# Was passiert, wenn Sie der Methode 'append' eine LISTE als Parameter übergeben?
my_list = ['one', 'two']
my_list.append(['three', 'four'])
print(my_list)
['one', 'two', ['three', 'four']]
In [78]:
# Kontrollfrage:
# Was passiert, wenn Sie der Methode 'extend' einen einzelnen Wert als Parameter übergeben?
my_list = ['one', 'two']
my_list.extend('three')
print(my_list)
['one', 'two', 't', 'h', 'r', 'e', 'e']
In [80]:
# Wenn eine atomare Variable übergeben wird, gibt es eine Fehlermeldung:
my_list = ['one', 'two']
my_list.extend(1)
print(my_list)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-80-3d035bd9e185> in <module>()
      1 # Wenn eine atomare Variable übergeben wird, gibt es eine Fehlermeldung:
      2 my_list = ['one', 'two']
----> 3 my_list.extend(1)
      4 print(my_list)

TypeError: 'int' object is not iterable
In [85]:
# Man kann Listen einfach sortieren:
my_list = [1, 6, 5, 3, 2, 4]
my_list.sort()
print(my_list)
[1, 2, 3, 4, 5, 6]
In [86]:
# Das geht auch mit inverser Sortierfolge:
my_list = [1, 6, 5, 3, 2, 4]
my_list.sort(reverse=True)
print(my_list)
[6, 5, 4, 3, 2, 1]

Tuples

In [67]:
# Tuple
my_tuple = (1, 3, 9)
my_tuple_mixed = (1, True, 'UniBwM')

latitude = 48.0803
longitude = 11.6382
geo_position = (latitude, longitude)
In [68]:
# Entpacken
lat, lon = geo_position
print(lat)
48.0803
In [69]:
# Auch die Elemente eines Tuples können einzeln adressiert werden:
print(geo_position[0])
48.0803
In [70]:
# Die Unterelemente eines Tuples können aber nicht geändert werden:
geo_position[0] = 44.123
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-70-e1df6d09a57a> in <module>()
      1 # Die Unterelemente eines Tuples können aber nicht geändert werden:
----> 2 geo_position[0] = 44.123

TypeError: 'tuple' object does not support item assignment

Dictionaries

In [ ]:
my_dict = {'name' : 'Martin Hepp', 'fakultaet' : 'WOW', 'geburtsjahr' : 1971}
print(my_dict['name'])
print(my_dict['fakultaet'])
In [ ]:
# Elemente können geändert und hinzugefügt werden
my_dict['fakultaet'] = 'INF'
my_dict['lieblingsvorlesung'] = 'Programmierung in Python'
In [ ]:
# Wenn es den Schlüssel ('key') nicht gibt, wird eine Fehlermeldung produziert:
print(my_dict['einkommen'])
In [ ]:
# Das kann man mit der Methode get vermeiden:
print(my_dict.get('einkommen'))
In [ ]:
# Man kann auch einen Default-Wert vorgeben (normalerweise None):
print(my_dict.get('einkommen', 'Unbekannt'))
print(my_dict.get('einkommen', 0))

Mengen

In [81]:
a = set(['rot', 'gruen', 'blau', 'gelb'])
print(a)
{'rot', 'gruen', 'blau', 'gelb'}
In [82]:
a = 'Dies ist eine Zeichenkette.'
# Nun schauen wir, welche Buchstaben hierin vorkommen.
zeichenvorrat = set(a)
print(zeichenvorrat)
{' ', 'i', 'D', 's', '.', 'Z', 'k', 'e', 'c', 't', 'n', 'h'}
In [15]:
# Python 3.6 Type Annotations, PEP 526
# http://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html
# https://www.python.org/dev/peps/pep-0526/
a: int = 1
b: int
b = 2
print(a)
print(b)

from typing import List, Set, Dict, Tuple, Text, Optional, AnyStr
my_list: List[int] = []
my_list.append(1)
print(my_list)

def test(number: int) -> float:
    return float(number)

print(test(1))
print(type(test(1)))
1
2
[1]
1.0
<class 'float'>
In [ ]: