Python Tutorial - Der Einstieg mit Jupyter Notebook
Diese Tutorial-Reihe des elab2go bietet einen Einstieg in die Programmiersprache Python. Die grundlegende Syntax wird vorgestellt (Variablen und Datentypen, Operatoren, Datenstrukturen für Listen und Mengen, Programmablaufsteuerung mit bedingten Verzweigungen und Schleifen, Funktionen, objektorientierte Programmierung mit Klassen), sowie die wichtigsten Python-Bibliotheken für Datenanalyse. Nach einer kurzen Motivation folgt die Schritt-für-Schritt-Anleitung zur Installation der verwendeten Python-Entwicklungsumgebung und die ersten Codezeilen in Python. Hinweise und Besonderheiten zur Syntax werden an Beispiel-Codes gezeigt. Dieses Tutorial eignet sich auch für Umsteiger, die bisher mit C-ähnlichen Sprachen oder MATLAB programmiert haben: die Gemeinsamkeiten und Unterschiede zwischen den Sprachen werden hervorgehoben und in einem letzten Abschnitt zusammengefasst.
Motivation
Python wird in den letzten Jahren verstärkt im Umfeld der Datenanalyse und des Machine Learning verwendet, häufig in Kombination mit der Plattform Anaconda (für Anwendungs- und Paketverwaltung) und Spyder, PyCharm, VSCode oder Jupyter Notebook als Entwicklungsplattform. Die einfache Verwendung der kostenlosen Python-Programmpakete für Datenverwaltung, -Modellierung und -Analyse Numpy, Pandas, Scikit-Learn, Keras und Tensorflow machen Python zu einer attraktiven Alternative für Einsteiger.
Warum Python? ...
Python (entwickelt um 1991) ist aktuell eine der meistgenutzten Programmiersprachen mit vielfachen Einsatzgebieten: 1. in der Grundausbildung als erste Programmiersprache, 2. in der Lehre an Hochschulen für die didaktische Aufbereitung und das Teilen von Demonstratoren und 3. im Umfeld der Datenanalyse, wo Python einen großen Funktionsumfang und gleichzeitig einen einfachen Zugang bietet. Für die Verwendung von Python für Datenanalyse sprechen eine Vielzahl von Gründen:
-
Python ist gut lesbar und verständlich, somit ist ein schneller Einstieg in die Syntax möglich.
-
Python bietet umfangreiche und kostenlose Programmbibliotheken für Datenverwaltung und Datenanalyse.
-
Python kann prozedural oder objektorientiert verwendet werden.
-
Python ist multiplattform-fähig (Windows, Linux, Raspberry Pi usw.) und kann auch in eingebetteten Systemen eingesetzt werden.
... und Jupyter Notebook?
Jupyter Notebook ist eine webbasierte Umgebung, die das Erstellen, Dokumentieren und Teilen von Demonstratoren unterstützt, und zwar insbesondere im Umfeld der Datenanalyse. In einem Jupyter Notebook kann man Code schreiben und ausführen, Daten visualisieren, und diesen Code auch mit anderen teilen. Das Besondere an Jupyter Notebook ist, dass der Code und die Beschreibung des Codes in unabhängige Zellen geschrieben werden, so dass einzelne Codeblöcke individuell ausgeführt werden können.
... und Anaconda?
Anaconda ist eine Entwicklungplattform für die Programmiersprachen Python und R, die für wissenschaftliches Rechnen, Datenverarbeitung und Maschinelles Lernen verwendet wird. Anaconda unterstützt insbesondere die Verwaltung von Anwendungen und Paketen, die nützlich bei der Programmierung mit Python und R sind. Zu den verfügbaren Anwendungen gehören Spyder (für Python-Entwicklung), RStudio (für R-Entwicklung), Jupyter Notebooks und Jupyter Labs (für die Erstellung interaktiver Demos). Mit Hilfe der Paketverwaltung conda können Anwendungsumgebungen (engl. Environments), erstellt werden, in die jeweils zueinander passende Versionen der benötigten Pakete heruntergeladen werden.
Übersicht
Das Tutorial ist in 14 Abschnitte gegliedert, die die Python-Syntax an einfachen Beispielen erklären und aufeinander aufbauen:
1 Vorbereitung: Installation der Entwicklungsumgebung
1-1 Jupyter Notebook
1-2 Spyder
1-3 Visual Studio Code2 Erste Codezeilen in Python
2-1 Hello World-Programm in Python
2-2 Einrückungen in Python
2-3 Kommentare in Python8 Datenstrukturen für Listen und Mengen
8-1 Listen
8-2 Tupel
8-3 Mengen
8-3 Dictionaries9 Funktionen in Python
9-1 Definition und Verwendung von Funktionen
9-2 Funktionen mit variabler Parameterliste
9-3 Lambda-Funktionen11 Python-Pakete verwenden und erstellen
11-1 Python-Pakete verwenden
11-2 Python-Pakete erstellen12 Python-Pakete für Datenanalyse und Machine Learning
12-1 Numpy
12-2 Matplotlib
12-3 Pandas
12-4 Scikit-Learn
12-5 Keras und Tensorflow
1 Installation der Entwicklungsumgebung
Um Python-Programme schreiben zu können, muss zunächst eine aktuelle Python-Installation von der Python-Webseite python.org heruntergeladen und installiert werden. Für die Entwicklung größerer Programme und die Durchführung von Datenanalysen sollten zusätzlich die Paketverwaltungsplattform Anaconda und die Entwicklungs- und Laufzeitumgebungen Spyder und Jupyter Notebook verwendet werden, die umfangreiche Funktionalität für Paketverwaltung, Softwareentwicklung und Präsentation bereitstellen.
Bei der Entwicklung größerer Python-Projekte, wo Syntax-Highlighting, Debugging-Funktionalität etc. wichtig sind, können weitere Entwicklungsumgebungen wie Visual Studio Code und PyCharm verwendet werden. Für den Einstieg und für kleinere Datenanalyse-Projekte, ist Anaconda + Jupyter Notebook + Spyder eine gute Startkombination.
1-1 Jupyter Notebook
Die Verwendung von Jupyter Notebook für den Einstieg hat den Vorteil, dass der Aufwand für die Installation einer Entwicklungsumgebung entfällt und man sich auf die Syntax der Sprache konzentrieren kann. Ein dokumentiertes Jupyter Notebook, das die wichtigsten Sprachkonstrukte mit Beispielen enthält, kann einfach geteilt werden, z.B. über Google Colab. Die Beispiele werden in separate Codezellen gespeichert und können in beliebiger Reihenfolge ausgeführt werden. Der Nachteil ist, dass die fortgeschrittene Funktionalität einer Entwicklungsumgebung (Syntax-Highlighting, Auto-Vervollständigung, Debuggen) hier fehlen.
Vorbereitung: Anaconda und Jupyter Notebook installieren
Die Details der Installation von Python und Anaconda sind in dem Abschnitt Vorbereitung: Installation von Python und Anaconda beschrieben.
Die Details der Verwendung von Jupyter Notebook sind in den Abschnitten Jupyter Notebook verwenden und Jupyter Notebook Widgets verwenden beschrieben, zu denen es auch YouTube-Anleitungen gibt.
Video: Jupyter Notebook
Das folgende Video zeigt, wie ein Jupyter Notebook erstellt und verwendet wird.
1-2 Spyder
Spyder ist eine Entwicklungsumgebung für Python, die vor allem in Datenanalyse-Projekten eingesetzt wird. Die aktuelle Spyder-Version 5.2 hat im Vergleich zur vorigen Version 4.0 eine modernisierte und benutzerfreundlichere Oberfläche erhalten. Die Entwicklung in Spyder ist projekt- oder ordnerbasiert, d.h. man kann mehrere Python-Skripte entweder in einem Projekt organisieren oder als lose Sammlung in einem Ordner.
Die Benutzeroberfläche von Spyder ist in Menüleiste und drei Haupt-Panels (Editor, Interaktive Konsole, Variablen-Explorer) organisiert, die für die Entwicklung und Ausführung von Skripten verwendet werden. Weitere Panels (Files, Plots, Help) sind als Tabs in das Variablen-Explorer-Panel integriert. Die Anordnung dieser Fenster kann über das View-Menü angepasst werden.
- Editor-Panel: enthält den Inhalt (Quellcode, Kommentare) der Python-Skripte. Hier wird Python programmiert!
- Variablen-Explorer: dies Panel enthält die Tabs für die Anzeige der Variablen des ausgeführten Skripts. Weitere hier integrierte Tabs sind Plots (Anzeige der Plots), Help (Hilfe) und Files (Ordner und Dateien).
- IPython-Konsole: hier wird die Ausgabe der ausgeführten Jupyter Codezellen angezeigt.
- Files-Panel: zeigt die Ordner und Dateien an, die Python-Skripte enthalten. Hier werden neue Ordner und Skripte erstellt.
Der Screenshot zeigt die Benutzeroberfläche von Spyder mit einem geöffneten Skript, das durch Angabe der speziellen Kommentare #%% den Code in Codezellen gliedert, die separat ausgeführt werden können.

1-3 Visual Studio Code
Visual Studio Code (VSCode) ist eine minimalistische Entwicklungsumgebung von Microsoft, die plattformübergreifend unterschiedliche Programmiersprachen unterstützt, unter anderem auch Python, wobei hier die entsprechende Unterstützung durch Erweiterungen dazu installiert wird. Für dies Tutorial wurde insbesondere die Jupyter-Erweiterung installiert, um den Code in Codeblöcke strukturieren und diese getrennt in der interaktiven Konsole ausführen zu können. Die Entwicklung in Visual Studio Code ist ordnerbasiert, d.h. man legt einen Ordner an, und darin zusammengehörige Skripte.
Die Benutzeroberfläche von Visual Studio Code ist in Menüleiste, Seitenleiste und drei Panels organisiert, die für die Entwicklung und Ausführung von Skripten verwendet werden. In der Seitenleiste hat man einen Schnellzugriff auf Explorer, Suche, Quellcodeverwaltung. Die Anordnung dieser Fenster kann über das Anzeigen-Menü angepasst werden.
- Explorer-Panel: zeigt die Ordner und Dateien an, die Python-Skripte enthalten. Hier werden neue Ordner und Skripte erstellt.
- Editor-Panel: enthält den Inhalt (Quellcode, Kommentare) einer Python-Datei und die Buttons zum Ausführen und Debuggen des Codes.
- Ausgabe-Panel: enthält verschieden Tabs für Probleme / Ausgabe / Debugging-Konsole / Terminal.
- Interaktive Jupyter-Konsole: hier wird die Ausgabe der ausgeführten Jupyter Codezellen angezeigt. Nur sichbar, wenn die Jupyter-Erweiterung installiert ist und das Skript mit #%% markierte Jupyter-Codezellen enthält.
Der Screenshot zeigt die Benutzeroberfläche von VSCode mit einem geöffneten Skript, das durch Angabe der speziellen Kommentare #%% den Code in Codezellen gliedert, die separat ausgeführt werden können.

