Sie sind auf Seite 1von 103

Konzepte des

scriptsprachenorientierten
Programmierens
Prof. Dr. Manuel Mayer

Teil 2
© FOM Hochschule für Oekonomie & Management
gemeinnützige Gesellschaft mbH (FOM), Leimkugelstraße 6, 45141 Essen

Dieses Werk ist urheberrechtlich geschützt und nur für den persönlichen Gebrauch im Rahmen der Veranstaltungen der FOM
bestimmt.
Die durch die Urheberschaft begründeten Rechte (u.a. Vervielfältigung, Verbreitung, Übersetzung, Nachdruck) bleiben dem
Urheber vorbehalten.
Das Werk oder Teile daraus dürfen nicht ohne schriftliche Genehmigung der FOM reproduziert oder unter Verwendung
elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden.
Dank geht an Dr.-Ing. M. B. Endejan für die Inspiration und teilweise inhaltliche Übernahme des Skripts.

2
Aufgabe der Vorlesungen
Die Vorlesungen und themenbezogenen Diskussionen dienen der
Erläuterung von Konzepten, Techniken, Methoden und Hintergründen. Sie
sollen zu den Übungen hinführen und zum Erkenntnisgewinn beitragen.

Übungen
Im Wechsel zwischen Vorlesung und Übung sollen die theoretisch
behandelten Inhalte praktisch umgesetzt werden. In den Übungen soll
umfangreich Gelegenheit bestehen, Probleme aufzudecken und sie zu
lösen. Es wird mit Nachdruck eine veranstaltungsbegleitende Eigenarbeit
mit weiterführenden und vertiefenden Übungen empfohlen.
3
https://xkcd.com/835/

0b111. Datentypen (Teil 1)


Datentypen in Python

☑‍

☑‍

5
Numerische Datentypen

v int Ganze Zahlen

v float Gleitkommazahlen

v complex Komplexe Zahlen

Typumwandlungen: int(), float(), complex()

Vergleiche: >, <, >>=, <<= ist bei komplexen Zahlen nicht definiert.

6
Integer (int)
v Für positive und negative Ganzzahlen

v Der Wertebereich von int ist nicht eingeschränkt.

v Der notwendige Speicherplatz passt sich automatisch an.

v Präfixnotation für alternative Zahlensysteme:

v 0x: Hexadezimalsystem, z. B. 0x2d

v 0o: Oktalsystem, z. B. 0o460

v 0b: Binärsystem, z. B. 0x110011

7
Denksport

v Gegeben sei die Integerzahl x = -7.

v Die bitweise Negation (~x) negiert alle Bits.

Frage 1: Welchen Wert erhalten wir durch die bitweise Negation?

Frage 2: Warum erhalten wir diesen Wert?

8
Denksport (II)

v Gegeben seien die Integerzahlen x = 3 und y = 5.

v Tauschen Sie Inhalte der Variablen, sodass am Ende x = 5 und y = 3 gilt.

v Bedingung: Es darf keine weitere Variable zu Hilfe genommen werden.

v Anmerkung: Die Variableninhalte 3 und 5 sind beispielhaft. Es wird eine


generische Lösung gesucht.

v Tipp: Wagen Sie einen Blick auf die Bit-Operatoren &, |, ^, >>, << bzw.
^=, |=, ^=, <<=, >>=

v Pro: Gibt es in Python eine weitere Möglichkeit?


9
Gleitkommazahlen (float)
v Für reelle bzw. Gleitkommazahlen

v Nutzt die doppelte Genauigkeit (aka double in C)

v Mathematische Schreibweise ist erlaubt, z. B. 4e12 oder 3.14e-12

v Der Wertebereich ist eingeschränkt (siehe Anzahl der Bits des Exponenten)

v Bei Über-/Unterschreitung wird die Zahl als inf bzw. –inf gespeichert.

v Die Genauigkeit ist eingeschränkt (siehe Anzahl der Bits der Mantisse)

v Für beliebig genaue, vom Benutzer definierbare Dezimalzahlen bietet


Python das Modul decimal: https://docs.python.org/3/library/decimal.html

10
Ein paar Beispiele...

11
Komplexe Zahlen (complex)
v Zur Speicherung und Verarbeitung komplexer Zahlen

v Die Vergleichsoperatoren <, <<=, >>=, > sind bei komplexen Zahlen
nicht definiert.

v Eine komplexe Zahl besitzt 2 Attribute, real und imag.

Eine komplexe Zahl besteht aus einem Realteil (𝑎)

und einem Imaginärteil (𝑏), wobei der Imaginärteil

mit einer imaginären Einheit 𝑗 multipliziert wird:

𝑐 = 𝑎 + 𝑏𝑗, Eigenschaft von 𝑗: 𝑗 ! = −1


12
Sequentielle Datentypen

