Beruflich Dokumente
Kultur Dokumente
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/
☑
☑
5
Numerische Datentypen
v float Gleitkommazahlen
Vergleiche: >, <, >>=, <<= ist bei komplexen Zahlen nicht definiert.
6
Integer (int)
v Für positive und negative Ganzzahlen
7
Denksport
8
Denksport (II)
v Tipp: Wagen Sie einen Blick auf die Bit-Operatoren &, |, ^, >>, << bzw.
^=, |=, ^=, <<=, >>=
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)
10
Ein paar Beispiele...
11
Komplexe Zahlen (complex)
v Zur Speicherung und Verarbeitung komplexer Zahlen
v Die Vergleichsoperatoren <, <<=, >>=, > sind bei komplexen Zahlen
nicht definiert.
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
Beispiel String:
v str() nutzt die spezielle Methode* __str__() einer Klasse, um eine String-
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...
* kommt noch 21
Zeichenketten formatieren
:[[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)
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
>> Doch damit nicht genug... Python >= 3.6 presents: f-Strings
26
f-Strings
27
Viele Wege führen nach Rom
28
28
String-Methoden
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.
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.
42
Listen (list)
v Der Datentyp list ähnelt den C-Arrays, bietet aber zusätzliche Funktionalität.
v Erzeugung über
43
Beispiele
Was ist der Inhalt von y bzw. x nach der jeweiligen Operation?
44
Arbeiten mit Listen
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):
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 Verschachtelung:
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) ☑
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 Erzeugung über
v kommaseparierte Liste: a, b, c
Exception-Handling
behandeln wir noch
genauer. Was fällt
auf im Vergleich zu
Java?
Siehe Denksport-
Aufgabe 1
55
Bytes und Bytearrays
57
UTF-8 Encoding im Detail
58
Beispiele
ord() – Unicode-Code (int)
eines Zeichens
bin() – Binäre Darstellung eines ints
siehe String-Encode-Funktion
11001110_10101000 0xce_a8
59
Decoding: decode()
60
Spezielle sequentielle Datentypen
v Range-Objekte
v MemoryView-Objekte
61
MemoryView
MemoryViews sind bspw. nützlich, wenn man einen Teil (Slice) der Daten benötigt, die
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 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).
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/
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.
67
Iteratoren – iter und next
68
Iteratoren – Mehrere Iteratoren
v Dies ist nicht für alle Iterables möglich, insbesondere bei solchen, die die Elemente nur bei
69
Enumerate enumerate(iterable, start)
70
Warum Enumerate?
71
Generatoren
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
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 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“:
v Das Modul itertools enhält eine Reihe von Hilfsfunktionen zum Arbeiten mit
Iteratoren: https://docs.python.org/3/library/itertools.html
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,
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.
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/
☑
☑
☑
🕑
🕑 Up next:
84
Mengen/Sets: set und frozenset
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 set([iterable])
v frozenset([iterable])
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?
s,t: Bei Operatoren beide gleichen Typs, bei Methoden gilt: t := beliebiger sequenzieller Datentyp
88
Sets: Operatoren und Methoden (Teil 2)
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
☑
☑
☑
🕑
☑
☑
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 Erzeugung über
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).
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)
in wirft aber einen Fehler, wenn der Schlüssel nicht gefunden wird → get()
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:
96
A tiny coding style discussion... (cont.)
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.)
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
100
Dictionary Comprehensions
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/