2 Erste Codezeilen in Python
Ein Python-Programm kann auf verschiedene Arten erstellt und getestet werden:
1. Interaktiver Modus: Der interaktive Modus erfolgt durch Eingabe der Python-Anweisungen in der Python-Befehlskonsole, dort erfolgt auch die Ausgabe.
Dies ist nützlich für Tutorials, und um Programmteile zu testen. Um die Python-Befehlskonsole aufzurufen,
unter Programme das Programm mit dem Namen Python auswählen.
2. Python-Skript: Größere Python-Programme sind Sammlungen von Python-Skripten, die sich in demselben Ordner befinden und
ein Programmpaket bilden.
Ein Python-Skript oder Python-Modul ist dabei eine Datei mit der Endung .py, das die Anweisungen des Programms enthält und
mit Hilfe von Funktionen und Klassen strukturiert werden kann.
Wichtig: damit ein Verzeichnis zum Python-Paket wird, muss es eine Datei mit dem Namen __init.py__ enthalten, die leer sein kann.
3. Jupyter Notebook: Für Tutorials oder interaktive Demos erstellen wir ein Jupyter Notebook,
das die einzelnen Python-Anweisungen in Zellen strukturiert, die getrennt voneinander dokumentiert und ausgeführt werden können.
Im Unterschied zum interaktiven Modus der Python-Befehlskonsole können Jupyter Notebooks besser für Demos, Lehre und Kollaboration verwendet werden.
Im Folgenden verwenden wir zunächst den interaktiven Modus, d.h. die Befehle werden direkt in der Python-Konsole eingegeben.
Um die Python-Befehlskonsole mit einer bestimmten Python-Version zu öffnen, wird Anaconda aufgerufen und das entsprechende Environment ausgewählt.
Durch Anklicken des Environments erhält man verschiedene Anwendungen zur Auswahl: Open Terminal, Open with IPython, Open with Jupyter Notebook.
Durch Auswahl des Menüpunktes "Open with Python" wird die Python Befehlskonsole geöffnet, dort werden die Python-Befehle direkt eingegeben
und es erfolgt dort auch die Ausgabe.
2-1 Hello World-Programm in Python
Das Hello-World-Programm ist das kleinste lauffähige Programm in Python und gibt
den Text "Hello World" auf der Konsole aus. Es verwendet für die Ausgabe die print-Funktion,
die als Parameter die Zeichenkette "Hello World" erhält.
In Python geht es auch einfacher: man kann wie in MATLAB oder R einfach den Namen einer
Variablen oder eines Wertes in der Konsole eingeben und die ENTER-Taste drücken,
dann wird der Inhalt der Variablen bzw. der Wert ausgegeben, auch ohne print.

Für die Entwicklung größerer Programme werden die Python-Befehle mit Hilfe einer Entwicklungsumgebung in ein Python-Skript gespeichert, d.h. in eine Datei mit der Endung *.py, die alle Befehle und Funktionen des Programms enthält.
helloworld.py
print('Hello World')
2-2 Einrückungen in Python
Python verwendet Einrückungen und Leerzeichen, um Codeblöcke zu definieren, d.h. zusammengehörige Befehle anzugeben.
Dies ist ein signifikanter Unterschied zu Programmiersprachen wie C oder Java, bei denen die Einrückung (engl. Indentation)
im Code nur der Lesbarkeit dient und Leerzeichen vom Compiler / Interpreter ignoriert werden.
Der erste Code wird ausgeführt, beim zweiten wird eine Fehlermeldung ausgegeben,
da die print-Anweisung nicht eingerückt ist. Falls wir in Zeile 4 des ersten Codes vor der print-Anweisung ein
Leerzeichen einfügen, wird auch hier ein Fehler auftreten ("IndentationError: unexpected indent"), da jede
Anweisung des if-Codeblocks um dieselbe Anzahl an Stellen eingerückt werden muss.
Die korrekte Einrückung ist wichtig, sobald man mit mehrzeiligen Anweisungen, d.h. Verzweigungen, Schleifen und Funktionen arbeitet, die auch mehrzeilige Codeblöcke umschließen. Für die automatische Korrektur der Einrückung kann man Programmpakete wie autopep3 verwenden, die in alle Entwicklungsumgebungen eingebunden werden können.
Python-Code: Richtige EinrückungPython-Code: Falsche Einrückung# Richtig: eingerückt
if 4 > 0 :
print("Positiv!")
print("4 ist größer als 0")
# Falsch: nicht eingerückt
if 4 > 0 :
print("4 ist größer als 0")

2-3 Kommentare in Python
Python verfügt über Kommentarfunktionen für die Dokumentation des Codes. Kommentare werden nicht vom System ausgeführt, sondern dienen der besseren Lesbarkeit und Verständlichkeit von Quellcode. Einzeilige Kommentare beginnen mit einem "#"-Symbol gefolgt von Text. Mehrzeilige Kommentare müssen am Anfang und Ende von je drei doppelten Anführungsstrichen eingerahmt werden.
Python-Code: Kommentare# Einzeiliger Kommentar
# Noch ein Kommentar
"""
Mehrzeiliger
Kommentar
"""
Kommentare werden besonders wichtig, sobald größere Programme mit Funktionen und Klassen entwickelt werden.
Bei der Verwendung von Funktionen sollte eine Kurzbeschreibung der Funktion, der Parameter
und des Rückgabewertes angegeben werden.
Dies geschieht, indem die Kommentare in die oben erwähnten drei doppelten Anführungsstrichen nach der Funktionssignatur geschrieben werden.
Tut man dies, so wird bei Aufruf des Befehls help(funktionsname) der zuvor angegebene Funktionskommentar als Hilfe ausgegeben.
Für die Erstellung professioneller Dokumentation im HTML- oder PDF-Format kann ein Dokumentations-Tool
wie Doxygen eingesetzt werden.
Doxygen bietet eine speziellen Syntax für Kommentare, und kann aus den Kommentaren eine Dokumentation im HTML-Format zu erzeugen.
Beispiel: Funktion in Doxygen-Syntax kommentieren
In dem folgenden Beispiel werden Wirkung und Parameter der Funktion add(x, y) kommentiert.
Ausgabedef add(x, y):
"""
Die Funktion berechnet die Summe zweier Eingabe-Objekte
@param x: erster Summand
@param y: zweiter Summand
@return: Summe der Eingabewerte
"""
return x + y
help(add)