v str Sequenz von Buchstaben (Zeichenketten), immutable

v list Sequenz beliebiger Instanzen, mutable

v tuple Sequenz beliebiger Instanzen, immutable

v bytes Sequenz von Binärdaten/Bytes, immutable

v bytearray Sequenz von Binärdaten/Bytes, mutable

Die Elemente einer Sequenz weisen eine definierte Reihenfolge auf.

Der Zugriff ist über einen eindeutigen Index möglich.


13
Allgemeine Operatoren und Funktionen
sequentieller Datentypen

Mitgliedschaft: Arithmetik und Zuweisung:


o x in s o s + t
o x not in s o s += t
o s.count(x) o s * n
o s.index(x[, i[, j]]) o s *= n

Allgemein: Slicing:
o len(s) o s[i]
o max(s) o s[i:j]
o min(s) o s[i:j:k]
s,t: Sequenzen gleichen Typs. n,i,j,k: ganze Zahlen. x: beliebiges Objekt 14
Mitgliedschaft

15
Arithmetik und Zuweisung

16
Allgemein

17
Slicing

sequence[from, to, step]

Beispiel String:

Frage: Welchen Teilstring ergibt txt[-4:-1]?


18
Strings (Zeichenketten)

v Sind nicht veränderbar (immutable)

v Einfache oder doppelte Anführungszeichen

v Dreifache Anführungszeichen erlauben mehrzeilige Strings

v Erzeugung über str()

v str() nutzt die spezielle Methode* __str__() einer Klasse, um eine String-

Repräsentation eines Objektes zu erzeugen.

v Falls __str__() nicht definiert wurde, wird die generische __repr__()-Funktion

verwendet, um eine String-Repräsentation zu erzeugen..

* später mehr zu special methods 19


Escape-Sequenzen

Bestimmte Zeichen müssen in einem String escaped werden.

Escape-Sequenz Ausgabe
\\ Backslash
\’ Einfaches Anführungszeichen
\” Doppeltes Anführungszeichen
\b ASCII-Backspace
\n und \r Neue Zeile (newline und return)
\t Tabulator (tab)
\u12af Unicode 16 Bit
\U12af89bc Unicode 32 Bit
\N{SNAKE} Unicode-Zeichen
\o84 Oktales Zeichen
\xFF Hexadezimales Zeichen
20
Ein paar Beispiele...

Möchte man Escape-Sequenzen vermeiden, kann auch sogenannte Raw-Strings verwenden.

Diese werden primär für reguläre Ausdrücke* und Windows-Pfade genutzt.

* kommt noch 21
Zeichenketten formatieren

v Oft will man Werte anderer Variablen


in eine Zeichenkette einbauen. Ein
Weg, dies zu erreichen, ist die String-
Formatierung.

v Dabei kommen Platzhalter zum Einsatz,


die von .format befüllt werden:

v Es können auch Nicht-String-Objekte


verwendet werden. Ebenso sind bspw.
positionelle Argumente oder der Key
eines Wörterbuchs möglich.
22
Zeichenketten formatieren (hardcore)

v Es gibt eine Vielzahl weiterer Formatierungsoptionen:

:[[fill]align][sign][#][0][width][grouping_option][.precision][type]

Feld Bedeutung
fill Füllzeichen (Default: Leerzeichen)
align Ausrichtung: < linksbündig, > rechtsbündig, ^ zentriert, = Padding nach
Vorzeichen
sign + Vorzeichen immer, - Vorzeichen nur bei negativen Zahlen, “ “ (Leerzeichen):
bei positiven Zahlen einrücken, bei negativen Zahlen Vorzeichen
# Kennzeichnung des Zahlensystems (0x, 0o, 0b)

0 ”Zero-Padding”, mit Nullen auffüllen


width Minimale Feldgröße
grouping_option , Komma als Tausendertrennzeichen, _ Unterstrich als Tausendertrennzeichen

.precision Numerisch: Nachkommastellen, nicht numerisch: max. Länge


type Zahlenformat (siehe nächste Tabellen) oder s (String)
23
Zahlenformate bei der String-Formatierung

Integer-Typen Bedeutung
b Binär
c Konvertiere zu Unicode-Zeichen
d Dezimal (Standard)
n Dezimal mit regionalen Trennzeichen (locale-specific)
o Oktal
x Hexadezimal (lowercase/klein)
X Hexadezimal (uppercase/groß)

24
Ein paar Beispiele...

25
Für die Geeks: %-Operator

v C-Programmierer vermissen vielleicht die printf-Syntax.

v Kein Problem, der %-Operator verhält sich sehr ähnlich:

>> Doch damit nicht genug... Python >= 3.6 presents: f-Strings
26
f-Strings

v Seit Python 3.6

v Erlaubt das Einfügen von Code innerhalb der Platzhalter

v Somit kann der Platzhalter u. a. auch Funktionsaufrufe beinhalten.

v Formatierungsangaben sind ebenfalls möglich.

27
Viele Wege führen nach Rom

28
28
String-Methoden

Trennen: Ersetzen: Testen von Eigenschaften:


o split o replace o isalnum, isaplha
o splitlines o lower o isdecimal, isdigit
o rsplit o upper o isidentifier
o partition o swapcase o islower
o rpartition o capitalize ☑ o isnumeric
o casefold o isprintable
Suchen: o title o isupper
o find o expandtabs o isspace
o rfind o istitle
o rindex
Ausrichten/Befüllen:
o startswith
o center o endswith
Trimmen: o ljust
o rjust Sonstige:
o strip
o lstrip o zfill o encode
o rstrip o format ☑
Verketten:
o join
29
Beispiel Trennen: split
string.split(separator, maxsplit)

30
Beispiele Suchen: find, index, count
string.find(value, start, end) string.index(value, start, end)
string.count(value, start, end)

31
Beispiel Trimmen: strip
string.strip(characters)

32
Beispiele Ersetzen: lower, upper, capitalize
string.lower() string.upper() string.capitalize()

33
Beispiel Ausrichten/Befüllen: zfill
string.zfill(len)

34
Beispiel Verketten: join
string.zfill(len)

35
Sehr viele
Viele Wege führen nach Rom

36
Beispiele Testen: startswith, endswith
string.startswith(value, start, end)
string.endswith(value, start, end)

37
Sonstiges: encode
string.encode(encoding=encoding, errors=errors)

Parameter Bedeutung
encoding Optionaler String, der den Zeichensatz definiert, Defaultwert ist “UTF-8”.
Wenngleich UTF-8 inzw. sehr weit verbreitet ist, kommt es immer wieder vor,
dass man Daten (z.B. über eine API) in einem anderen Zeichensatz bekommt.
(bspw. sind bestimmte Reports über die MWS-API im ISO-8859-15-Format).
errors Optionaler String, der das Verhalten im Fehlerfall regelt:
strict (default), backslashreplace, ignore, namereplace, replace,
xmlcharrefreplace

38
Challenges (3)

C07:

Pig Latin ist eine Spielsprache, die im englischen Sprachraum von Kindern (als
“Geheimsprache”) verwendet wird. Man nimmt den ersten Konsonanten* eines Wortes,
verschiebt ihn an das Wortende und fügt ein "ay" hinzu. Wenn ein Wort mit einem
Vokal beginnt, fügt man einfach ein "way" an das Ende an. Zum Beispiel wird pig zu
igpay, banana zu ananabay und aadvark zu aadvarkway. Erstellen Sie ein Programm,
das den Benutzer auffordert, ein Wort einzugeben und es in Pig Latin zu ändern.
Stellen Sie sicher, dass das neue Wort in Kleinbuchstaben angezeigt wird.

* bzw. Konsonanten-Cluster, aber wir halten es einfach.

39
Exkurs: dir

v Die Funktion dir() gibt die Attribute und Methoden eines Objektes zurück.

40
Exkurs: Dunder Methods (aka special/magic methods)

v Dunder Methods sind alle Methoden, die mit __ starten und enden. Die Methode
__add__ wird bspw. auch als dunder add bezeichnet.

v Dunder Methods bestimmen, was unter der Haube passiert, wenn eine
bestimmte Operation bei einem Objekt durchgeführt wird.
→ Denken Sie an das Duck Typing.

Nur für Demonstrationszwecke.


Dunder Methods sollten nicht direkt aufgerufen werden!
41
Exkurs: hash()

v Die Funktion hash() kann bei nicht veränderbaren Sequenzen (immutable


sequences) angewandt werden und gibt einen Integer-Wert zurück.

v Standardmäßig verwendet hash() die Identität (id) des Objektes.

v Die Dundermethode __hash__() erlaubt eine eigene Implementierung, jedoch


soll die Methode einen Integer zurückgeben.

42
Listen (list)

v Listen sind veränderbar (mutable)

v Eine Liste ist eine geordnete Abfolge von Elementen.

v Der Datentyp list ähnelt den C-Arrays, bietet aber zusätzliche Funktionalität.

v Erzeugung über

v eckige Klammern: [], [a], [a, b, c]


v Build-in-Funktion list(iterable) Ein Iterable ist hier entweder eine
Sequenz, eine Collection oder ein Iterator-Objekt.
v List Comprehensions

43
Beispiele

Und ein paar schnelle Übungsaufgaben:

Was ist der Inhalt von y bzw. x nach der jeweiligen Operation?
44
Arbeiten mit Listen

v Der Operator in prüft die Mitgliedschaft in einer Liste:

v Verbinden, Anhängen und Addieren:

v Elemente “entpacken”

45
Sortieren
list.sort(reverse=True|False, key=myFunc)
sorted(iterable, key=key, reverse=reverse)

v Jede Liste in Python besitzt die Methode sort(). Mit dem Parameter
reverse=True wird die Liste in absteigender Reihenfolge sortiert.

v Parameter key: Behandeln wir später ausführlicher (→ Lambdas). Aber alles der Reihe
nach. Erstmal die Built-in-Funktion abs() zum Absolutwertvergleich.
Die Reihenfolge der Paramter
wurde vertauscht. Was ist da
los?

46
Sortieren (II)

v Es können nur homogene Listen sortieren. Haben wir also beispielsweise eine Liste, die
sowohl Strings als auch numerische Werte beinhaltet, kann sorted() nicht verwendet
werden. Wir würden einen TypeError erhalten:
TypeError: '<' not supported between instances of 'int' and 'str’.

v Während die sort()-Methode die Liste “in-place” sortiert, gibt die sorted()-Funktion eine
sortierte Liste des übergebenen Iterables zurück.

47
List Comprehensions

v Häufig wird eine Liste konstruiert, indem über ein anderes Objekt
mit einer for-Schleife iteriert wird.

v List Comprehensions sind eine spezielle Syntax, die sich an der mathematischen
Mengennotation orientiert (if Bedingung ist optional):

{𝑛! : 𝑛 ∈ 𝑀, 𝑛 𝑔𝑒𝑟𝑎𝑑𝑒} ⟷ def squares_of_evens(numbers):


return [n ** 2 for n in numbers if n % 2 == 0]
[Ausdruck for Variable in Iterable if Bedingung]

v Es sind auch mehrere for- und if-Statements möglich. Die Abarbeitung erfolgt von
links nach rechts:
[(m, n) for m in range(11) if m % 2 == 0 for n in range(m) if n % 2 != 0]
48
List Comprehension Beispiele

v Welche Elemente beinhalten folgende Listen?

v Nicht benötigte Variablen werden typischerweise mit _ benannt:

v Verschachtelung:

Frage 1: Wie sähe ein entsprechender for-Schleifen-Block aus?


Frage 2: Welche List Comprehension führt zu [‘fooba’, ‘Madrid’, ‘Berlin’]?
49
Operatoren/Funktionen/Keywörter bei mutierbaren
Sequenzen

Ersetzen: Hinzufügen:
o s[i] = x ☑ o s.insert(i, x)
o s[i:j] = t ☑ o s.append(x) ☑
o s[i:j:k] = t ☑ o s.extend(t) ☑

Entfernen: Ändern der Reihenfolge:


o del s[i] o s.reverse()
o del s[i:j]
o del s[i:j:k]
Kopieren:
o s.pop([i])
o s.remove(x) o s.copy()
o s.clear()

50
Beispiele Hinzufügen: insert, append, extend

list.insert(position, element)
list.append(element)
list.extend(iterable)

51
Beispiele Entfernen: del, pop, remove, clear

del object
list.remove(element)
list.pop(position)
list.clear()

52
Beispiele Kopieren und Umkehren: copy, reverse

list.copy()
list.reverse()

53
Tupel (tuple)

v Sind die unveränderlichen “Cousins” der Listen.

v Praktisch alle Operationen mit Listen, die diese nicht verändern,


funktionieren auch mit Tupel.

v Bequeme Möglichkeit, Funktionen mit mehreren Rückgabewerten zu schreiben.

v Erzeugung über

v runde Klammern: (), (a,), (a, b, c)

v kommaseparierte Liste: a, b, c

v Build-in-Funktion tuple(iterable) Ein Iterable ist hier entweder eine


Sequenz, eine Collection oder ein Iterator-Objekt.
54
Beispiele

Exception-Handling
behandeln wir noch
genauer. Was fällt
auf im Vergleich zu
Java?

Siehe Denksport-
Aufgabe 1

55
Bytes und Bytearrays

v Strings beinhalten Unicode-Zeichen, Bytes- und Bytearray-Objekte


hingegen einzelne Bytes.

v Erzeugung von Bytes (immutable) über

v die bytes()-Funktion: bytes(x, encoding, error)

v Prefixnotation, bspw. b’sequenz’, b”sequenz”, b’’’sequenz’’’, b”””sequenz”””

v Erzeugung von Bytearray (mutable) über

v die bytearray()-Funktion: bytearray(x, encoding, error)

v Bytes und Bytearrays unterstützen fast alle String-Methoden (Ausnahmen siehe


Dokumentation) sowie die allgemeinen Sequenz-Operationen. 56
Beispiele

57
UTF-8 Encoding im Detail

v UTF-8-kodierte Strings entsprechen folgender Tabelle:


Bereich Kodierung Beschreibung
U-00000000 ... 0xxxxxxx Marker-Bit ‘0’ und 7 Payload-Bits (genügt ASCII)
U-0000007F
U-00000080 ... 110xxxxx Marker-Bits ‘110’, ‘10’ und 11 Payload-Bits
U-000007FF 10xxxxxx
U-00000800 ... 1110xxxx Marker-Bits ‘1110’, ‘10’, ‘10’ und 16 Payload-Bits
U-0000FFFF 10xxxxxx
10xxxxxx
U-00010000 ... 11110xxx Marker-Bits ‘11110’, ‘10’, ‘10’, ‘10’ und 21 Payload-Bits
U-0010FFFF 10xxxxxx
10xxxxxx
10xxxxxx

→ 2, 3 oder 4 Bytes nur falls benötigt


→ ist nicht von der Byte-Reihenfolge abhängig (big/little endian)

58
Beispiele
ord() – Unicode-Code (int)
eines Zeichens
bin() – Binäre Darstellung eines ints

siehe String-Encode-Funktion

11001110_10101000 0xce_a8

Beachten Sie die Marker-Bits


110 bzw. 10

59
Decoding: decode()

v Umkehrfunktion von encode()

v Dekodiert Bytes zu einem String

60
Spezielle sequentielle Datentypen

v Genau genommen gibt es zwei weitere


sequentiellen Datentypen:

v Range-Objekte

v MemoryView-Objekte

61
MemoryView

v C-Level-Pufferschnittstelle als Python-Objekt

v Memory-Views erlauben nicht alle allgemeinen Sequenzoperationen!

MemoryViews sind bspw. nützlich, wenn man einen Teil (Slice) der Daten benötigt, die

zugrundeliegenden Daten jedoch nicht kopieren möchte (bytes/str).

62
Denksport (III)
Gegeben sei folgender Quellcode Ihres Kollegen, der – die Sinnhaftigkeit
sei dahingestellt – Strings salamimäßig Scheibe für Scheibe kürzt.

Da er von der Ausführungsgeschwindigkeit enttäuscht war, hat er mit dem Modul time die
Zeit gemessen und erwartungsgemäß eine quadratische Komplexität 𝑂(𝑛! ) festgestellt:

Wie ließe sich eine lineare Komplexität erreichen? Denken Sie an MemoryViews!

63
Range range(start, stop, step)

v Die Funktion range() kennen wir bereits von den Zählschleifen.


Diese liefert ein Range-Objekt.

v Eine Range repräsentiert den Bereich ganzzahliger Werte ab einschließlich start bis
ausschließlich stop mit einer Schrittweite von step. Range-Objekte sind iterabel.

v Der Vorteil gegenüber einer normalen Tupel etc. besteht darin, dass ein Range-
Objekt unabhängig von der Größe nur wenig Speicherplatz benötigt (da nur die
Start-, Stopp- und Schrittwerte gespeichert werden).

v Ranges erlauben nicht alle allgemeinen Sequenzoperationen!


64
Challenges (4)

C08:
Gegeben sei folgende Liste: C09:
alphabet = [‘a’,’b’,’c’,’c’,’d’,’e’,’e’] Bestimmen Sie die Menge der
natürlichen Zahlen unter 1000,
Entfernen Sie eines der doppelten ‘c’ von der Liste,
prüfen Sie dann, ob ‘f’ in der Liste enthalten ist. Fügen die 2, 3 und 7 als Teiler besitzen.
Sie anschließend ‘f’ geeignet hinzu. Falls notwendig, Das Ergebnis soll in Form einer
Liste vorliegen, die mittels List
entfernen Sie das doppelte ‘e’ und weisen Sie sich zum
Schluss die ersten beiden Einträge der Liste den Comprehension erstellt wurde.
Variablen a und b zu (mit 1 Anweisung).

C10:
Gegeben sei die Wortfolge
words = “I tried so hard and got so far”
Finden Sie alle Wörter mit weniger als 4 Buchstaben und schreiben Sie sie in
eine Liste.
65
https://xkcd.com/1411/

0b1000. Iteratoren und Generatoren


Iteratoren

v Iterable bzw. iterierbares Objekt: Python hat eine ganze Reihe iterierbarer Objekte.
Wir kennen schon Listen, Tupel, ...

v Iterator: Ein Iterator ist ein Objekt, das den momentanen Zustand einer Iteration
repräsentiert.

v Im Allgemeinen müssen Iteratoren nicht manuell gehandhabt werden (siehe for-Loop)

67
Iteratoren – iter und next

v Ein Iterator lässt sich auch


explizit mit der Funktion iter
erzeugen:

v Iteratoren unterstützen die


Funktion next. Sie gibt das
nächste Element aus:

v Oder einen Fehler, wenn kein


Element mehr vorhanden ist:

68
Iteratoren – Mehrere Iteratoren

v Für Listen besteht ein Iterator im


Wesentlichen aus der Liste selbst
und dem momentanen Index. Man
kann über Listen mehrfach
iterieren.

v Dies ist nicht für alle Iterables möglich, insbesondere bei solchen, die die Elemente nur bei

Bedarf erzeugen (siehe Generatoren).

v Iteratoren sind selbst iterabel (trivialerweise).

69
Enumerate enumerate(iterable, start)

v Die Funktion enumerate gibt zu einem Collection-Objekt ein Enumerate-


Objekt zurück.

v Im Prinzip wird jedes Element der Collection zu einem Key-Value-Pair


umgewandelt, wobei der Key einem numerischen Index entspricht.

70
Warum Enumerate?

71
Generatoren

v Generatoren sind spezielle Funktionen, die den yield-Befehl verwenden.

v Generatoren zeigen ein anderes Verhalten als normale Funktionen:

v Ihr Aufruf führt nicht direkt Code aus, sondern liefert ein Generator-Objekt zurück.
Dieses Objekt ist ein Iterator.
v Beim Iterieren wird der Code der Funktion ausgeführt, bis das erste Mal der yield-
Befehlt auftritt.

v An dieser Stelle hält die Funktion an und gibt die Kontrolle mitsamt dem value an den
Aufrufer zurück.
v Sobald das nächste Element angefordert wird, wird die Funktion fortgesetzt.
v Die Grundidee von Generatoren ist die Trennung von der Erzeugung der Daten
(Generator) und der Verarbeitung (Loop). Effekte treten somit (üblicherweise) nur
bei der Verarbeitung auf. 72
Generatoren - Beispiele
Mit def werden in Python
v
Funktionen definiert.

Tatsächlich ist range() selbst ”lazy”, sodass dieses Beispiel ziemlich sinnbefreit ist.

73
Generator Expressions

v Analog zu List Comprehensions gibt es Generator Expressions.

v Syntaktischer Unterschied: runde statt eckige Klammern

v Erzeugen Elemente erste beim Iterieren (im Gegensatz zu List Comprehensions!)

74
Generator Expressions - Beispiele

v Bei Funktionen mit einem Argument kann man die runden Klammern um eine Generator

Expression weglassen:

v Testen, ob irgendein oder alle Elemente der Iterablen wahr sind: any/all (SQL lässt

grüßen)

75
76
Hilfreich: Die Funktion zip zip(iterator1, iterator2, iterator3 ...)

v zip erzeugt einen Iterator, dessen Elemente Tupel sind.

v Jedes Tupel enthält je ein Element aus jeder iterable.

v Wenn die Listen unterschiedliche Längen haben, hält zip an, sobald die erste Liste
endet.

77
zip - Beispiele

Mit einem kleinen „Trick“ lassen sich Listen auch wieder „entpacken“:

Zu diesem Asterisk kommen wir noch.


78
Itertools

v Das Modul itertools enhält eine Reihe von Hilfsfunktionen zum Arbeiten mit
Iteratoren: https://docs.python.org/3/library/itertools.html

v Im Folgenden werden einige Funktionen vorgestellt.

count: itertools.count(start=0, step=1)


Im Großen und Ganzen identisch zu:

79
takewhile, dropwhile: itertools.takewhile(condition, iterable)
itertools.dropwhile(condition, iterable)

v takewhile liefert Elemente aus iterable, solange die condition-Funktion wahr zurückgibt.

v dropwhile überspringt die entsprechenden Elemente am Anfang und liefert nur den Rest.

Vorsicht: Würde man hier eine List Comprehension für die Liste aller(!) Quadratzahlen verwenden,

würde das Programm nicht beenden, trotz takewhile.

Wer kann den Unterschied erklären?

80
repeat: itertools.repeat(object[, times])

v Erzeugt einen Iterator, der unendlich oft oder optional times Mal object zurückliefert.

cycle: itertools.cycle(iterable)

v Erzeugt einen Iterator, der die übergebene iterable immer wieder durchläuft.

chain: itertools.cycle(iterable, iterable, ...)

v Erzeugt einen Iterator, der die übergebenen iterables der Reihe nach durchläuft.

81
Challenges (5)

C11:
Implementieren Sie eine Funktion nth_elements, die, gegeben einen Iterator it und eine
Zahl n, einen neuen Iterator erzeugt, der jedes n-te Element von it zurückliefert.
Verwenden Sie
- itertools.cycle, zip und eine geeignete generator expression,
- yield und eine geeignete Schleife.

Hinweis: Wäre it eine Liste, dann wäre die Funktion im Wesentlichen äquivalent zu
it[::n] (das können Sie nebenbei zum Testen Ihrer Lösung verwenden). Allerdings soll it
in Ihrer Implementierung nicht in eine Liste umgewandelt werden.

Weiterhin kann man dasselbe Ergebnis mit itertools.islice erreichen. Ihre Lösung soll
diese Hilfsfunktion nicht verwenden. Schlagen Sie jedoch in der Dokumentation islice
nach und versuchen Sie in einem zweiten Schritt, es damit umzusetzen.

82
https://xkcd.com/69/

0b1001. Datentypen (Teil 2)


Datentypen in Python




🕑

🕑 Up next:

84
Mengen/Sets: set und frozenset

Sets sind ungeordnete Ansammlungen von


paarweise verschiedenen, hashbaren Elementen.

v Folglich sind die Elemente eindeutig und immutable. Dem set selbst kann
man jedoch Elemente hinzufügen oder welche entfernen. Im Gegensatz zum
immutable frozenset.

v Erzeugung über die Funktionen

v set([iterable])

v frozenset([iterable])

v Nicht-leere Sets mittels {element, element, ...}


85
Sets vs. Listen

Warum, glauben Sie, ist der in-Operator bei Sets deutlich schneller?

86
Sets vs. Listen

Warum, glauben Sie, ist der in-Operator bei Sets deutlich schneller?

Die zugrundeliegende Datenstruktur eines Sets in Python ist eine Hashtable


(aka hash map). Die Suche nach einem bestimmten Element in einer Hashtable
hat die Komplexität O(1) (vielleicht erinnern Sie sich noch an die DBM-
Veranstaltung und Hash-Indizes).

Tatsächlich war zu Beginn der CPython-Quellcode zu set mehr oder weniger


identisch zu dem der Dictionaries (dict). Heute unterscheiden sich die
Implemtierungen jedoch signifikant (z. B. ungeordnet vs. geordnet).
87
Sets: Operatoren und Methoden (Teil 1)

Operator Funktion/Methode Beschreibung


x in s n/a True, wenn x in s enthalten ist.
x not in s n/a True, wenn x nicht in s enthalten ist.
s <= t s.issubset(t) True, wenn s eine Teilmente von t ist.
s < t n/a True, wenn s eine echte Teilmenge von t ist.
s >= t s.issuperset(t) True, wenn s eine Obermenge von t ist.
s > t n/a True, wenn s eine echte Obermenge von t ist.
s | t s.union(t) Vereinigungsmenge von s und t, Zuweisung mögich mit |=
s & t s.intersection(t) Schnittmenge von s und t, Zuweisung mögich mit &=
s - t s.difference(t) Differenz von s und t, Zuweisung mögich mit -=
s ^ t s.symmetric_difference(t) Symmetrische Differenz: A Δ B := (A∖B) ∪ (B∖A), Zuweisung mögich mit ^=
n/a s.isdisjoint(t) True, wenn s und t disjunkt sind.
n/a s.copy() Erzeugt eine flache Kopie von s.

s,t: Bei Operatoren beide gleichen Typs, bei Methoden gilt: t := beliebiger sequenzieller Datentyp

88
Sets: Operatoren und Methoden (Teil 2)

Operator Funktion/Methode Beschreibung


n/a s.add(e) Fügt Element e in Menge s ein.
n/a s.remove(e) Löscht Element e aus Menge s. Exception falls nicht vorhanden.
n/a s.discard() Löscht Element e aus Menge s. Keine Aktion falls nicht vorhanden.
n/a s.clear() Löscht alle Elemente aus s. Die (leere) Menge bleibt bestehen.
n/a s.update(t) entspricht s |= t
n/a s.difference_update(t) entspricht s -= t
n/a s.intersection_update(t) entspricht s &= t
n/a s.symmetric_difference_update(t) entspricht s ^= t
len(s) Anzahl der Elemente in s

s,t: Bei Operatoren beide gleichen Typs, bei Methoden gilt: t := beliebiger sequenzieller Datentyp

89
Denksport (IV)
Sie müssen Ihrem Entwicklerkollegen mal wieder unter die Arme
greifen. Er sucht händeringend nach einem einfachen Weg, seine sehr
lange Liste von Duplikaten zu befreien. Sie nutzen Ihr neu erlangtes
Wissen über Datentypen und –strukturen und zeigen ihm anhand
folgender Liste, wie er schnell und einfach eine duplikatfreie Liste
bekommt.

item_list = [1, 2, 3, 1, 2, 3]

...?

90
Datentypen in Python




🕑

Last, not 🕑least:


91
Wörterbuch: dict

v Mappings stellen Zuordnungen zwischen Objekten her und dienen somit zur
Definition und Speicherung von Schlüssel-Werte-Paaren (Key-Value-Pairs).

v Dictionaries sind mutable.

v Erzeugung über

v die Funktion dict: dict(keyword arguments)

v geschweifte Klammern, z.B. {key: value, key2: value2}

v Die Werte können Instanzen beliebiger Datentypen sein.

v Die Schlüssel müssen eindeutig und Instanzen von Immutables sein.

92
Wörterbuch: dict (Ordnung)

v Seit Python 3.7 sind Dictionaries geordnet. Vorher waren Sie ungeordnet und
näher an einem Set dran (+ die Schlüssel natürlich).

v Dictionaries sind iterierbare Objekte:

v Sie können mit einer for-Schleife durchlaufen werden.

v Die Iteration läuft über alle Schlüssel.

v Während des Durchlaufs dürfen keine Elemente entfernt oder


hinzugefügt werden.

93
Wörterbuch: dict (Operatoren und Methoden)

Operator/Funktion/Methode Beschreibung
len(d) Anzahl der Key-Value-Pairs
d[k] Zugriff auf den Wert mit Schlüssel k.
del d[k] Löschen des Elementes mit Schlüssel k.
k [not] in d True, wenn der Schlüssel k in d [nicht] vorkommt.
dict.fromkeys(seq[,value]) (static) Erzeugt ein Dictionary mit seq als Schlüsseln und optional value als Wert.
d.clear() Löscht den Inhalt von d.
d.copy() Erzeugt eine flache Kopie von d.
d.get(k[,x=None]) Wert von k oder x falls k nicht vorhanden.
d.items() Liefert ein iterierbares Objekt mit allen Key-Value-Pairs.
d.keys() Liefert ein iterierbares Objekt mit allen Schlüsseln.
d.values() Liefert ein iterierbares Objekt mit allen Werten.
d.pop(k) Liefert zum Schlüssel k den Wert und entfernt das Paar anschließend aus d.
d.popitem() Liefert das letzte Paar (da jetzt ordered) von d und entfernt es aus d.
d.setdefault(k[,x=None]) Liefert d[k]. Falls k nicht vorhanden, wird der Key mit dem Wert x eingefügt.
d.update(d2) Fügt Paare von d2 hinzu und überschreibt ggf. bereits vorhandene Keys.
94
Wörterbuch: dict (Beispiele)

Der in-Operator ist auch bei Dictionaries schnell (da Hashmap):

in wirft aber einen Fehler, wenn der Schlüssel nicht gefunden wird → get()

Zuweisung mit eckigen Klammern:

95
A tiny coding style discussion...

Nehmen wir an, die Wörter eines Dokumentes sollen gezählt werden. Das
Dokument liegt bereits als Liste vor:

document = [”you", ”only", ”live", ”once"]

Es wäre nun naheliegend, in der Iteration mit einer Bedingung zu arbeiten:

96
A tiny coding style discussion... (cont.)

Alternativ könnten wir mit einer Ausnahmebehandlung arbeiten.

In der Tat wird in Python EAFP (it is easier to ask for forgiveness than
permission) dem klassischen Ansatz LBYL (look before you leap) vorgezogen.

97
A tiny coding style discussion... (cont.)

Eine weitere Möglichkeit wäre die Verwendung von get.

Alle 3 Methoden wirken etwas unhandlich, wenngleich diese hier schon mal auf
Verzweigungen (if/else, try/except) verzichtet. Aber es geht noch besser, mit:

defaultdict

98
A tiny coding style discussion... (cont.)

Ein defaultdict funktioniert wie ein gewöhnliches Dictionary. Wenn man jedoch
einen nicht vorhandenen Schlüssel nachschlägt, fügt es zunächst einen neuen
Wert mithilfe einer Null-Argument-Funktion ein:

99
Defaultdict-Beispiele

Welche Inhalte weisen die Defaultdicts nach der Operation auf?

100
Dictionary Comprehensions

Man kann nicht nur Listen generieren, sondern auch Dictionaries.

{key: value for variable in iterable}


{key: value for variable in iterable if conditional}

Tuple Comprehensions existieren nicht. Die entsprechende Syntax mit runden


Klammern sind...?

101
Challenges (6)

C12:
Aus einer Datenbanktabelle erhalten Sie strukturierte Daten zu den Klausurergebnissen.
Da es sowohl eine Midterm- als auch eine Endtermklausur gegeben hat, möchten Sie den
gleichgewichteten Durchschnitt der erzielten Punkte bilden. Folgendes Datenstruktur
erhält die Klausurergebnisse:

exam_details= [
{‘student_id' : 1, ‘midterm' : 70, ‘endterm' : 82},
{‘student_id' : 2, 'midterm' : 73, 'endterm' : 74},
{‘student_id' : 3, 'midterm' : 75, 'endterm' : 86}
]

Schreiben Sie eine Funktion get_averages(list_of_dicts), die die Elemente midterm und
endterm durch ein Element final ersetzt und den entsprechenden Durchschnittswert
beinhaltet.
102
Up next:

https://xkcd.com/889/

0b1010. Turtle Graphics 🤩

Das könnte Ihnen auch gefallen