3 Variablen und Datentypen
Variablen sind benannte Speicherplätze, in denen die Daten des Programms gespeichert werden, z.B. name, jahr, x, y. Python-Variablen werden deklariert, sobald man ihnen einen Wert zuweist, z.B. x = 1, name = "HS KL". Der Datentyp (ganze Zahl, Fließkommazahl, Zeichenkette etc.) der Variablen wird automatisch durch Python vergeben und kann mit Hilfe der type-Anweisung herausgefunden werden.
Python-Code: Variablen und print-FunktionPython-Code: type-Funktion# name hat den Datentyp String
name = "HS KL"
# jahr hat den Datentyp Integer
jahr = 2022
# Zuweisungen: eine pro Zeile
x = 1
y = 2
# oder mehrere in einer Zeile
x, y = 1, 2 # x = 1, y = 2
# Ausgabe der Variablen
print(name, "\n", jahr, "\n", x, y)
# isPositiv wird als Wahrheitswert ausgewertet
isPositiv = (x > 0)
# Klasse herausfinden
print(isPositiv, " hat den Datentyp ", type(isPositiv))
3-1 Datentypen
Python verwendet intern wie die Programmiersprachen C oder Java Datentypen für ganze Zahlen (int), Fließkommazahlen (float, double), Wahrheitswerte (bool), Zeichen und Zeichenketten (str), darüber hinaus Datenstrukturen für Listen und Mengen. Die Datentypen sind in die folgenden Kategorien integriert:
- Numerische Datentypen (engl. Numeric): int, float, complex
- Boolesche Datentypen (engl. Boolean): bool
- Zeichenketten (engl. Text): str
- Binäre Datentypen (engl. Binary): bytes, bytearray, memoryview
- Listen (engl. Sequences): list, tuple, range
- Mappings: dictionary
- Mengen (engl.Sets): set, frozenset
Der Datentyp einer Variablen wird meist implizit bei Zuweisung eines Wertes festgelegt, er kann jedoch bei Bedarf auch explizit durch Typecasting angegeben werden, indem man den gewünschten Datentyp vor den Namen des Wertes schreibt und diesen in runde Klammern setzt, z.B. x = float(5) oder x = str("Hallo!").
Python-Code: Typumwandlung# Datentyp von x
# ist implizit int
x = 5
print(type(x)) # Ausgabe: class'int'
# Datentyp von x
# wird auf float festgelegt
x = float(5)
print(type(x)) # Ausgabe: class'float'
3-2 Numerische Datentypen
Es gibt in Python drei Hauptdatentypen für Zahlen: int (ganze Zahlen), float (Fließkommazahlen) und complex (komplexe Zahlen), sowie einen Datentyp Decimal für korrekt gerundete Fließpunktarithmetik. Der in Python eingebaute Datentyp float hat doppelte Genauigkeit und entspricht dem Datentyp double in C oder Java.
Python-Code: Numerische Datentypenx = 5 # int
pi = 3.14 # float
# Komplexe Zahl z = 2 + 3 i
z = complex(2, 3)
# Typecasting
x = int(pi) # x = 3
z = int("3") # z = 3
3-3 Text-Datentyp: Strings
Der Datentyp String beschreibt Texte bzw. Zeichenketten (ein Text ist eine Zeichenkette, also eine Folge von Zeichen). Mit der Angabe eines Index, der bei 0 anfängt, kann man spezifische Zeichen aus der Zeichenkette auslesen. Es können auch negative Indizes verwendet werden, dann wird die Zeichenkette vom Ende durchlaufen. Für eine Zeichenkette x erhält man mit x[0] das erste Element, mit x[-1] das letzte Element, mit x[i:j] die Zeichen von i inklusive bis j exklusiv.
Die Python-Dokumentation zu Strings beschreibt eine Reihe von Funktionen, mit denen man Zeichenketten in Python verarbeiten kann. Mit der Funktion len(x) wird die Länge einer Zeichenkette nachgefragt, also die Anzahl an Zeichen in dieser Kette. Mit der x.strip()-Anweisung besteht die Möglichkeit, Leerzeichen am Anfang und am Ende einer Zeichenkette zu löschen.
Python-Code: Zeichenkettenx = "Hallo!"
print(x[0]) # H
print(x[-1]) # !
print(x[1:6]) # allo!
print(x[-4:-1]) # llo
print(len(x)) # 6
x = " Hallo aus Kaiserslautern "
print(x.strip())
3-4 Boolesche Datentypen: bool
Boolesche Datentypen können nur zwei Werte annehmen, wahr oder falsch. In Python wird jede Zahl außer "0" als wahr, engl. "True", betrachtet und "0" wird als falsch, engl. "False", interpretiert. Generell wird jeder Wert mit Wahr bewertet, wenn er einen Inhalt enthält, egal ob String, Integer oder List. Boolesche Datentypen werden benötigt, wenn man auswerten muss, ob ein Ausdruck wahr oder falsch ist, zum Beispiel, wenn die Bedingung einer bedingten Verzweigung oder Schleife ausgewertet wird.
print(6 > 5) # True
print(6 == 4) # False
4 Operatoren
Mit Operatoren werden Operationen an Variablen und Werten ausgeführt. Python unterteilt die Operatoren in folgende Gruppen:
- Arithmetische Operatoren: führen allgemeine mathematische Operationen aus.
- Zuweisungsoperatoren: weisen Variablen Werte zu.
- Vergleichsoperatoren: vergleichen zwei Werte.
- Logische Operatoren: kombinieren logische Ausdrücke, die dann als wahr oder falsch ausgewertet werden.
- Identitätsoperatoren: vergleichen Objekte
- Mitgliedsoperatoren: prüfen, ob ein Objekt in einer Sequenz liegt.
- Bitweise Operatoren: führen eine bitweise Verknüpfung der Operanden aus.
Bei der Auswertung von Ausdrücken ist die Priorität der Operatoren zu beachten, ggf. sollte man Klammern verwenden.
Übersicht der Operatoren
Arithmetische Operatoren werden mit numerischen Werten verwendet,
um allgemeine mathematische Operationen auszuführen.
Operator | Beispiel | Wirkung |
---|---|---|
Addition | x + y | 10 + 3 # Ergebnis: 13 |
Subtraktion | x - y | 10 - 3 # Ergebnis: 7 |
Multiplikation | x * y | 10 * 3 # Ergebnis: 30 |
Division | x / y | 10 / 3 # Ergebnis: 3.33 |
Ganzzahl-Division | x // y | 10 // 3 # Ergebnis: 3 |
Modulo-Operator | x % y | 10 % 3 # Ergebnis: 1 |
Potenzierung | x ** y | 10 ** 3 # Ergebnis: 1000 |
Zuweisungsoperatoren werden verwendet, um Variablen Werte zuzuweisen.
Bei der Zuweisung x = y wird der Wert der Variablen y (rechte Seite) der Variablen x (linke Seite) zugewiesen.
Bei abkürzenden Zuweisungen wird jeweils eine Operation auf dem Wert einer Variablen ausgeführt und dieser neue
Wert erneut der Variablen zugewiesen.
Operator | Beispiel | Wirkung |
---|---|---|
Zuweisung | x = y | Variable x erhält den Wert y |
Abkürzende Addition | x += 4 | x = x + 4 # Der Wert der Variablen x wird um 4 erhöht |
Abkürzende Multiplikation | x *= 4 | x = x * 4 |
Abkürzende Division | x /= 4 | x = x / 4 |
Abkürzende Ganzzahl-Division | x //= 4 | x = x // 4 |
Abkürzende Modulo | x %= 4 | x = x % 4 |
Vergleichsoperatoren und logische Operatoren werden zusammen verwendet, um Bedingungen zu formulieren, d.h. Ausdrücke, die als wahr oder falsch ausgewertet werden.
Vergleichsoperatoren verknüpfen zwei Variablen / Werte, und das Ergebnis wird als wahr oder falsch ausgewertet.
Operator | Beispiel | Wirkung |
---|---|---|
Gleich | x == y | wahr, wenn x gleich y ist |
Ungleich | x != y | wahr, wenn x ungleich y ist |
Größer | x > y | wahr, wenn x größer als y ist |
Kleiner | x < y | wahr, wenn x kleiner als y ist |
Größer gleich | x ≥ y | wahr, wenn x größer gleich y ist |
Kleiner gleich | x ≤ y | wahr, wenn x kleiner gleich y ist |
Logische Operatoren werden verwendet, um boolesche Ausdrücke zu kombinieren.
P und Q stehen für logische Ausdrücke, z.B. P = (x > 10) und Q = (x < 20).
Operator | Beispiel | Wirkung |
---|---|---|
Logisches Und | P and Q | Gibt wahr (1) zurück, wenn die Ausdrücke P und Q beide wahr sind |
Logisches Oder | P or Q | Gibt wahr (1) zurück, wenn einer der Ausdrücke P oder Q wahr ist |
Logische Verneinung | not P | Verneint den Ausdruck P: aus wahr wird falsch, aus falsch wird wahr |
Mitgliedsoperatoren prüfen die Zugehörigkeit eines Objektes zu einer Auflistung.
x steht hier für ein beliebiges Objekt, list für eine Auflistung.
Operator | Beispiel | Wirkung |
---|---|---|
enthalten in | x in list | wahr, wenn x in der Liste list enthalten ist. |
nicht enthalten | x not in list | wahr, wenn x nicht in der Liste list enthalten ist. |
Identitätsoperatoren prüfen, ob zwei Objekte auf denselben Speicherbereich zeigen.
x is y gibt wahr zurück, wenn beide Variablen dasselbe Objekt sind, d.h. auf denselben Speicherbereich zeigen.
Operator | Beispiel | Wirkung |
---|---|---|
Gleich | x is y | wahr, wenn beide Variablen dasselbe Objekt sind |
Nicht gleich | x is not y | wahr, wenn die Variablen nicht dasselbe Objekt sind |
Bitweise Operatoren (bitweises und, oder etc.) führen bitweise Operationen auf ganzzahligen Operanden aus.
D.h. die Operanden werden in ihre bitweise Darstellung konvertiert, z.B. x = 5 = 0101, y = 3 = 0011, und dann wird jedes
Bit im Operanden x mit dem Bit an der passenden Position im Operanden y verknüpft.
Operator | Beispiel | Wirkung |
---|---|---|
Bitweises Und | x & y | Ergebnisbit ist 1, wenn beide Bits 1 sind |
Bitweises Oder | x | y | Ergebnisbit ist 1, wenn mindestens eines der Bits 1 ist |
Bitweises Entweder-Oder (XOR) | x ^ y | Ergebnisbit ist 1, wenn genau eines der Bits 1 ist |
Bitweises Nicht | ˜ x | Gibt das Einerkomplement von x zurück |
Shift-right | x >> n | Bits in x werden um n Positionen nach rechts geschoben. |
Shift-left | x << n | Bits in x werden um n Positionen nach links geschoben. |
Beispiel
x = 5 # binär: 0101
y = 3 # binär: 0011
print("x & y = %d" % (x & y)) # 0101 & 0011 = 0001 (1)
print("x | y = %d" % (x | y)) # 0101 | 0011 = 0111 (7)
print("x ^ y = %d" % (x ^ y)) # 0101 ^ 0011 = 0110 (6)
5 Ein- und Ausgabe
5-1 Eingabe mit input()
Die Eingabe über die Python-Befehlskonsole oder in einer Jupyter Notebook-Zelle erfolgt mit Hilfe der "input()"-Funktion. Der Befehl x = input() erzeugt ein Eingabefeld, und alles, was man darin eingibt, wird in die Variable x gespeichert. Soll die Eingabe als ein bestimmter Datentyp interpretiert werden, muss sie mit Hilfe einer entsprechenden Funktion (z.B. int(), oder str()) umgewandelt werden.
Beispiel: Im folgenden Beispiel werden zwei ganze Zahlen eingegeben und zur Kontrolle formatiert wieder ausgegeben.
Python-Code: Ein- und Ausgabe# Eingabeaufforderung
print("Zahl eingeben:")
# Einlesen der Zahl
x = int(input())
print("Noch eine Zahl eingeben:")
y = int(input())
# Formatierte Ausgabe
print("Ihre Eingabe: x = %d, y = %d" % (x, y))
Die Ausgabe nach Ausführung der Zeilen 1 bis 5 dieses Codeblocks sieht aus wie unten abgebildet.
Mit Hilfe der input()-Funktion wird ein Eingabefenster erzeugt, das eine Eingabe erfordert.

Die Funktion input() kann auch einen Text als Parameter erhalten, wie im nächsten Beispiel. Dann erfolgen Eingabeaufforderung und Ausgabe in derselben Zeile.
# Lese Eingabe von der Konsole
x = int(input("Zahl eingeben: "))
y = int(input("Noch eine Zahl eingeben: "))
# Formatierte Ausgabe
print("Ihre Eingabe: x = %d, y = %d" % (x, y))
5-2 Ausgabe auf die Konsole
Es gibt zwei Wege, um den Inhalt einer Variablen in Python unformatiert in die Konsole / Standardausgabe auszugeben.
- Schreibe den Namen der Variablen in eine neue Zeile, ohne abschließendes Semikolon. Es wird stets nur die letzte Variable in einem Block ausgegeben! D.h. im Beispiel unten nur der Inhalt der Variablen y.
- Verwende print()-Funktion. Diese Funktion akzeptiert als Argument eine Zeichenkette, Variable, ein Objekt oder eine Liste von Objekten, es können auch Separatoren angegeben werden. Anders als in C muss defaultmäßig kein Sonderzeichen angegeben werden, um einen Zeilenumbruch zu erzeugen. Falls man jedoch ein print ohne Zeilenumbruch haben möchte, muss der print-Aufruf in der folgenden Form erfolgen: print("Hallo", end=','), d.h. mit Hilfe des Parameters end wird ein anderes Trennzeichen als der Zeilenumbruch festgelegt.
Variablenname in eine neue Zeile schreiben
x = 10
y = 20
x
y
Ausgabe unterschiedlicher Variablen mit print
Ausgabeprint("Hallo")
pi = 3.14
print(pi)
x, y = 10, 20
print(x, y)
print("x:", x, "y:", y)

5-3 Formatierte Ausgabe mit print() und format()
Formatierte Ausgaben, die Texte und die Inhalte von Variablen kombinieren, können in Python auf verschiedene Arten umgesetzt werden:
- (1) Verwendung von print mit str
Die Inhalte numerischer Variablen werden mit Hilfe der str- Funktion in Zeichenketten umgewandelt, mit Hilfe des +-Operators aneinandergefügt und dann mit print ausgegeben. - (2) Formatierte Ausgabe mit print und Platzhaltern (ähnlich wie in C)
Die Inhalte numerischer Variablen werden mit Hilfe von Platzhaltern in eine formatierende Zeichenkette eingefügt. Die formatierende Zeichenkette, z.B. "x=%d, y=%.1f, Summe=%.2f" enthält für jede Variable einen Platzhalter: %d - für ganze Zahlen, %.1f - für Fließkommazahlen mit einfacher Genauigkeit, gerundet auf eine Nachkommastelle, und %.2f - für Fließkommazahlen mit doppelter Genauigkeit, gerundet auf zwei Nachkommastellen. - (3) Formatierte Ausgabe mit print und format
Die String-Methode format setzt in eine formatierende Zeichenkette an die Stelle von Platzhaltern die Inhalte der Variablen ein, die ihr als Parameter übergeben werden.
Das folgende Beispiel erzeugt drei Mal (fast) dieselbe Ausgabe:
Ausgabe# Ausgabe: x=5, y=20.5, Summe=25.50
x, y = 5, 20.5
sum = x + y
# (1) Ausgabe eines Textes mit angefügter float-Variablen
print("x=" + str(x) + " y=" + str(y) + " Summe=" + str(sum))
# (2) Formatierte Ausgabe mit Platzhaltern (C-Style)
print("x=%d, y=%.1f, Summe=%.2f" % (x, y, x + y))
# (3) Formatierte Ausgabe mit format
print("x={0:d}, y={1:.1f}, Summe={2:.2f}".format(x, y, x+y))

6 Bedingte Verzweigungen
Eine bedingte Verzweigung ist eine Kontrollstruktur, die festlegt, welcher von zwei (oder mehr) Anweisungsblöcken,
abhängig von einer (oder mehreren) Bedingungen, ausgeführt wird.
Bedingte Verzweigungen werden in Python wie in fast allen Programmiersprachen mit der if-else-Anweisung beschrieben.
Das Schlüsselwort "elif" in Python ist genau wie: "Wenn die vorherigen Bedingungen nicht zutreffen, versucht es mit dieser Bedingung" und das Schlüsselwort
"else" fängt alles ab, was von den vorhergehenden Bedingungen nicht erfasst wird.
x, y = 1, 4 # x = 1 und y = 4
if x > y :
print("%d > %d" % (x, y));
elif x == y :
print("%d == %d" % (x, y));
else :
print("%d < %d" % (x, y));
Komplexere Bedingungen werden mit Hilfe von Vergleichsoperatoren und logischer Operatoren formuliert.
Neuere Python-Versionen (ab Python 3.10) unterstützen auch eine match-case-Anweisung, die der switch-Anweisung in C und Java ähnelt, jedoch erweiterte Funktionalität zum Filtern von Mustern enthält.
7 Schleifen
Schleifen ermöglichen es, Anweisungen wiederholt auszuführen, und zwar so lange, wie eine Ausführungsbedingung erfüllt ist.
Python verfügt über zwei Schleifenbefehle: "while"-Schleife und "for"-Schleife.
Um den Kontrollfluss in Schleifen zu steuern, werden zusätzlich zu der Ausführungsbedingung die Anweisungen break
und continue eingesetzt.
break ermöglicht es, jederzeit aus einer Schleife auszusteigen. continue ermöglicht es, einzelne Schleifenschritte auszusetzen.
7-1 While-Schleife
Mit der "while"-Schleife werden Anweisungen ausgeführt, solange eine Bedingung wahr ist.
Beispiel: Berechne Summe 1+2+3+4+5 mit while-Schleife
Dieses Beispiel zeigt, wie eine Schleife auf die klassische Art (wie in C) geschrieben wird.
- Zeile 2: Initialisiere Zählvariable i mit 1
- Zeile 3: Prüfe Ausführungsbedingung i ≤ 5. Solange die Bedingung wahr ist, werden die Anweisungen des Schleifenrumpfs ausgeführt.
- Zeile 4-6: Diese Zeilen enthalten die Anweisungen des Schleifenrumpfs, die zu wiederholen sind. Wichtig: Die Zugehörigkeit zum Schleifenblock wird durch die korrekte Einrückung sichergestellt.
- Zeile 7: Ausgabe der Summe
sum = 0
i = 1
while i <= 5:
print(str(i) + "+") # Ausgabe der Zählvariablen
sum += i # Addiere i zur Variable sum hinzu
i += 1 # Inkrementiere i
print("Summe = " + str(sum))
Die Ausgabe nach Ausführung dieses Codeblocks sieht aus wie abgebildet.
Die Anweisungen im Schleifenrumpf erzeugen die Ausgabe der zu addierenden Terme, die
print-Anweisung nach der Schleife (Zeile 7) erzeugt die Ausgabe der Gesamtsumme.
7-2 For-Schleife
Mit der "for"-Schleife iteriert man über die Elemente einer Sequenz (Liste, Tupel, Menge etc.). Die Syntax der for-Schleife erfordert zwingend, dass mit Hilfe des Mitgliedsoperators "in" über die Elemente einer Sequenz iteriert werden muss.
Beispiel 1: Gebe Elemente einer Studierenden-Liste aus
Die Iteration über die Elemente einer Listen-Datenstruktur ist in Python die bevorzugte Art, Schleifen zu verwenden.
Hierbei wird mit Hilfe des Mitgliedsoperators "in" die Mitgliedschaft eines Objektes zu einer Liste überprüft.
studenten = ["Max Muster", "Anna Test", "John Doe"]
for std in studenten:
print("Student: " + std)
Beispiel 2: Berechne Summe 1+2+3+4+5 mit for-Schleife
- Zeile 1: Initialisiere Variable sum mit 0
- Zeile 2: Iteriere mit der Zählvariablen i über die Sequenz {1,2,3,4,5}, die mit Hilfe des Funktionsaufrufs range(1,6) erzeugt wird.
- Zeile 3-4: Diese Zeilen enthalten die Anweisungen des Schleifenrumpfs
- Zeile 5: Ausgabe der Summe
sum = 0
for i in range(1,6):
print(str(i) + "+")
sum += i
print("Summe = " + str(sum))
8 Datenstrukturen
In der Python Standardbibliothek gibt es vier Datenstrukturen für Listen und Mengen: Listen (engl. lists), Tupel (engl. tuples), Mengen (engl. sets) und Dictionary (engl. dictionary). Python-Datenstrukturen können grundsätzlich unterschiedliche Datentypen enthalten, d.h. Objekte beliebigen Datentyps. Jedoch muss man bei der Durchführung von Operationen auf Elementen der Datenstruktur auf Kompatibilität achten. Die angeführten Python-Datenstrukturen unterscheiden sich darin, ob sie änderbar sind (oder nicht), geordnet sind (oder nicht), und Duplikate zulassen (oder nicht).
8-1 Listen
Listen (engl. lists) sind Sammlungen von Objekten beliebigen Datentyps, die geordnet und änderbar sind. Sie erlauben doppelte Mitglieder und werden mit rechteckigen Klammern definiert. Listenelemente werden wie im Beispiel unten über den Index ausgewählt. Listen sind vergleichbar mit Arrays in C oder Java.
Beispiel: Studierende-Liste
Eine Python-Programm verwaltet eine Liste der Studierenden einer Hochschule.
Mit dem Ausdruck studenten[1,3] werden alle Elemente mit Index ≥ 1 und < 3 ausgewählt (engl. "Slicing").
# Liste "studenten"
studenten = ["Max Muster", "Anna Test", "John Doe"]
print(studenten) # ['Max Muster', 'Anna Test', 'John Doe']
studenten[2] = "Jane Doe" # Zuweisung
print(studenten[0]) # Max Muster
print(studenten[-1]) # Jane Doe
print(studenten[1:3]) # ['Anna Test', 'Jane Doe']
Eine häufig benötigte Funktionalität im Zusammenhang mit Listen ist das Umwandeln einer Liste in einen String, dies kann z.B. mit Hilfe der join-Funktion erreicht werden. Im folgenden Beispiel haben wir eine Liste mit Studenten-Namen, die wir für die Ausgabe in eine Zeichenkette umwandeln wollen, dabei soll als Trennzeichen für die einzelnen Elemente ein Semikolon verwendet werden.
Python-Code: Liste in String umwandeln mit joinAusgabestud_list = ["Max Muster", "Anna Test", "John Doe"]
print("Liste:\n", stud_list)
stud_string = ';'.join([str(item) for item in stud_list])
print("String:\n", stud_string)

8-2 Tupel
Tupel (engl. tuples) sind geordnete und unveränderbare Kollektionen, die verwendet werden, um zusammengehörende Datensätze (engl. records) zu speichern. Sie erlauben doppelte Mitglieder und werden mit runden Klammern definiert. Die Elemente eines Tupels können über ihren Index ausgewählt werden.
Beispiel: Adressen
Ein Python-Programm verwaltet eine Liste der Standorte einer Hochschule.
Da die Adressen sich nicht ändern, werden hier Tupel verwendet.
Die Zuweisung in Zeile 7 erzeugt einen Fehler, da die Elemente eines Tupels nicht geändert werden können.
# Tupel "adresse"
adresse = ("HS KL", "Schoenstrasse", 11)
print(adresse)
print(adresse[0]) # HS KL
print(adresse[1:3]) # ('Schoenstrasse', 11)
print(adresse[-1]) # 11
adresse[0] = "Morlauterer Strasse" # Fehler!
8-3 Mengen
Mengen (engl. Sets) sind Sammlungen, die ungeordnet und nicht indiziert sind. Mengen erlauben keine doppelten Mitglieder. Da der Inhalt ungeordnet ist, kann man keinen Index für den Zugriff auf die Elemente benutzen. Eine Menge wird definiert, indem man ihre Elemente in geschweifte Klammern setzt, wie im Beispiel unten.
# Mengen (Sets)
menge1 = {1, 2, 3, 4, "a", "b", "c"}
menge2 = {3, 4, 5, 6, "c"}
menge1.add(8) # neues Element hinzufügen
menge2.discard(6) # Element löschen
print(menge1) # {1, 2, 3, 4, 8, 'a', 'b', 'c'}
print(menge2) # {3, 4, 5, 'c'}
Alternativ kann eine Menge mit Hilfe der Funktion set definiert werden. Im Beispiel wird zunächst eine Liste deklariert, und aus der Liste dann eine Menge mit Hilfe der set-Funktion.
Beispiel: Menge aus Liste erzeugen mit setlist = [1, 2, 3] # Liste
menge3 = set(list) # Menge
Die Mengen-Datenstruktur ist eine Implementierung des mathematischen Mengenbegriffs und unterstützt Mengenoperationen wie Vereinigung (engl. union), Durchschnitt (engl. intersection), Differenz (engl. difference).
u = menge1.union(menge2) # Vereinigung)
print(u) # {1, 2, 3, 4, 5, 8, 'a', 'b', 'c'}
diff = menge1.difference(menge2) # Differenz
print(diff) # {1, 2, 8, 'a', 'b'}
Man kann die Set-Elemente mit Hilfe einer for-Schleife durchlaufen oder mit dem Komponenten-Schlüsselwort nachfragen.
8-4 Dictionaries
Dictionaries (Hashmaps) sind Sammlungen aus Schlüssel-Wert-Paaren, die ungeordnet und änderbar sind. Die Werte sind über Schlüsselwerte indexiert, die eindeutig sein müssen.
Beispiel: Telefonbuch
Eine Python-Programm verwaltet die Telefonnummern in einem Telefonbuch.
Jedem Kontakt wird eine Telefonnummer zugeordnet. Schlüssel sind die Namen der Kontakte, Werte sind die Telefonnummern.
# Dictionary (Hashmap)
telefonbuch = {
"Max Muster" : "0171 876654",
"Anna Test" : "0151 987654"
}
# Neuen Wert hinzufügen
telefonbuch["John Doe"] = "0171 123456"
print(telefonbuch) # Telefonbuch ausgeben
# Wertaufruf mit Schlüsselwert
annasNummer = telefonbuch.get("Anna Test")
print(annasNummer) # 0151 987654
9 Funktionen in Python
Eine Funktion ist ein Codeblock, der nur ausgeführt wird, wenn er aufgerufen wird. Funktionen werden einmal definiert und können dann beliebig oft aufgerufen werden. Man kann Daten oder sogenannte Parameter an eine Funktion übergeben. Eine Funktion kann auch Daten/Parameter zurückgeben. Damit eine Funktion Werte zurückgeben kann, benutzt man das Schlüsselwort "return". In Python enthält die Parameterliste üblicherweise eine festgelegte Anzahl an Parametern, es gibt jedoch auch die Möglichkeit, mittels *args oder **kwargs eine variable Anzahl an Parametern zu übergeben (siehe Abschnitt 9-2).
Funktionen kommen auf zweierlei Arten zum Einsatz: zum einen verwendet man vorhandene Funktionen der Python-Pakete, um gewisse Aufgaben durchzuführen. Zum anderen entwickelt man eigene Funktionen für Teilaufgaben und strukturiert damit größere Programme.
9-1 Definition und Verwendung von Funktionen
Funktionen werden definiert, indem man nach dem Schlüsselwort def den Namen der Funktion, und danach, in runde Klammern gesetzt, eine Parameterliste angibt. In den nachfolgenden Zeilen stehen die Anweisungen, die zum Codeblock der Funktion gehören. Diese müssen eingerückt sein. Funktionen werden verwendet bzw. aufgerufen, indem man ihren Namen angibt, gefolgt von der Liste der tatsächlichen Argumente, die in Anzahl und Reihenfolge mit der Parameterliste der Funktion übereinstimmen muss.
Funktion ohne Parameter
Die Funktion mit dem Namen my_func() gibt bei jedem Aufruf den Text "Hallo" auf der Konsole aus.
Die Parameterliste ist leer, d.h. zwischen den runden Klammern steht nichts.
# (1) Funktion definieren
def my_func():
print("Hallo!")
# (2) Funktion verwenden
my_func() # Ausgabe: Hallo!
my_func() # Ausgabe: Hallo!
Funktion mit Übergabe-Parameter
Die Funktion mit dem Namen my_func() gibt ihre beiden Parameter auf der Konsole aus, getrennt durch ">>".
Jeder der Parameter darf ein beliebiges Objekt sein. Der Funktionsaufruf in Zeile 9 führt zu der Fehlermeldung
"TypeError: my_func() missing 1 required positional argument: 'text'", da für den zweiten Parameter kein Wert übergeben wurde.
# (1) Funktion definieren
def my_func(nr, text):
print(nr, '>>', text)
# (2) Funktion verwenden
my_func(1, "Hallo") # Ausgabe: 1 >> Hallo
my_func(2, "zusammen!") # Ausgabe: 2 >> zusammen!
my_func(3, [1,2,3,4]) # Ausgabe: 3 >> [1, 2, 3, 4]
my_func("X", 4) # Ausgabe: X >> 4
my_func(4) # Fehler! Das zweite Argument fehlt
Funktion mit Standard-Übergabe-Parameter
# (1) Funktion definieren
def my_func(text = "kein Text übergeben"):
print(text)
# (2) Funktion verwenden
my_func() # Ausgabe: kein Text übergeben
my_func("Übergebener Wert") # Ausgabe: Übergebener Wert
my_func(text = "Übergebener Wert") # Ausgabe: Übergebener Wert
Funktion mit Rückgabewert
Eine Funktion kann auch Daten/Parameter als Rückgabewert zurückliefern, diese können in der aufrufenden Funktion in Berechnungen oder Ausgaben weiter verwendet werden.
Damit eine Funktion einen Wert zurückgibt, wird das Schlüsselwort return verwendet.
Beispiel 1
Beispiel 1 definiert die Funktion myfunc(), die das Doppelte des Parameters x zurückgibt.
# (1) Funktion definieren
def my_func(x):
return x*2
# (2) Funktion verwenden
print(my_func(4)) # Ausgabe: 8
print(my_func(5)) # Ausgabe: 10
Beispiel 2
Beispiel 2 zeigt, wie eine benutzerdefinierte Funktion f(x,y) = sin(x)*exp(-y) definiert wird.
Die Parameter x und y müssen reelle Werte sein. Die Funktion funktioniert nicht für Parameter x, y, die Listen sind,
also erzeugt f(list1, list2) einen Fehler.
Wenn eine Funktion in Python Listenparameter akzeptieren soll, muss sie zuerst mit der NumPy-Function vectorize
in eine vektorisierte Form umgewandelt werden.
# Definiere die Funktion f
from numpy import pi, sin, exp
def f(x, y) :
return sin(x)*exp(-y)
# Verwende die Funktion f
z = f(pi/4, 1); print(z)
# Verwende vektorisierte Version der Funktion f
fvec = np.vectorize(f)
z = fvec([pi/4, pi/2], [1, 2]); print(z)
9-2 Funktionen mit variabler Parameterliste
Wenn nicht bekannt ist, wie viele Argumente an die Funktion übergeben werden, fügt man vor dem Parameternamen in der Funktionsdefinition ein * hinzu, d.h. man verwendet den Unpacking-Operator (*), um den Parameter "auszupacken". Auf diese Weise erhält die Funktion ein Tupel von Argumenten und kann entsprechend auf die Elemente zugreifen. Die variablen Parameter bezeichnet man üblicherweise mit *args, das ist jedoch lediglich eine Namenskonvention. Für noch mehr Flexibilität können Schlüsselwertargumente mit dem Bezeichner **kwargs verwendet werden.
Beispiel: Funktion mit variabler Parameterliste
Die Funktion anzahl_arg() hat eine variable Parameterliste und gibt die Anzahl ihrer Parameter aus.
Der Funktionsaufruf in Zeile 5 erzeugt die Ausgabe 1, da die Funktion hier nur ein Argument, nämlich die Liste [1, 2, "Los"], erhält.
Der Funktionsaufruf in Zeile 6 erzeugt die Ausgabe 2, da die Funktion hier zwei Argumente, nämlich die Liste [1, 2] und den String "Los!"
erhält.
Der Funktionsaufruf in Zeile 7 erzeugt die Ausgabe 3, da der Funktion hier drei Argumente, nämlich die Zahlen 1 und 2 sowie den String "Los!"
übergeben werden.
Würde man den * vor dem Namen des Parameters weglassen, könnte hier nur ein einziger Parameter übergeben werden,
z.B. ein Objekt oder eine Liste.
# (1) Funktion definieren
def anzahl_arg(*args):
return len(args)
# (2) Funktion verwenden
print(anzahl_arg([1, 2, "Los!"])) # Ausgabe : 1
print(anzahl_arg([1, 2], "Los!")) # Ausgabe: 2
print(anzahl_arg(1, 2, "Los!")) # Ausgabe: 3
9-3 Lambda-Funktionen
Eine Lambda-Funktion ist eine anonyme Funktion, die für kurze einzeilige Befehle verwendet wird und anstelle von def das Schlüsselwort lambda verwendet. Sie kann eine beliebige Anzahl von Parametern / Argumenten annehmen, aber nur einen Ausdruck (Befehl) haben. Die erste Lambda-Funktion in unserem Beispiel fügt der als Argument übergebenen Zahl den Wert 10 hinzu. Die zweite Lambda-Funktion hat zwei Argumente, a und b, die sie multipliziert.
# Erste Lambda-Funktion:
add = lambda a : a + 10
# Aufruf der Funktion:
print(add(5)) # Ausgabe: 15
# Zweite Lambda-Funktion:
mult = lambda a, b : a * b
# Aufruf der Funktion:
print(mult(5, 2)) # Ausgabe: 10
9-4 Globale und lokale Variablen
Variablen, die außerhalb einer Funktion erstellt werden, nennt man globale Variablen. Globale Variablen können innerhalb und außerhalb von Funktionen verwendet werden. Wenn man eine Variable innerhalb einer Funktion erstellt, ist diese Variable lokal und kann nur in dieser Funktion verwendet werden. Um eine globale Variable innerhalb einer Funktion zu definieren, kann man das Schlüsselwort global verwenden.
10 Klassen und Vererbung
Python ist eine objektorientierte Programmiersprache. Fast alles in Python ist ein Objekt inkl. seiner Eigenschaften und Methoden. Eine Klasse ist ein Objekt-Konstruktor zum Erstellen von Objekten der gleichen Klasse. In Python benutzt man für Klassendefinition das Schlüsselwort "class". Eine Methode einer Klasse ist eine Funktion, die innerhalb einer Klasse definiert wird und als ersten Parameter eine Referenz ("self") auf die Instanz enthält, von der sie aufgerufen wurde.
Eine Besonderheit bei der Verwendung von Membervariablen und Methoden einer Klasse in Python ist, dass bei interner Verwendung das Schlüsselwort self stets vorangestellt werden muss.
10-1 Klassen-Deklaration und Initialisierung
Python-Klassen haben eine "__init __ ()"-Methode, die implizit beim Erstellen eines neuen Klassenobjektes ausgeführt wird. Die "__init __ ()"-Methode wird verwendet, um Objekteigenschaften zu setzen oder andere Vorgänge, die beim Erstellen des Objekts erforderlich sind, durchzuführen.
Beispiel: Wir deklarieren eine Klasse Auto, mit der wir neue Auto-Objekte erzeugen wollen. Ein Auto hat die Eigenschaften Hersteller und Modell und eine Methode "ausgeben()", die die Eigenschaften des Autos zu einer Zeichenkette zusammenbaut und ausgibt.
- Zeile 2-4: Die"__init __ ()"-Funktion setzt aktuellen Werte für hersteller und modell. Der Parameter "self" ist eine Referenz auf die aktuelle Instanz der Klasse und wird für den Zugriff auf Variablen der Klasse verwendet. Der self-Parameter muss bei allen Methoden der Klasse als erster Parameter der Parameterliste angegeben werden.
- Zeile 5-6: Die Methode ausgeben() erstellt eine Textausgabe aus den Eigenschaften des Klassenobjektes.
- Zeile 8-10: Erstelle zwei neue Klassenobjekte und gebe sie aus.
- Zeile 13-14: Lösche die Klassenobjekte. Mit dem Schlüsselwort "del" wird das Objekt zerstört und vom Speicher gelöscht.
class Auto:
def __init__(self, hersteller, modell):
self.hersteller = hersteller
self.modell = modell
def ausgeben(self):
print("Hersteller: " + self.hersteller + ", Modell: " + self.modell)
# Erstelle neue Klassenobjekte, gebe sie aus, und lösche sie wieder
my_auto1 = Auto("Audi", "A3")
my_auto2 = Auto("BMW", "i3")
my_auto1.ausgeben() # Ausgabe: Hersteller: Audi, Modell: A3
my_auto2.ausgeben() # Ausgabe: Hersteller: BMW, Modell: i3
del my_auto1
del my_auto2
10-2 Vererbung in Python
Vererbung ermöglicht es, Klassen zu definieren, die alle Methoden und Eigenschaften einer anderen Klasse erben. Die übergeordnete Klasse, von der geerbt wird, nennt man Basisklasse. Die untergeordnete Klasse, die von der Basisklasse Eigenschaften und Methoden erbt, nennt man Subklasse oder Kindklasse. In Python wird eine Subklasse definiert, indem man nach dem Klassennamen den Namen der Basisklasse in runde Klammern setzt.
Beispiel: Basisklasse Fahrzeug, Subklasse Auto
Wir definieren eine Basisklasse "Fahrzeug" und eine Subklasse "Auto".
Die Subklasse Auto erbt die Eigenschaften und Funktionen von "Fahrzeug" und hat eine weitere Eigenschaft "farbe" sowie eine zusätzliche
Methode "farbe_ausgeben()".
- Zeile 2-7: Definition der Basisklasse für Fahrzeuge
- Zeile 9: Definition der Subklasse Auto.
- Zeile 10-12: In Zeile 11 wird mit "super.__init__" die Initialisierungsmethode der Basisklasse aufgerufen. Danach wird in Zeile 12 die Eigenschaft farbe gesetzt, die nur zur Subklasse gehört. D.h. mit dem Aufruf "super().__init__(hersteller, modell)" können wir auch die übergeordneten Eigenschaften initialisieren lassen.
- Zeile 13-14: Definition der Methode "farbe_ausgeben()", die nur der Subklasse gehört
- Zeile 16-18: Erstellung eines Klassenobjektes mit dem Namen my_auto. Durch Ausführen der Methoden ausgeben() und farbe_ausgeben() werden alle Eigenschaften des Klassenobjektes angezeigt.
# Basisklasse für Fahrzeuge
class Fahrzeug:
def __init__(self, hersteller, modell):
self.hersteller = hersteller
self.modell = modell
def ausgeben(self):
print("Hersteller: " + self.hersteller + ", Modell: " + self.modell)
# Subklasse für Autos
class Auto(Fahrzeug):
def __init__(self, hersteller, modell, farbe):
super().__init__(hersteller, modell)
self.farbe = farbe
def farbe_ausgeben(self):
print("Auto: Farbe: " + self.farbe)
# Erstellung eines Klassenobjektes und Ausführen der Methoden
my_auto = Auto("Audi", "A3", "rot")
my_auto.ausgeben() # Methode geerbt von Fahrzeug-Klasse
my_auto.farbe_ausgeben() # zusätzl. Methode aus Auto-Klasse
Beispiel: Subklasse LKW
Wir definieren eine weitere Subklasse "LKW" der Basisklasse "Fahrzeug".
Die Subklasse LKW hat keine weiteren Eigenschaften, überschreibt aber die ausgeben()-Methode mit einer eigenen
Definition. Das Schlüsselwort "pass" wird hier verwendet, da wir der untergeordneten Klasse keine weiteren Eigenschaften geben möchten.
In Subklassen können geerbte Methoden auch überschrieben werden, dazu wird die Methode in der Subklasse neu definiert. Hier wird die Methode "ausgeben()" so überschrieben, dass der Text "LKW" der Ausgabe vorangestellt wird.
# Subklasse für LKWs
class LKW(Fahrzeug):
pass
def ausgeben(self):
print("LKW: Hersteller: " + self.hersteller + ", Modell: " + self.modell)
# Erstellung eines Klassenobjektes und Ausführen der Methoden
my_lkw = LKW("Mercedes-Benz", "Unimog")
my_lkw.ausgeben()
11 Python-Pakete verwenden und erstellen
Python-Pakete sind Klassen- und Funktionsbibliotheken, d.h. Gruppierungen von Klassen und Funktionen für definierte Einsatzgebiete. Python-Pakete kommen auf zweierlei Arten zum Einsatz: zum einen verwendet man Funktionen vorhandener Pakete, um gewisse Aufgaben durchzuführen. Zum anderen entwickelt man eigene Funktionen für Teilaufgaben und strukturiert damit größere Programme.
11-1 Python-Pakete verwenden
Python verfügt über eine eingebaute Standardbibliothek (Python Standard Library), die direkt nach der Installation verfügbar sind, und viele grundlegende Funktionen schon enthält (mathematische Funktionen, Textverarbeitung, Systemfunktionen, Dateizugriff, Verschlüsselung etc.) Darüber hinaus gibt es eine Reihe von spezialisierten Python-Bibliotheken, die Funktionalität für Datenanalyse und Machine Learning oder Kryptografie Verfügung stellen. Um ein spezielles Python-Paket verwenden zu können, muss es zuvor installiert werden.
Wie werden Python-Bibliotheken bzw. Python-Pakete installiert?
Python-Bibliotheken, die nach der Installation nicht schon dabei sind, können über die Paketverwaltungstools
pip und conda einfach hinzu installiert werden.
Das Paketverwaltungstool pip funktioniert nur mit Python-Modulen, das erweiterte Paketverwaltungstool conda kann auch verwendet werden,
um Module in anderen Programmiersprachen zu laden, z.B. in der statistischen Programmiersprache R.
Die beiden Tools werden über die Python-Konsole bedient. Die Syntax der Befehle ist ähnlich, z.B. pip list (install, uninstall, ...) oder conda list (install, uninstall, ...). Zunächst die Verwendung von pip an einem Beispiel: Unten werden alle installierten Pakete angezeigt und danach werden das Paket Pandas sowie die neueste Version des Pakets Numpy installiert.
pip list pip install pandas pip install numpy --update
Conda ist ein Paketverwaltungs-Programm, mit dessen Hilfe man Anwendungsumgebungen (engl. Environments) erstellen, aktivieren / deaktivieren und Pakete installieren und aktualisieren kann. Die wichtigsten conda-Befehle sind conda create, conda activate, conda install, conda update und conda deactivate. Um zum Beispiel eine Anwendungsumgebung mit dem Namen ML zu erstellen und in diese eine spezielle Zusammenstellung von Programmpaketen zu installieren, werden folgende Befehle verwendet:
conda create --name ML conda activate ML conda install pandas conda install tensorflow conda install keras conda deactivate ML
11-2 Python-Pakete erstellen
Größere Python-Programme können in Pakete (engl. packages) strukturiert werden. Ein Paket ist einfach ein Verzeichnis, das eine Datei __init__.py enthält, die leer sein kann, sowie eine beliebige Anzahl an Python-Modulen, die zusammengehörige Funktionen und Klassen gruppieren. Nachdem ein Python-Paket erstellt wurde, können die darin definierten Klassen und Funktionen in anderen Python-Skripten verwendet werden, indem man entweder das komplette Paket oder nur einzelne Module oder Klassen / Funktionen importiert.
Beim Importieren von Paketen / Modulen / Klassen / Funktionen wird die Punkt-Notation verwendet,
um die Zugehörigkeit zu kennzeichnen. z.B. paket.modul.klasse.
Es können auch Alias-Namen für Pakete und Module vergeben werden, dies sind Kurznamen, die die Verwendung im Code vereinfachen.
Valide Syntax ist z.B.
import paket as pk
import paket.modul as md
from paket.modul import klasse as kl
Als Beispiel erstellen wir ein Package mit dem Namen mypkg, das zwei Module enthält, module1.py und module2.py. Das Modul module1.py enthält die Definition zweier Funktionen myfunc1 und myfunc2, das Modul module2 die Definition der Klasse Auto, die wir in Abschnitt 10 vorgestellt haben. Die Verzeichnisstruktur sieht wie abgebildet aus:

def my_func1(text):
print(text)
def my_func2(x):
return x*2
class Auto:
def __init__(self, herst, modell):
self.herst = herst
self.modell = modell
def ausgeben(self):
print("Hersteller: ...")
Zum Testen der Paketverwendung erstellen wir ein Test-Skript pkg_test.py, das sich im übergeordneten Verzeichnis relativ zu dem
Verzeichnis mypkg befindet, und importieren die Module module1 und module2 mit Alias-Namen m1 und m2.
Der Befehl import mypkg.module1 as m1 importiert das Modul module1 aus dem Paket mypkg mit dem Namen Alias-Namen m1.
Dies bedeutet, dass wir im Code die Funktionsaufrufe in der Form m1.myfunc1() angeben müssen.
import mypkg.module1 as m1
m1.my_func1("Hallo!")
print(m1.my_func2(10))
import mypkg.module2 as m2
my_auto1 = m2.Auto("Audi", "A3")
my_auto2 = m2.Auto("BMW", "i3")
my_auto1.ausgeben() # Ausgabe: Hersteller: Audi, Modell: A3
my_auto2.ausgeben() # Ausgabe: Hersteller: BMW, Modell: i3
12 Python-Pakete für Datenanalyse
Die wichtigsten Python-Bibliotheken für Datenanalyse und Machine Learning sind:
- NumPy - Arrays und Zufallszahlen
- Matplotlib - Datenvisualisierung, Diagramme
- Pandas - Datenverarbeitung für tabellenartige Daten, Series, DataFrames
- Scikit-Learn- Machine Learning, Klassifikation, Regression
- Keras - Künstliche Neuronale Netzwerke, Wrapper für Tensorflow
12-1 Numpy
Numpy ist eine Python-Bibliothek für Datenverwaltung und Datenvorbereitung, bietet Unterstützung für die Erzeugung, Umformung und Auswertung von Arrays und Zufallszahlen.
Python-Code: Numpy verwendenAusgabe: Numpy verwendenimport numpy as np
# Eindimensionale Arrays
x1 = np.array([1, 2, 3, 4])
x2 = np.arange(1, 5, 1) #
x3 = np.arange(0, 1.1, 0.1)
print('x1:', x1, '\nx2:', x2, '\nx3:', x3)
# Zweidimensionale Arrays
a1 = np.array([[1, 2], [3, 4]], )
a2 = np.zeros((2, 3))
print('a1:\n', a1, '\na2:\n', a2)

12-2 Matplotlib
Matplotlib ist eine Python-Bibliothek für Datenvisualisierung, die über das Paket pyplot das Erstellen von Diagrammen unterschiedlichster Art unterstützt: Linien-, Punkte-, Balkendiagramme, ein- und zweidimensonal, statisch oder interaktiv. Die wichtigsten Befehle zum Plotten sind plot für eindimensionale und surf für mehrdimensionale Diagramme. Der plot-Befehl erhält als Parameter die x- und y-Koordinaten der darzustellenden Daten, und optional einen String mit Formatierungsangaben. Weiterhin stehen viele Optionen zum Hinzufügen von Beschriftungen, Titeln, Legenden etc. zur Verfügung.
Python-Code: Matplotlib verwendenAusgabe: Datenvisualisierung mit Matplotlibimport numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,40) # x-Werte
y1 = np.sin(x);y2 = np.cos(x); # y-Werte
fig = plt.figure(figsize=[6, 3]) # Diagrammfenster mit festgelegter Größe
plt.plot(x, y1,'r*', label='sin'); # Plot der Sinus-Funktion
plt.plot(x, y2,'b+', label='cos'); # Plot der Cosinus-Funktion
plt.title('Sinus und Cosinus-Funktion');
plt.grid(True)
plt.legend(loc="upper center")
plt.xlabel('x');plt.ylabel('y');

12-3 Pandas
Pandas ist eine Python-Bibliothek mit speziellen Datenstrukturen - Series und DataFrames- und Funktionen iloc(), loc(), resample() für den Zugriff auf excel-ähnliche beschriftete Datentabellen. In der Datenanalyse spielt Pandas eine zentrale Rolle, da man damit große CSV-Dateien in den Arbeitsspeicher des Programms laden kann und die Daten anschließend weiter bereinigen und visualisieren kann. Pandas-Funktionen wie iloc(), loc(), resample() werden verwendet, um Zeilen / Spalten / Zellen auszuwählen und Daten zu gruppieren und aggregieren.
Python-Code: Pandas verwenden (1)
Daten aus Excel einlesen und in eine csv-Datei schreiben
Ausgabeimport pandas as pd
# Daten aus studenten.xlsx einlesen, erste Spalte enthält den Index
df = pd.read_excel('studenten.xlsx', index_col=0, parse_dates=True)
# Daten in die csv-Datei schreiben, mit angegebenem Trennzeichen
df.to_csv('studenten.csv', index=True, sep = ';')
df

Python-Code: Pandas verwenden (2)
Dataframe aus einem Dictionary bilden und plotten
Ausgabeimport pandas as pd
# Erzeuge ein Dictionary (Name-Wert-Paare)
studenten = {
"Name": ["Muster", "Test", "Doe"],
"Vorname": ["Max", "Anna", "John"],
"Alter": [22, 24, 26],
"Note": [1.7, 2.1, 1.3]
}
# Erzeuge DataFrame aus Dictionary
df = pd.DataFrame(studenten) # DataFrame aus Dictionary
print(df)
# Scatter-Plot Note vs. Alter
df.plot.scatter(x = 'Alter', y = 'Note', c='Red');

12-4 Scikit-Learn
Scikit-Learn ist zusammen mit Pandas, Keras und Tensorflow eine der wichtigen Python-Bibliotheken für Maschinelles Lernen und bietet Unterstützung für die üblichen Schritte des Überwachten und Unüberwachten Lernens: Datenvorbereitung, Trainingsphase und Modellevaluation, ebenso leistungsstarke Algorithmen für Klassifikations-, Regressions- und Clustering-Probleme. In dem folgenden Beispiel wird der vereinfachte Ablauf beim Trainieren eines Entscheidungsbaum-Modells für die Klassifikation von Ausfällen gezeigt: Einlesen der Daten mit Hilfe der Funktion read_csv, Extrahieren der Merkmale und der Zielvariablen, Aufteilen in Trainings- und Validierungsdaten mit train_test_split, Trainieren des Modells mittels fit-Funktion, Visualisierung mittels der Funktion plot_tree.
Python-Code: Scikit-Learn verwenden
Entscheidungsbaum-Modell trainieren
Ausgabeimport pandas as pd
import matplotlib.pyplot as plt
from sklearn import model_selection as ms
from sklearn import tree
df = pd.read_csv("messungen.csv", header=0, sep = ";", index_col=0)
print('DataFrame mit Temperatur-Daten:\n', df);
# Extrahiere Merkmale in ein Numpy-Array x
x = df.iloc[:,0:2].to_numpy()
# Extrahiere Zielvariable in ein Numpy-Array y
y = df[['ausfall']]
y = y.values
# 90% Trainingsdaten und 10% Testdaten
X_train, X_test, y_train, y_test = ms.train_test_split(x, y, test_size=0.1, random_state=1)
model = tree.DecisionTreeClassifier(criterion='entropy', splitter='best')
# Erzeuge Entscheidungsbaum
model.fit(X_train, y_train)
# Visualisiere Entscheidungsbaum
fig, ax = plt.subplots(figsize=(5, 5))
tree.plot_tree(model, filled=True, feature_names=df.columns[0:2], class_names=['ja','nein'])
plt.show()


12-5 Keras und Tensorflow
Das aktuell meistgenutzte Framework für die Entwicklung von Künstlichen Neuronalen Netzwerken und Deep-Learning-Modellen mit Python ist Keras mit Tensorflow als Backend. Tensorflow ist ein von Google entwickeltes Framework für maschinelles Lernen, das unter Open-Source-Lizenz verfügbar ist. Keras ist eine Open-Source-Python- Bibliothek zum Entwickeln und Bewerten von Machine Learning-Modellen, das als benutzerfreundliche Schnittstelle zum Tensorflow-Framework verwendet wird.
Die Schichten eines Künstlichen Neuronalen Netzwerks sind in Keras durch die Klassen der Layer-API realisiert: Conv2D, MaxPooling2D, Flatten, Dense, LSTM etc. Jede Layer-Klasse hat eine Gewichtsmatrix, eine Größenangabe für die Anzahl verwendeter Neuronen (units), eine Formatbeschreibung der Eingabedaten (input_shape), eine Aktivierungsfunktion (activation), und eine Reihe weiterer Parameter, die die Gestaltung der Schicht steuern.
Die üblichen Schritte beim Erstellen eines Neuronalen Netzwerks (Modell erstellen, Modell trainieren, Modell validieren und verwenden) werden in Keras mit Hilfe der Funktionen compile(), fit() und predict() durchgeführt.
Das folgende Beispiel zeigt, wie ein Künstliches Neuronales Netzwerk für die Ziffernerkennung mit Hilfe von Keras trainiert und für die Klassifikation verwendet wird. Das Ziel ist, ein Modell zu erstellen und zu trainieren, das handgeschriebene Ziffern (grau-weiß-Bilder im Format 28x28 Pixel) korrekt klassifizieren kann. Als Trainings- und Validierungsdatensatz werden 60.000 Ziffern-Bilder aus dem MNIST-Ziffern-Datensatz verwendet, die direkt über Keras geladen werden können. Unser Beispiel ist dem Simple MNIST convnet aus der Sammlung der Keras-Codebeispiele nachempfunden.

Python-Code: Keras verwenden
(1) Daten einlesen und vorbereiten
Verwendete Funktionen: load_data(), reshape(), to_categorical()
Ausgabeimport numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.utils import to_categorical, plot_model
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten
print("1. Lade MNIST-Datensatz")
(trainX, trainY), (testX, testY) = mnist.load_data()
# Ausgabe der Dimensionen des Datensatzes
print('Train: X=%s, Y=%s' % (trainX.shape, trainY.shape))
print('Test: X=%s, Y=%s' % (testX.shape, testY.shape))
print("2. Datenvorbereitung")
trainX = trainX.reshape((trainX.shape[0], 28, 28, 1))
testX = testX.reshape((testX.shape[0], 28, 28, 1))
# Daten werden in den Bereich [0, 1] normalisiert
trainX = trainX.astype("float32") / 255.0
testX = testX.astype("float32") / 255.0
# Zielvariable wird numerisch codiert
trainY = to_categorical(trainY)
testY = to_categorical(testY)
print('Train: X=%s, Y=%s' % (trainX.shape, trainY.shape))
print('Test: X=%s, Y=%s' % (testX.shape, testY.shape))

Python-Code: Keras verwenden
(2) Modell definieren und trainieren
Verwendete Klassen: Sequential, Conv2D, MaxPooling2D, Flatten, Dense
Verwendete Funktionen: compile(), summary(), fit(), save()
Ausgabe# Definiere das Modell
print("3. Definiere das Modell")
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
# Trainiere das Modell
print("4. Trainiere das Modell\n")
model.fit(trainX, trainY, epochs=8, batch_size=64, verbose=2)
# Speichere das Modell
model.save('digits_model.h5')


Python-Code: Keras verwenden
(3) Modell evaluieren
Verwendete Funktionen: evaluate()
score = model.evaluate(testX, testY, verbose=0)
print("Test loss:", score[0])
print("Test accuracy:", score[1])
Python-Code: Keras verwenden
(4) Modell für die Klassifikation verwenden
Verwendete Funktionen: load_img(), img_to_array(), load_model(), predict()
Ausgabefrom keras.preprocessing.image import load_img, img_to_array
from keras.models import load_model
def prepare_image(filename): # Hilfsfunktion zum Vorbereiten eines Bildes
img = load_img(filename, color_mode = 'grayscale', target_size=(28, 28))
img = img_to_array(img)
img = img.reshape(1, 28, 28, 1)
img = img.astype('float32') / 255.0
return img
# Test-Bild laden und vorbereiten
img = prepare_image('digit-5.png')
# Modell aus Datei laden
model = load_model('digits_model.h5')
# Vorhersage / Klassifikation erstellen
digit = model.predict(img)
print("Das Bild stellt folgende Zahl dar:")
print(digit)

13 Python-Pakete für Kryptographie
Die Python-Pakete PyCrypto bzw. die neuere Version PyCryptoDome implementieren eine Reihe kryptografischer Verfahren, die in eigenen Python-Programmen für Verschlüsselung und digitale Signaturen eingesetzt werden können:
- symmetrische Verschlüsselung (AES)
- asymmetrische Verschlüsselung (RSA)
- Hashverfahren (SHA1, SHA2, SHA3)
- Message Authentication Codes (HMAC, CMAC)
- asymmetrische digitale Signaturen
Beispiel
Im folgenden Beispiel wird der Klartext "Hallo zusammen!" mit Hilfe der AES-Verschlüsselung im EAX-Betriebsmodus verschlüsselt.
In diesem Modus wird die Nachricht gleich auch mit einem MAC-Code authentifiziert.
Wir erzeugen beim Verschlüsseln einen Einmal-Code nonce und ein Message Authentication Tag mac_tag.
Nonce wird später für die Entschlüsselung und mac_tag für die Überprüfung der Authentizität bei der Entschlüsselung benötigt.
Der Schlüssel key muss 16 Byte lang sein, deswegen wählen wir hier 16 Buchstaben.
Wird die Verschlüsselung des Klartextes mehrfach ausgeführt, ist der Chiffretext jedesmal ein anderer!
Python-Code: AES-Verschlüsselung
Verwendete Klassen: AES
Verwendete Methoden: encrypt_and_digest()
from Crypto.Cipher import AES
key = b'Sixteen byte key'
cipher = AES.new(key, AES.MODE_EAX)
nonce = cipher.nonce
klartext = "Hallo zusammen!"
chiffretext, mac_tag = cipher.encrypt_and_digest(klartext.encode())
print("Verschlüsselte Nachricht: ", chiffretext, "\nSignatur: ", mac_tag)
Python-Code: AES-Entschlüsselung
Verwendete Klassen: AES
Verwendete Methoden: decrypt(), verify()
from Crypto.Cipher import AES
key= b'Sixteen byte key'
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
klartext = cipher.decrypt(codetext)
try:
cipher.verify(mac_tag)
print("Die Nachricht ist authentisch!:", klartext)
except ValueError:
print("Schlüssel falsch oder Nachricht verfälscht!")
14 Python vs R und MATLAB
Python ist einerseits eine Programmiersprache und kann für Softwareentwicklung verwendet werden, hat andererseits aber auch einen starken Fokus auf Datenanalyse. Im Vergleich zu den Programmiersprachen C und Java und zu den Datenanalyse-Sprachen R und MATLAB gibt es Unterschiede und Gemeinsamkeiten:
- Einrückungen haben in Python eine syntaktische Bedeutung, sie bezeichnen einen Codeblock, d.h. eine Reihe zusammengehöriger Anweisungen. Dies ist anders als in C und Java, wo man geschweifte Klammen verwendet, um Codeblöcke zu kennzeichnen.
- Variablen können ohne Angabe eines Datentyps verwendet werden ("dynamische Typbindung"). Dies ist anders als in C oder Java, und ähnlich wie in R oder MATLAB.
- Der Python-Interpreter hat eine interaktive Benutzerkonsole. Dies ist anders als in C oder Java, und ähnlich wie in R oder MATLAB.
- Python kann sowohl prozedural als auch objektorientiert programmiert werden. Dies ist anders als in C oder Java, und ähnlich wie in R oder MATLAB.
- Python verfügt über umfangreiche Bibliotheken für Datenverwaltung, Datenanalyse und Datenvisualisierung, wie R und MATLAB.
- Python-Klassen verfügen nicht über eine Zugriffssteuerung (private / protected / public) auf ihre Membervariablen und Methoden, d.h. alle Variablen und Methoden einer Klasse sind von außen sichtbar und verwendbar. Dies ist anders als in Java.
Die vollständige und detaillierte Python-Dokumentation kann auf der offiziellen Python-Webseite https://docs.python.org/3/tutorial/ nachgeschlagen werden.
YouTube-Videos
Die Verwendung der erstellten Jupyter Notebooks wird durch Videos (Screencast mit zusätzlichen Erläuterungen) veranschaulicht.
Python Tutorial: Einstieg mit Jupyter Notebook
Jupyter Notebook Widgets verwenden
Autoren, Tools und Quellen
Autor
Prof. Dr. Eva Maria Kiss
Mit Beiträgen von:
M. Sc. Anke Welz, M. Sc. Franc Pouhela
Tools
Python,
Anaconda,
Jupyter Notebook
elab2go-Links
- [1] Datenverwaltung und -Visualisierung mit Pandas: elab2go.de/demo-py2
- [2] Clusteranalyse mit scikit-learn: elab2go.de/demo-py3
- [3] Predictive Maintenance mit scikit-learn: elab2go.de/demo-py4
- [4] Machine Learning-Modellierung mit Keras und Tensorflow: elab2go.de/demo-py5
Quellen und weiterführende Links
- [1] Offizielle Python Dokumentation bei python.org: docs.python.org/3/tutorial/
sehr umfangreich, Nachschlagewerk, hier findet man Dokumentationen für verschiedene Python-Versionen - [2] Python Tutorial bei Google Developers: developers.google.com/edu/python/introduction
umfangreich, für Fortgeschrittene, verweist auf die offizielle Dokumentation - [3] Python Tutorial bei W3Schools: w3schools.com/python/ – für Einsteiger geeignet, interaktive Ausführung im Browser
- [4] Python Cheatsheet: evamariakiss.de/tutorial/python/ – zum Nachschlagen der wichtigsten Python-Befehle, mit Selbsttest / Quiz
- [5] NumPy: numpy.org/ – Mehrdimensionale Arrays, Mathematische Funktionen, Zufallszahlen
- [6] Matplotlib: matplotlib.org/ – Datenvisualisierung, Plotten
- [7] Pandas: pandas.pydata.org/ – Datenverwaltung, Datenvorbereitung, DataFrames, Series
- [8] Scikit-Learn: scikit-learn.org – Algorithmen für Maschinelles Lernen
- [9] Keras: keras.io – Künstliche Neuronale Netzwerke, Deep Learning