0% fanden dieses Dokument nützlich (0 Abstimmungen)
87 Ansichten130 Seiten

Python Kurs WWU Münster

Das Dokument beschreibt einen Python-Kurs an der Universität Münster. Der Kurs umfasst 5 Tage und behandelt Python-Grundlagen, Kontrollstrukturen, Ausnahmen, Funktionen, NumPy, matplotlib und Klassen. Der Fokus liegt auf der Anwendung von Python für numerische Berechnungen.

Hochgeladen von

hansrotbach
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
87 Ansichten130 Seiten

Python Kurs WWU Münster

Das Dokument beschreibt einen Python-Kurs an der Universität Münster. Der Kurs umfasst 5 Tage und behandelt Python-Grundlagen, Kontrollstrukturen, Ausnahmen, Funktionen, NumPy, matplotlib und Klassen. Der Fokus liegt auf der Anwendung von Python für numerische Berechnungen.

Hochgeladen von

hansrotbach
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen

W ESTFÄLISCHE

W ILHELMS -U NIVERSITÄT
M ÜNSTER

Pythonkurs Wintersemester 2016/17


Einführung in die Programmierung zur Numerik mit Python

wissen leben
WWU Münster Stephan Rave 27.-31. März 2017
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 2 /130

Organisation

I Anwesenheitsliste

I Teilnahmenachweis / Allgemeine Studien: Teilnahme an allen 5 Tagen

I Logische Grundlagen und Programmierung (1-Fach Bachelor, PO


2014): Teilnahme an allen 5 Tagen und erfolgreiches Bearbeiten einer
Hausaufgabe

WWU Münster
wissen leben
I Vorkenntnisse?

I Funktioniert der Login?

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 3 /130

Python/NumPy Tutorials

I Programming for Computations – Python

I A Byte of Python

I Python-Tutorial

WWU Münster
I Dive Into Python 3

wissen leben
I Numpy-Tutorial

I Numpy for Matlab Users

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 4 /130

Hilfe!

I Google

I stackoverflow

I Python 3 Sprach-Referenz

WWU Münster
wissen leben
I Python 3 Standardbibliothek-Referenz

I NumPy-Referenz

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 5 /130

Übersicht

Tag 1: Python Grundlagen

Tag 2: Kontrollstrukturen, Exceptions und Funktionen

Tag 3: Numerik mit Python - das Modul NumPy

WWU Münster
Tag 4: matplotlib, numerische Mathematik, sowie Klassen und Vererbung

wissen leben
in Python

Tag 5: Verschiedenes

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 6 /130

Programmierung in der Numerik

Beispiel: Matrixinverse berechnen


Das Invertieren einer Matrix mit Millionen Elementen ist per Hand zu
aufwändig. Man bringe also dem Computer bei: für A ∈ GLn (R) finde A−1
sodass AA−1 = I
I Eingabe: Matrix A ∈ Rmxn
Keinerlei Forderung an m, n. A vielleicht gar nicht invertierbar.

WWU Münster
Welche (Daten-)Struktur hat A?

wissen leben
I Überprüfung der Eingabe: erfüllt A notwendige Bedingungen an
Invertierbarkeit? Ist die Datenstruktur wie erwartet?
I A−1 berechnen, etwa mit Gauß-Algorithmus.
I Ausgabe: Matrix A−1 , falls A invertierbar, Fehlermeldung sonst.
I Probe: AA−1 = I? Was ist mit numerischen Fehlern?

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 7 /130

Programmierung in der Numerik

I Um mathematische Problemstellungen, insbesondere aus der linearen


Algebra und Analysis zu lösen, ist die Anwendung von
Rechnersystemen unerlässlich. Dies ist einerseits durch eine in der
Praxis enorm hohe Anzahl von Unbekannten als auch durch die
Nichtexistenz einer analytischen(exakten) Lösung bedingt.

WWU Münster
I Die Vorlesung „Numerische Lineare Algebra” beschäftigt sich u.a. mit

wissen leben
der Theorie von Algorithmen zur Lösung großer linearer
Gleichungssysteme. Für die Umsetzung dieser Algorithmen verwenden
wir Programmiersprachen wie Python, Matlab, Julia, C, C++ oder
Fortran.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 8 /130

Was ist Python?

I Python ist eine interpretierte, objektorientierte, dynamisch-typisierte


höhere Programmiersprache mit automatischer Speicherverwaltung.
I Python wurde im Februar 1991 von Guido van Rossum (BDFL) am

WWU Münster
Centrum Wiskunde und Informatica in Amsterdam veröffentlich.

wissen leben
I Python ist in den Versionen 2.x und 3.x verbreitet (nicht
abwärtskompatibel!). Wir werden Python 3 verwenden.

Achtung!
Supportende für Python 2 in 2020.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 9 /130

Programmierung mit Python


Wie sage ich dem Computer was er zu tun hat?
I Python-Programme (auch: Python-Skripte) sind Textdateien
bestehend aus nacheinander (oder mit Sprüngen) auszuführenden
Anweisungen.
I Die Python Programmiersprache legt die Form der Anweisungen
fest, die in der Datei stehen dürfen.

WWU Münster
I CPython ist ein ausführbares Programm (Binary), der sogenannte

wissen leben
Python-Interpreter, das diese Anweisungen so interpretiert, dass sie
vom Computer verarbeitet werden können
I Ein Python-Programm auszuführen bedeutet also, CPython mit
dem Python-Programm als Eingabe aufzurufen:
> python3 mein_programm.py
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 10 /130

Besonderheiten von Python

I Objektorientierung: Alles ist ein Objekt.


I Stark typisiert: Jedes Objekt hat einen eindeutigen
unveränderlichen1 Typ.
I Dynamisch typisiert: Der Typ einer Variablen entscheidet sich erst
zur Laufzeit und kann sich ändern.

WWU Münster
I Automatische Speicherverwaltung: Kein manuelles

wissen leben
(fehleranfälliges) anlegen und freigeben von Speicher.
I Whitespace sensitiv: Einrückung entscheidet über Gruppierung von
Anweisungen in logischen Blöcken.

1 fast!

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 11 /130

Einstieg in Python

Wie erstellt man ein Pythonprogramm? - Basis-Variante


Schreiben des Programms:
I In einem beliebigen Texteditor das Programm schreiben und die
Datei als .py Datei, zum Beispiel my_program.py speichern.
Ausführen des Programms im Linux-Terminal:
I Terminal öffnen (Strg + Alt + T) und in das Verzeichnis wechseln,

WWU Münster
in dem die Datei liegt

wissen leben
> cd ordner/unterordner/unterunterordner
I Den Python-Interpreter aufrufen um das Programm zu starten, in
diesem Fall:
> python3 my_program.py

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 12 /130

Hello world!

Ein einfaches Standardbeispiel zum Start zeigt die Verwendung der


Funktion print zur Ausgabe von Strings:

hello_world.py
print ( " Hello world ! " ) # This is a comment

WWU Münster
Es folgt die explizite Ausführung der Datei im Terminal:

wissen leben
> python3 hello_world.py
Mit der Ausgabe:
Hello world!

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 13 /130

Hello world!

Aufgaben
(1) Reproduzieren Sie obiges Beispiel mit entsprechender Erstellung einer
.py Datei in einem geeigneten Ordner mit einem beliebigen Editor.
(2) Fügen Sie Ihrem Programm eine weitere Zeile hinzu, in der Sie einen
erneuten print Befehl mit einem selbst gewähltem String schreiben.

WWU Münster
wissen leben
(3) Python as Taschenrechner: Geben sie mit einer weiteren Zeile den
Wert von 9999 aus.2

2 ab wird in Python als a**b geschrieben.


,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 14 /130

Lernkontrolle
(1) Zur Ausführung eines Python-Programms benötigt man ein(en) ...
(a) Python-Interpret. (b) Python-Compiler.
(c) Python-Skript.
(2) Die logische Unterteilung eines Python-Codes erfolgt per ...
(a) Klammersetzung mit {}. (b) Auslagerung in Datei.
(c) Einrückung.

WWU Münster
(3) Sie haben bereits die print Funktion kennengelernt. Welcher der

wissen leben
folgenden Anweisungen erzeugt einen Fehler?
(a) print(3) (b) print(3+3) (c) print(3+"3")

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 15 /130

Die Python-IDE Pyzo

Pyzo ist eine integrierte Entwicklungsumgebung (IDE) für Python


I Installation (auf eigenen PCs): [Link]

WWU Münster
I Gleichzeitig einfache Installation des Python-Interpreters und

wissen leben
benötigter Pakete
I Funktionen:
I Editor zum Schreiben von Programmen
I Terminal zum Ausführen
I IPython-Shell zum direkten Eingeben von Python-Befehlen
I Debugger
,
I ... ,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 16 /130

Pyzo einrichten
Wenn Shell nicht automatisch ausgewählt: shell config-Menü öffnen

WWU Münster
wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 17 /130

Pyzo einrichten
Python 3-Interpreter auswählen

WWU Münster
wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 18 /130

Pyzo einrichten
Pyzo-Basis-Startbildschirm

WWU Münster
wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 19 /130

Editor und Shell


Die Python-Shell:
I Führt Python-Befehle interaktiv aus.
I Befehle können einfach Zeile für Zeile eingetippt und ausgeführt
werden.
=⇒ Nützlich für schnelles Ausprobieren von Code.

WWU Münster
wissen leben
Der Editor:
I Programm wird im Editor geschrieben.
I Kompletter Code oder Teile können in der Shell ausgeführt werden.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 20 /130

Code ausführen in Pyzo

Es gibt verschiedene Arten, wie Code aus dem Editor in der Shell
ausgeführt werden kann:

Interactive Mode
I Execute file: Kompletter Quellcode wird ausgeführt.
I Execute selection: Markierter Quellcode wird ausgeführt; ist nichts

WWU Münster
markiert, wird die aktuelle Zeile ausgeführt.

wissen leben
Interactive Mode entspricht praktisch dem Kopieren des Codes in die
aktuelle Shell, die den Code dann ausführt

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 21 /130

Code ausführen in Pyzo


Script Mode
I Run file as script: Neue Shell wird gestartet, Skript-Name und
Arbeitsverzeichnis werden passend gesetzt, im Editor geschriebene
Datei wird dort ausgeführt.

Script Mode entspricht praktisch dem Ausführen der Datei im Terminal.

WWU Münster
Die Datei muss dazu abgespeichert werden.

wissen leben
Achtung!
Der Code kann beim Entwickeln schnell und einfach im Interactive Mode
ausgeführt werden, das fertige Programm muss am Ende aber auch im
Script Mode funktionieren!

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 22 /130

Pyzo

Aufgaben
Probieren Sie die Funktionen der Python-Shell und der
Pyzo-Run-Optionen aus:
I Benutzen Sie die print-Funktion direkt in der Shell.

Öffnen Sie Ihre hello_world.py-Datei im Editor.

WWU Münster
wissen leben
I Führen Sie den kompletten Code im Interactive Mode aus.
I Führen Sie nur eine Zeile aus.
I Führen Sie die Datei im Script Mode aus.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 23 /130

Namen (=Variablen) und Zuweisung

Die Zuweisung eines Objekts an einen Namen (Variable) erfolgt in Python


über das Konstrukt:
<Name> = <Wert>
Im Gegensatz zu anderen Programmiersprachen wie z.B. C++ steht der
Typ einer Variablen in Python erst zur Laufzeit fest, d.h. eine Variable
muss nicht im Vorhinein korrekt deklariert werden.

WWU Münster
wissen leben
Der Typ einer Variable legt dessen Zugehörigkeit zu einer Menge
gleichartiger Datenstrukturen und damit dessen Verwendungsmöglichkeiten
fest. Einfaches Beispiel sind int und float Typen in Python.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 24 /130

Variablen, Zuweisungen und Typen


Folgendes Programmbeispiel zeigt Definition und Verwendung einfacher
Variablen:
[Link]
x = 1 # x verwe i s t aus das 1 Objekt des Typs int
y = 1.0 # y verwe i s t auf das 1.0 Objekt des Typs float

print ( " x = " , x , " has the Type " , type ( x ))

WWU Münster
print ( " y = " , y , " has the Type " , type ( y ))

wissen leben
x = x + 3
y = y * 2

print ( x )
print ( y )

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 25 /130

Built-in types
Built-in types in Python sind u.a.:
I Numeric types: integers (int), floating point numbers (float) und
complex numbers (complex)

I Boolean type (bool) mit Werten True und False

I Text sequence type string (str)

WWU Münster
wissen leben
I Sequence types: list, tuple und range

I Set types: set und frozenset

I Mapping type dictionary (dict)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 26 /130

Operatoren

Wie rechnet man in Python?


Seien x, y und z Variablen, dann sind in Python u.a. folgende binäre und
unäre Rechenoperationen möglich:

Addition: z=x+y x=x+y bzw. x+=y


Subtraktion: z=x-y x=x-y bzw. x-=y
Multiplikation: z=x*y x=x*y bzw. x*=y

WWU Münster
wissen leben
(Echte) Division: z=x/y x=x/y bzw. x/=y
Gerundete Division: z=x//y x=x//y bzw. x//=y
Modulo: z=x%y x=x%y bzw. x%=y
Potenzieren: z=x**2 x=x**2
Negation: z=-x x=-x

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 27 /130

Strings

Strings können auf verschiedene Weisen angelegt und verkettet werden:

[Link]
# Strings koennen auf v e r s c h i e d e n e n
# Wegen d e f i n i e r t werden ( string l i t e r a l s )
name = ’ Bond ’
prename = " James "

WWU Münster
salutation = """ My name is """

wissen leben
# Ausgabe
agent = salutation + " " + name + " , " + prename + " " + name + " . "
print ( agent )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 28 /130

Sequence Types
[Link]
# list ist mutable
l = list ()
print ( l )
l = [1 , ’2 ’ , list ()]
print ( l )
l [0] = 9
print ( l )

# tuple ist i m m u t a b l e

WWU Münster
t = tuple ()

wissen leben
t = ( ’ value ’ , 1)
print ( t )
t [0] = t [1] # error

# range ist i m m u t a b l e
r = range (0 ,4 ,1) # das selbe wie range (4)
print ( r )
print ( list ( r ))

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 29 /130

Zuweisungen erstellen keine Kopien!

[Link]
l = [0 , 4 , 42]
k = l
k [1] = 7
print ( k )
print ( l )

WWU Münster
# int , float , str sind i m m u t a b l e !

wissen leben
i = 42
j = i
j += 1 # erzeugt 43 Objekt und weist es j zu
print ( j )
print ( i )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 30 /130

Set type und dictionary type

[Link]
# set
s = set ()
print ( s )
s = set ([1 ,2 ,3])
print ( s )
print ( s == set ([1 ,2 ,2 ,1 ,3]))

WWU Münster
# dictionary

wissen leben
d = dict ()
d = { ’ key ’: ’ value ’}
d = { ’ Paris ’: 2.5 , ’ Berlin ’: 3.4}
print ( ’ Einwohner Paris : ’ , d [ ’ Paris ’] , ’ Mio ’)
print ( ’ Einwohner Berlin : ’ , d [ ’ Berlin ’] , ’ Mio ’)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 31 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem 2 verschiedene Variablen
x , y mit selbst gewählte Werte vom Typ float zugeweisen werden und
dann deren Summe, Differenz und Produkt ausgegeben werden.
(2) Konstruieren sie ein list-Objekt, das x und y enthält, und erweitern
Sie dieses schrittweise mit den Ergebnissen der Rechenoperationen
aus (1). Geben Sie das Ergebnis aus.
Hinweis: Recherchieren Sie hierzu im Internet, wie man Zahlen und

WWU Münster
Objekte an Listen anhängt.

wissen leben
(3) Konstruieren Sie ein dict, dessen keys aus x , y sowie den Namen der
Rechenoperationen aus (1) bestehen, und denen als values die
passenden Werte zugeordnet sind. Geben Sie den Wert der Summe
und der Differenz mithilfe dieser Datenstruktur aus.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 32 /130

Lernkontrolle
(1) Von welchem Typen ist das Ergebnis der Operation 1 + 2.0?
(a) int (b) complex (c) float
(2) Im Gegensatz zum sequence type list ist ein tuple ...
(a) mutable. (b) immutable. (c) ein set type.

(3) Welche der folgenden Definitionen eines dict ist nicht zulässig?
(a) {3: ’drei’} (b) {(3,4): ’Drei und vier!’ }

WWU Münster
wissen leben
(c) {[3,4]: ’Drei und vier!’ }

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 33 /130

Boolean type und logische Verknüpfungen


Der Typ bool hat genau zwei Werte: True und False.

Allen Python-Objekten o ist mit bool(o) ein Wahrheitswert zugeordnet.

Python stellt logische Operatoren bereit um Wahrheitswerte zu


vergleichen und einen neuen Wahrheitswert liefen:
I not, or, and

WWU Münster
Operanden o, die nicht vom Typ bool sind, wird dabei implizit zu bool(o)

wissen leben
umgewandelt. Der Rückgabewert von o and/or o2 entspricht dem
Operanden, der über den Wahrheitswert des Ausdrucks entschieden hat.

Python-Objekte können mit == und is auf Gleichheit bzw. Identität


geprüft werden.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 34 /130

Boolean Typ und logische Verknüpfungen

[Link]
print ( bool (7))
print ( bool (0))
print ( bool (0.))
print ( bool ([]))
print ( bool ([0]))
print ( bool ( ’ ’ ))

WWU Münster
print ( bool ( None ))

wissen leben
print ( bool (()))

print ( False or 3)
print ( True and False )
print (4 or [4])

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 35 /130

Boolean Typ und logische Verknüpfungen


[Link]
a , b = [8] , [8]
print ( a == b )
print ( a is b )

a = 9
b = 9
print ( a == b , a is b )

a = 9999

WWU Münster
b = 9999

wissen leben
print ( a == b , a is b )

Achtung!
Der Operator is sollte in der Regel nur in der folgenden Form verwendet
werden: <Variable> is None
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 36 /130

Kontrollstrukturen
Python bietet folgende Kontrollstrukturen an:
I Bedingte Verzweigung:

if <Bedingung>:
<Anweisungen>
elif <Bedingung>:
<Anweisungen>
else:
<Anweisungen>

WWU Münster
wissen leben
I Bedingte Schleife:

while <Bedingung>:
<Anweisungen>

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 37 /130

Kontrollstrukturen
I Zählschleife:

for <Variable> in <Iterierbares Objekt>:


<Anweisungen>

In einer for Schleife lässt sich z.B. über sequence types und dictionary
types iterieren.

WWU Münster
Die Anweisungen bzw. Anweisungsblöcke, die logisch zusammengehören,

wissen leben
müssen in der selben Tiefe eingerückt sein. Hierzu empfiehlt sich die
Benutzung der Tabulator-Taste.
Achtung!
Stellen Sie Ihren Editor so ein, dass die Tabulator-Taste eine feste Anzahl
an Leerzeichen ausgibt!
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 38 /130

Kontrollstrukturen

[Link]
# V e r z w e i g u n g mit if
condition = " " or (3 - 3)

if condition :
print ( " Condition is true ! " )

WWU Münster
elif 1 == 2:

wissen leben
print ( " 1 is equal to 2! " )
else :
print ( " Nothing true here :( " )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 39 /130

Kontrollstrukturen

[Link]
# while - S chleife
a = 0
while a < 5:
a +=1
print ( a )

WWU Münster
wissen leben
# for - S c h leife
for i in range (0 ,4 ,1):
print ( i )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 40 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem zunächst zwei leere
Listen angelegt werden und eine beliebige positive Integer-Zahl in
einer Variablen end gespeichert wird.
Ihr Programm soll nun mithilfe einer for oder while Schleife unter
Verwendung eines if - else Verzweigungsblock alle natürlichen Zahlen

WWU Münster
kleiner gleich end in jeweils gerade und ungerade Zahlen in die zuvor

wissen leben
definierten Listen aufteilen und speichern. Geben Sie diese Listen aus.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 41 /130

Lernkontrolle
(1) Welchem Wert entspricht der folgende Ausdruck?
False or ((True and False) or (True is False)
or (True is True and (True or False)))
(a) True (b) False (c) 2
(2) Welcher der folgenden Typen kann in einer for-Schleife nicht als Typ
des iterierbaren Objekts verwendet werden?
(a) list (b) dict (c) int

WWU Münster
(3) Welcher der folgenden Ausdrücke erzeugt für a=5 und b=[1,2] eine

wissen leben
Endlosschleife?
(a) for i in range(a): a+=1 (b) while a < 5: a+=1
(c) for i in b: [Link](i)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 42 /130

Guter Programmierstil

Was ist zu empfehlen?


I Programmteile übersichtlich gruppieren und besonders bei
Verzweigungen sowie Schleifen mit Einrückungen arbeiten. (Python
erzwingt dies automatisch.)
I Genügend Kommentare einfügen um potentielle Leser die
Funktionsweise des Codes nahezubringen.

WWU Münster
wissen leben
I Genügend Kommentare einfügen um stets selbst zu verstehen was
man programmiert hat - wichtig für Fehlerbehandlung!
I Variablennamen sinnvoll wählen.
I PEP 8.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 43 /130

Zusammenfassung
Bisherige Themen
I Erstellen und Übersetzen einer .py Datei
I Grundlegender Umgang mit Pyzo
I Grundlagen der Programmiersprache Python: Zuweisungen,
Variablen, Kontrollstrukturen und Typen

WWU Münster
Kommende Themen

wissen leben
I Mehr zu Kontrollstrukturen
I Input/Output
I Exceptions
I Funktionen

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 44 /130

Pyzo erweitern
Pyzo kann mit verschiedenen Tools erweitert werden. Diese können im
Tools-Menü aktiviert werden.
Besonders nützlich sind:
I File Browser
I Workspace: Eine Übersicht aller aktuell in der Shell definierten
Variablen

WWU Münster
wissen leben
I Interactive Help: Hilfe-Funktion, mit der nach Infos über Module,
Objekte, etc. gesucht werden kann. Wird beim Schreiben im Editor
passend aktualisiert.
Alle einzelnen Pyzo-Komponenten können je nach Wunsch beliebig
platziert werden.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 45 /130

Kontrollstrukturen

In Kontrollstrukturen können weitere, hilfreiche Schlüsselwörter innerhalb


einer Schleife benutzt werden:

I continue: Springt sofort zum Anfang des nächsten


Schleifendurchlaufs.

WWU Münster
wissen leben
I break: Bricht Schleife ab.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 46 /130

Kontrollstrukturen

[Link]
for i in range (5):
if i == 2:
c ontinue # Zur n a e c h s t e n I t e r a t i o n
print ( i )
if i == 3:
break # Bricht S c h l e i f e ab

# e n u m e r a t e zaehlt Elemen t e eines i t e r a b l e s auf

WWU Münster
for i , value in e n u m e r a t e ( range (0 ,10 ,2)):

wissen leben
print ( ’ Die ’ , i , ’ - te Zahl ist ’ , value )

# S c h l e i f e ueber key / value - Paare eines dicts


dic = { ’ Paris ’: 2.5 , ’ Berlin ’: 3.7 , ’ Moskau ’: 11.5 }
for key , value in dic . items ():
print ( key + ’: ’ , value , ’ Mio Einwohner ’)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 47 /130

Strings - Fortsetzung
Die Ausgabe von Strings kann mithilfe von Angaben in { } in der
formatierten Ausgabe spezifiziert werden:

[Link]
x , y = 50/7 , 1/7
print ( " {} " . format ( x )) # 7.14285714286
print ( " {1} , {0} " . format (x , y )) # 0.1428... , 7 . 1 4 2 8 . . .
print ( " {0: f } {1: f } " . format (x , y )) # 6 N a c h k o m m a s t e l l e n

WWU Münster
print ( " {: e } " . format ( x )) # Exponentialformat

wissen leben
print ( " {:4.3 f } " . format ( x )) # Ausgabe 4 Stellen
# 3 Nachkommastellen
print ( " {0:4.2 e } {1:4.1 f } " . format (x , y ))
print ( " {0: >5} ist {1: <10.1 e } " . format ( " x " ,x ))
print ( " {0:5} ist {1:10.1 e } " . format ( " y " ,y ))
print ( " {0:2 d } {0:4 b } {0:2 o } {0:2 x } " . format (42))

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 48 /130

Exceptions
In Python werden unter anderem folgende (builtin) Fehlertypen
unterschieden:
I SyntaxError: Ungültige Syntax verwendet.
I ZeroDivisonError: Division mit Null.
I NameError: Gefundener Name nicht definiert.

WWU Münster
I TypeError: Funktion oder Operation auf Objekt angewandt, welches

wissen leben
diese nicht unterstützt.
I AttributeError, KeyError, IOError und viele mehr
Für eine vollständige Liste siehe:
[Link]

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 49 /130

Exceptions
Schreibt man selbst Programme, so lassen sich Fehler mit einem try -
except Block abfangen. Die Struktur ergibt sich wie folgt:

try:
<Anweisungen>
except <Fehler-Typ>:
<Anweisungen im Fehlerfall>

WWU Münster
wissen leben
except <Anderer Fehler> as e:
<Anweisungen im Fehlerfall>
finally:
<Anweisungen, die immer ausgeführt werden>

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 50 /130

Exceptions kann man selber mithilfe des Schlüsselworts raise auslösen:

[Link]
def get_name ():
name = input ( ’ Name : ’) # Eingabe des Nutzers
if len ( name ) == 0:
raise ValueError ( ’ Keine Eingabe ’)
return name

try :
n = get_name ()
except ValueError :

WWU Münster
print ( ’ Kein Name angegeben ’)

wissen leben
except Exception as e :
print ( ’ Anderer Fehler : ’ , e )
finally :
print ( ’ Dies wird immer ausgefuehrt ! ’)

print ( ’ Hallo {}! ’. format ( n ))

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 51 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, das eine Nutzereingabe erwartet
und testet, ob die Eingabe eine positive Integer-Zahl ist. Ist das nicht
der Fall, so bricht das Programm mit einer selbst gewählten
Fehlermeldung ab. Ist das der Fall, so werden alle natürlichen Zahlen
von 0 bis zur Eingabezahl in einer Schleife addiert und das Ergebnis
ausgegeben.
Hinweis: Verwenden Sie die Funktion input() und wandeln Sie die
String-Eingabe mithilfe von int() in eine gültige Integerzahl um.

WWU Münster
Schlagen Sie im Zweifel in der Dokumentation von Python deren

wissen leben
richtige Verwendung nach.
(2) Erweitern Sie Ihr Programm aus (1) wie folgt: Benutzen Sie
continue um nur gerade Zahlen in der Schleife zu addieren und
brechen Sie die Schleife ab, falls die bisher berechnete Summe den
fünffachen Wert der Eingabezahl übersteigt.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 52 /130

Lernkontrolle
(1) Welche der folgenden Anweisungen erzeugt einen Fehler?
(a) 2*[1,3] (b) "das"*10 (c) "das"+10

(2) Sei d={’a’: 1, ’b’: 2} ein dict. Welcher Fehler wird bei dem Aufruf
print(d[’c’]) erzeugt?
(a) KeyError (b) IOError (c) NameError

WWU Münster
wissen leben
(3) Mit welcher Formatspezifikation können Sie die Zahl 11/26 als float
Zahl mit 8 Stellen nach dem Komma rechtsbündig mithilfe von print
ausgeben?
(a) {:>8f} (b) {:>9.8f} (c) {:>9.8l}

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 53 /130

Lesen und Schreiben von Dateien

In Python lassen sich einfach Dateien öffnen, schreiben und lesen.


Folgende Funktionen stellt Python dazu bereit:

I open( ): Öffnen einer Datei


I write( ): Einzelne strings in Datei schreiben
I writelines( ): Liste von strings in Datei schreiben

WWU Münster
I readlines( ): Liest Zeilen einer Datei in Liste von strings

wissen leben
I readline( ): Liest einzelne Zeile einer Datei in einen string
I read( ): Liest alle Zeilen einer Datei in einen string

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 54 /130

Lesen und Schreiben von Dateien

Außerdem lässt sich dem Befehl open( ) ein zusätzliches Attribut


übergeben, dass die Art des Zugriffs auf eine Datei regelt:

I r: Öffnen zum Lesen (Standard)


I w: Öffnen zum Schreiben - impliziert Überschreiben
I a: Öffnen zum Schreiben am Ende der Datei

WWU Münster
I r+: Öffnen zum Lesen und Schreiben am Anfang der Datei

wissen leben
I w+: Öffnen zum Lesen und Schreiben, Dateiinhalt zuvor gelöscht
I a+: Öffnen zum Lesen und Schreiben am Ende der Datei

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 55 /130

Lesen und Schreiben von Dateien


[Link]
# Datei oeffnen
d = open ( " Beispiel . txt " ," r + " )

# Lesen
contents = d . read ()
if contents != " " :
print ( contents )
else :
print ( " Datei ist leer !\ n \ n " )

WWU Münster
wissen leben
# Nutzereingabe
text = input ( " Schreibe an das Ende der angezeigten Zeilen : " )

# S c h r e i b e n mit Z e i l e n u m b r u c h am Ende
d . write ( text + " \ n " )

# Datei s c h l i e s s e n
d . close ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 56 /130

Kopieren von Container-Objekten

[Link]
l = [1 ,2]
k = l # k und l v e r w e i s e n auf d a s s e l b e Objekt
k [0] = 99
print k , l

l = [1 ,2]

WWU Münster
k = l . copy () # k verweis t auf eine Kopie des Objekts

wissen leben
# auf das l v e r w e i s t
k [0] = 99
print k , l

Genauso haben dict und set eine copy-Methode.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 57 /130

Funktionen
Funktionen dienen zur Auslagerung und Systematisierung von
Anweisungen, die dann bequem über den Aufruf der Funktion beliebig oft
ausgeführt werden können. Die Funktion kann Eingabeargumente erhalten
und selbst Objekte zurückgeben.

Funktionen in Python werden mit dem Schlüsselwort def, dem


Funktionsnamen und der übergebenen Parameterliste wie folgt definiert:

WWU Münster
wissen leben
def Funktionsname(a,b,...):
<Anweisungen>

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 58 /130

Funktionen

[Link]
# Definiere Summenfunktion
def summe (a , b ):
return a + b

result = summe (1 ,2)


print ( result )

WWU Münster
wissen leben
# F u n k t i o n e n sind Objekte wie alles andere in Python
f = summe
print ( result - f (1 ,2))
print ( f )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 59 /130

Funktionen

[Link]
# Produktfunktion
def product (a , b ):
return a * b

# F u n k t i o n : wende a , b auf op an
def execute (a , b , op ):

WWU Münster
return op (a , b )

wissen leben
# F u n k t i o n e n lassen sich wie Objekte
# als P a r a m e t e r u e b e r g e b e n
print ( execute (3 , 5 , product ))

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 60 /130

Geltungsbereich (Scope) von Variablen


Bei der Arbeit mit Funktionen muss darauf geachtet werden, dass in
Funktionen lokal definierte Variablen nicht global bekannt sind, wie
folgendes Beispiel zeigt:
[Link]
def function ():
x = 1
return x

WWU Münster
if True :

wissen leben
y = 2

# K o n t r o l l s t r u k t u r e n erz e u g e n keinen lokalen scope


print ( y )

# F u n k t i o n s d e f i n i t i o n e n h i n g e g e n schon - Fehler
print ( x )

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 61 /130

Lambda-Funktionen

Lambda-Funktionen dienen zur Erstellung von anonymen Funktionen, d.h.


Funktionen ohne Namen. Speziell bei Nutzung der map- oder
filter-Funktion sind solche Lambda-Funktionen hilfreich. Sie werden wie
folgt definiert:

WWU Münster
wissen leben
lambda <Argumente>: <Ausdruck>

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 62 /130

Lambda Funktionen

Lambda
# Einfache Verwendung
f = lambda x , y : x + y
f (2 ,3) == 5

# V e r w e n d u n g auf map , filter

WWU Münster
values = [ -1 , , 2 , , -3]

wissen leben
map ( lambda x : x > 0 , values ) == [ False , True , False ]
filter ( lambda x : x > 0 , values ) == [2]

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 63 /130

and und or sind short-circuit Operatoren


In <Ausdruck1> and/or <Ausdruck2> wird Ausdruck2 nur dann
ausgewertet, wenn Ausdruck1 nicht bereits über den Wahrheitswert des
Gesamtausdrucks entschieden hat.
short-circuit
def f1 ( x ):
print ( ’ in f1 ’)
return x

WWU Münster
def f2 ( x ):

wissen leben
print ( ’ in f2 ’)
return x

f1 (0) or f2 (0) # gibt ’ in f1 ’ und ’ in f2 ’ aus


f1 (1) or f2 (3) # gibt ’ in f1 ’ aus
f1 (0) and f2 (3) # gibt ’ in f1 ’ aus
f1 (3) and f2 (3) # gibt ’ in f1 ’ und ’ in f2 ’ aus

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 64 /130

Import von Modulen


Bei größeren Programmierprojekten bietet es sich zur besseren Übersicht
an, verschiedene Programmteile in verschiedenen Quelldateien (Module)
auszulagern. Entsprechende Dateien können dann per import-Anweisung
in Python in andere Quelldateien importiert werden. Alle importierten
Klassen und Funktionen sind dann verwendbar.

Folgende Befehle stehen hierzu zur Verfügung:


import <Modulname>

WWU Münster
I

wissen leben
Verwendung per <Modulname>.<Funktion/Klasse>
I from <Modulname> import <Funktion/Klasse> [as <Name>]
Verwendung per <Funktion/Klasse>
Dabei ist <Modulname> der Dateiname einer Quelldatei (ohne .py) im
gleichen Verzeichnis oder im global Modul-Suchpfad von Python.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 65 /130

Import von Quelldateien


[Link]
def summe (a , b ):
return a + b

[Link]
import tools # tools . py liegt im g l e i c h e n V e r z e i c h n i s

WWU Münster
z = tools . summe (2 ,3)

wissen leben
print ( z )

# Alternativen
from tools import summe # E i n z e l n e F u n k t i o n
z = summe (2 ,3)
print ( z )

from tools import summe as import_summe


z = import_summe (2 ,3)
print ( z )
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 66 /130

Aufgaben
(1) Schreiben Sie eine Python-Datei, die eine Funktion enthält, welche
zwei gleich lange übergebene Listen elementweise addiert und die
Ergebnisliste zurückgibt.
Hinweis: Entweder wird in Ihrer Funktion eine neue Liste erzeugt,
oder sie verwenden eine der bereits gegebenen Listen und
modifizieren diese.

WWU Münster
(2) Schreiben Sie ein Python-Programm, das Ihre Datei aus (1)

wissen leben
importiert. Definieren Sie zwei gleich lange Listen und verwenden Sie
die importierte Funktion. Geben Sie die Ergebnisliste aus.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 67 /130

Lernkontrolle
(1) def incr(a): a+=2 sei eine Funktion. Angenommen sie definieren b=2
und rufen incr(b) auf. Welchen Wert hat b nun?
(a) 4 (b) 2 (c) Undefiniert
(2) def incr(a): a+=[2] sei eine Funktion. Angenommen sie definieren
b=[2] und rufen incr(b) auf. Welchen Wert hat b nun?
(a) [4] (b) [2] (c) [2,2]
(3) Sie haben zufällig zwei Funktionen gleicher Signatur aus zwei

WWU Münster
verschiedenen Dateien importiert und können in ihrem Code beide

wissen leben
nicht explizit unterscheiden. Was passiert bei Aufruf der Funktion?
(a) Ein Fehler wird erzeugt.
(b) Die zuletzt Importierte wird aufgerufen.
(c) Die zuerst Importierte wird aufgerufen.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 68 /130

Zusammenfassung

Bisherige Themen
I Grundlagen der Programmiersprache Python: Funktionen, Strings,
Exceptions
I Importieren von Quelldateien in Python

WWU Münster
wissen leben
Kommende Themen
I Numerik mit Python - das numpy-Modul

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 69 /130

Debuggen in Pyzo
Ein Debugger dient zum Auffinden und Analyiseren von Fehlern in
Programmen. Insbesondere kann mit einem Debugger das Programm
angehalten und schrittweise ausgeführt werden.

I Breakpoint setzen: An der passenden


Stelle in die graue Spalte zwischen
Zeilennummer und Code klicken
I Programm starten; stoppt automatisch beim Breakpoint

WWU Münster
I Verschiedene Icons in der Shell zum „Weiterklicken“:

wissen leben
Weiter bis zur nächsten Zeile
Nächster Schritt (auch in aufgerufene Funktionen, etc. hinein)
Bis zum Ende des aktuellen Bereichs (z.B. return)
Weiter (bis zum nächsten Breakpoint)
Debuggen beenden

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 70 /130

Das Modul NumPy


NumPy ist ein externes Python-Modul für wissenschaftliches Rechnen.
Es liefert mächtige array Objekte, mit deren Hilfe effektive Berechnungen
im Sinne der numerischen linearen Algebra möglich sind. Dies ist allerdings
nur ein Verwendungszweck des NumPy-Pakets.
Wesentliche Vorteile von NumPy:
I Prägnante Formulierung mathematischer Operationen wie z.B.
Matrix-Multiplikation.

WWU Münster
I Meist viel höhere Geschwindigkeit als bei Verwendung von

wissen leben
Python-Listen und Schleifen.
I Große Sammlung grundlegender mathematischer Algorithmen, z.B.
LGS lösen.
Weitere Informationen und ein ausführliches Tutorial sind zu finden unter:
[Link]
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 71 /130

NumPy
Arrays
import numpy as np
# 1 d array (= Vektor )
a = np . array ([1 ,2 ,3 ,4])
a . shape == (4 ,)
a . dtype == np . int64

# 2 d array (= Matrix )
a = np . array ([[1. ,2.] , [3. ,4.] , [5. ,6.]])

WWU Münster
a . shape , a . dtype == (3 ,2) , np . float64

wissen leben
# 3 d array (= 3 - Tensor )
a = np . array ([[[1. ,2.] ,[4 ,5]] ,[[1 ,2] ,[4 ,5]]])
a . shape , a . dtype == (2 ,2 ,2) , np . float

# Achtung , alle Zeilen muessen gleich lang sein !


a = np . array ([[1 ,2] ,[3] ,[4]])
a . shape , a . dtype == (3 ,) , object

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 72 /130

NumPy
Array-Erstellung und -Indizierung (Slicing)
import numpy as np

np . ones ((4 ,4) , dtype = complex )


np . zeros ((3 ,3 ,3))
np . empty (5)
np . eye (3)

# leere , aber u n t e r s c h i e d l i c h e Arrays !

WWU Münster
np . zeros (0)

wissen leben
np . zeros ((0 ,5))
np . zeros (())

# I n d i z i e r u n g und Slicing
a = np . arange (6). reshape ((3 ,2))
print ( a )
a [2 ,0] # == 4
a [1 ,:] # zweite Zeile
a [: ,0] # erste Spalte
a [1:3 ,0] # == [3 ,5]
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 73 /130

NumPy
Grundlegende Operationen
import numpy as np
a = np . array ([1 ,2 ,3])
b = np . arange (3)

a-b # == np . array ([1 ,1 ,1])


b **2 # == np . array ([0 ,1 ,4])
b += a # == np . array ([1 ,3 ,7])

WWU Münster
sin ( a )

wissen leben
a < 3 # == np . array ([ True , True , False ] , dtype = bool )

# Matrizen
A = np . array ([[1 ,0] ,[0 ,1]])
B = np . array ([[2 ,3] ,[1 ,4]])
A*B # e l e m e n t w e i s e s Produkt
A . dot ( B ) # Matrixprodukt

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 74 /130

NumPy

Weitere Operationen
a = np . arange (5)
a . sum () # = 10
a . min () # = 0
a . max () # = 4

b = np . arange (6). reshape (2 ,3)


b . sum ( axis =0) # == np . array ([3 ,5 ,7])

WWU Münster
b . max ( axis =1) # == np . array ([2 ,5])

wissen leben
b . cumsum ( axis =0) # == np . array ([[0 ,1 ,2] ,[3 ,5 ,7]])

c = np . random . rand (5)


print ( c )
c . sort ()
print ( c )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 75 /130

NumPy
Stacking und Splitting von arrays
# stacking
a , b = np . arange (3) , np . arange (3 ,6)
np . vstack (( a , b )) # == np . array ([[0 ,1 ,2] ,[3 ,4 ,5]])
np . hstack (( a , b )) # == np . array ([0 ,1 ,2 ,3 ,4 ,5])
np . column_stack (( a , b )) # == np . array ([[0 ,3] ,[1 ,4] ,[2 ,5]])

# splitting
c = np . hstack (( a , b ))

WWU Münster
np . hsplit (c ,3) # c in 3 Teile trennen

wissen leben
np . hsplit (c ,(3 ,4)) # c nach 3. und 4. Spalte trennen

Achtung!
Funktionen wie hstack() erwarten einen Parameter, d.h. hstack(a,b)
statt hstack((a,b)) erzeugt einen Fehler.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 76 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem folgende Matrix-Vektor
Multiplikation mit Matrix A und Vektor x mit Hilfe von
NumPy-Arrays vereinfacht wird:
 
0 0 0
A = 0 −2 1 , x = (4, 1, 2)T
0 2 5

WWU Münster
wissen leben
Extrahieren Sie hierzu möglichst geschickt die 2 × 2 Untermatrix bei
Streichung der ersten Spalte und ersten Zeile von A und multiplizieren
diese mit dem richtigen Teilvektor von x . Geben Sie das Ergebnis aus.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 77 /130

Lernkontrolle
(1) Sei a=[Link]([1,2,3,4]) gegeben. Was ist das Ergebnis der
Operation a/=2?
(a) [Link]([0.5,1.0,1.5,2.0]) (b) [Link]([0,1,1,2])
(c) TypeError
(2) Was ist der Unterschied zwischen range() und arange()?
(a) range() liefert Liste, arange() NumPy array.

WWU Münster
(b) Es gibt keinen!

wissen leben
(c) range() liefert iterierbares Range-Objekt, arange() NumPy array.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 78 /130

NumPy

Achtung!
Bei der Arbeit mit NumPy kann es schnell zu Fehlern bezüglich der
Zuweisung gleicher Daten kommen. Folgende, Fälle müssen unterschieden
werden:

WWU Münster
I Referenz

wissen leben
I Kopie
I View

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 79 /130

NumPy
Referenz
a = np . arange (4)
b = a # Kein neues Objekt ! a und b v e r w e i s e n auf d a s s e l b e Objekt
b is a # True
b . shape = (2 ,2) # Aendert Form von a
a . shape # == (2 ,2)

Kopie

WWU Münster
wissen leben
a = np . arange (4)
b = a . copy () # Neues array mit neuen Daten
b is a # False
b [1] = 5
b # == array ([0 ,5 ,2 ,3])
a # == array ([0 ,1 ,2 ,3])

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 80 /130

NumPy
View
a = np . arange (4)
b = a . view ()
b is a # False
b . base is a # True - b ist View auf Daten von a
b . shape = (2 ,2)
a . shape # == (4 ,) - Form von a wurde nicht v e r a e n d e r t
b [1 ,1] = 100 # Daten von a / b werden v e r a e n d e r t
a # == array ([0 ,1 ,2 ,100])

WWU Münster
wissen leben
Achtung!
I Das Kopieren speicherintensiver Objekte (in der Praxis z.b. Gitter mit
Millionen von Gitterpunkten) sollte vermieden werden.
I Bei Unsicherheiten lässt sich über is feststellen, ob Variablen auf das
gleiche Objekt verweisen.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 81 /130

NumPy

Übersicht wichtiger array Befehle


I Erstellung: array( ), ones( ), zeros( ), diag( ), eye( ), empty( ),
arange( ), linspace( )
I Manipulation: transpose( ), inv( ), reshape( ), ravel( )
I Information: shape, ndim, dtype, itemsize, size, print
I Operationen: dot( ), trace( ), column_stack( ), row_stack( ),

WWU Münster
vstack( ), hstack( ), hsplit( ), vsplit( ), sum( ), min( ), max( )

wissen leben
Achtung!
Befehl array([1,2,3,4]) korrekt, array(1,2,3,4) erzeugt Fehler!

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 82 /130

NumPy

Universal functions (ufuncs)


NumPy bietet die Nutzung verschiedener mathematischer Funktionen wie
zum Beispiel:
I sin, cos, exp, sqrt und add
Diese agieren jeweils elementweise auf eingegebene Arrays.

WWU Münster
Universal functions

wissen leben
import numpy as np
a = np . arange (4)
np . exp ( a ) # == array ([1. , 2.718 , ...])
np . sqrt ( a ) # == array ([0. ,1. ,...])
np . add (a , a ) # == array ([0 ,2 ,4 ,6])

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 83 /130

NumPy
Eine weitere Möglichkeit mit Matrizen zu arbeiten bietet die
matrix-Klasse in Numpy:
Matrix class
A = np . matrix ( " 1.0 , 0.0; 0.0 , 1.0 " )
type ( A ) # == < class ’ numpy . m a t r i x l i b . d e f m a t r i x . matrix ’>
A.T # t r a n s p o n i e r t e Matrix
A.I # inverse Matrix
B = np . matrix ( " 1.0 , 2.0; 3.0 , 4.0 " )
A*B # Matrixmultiplikation

WWU Münster
y = np . matrix ( " 3.0; 2.0 " )

wissen leben
np . linalg . solve (A , y ) # loest l i n e a r e s G l e i c h u n g s s y s t e m Ax = y nach x

Achtung!
Die Verwendung von matrix ist aufgrund der subtilen Unterschiede zu
array generell nicht empfehlenswert.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 84 /130

NumPy
NumPy ermöglicht neben der indizierung mit Zahlen und slices auch die
Indizierung mit Listen von Indices. Dies erzeugt immer eine Kopie!

Advanced Indexing
a = np . arange (10)**2 # Erste zehn Q u a d r a t z a h l e n
i = np . array ([2 ,3 ,3 ,7 ,8]) # Ein Index - Array
a[i] # == array ([4 ,9 ,9 ,49 ,64])

WWU Münster
j = np . array ([[1 ,2] ,[6 ,5]]) # 2 - dim Index - Array

wissen leben
a[j] # == array ([[1 ,4] ,[36 ,25]])

a[i] = 0
a # == array ([0 ,1 ,0 ,0 ,16 ,25 ,36 ,0 ,0 ,81])

b = a !=0 # bool array


a[b] # a ohne Werte gleich 0

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 85 /130

NumPy
View vs. Kopie beim Indizieren
a = np . eye (5) # 5 x5 E i n h e i t s m a t r i x
a [2 ,3]. base is a # False

a [3 ,:]. base is a # True


a [: ,0]. base is a # True
a [2:4 , 1:2]. base is a # True
a [3]. base is a # True
a . T . base is a # True
a . ravel (). base is a # True

WWU Münster
wissen leben
a [[3 ,4 ,2] , :]. base is a # False
a [[0] , :]. base is a # False
a [[0]]. base is a # False

Regel
view bei slicing, Kopie bei Indizierung mit Listen.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 86 /130

NumPy

Wichtige Module in NumPy


NumPy bietet weitere Untermodule, die zusätzliche Funktionalitäten
bereitstellen, unter anderem:
I linalg: Lineare Algebra Modul zur Lösung linearer Gleichungssysteme,
Bestimmung von Eigenvektoren etc.

WWU Münster
I fft: Modul für die diskrete Fourier-Transformation

wissen leben
I random: Modul für Generierung von Zufallszahlen, Permutationen,
Distributionen etc.
Für weitere Informationen siehe die NumPy Dokumentation.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 87 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, das für ein gegebenes array die
Summe der Komponenten, den betragsmäßig größten und kleinsten
Eintrag sowie deren Index mithilfe von builtin NumPy Funktionen
bestimmt und ausgibt.
(2) Schreiben Sie ein Python-Programm, in dem der Code aus (1) in eine
Funktion ausgelagert ist, die das entsprechende array als Argument

WWU Münster
wissen leben
erhält. Testen Sie Ihr Programm an den folgenden Daten:
[Link]([0, 2, -4, 5, 3]), [Link]([1.5, 3.0, -3.0, -1.5])

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 88 /130

Lernkontrolle
(1) Sie möchten zeitweise mit einem Form-veränderten NumPy-Array
arbeiten, ohne die Form des Arrays global zu verändern. Womit
arbeiten Sie?
(a) Referenz (b) Kopie (c) View
(2) Mit welchem NumPy-Befehl können Sie eine Diagonalmatrix der
Dimension n mit Einträgen konstant 2 erzeugen?
(a) [Link]([2],n) (b) 2*[Link]((n,n))

WWU Münster
(c) [Link]([Link](n, 2))

wissen leben
(3) Sie möchten alle Einträge eines Arrays v ungleich null als NumPy
array erhalten - wie?
(a) v[v!=0] (b) v[v==0] (c) v!=0

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 89 /130

Zusammenfassung

Bisherige Themen
I Grundlagen des Moduls NumPy: Arrays, Matrizen, Indizierung,
Referenzen, Views und hilfreiche Module

Kommende Themen

WWU Münster
wissen leben
I matplotlib
I Numerische Mathematik
I Klassen und Vererbung

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 90 /130

matplotlib

matplotlib ist eine 2D-Plotting-Bibliothek für Diagramme und


wissenschaftliche Visualisierungen.

Die Visualisierungen lassen sich in vielen Aspekten manipulieren, z.B. in


Größe, Auflösung, Linienbreite, Farbe, Stil, Gittereigenschaften,
Schriftarten und vieles mehr.

WWU Münster
wissen leben
Weitere Informationen und Dokumentation sind zu finden unter
[Link]

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 91 /130

matplotlib

[Link]
import numpy as np
import matplotlib . pyplot as plt

# v i s u a l i s i e r e sin und cos auf 256 er Gitter


x = np . linspace ( - np . pi , np . pi , 256)
S , C = np . sin ( x ) , np . cos ( x )

WWU Münster
# plot

wissen leben
plt . plot (x , S )
plt . plot (x , C )

# Erzeuge Ausgabe
plt . show ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 92 /130

matplotlib
Ausgabe:

WWU Münster
wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 93 /130

matplotlib
[Link]
import numpy as np
import matplotlib . pyplot as plt

# d i c t i o n a r y for f o n t s t y l e
font = { ’ family ’: ’ serif ’ , ’ color ’: ’ darkred ’ ,
’ weight ’: ’ normal ’ , ’ size ’: 16}

# numpy r o utines
x = np . linspace (0.0 , 5.0 , 100)

WWU Münster
y = np . cos (2 * np . pi * x ) * np . exp ( - x )

wissen leben
# m a t p l o t l i b routines
plt . plot (x , y , ’k ’)
plt . title ( ’ Damped exponential decay ’ , fontdict = font )
plt . text (2 , 0.65 , r ’$ \ cos (2 \ pi t ) \ exp ( - t ) $ ’ , fontdict = font )
plt . xlabel ( ’ time ( s ) ’ , fontdict = font )
plt . ylabel ( ’ voltage ( mV ) ’ , fontdict = font )
plt . show ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 94 /130

matplotlib
Ausgabe:

WWU Münster
wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 95 /130

SciPy
Das SciPy-Ökosystem ([Link]) bietet neben numpy und
matplotlib noch zahlreiche weitere Bibliotheken und sonstige Ressourcen
zu wissenschaftlichem Rechnen mit Python.

Weiter wichtige SciPy-Bibliotheken:


I scipy: Große Sammlung grundlegender numerischer Algorithmen die
über das in numpy angebotene weit hinausgehen.

WWU Münster
wissen leben
I jupyter: Interaktive Web-Notebooks für wissenschaftliches Arbeiten
mit Python und weiteren Sprachen.
I sympy: Computer-Algebra mit Python.
I pandas: Datenanalyse-Paket mit zu R vergleichbaren Features.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 96 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem Sie selbst ein Polynom
beliebigen Grades definieren und dieses in einem gewünschten
Intervall mithilfe von matplotlib darstellen. Beschriften Sie die
gegebenen Achsen und den Graphen des Polynoms entsprechend.
Hinweis: Sie können dazu den Graphen mit dem plot-Befehl labeln

WWU Münster
und mithilfe einer Legende eine Bezeichnung einblenden. Suchen Sie

wissen leben
hierzu eine Anleitung im Internet.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 97 /130

Numerische Mathematik
Die angewandte Mathematik befasst sich mit der Übertragung
mathematischer Konzepte auf reale Anwendungen.

Die Numerik beschäftigt sich mit der konkreten Umsetzung und


Herleitung entsprechender Lösungsverfahren sowie -algorithmen und deren
Analyse hinsichtlich Robustheit und Effizienz.

Die lineare Algebra gibt Problemstellungen vor, deren effiziente Lösung

WWU Münster
wissen leben
Aufgabengebiet der numerischen linearen Algebra ist. Ein
Musterbeispiel ist das Lösen eines linearen Gleichungssystems.
Die numerische Analysis hingegen befasst sich mit dem approximativen
Lösen von Problemen der Analysis, insbesondere von
Differentialgleichungen.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 98 /130

Numerische Mathematik

Beispiel: Lösen eines linearen Gleichungssystems


I Der Gauß-Algorithmus hat den Aufwand O(n3 ).
I In der numerischen linearen Algebra werden weitere Verfahren
vorgestellt, wie z.b. die Cholesky-Zerlegung und Verfahren mit
orthogonalen Transformationen.
I Wichtig dabei sind Effizienz und Stabilität.

WWU Münster
I Die Kondition des linearen Gleichungssystems zur Untersuchung der

wissen leben
Empfindlichkeit der Lösung gegenüber Änderungen der Eingabedaten
spielt eine große Rolle.
I Solche Änderungen der Eingabedaten können dabei durch die
Problemstellung aber auch die Maschinengenauigkeit bedingt werden.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER Pythonkurs Wintersemester 2016/17 99 /130

Numerische Mathematik

Numerische lineare Algebra


Die Themen der numerischen linearen Algebra umfassen u.a.:
I Fehlerrechnung
I Direkte Verfahren zur Lösung linearer Gleichungssysteme
I Iterative Lösung von Gleichungssystemen mit Fixpunktiteration

WWU Münster
I Krylovraumverfahren zur Lösung linearer Gleichungen (u.a. CG

wissen leben
Verfahren)
I Berechnung von Eigenwerten

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 100
Pythonkurs Wintersemester 2016/17 /130

Numerische Mathematik

Beispiel: Numerische Integration


I Gegeben: Riemann integrierbare Funktion f : [a, b] → R für a, b ∈ R
Rb
I Gesucht: a f (x )dx
I Lösungsvorschläge:
I Finde Stammfunktion F von f und berechne Integral exakt -
Unbrauchbar, da sich in praktischen Anwendungen faktisch nie eine

WWU Münster
Stammfunktion von f berechnen lässt, einfaches Beispiel:

wissen leben
f (x ) = sin(x )/x
I Idee:
R b Approximiere Integral mithilfe einer Quadraturformel Q:
a
f (x )dx = Q(f ) + E (f ) mit möglichst minimalem Fehlerterm E

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 101
Pythonkurs Wintersemester 2016/17 /130

Numerische Mathematik

Beispiel: Numerische Integration


I Ein einfaches Beispiel für eine Quadraturformel ist die Trapezregel:

f (a) + f (b)
Q(f ) = (b − a)
2
I Ist f wenigstens zweimal stetig differenzierbar, so gilt für den Fehler

WWU Münster
wissen leben
E bei Benutzung der Trapezregel:

(b − a)3 00
|E (f )| ≤ max |f (x )|
12 a≤x ≤b

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 102
Pythonkurs Wintersemester 2016/17 /130

Numerische Mathematik

Beispiel: Numerische Integration


I Die Trapezregel ist ein Spezialfall der Newton-Cotes-Formeln,
deren Idee es ist die zu integrierende Funktion durch Polynome zu
interpolieren und diese dann zu integrieren.

WWU Münster
I Eine andere Möglichkeit Integrale zu approximieren bietet die

wissen leben
Gauß-Quadratur.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 103
Pythonkurs Wintersemester 2016/17 /130

Numerische Mathematik

Numerische Analysis
Die Themen der numerischen Analysis umfassen u.a.:
I Interpolation (Polynom-, Funktions-)
I Numerische Integration

WWU Münster
I Numerik Gewöhnlicher Differentialgleichungen

wissen leben
I (Numerik Partieller Differentialgleichungen)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 104
Pythonkurs Wintersemester 2016/17 /130

Klassen

Eine Klasse ist eine Vorlage für gleichartige Objekte. Sie legt fest welche
Daten-Attribute und Methoden (=Funktionen) Instanzen (=Objekte)
dieser Klasse besitzen.

Als Beispiel lässt sich ein Pendant aus dem Alltag heranziehen: Die Klasse
Auto gibt technische Eigenschaften eines Automobils vor (4 Räder,
Chassis, Motor etc.). Einzelne Autos sind Instanzen dieser Klasse, die eine

WWU Münster
wissen leben
ähnliche Funktionalität bieten, aber unterscheidbar sind.

Das Konzept der Klasse stellt ein Grundkonzept der objektorientierten


Programmierung dar.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 105
Pythonkurs Wintersemester 2016/17 /130

Klassen
Syntax zur Definition einer Klasse:

class MyClass:
# Konstruktor
def _ _init_ _(self, ...):
<Anweisungen>

WWU Münster
wissen leben
def eine_methode(self, ...):
<Anweisungen>
...

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 106
Pythonkurs Wintersemester 2016/17 /130

Klassen

[Link]
# Klassendefinition
class MyClass :
def __init__ ( self , msg ):
self . _member = msg

def some_function ( self ):


print ( self . _member )

WWU Münster
wissen leben
# Objekte der Klasse i n s t a n z i i e r e n
obj1 = MyClass ( " Hinter dir ! Ein dreikoepfiger Affe ! " )
print ( obj1 . type )
obj1 . some_function ()
obj2 = MyClass ( " Ich verkaufe diese feinen Lederjacken " )
obj2 . some_function ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 107
Pythonkurs Wintersemester 2016/17 /130

Klassen
[Link]
class car :
def __init__ ( self , color ):
self . color = color
self . speed = 0

def accelerate ( self ):


self . speed += 10

def info ( self ):

WWU Münster
print ( " This car is " + str ( self . color ) \

wissen leben
+ " and its speed is " + str ( self . speed ) \
+ " km / h . " )

myCar = car ( " blue " )


myCar . info ()
myCar . accelerate ()
myCar . info ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 108
Pythonkurs Wintersemester 2016/17 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem Sie eine Klasse Hund
implementieren. Diese soll Attribute alter und name enthalten, die
beim Aufruf des Konstruktors initialisiert werden. Schreiben Sie zwei
Methoden die jeweils das Alter und den Namen des Hundes
zurückgeben. Testen Sie Ihre Klasse an selbst gewählten Beispielen.
(2) Erweitern Sie Ihre Klasse aus (1) um die bool Variable hunger, die

WWU Münster
sie bei Instanziierung eines Hund-Objekts automatisch auf True

wissen leben
setzen. Fügen Sie eine Methode zur Abfrage des Hungers und eine
Methode fuettern zum Setzen der Variable Hunger auf False hinzu.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 109
Pythonkurs Wintersemester 2016/17 /130

Klassen

Special (Magic) Members


Mithilfe besonderer Methoden und Attribute - sogenannter special
members - lassen sich einer Klasse spezielle Funktionalitäten geben.

WWU Münster
Die Namen dieser Methoden beginnen und enden mit “_ _” . Sie werden

wissen leben
meist nicht mit ihrem Namen benutzt, sondern implizit verwendet.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 110
Pythonkurs Wintersemester 2016/17 /130

Klassen

Special Members
Beispiele für special members sind:
I _ _ init _ _: Wird bei Erzeugung einer neuen Klasseninstanz
aufgerufen.
I _ _ str_ _: Gibt an was str(obj) zurückgibt, nützlich für
print(obj).

WWU Münster
I _ _ call_ _: Instanzen einer Klasse wie eine Funktion aufrufen.

wissen leben
I Für Vergleichsoperationen: _ _ eq_ _, _ _ lt_ _, _ _ le_ _,
_ _ gt_ _, _ _ ge_ _ usw.
I Für binäre Operationen: _ _ add_ _, _ _ sub_ _, _ _ mul_ _,
_ _ truediv_ _, _ _floordiv_ _ usw.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 111
Pythonkurs Wintersemester 2016/17 /130

Klassen
[Link]
class Gummibaeren :
def __init__ ( self , menge ):
self . menge = menge
def __add__ ( self , other ):
return Gummibaeren ( self . menge + other . menge )
def __iadd__ ( self , other ):
self . menge += other . menge
return self
def __eq__ ( self , other ):

WWU Münster
return self . menge == other . menge

wissen leben
def __str__ ( self ):
if self . menge > 0:
return ’ {} Gummibaeren , hmmm ! ’. format ( self . menge )
else :
return ’ Keine Gummibaeren :((( ’

meine , deine = Gummibaeren (100) , Gummibaeren (79)


unsere = meine + deine
print ( unsere , meine != deine )
meine += deine # meine = meine . _ _ i a d d _ _ ( deine )
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 112
Pythonkurs Wintersemester 2016/17 /130

Vererbung

Ein Vorteil des Klassenkonzepts ist die Möglichkeit der Vererbung:


I Ist die Klasse B abgeleitet von Klasse A, so erbt B alle Methoden
von A - sofern B diese nicht überschreibt.

I Bei Klassen ähnlicher Struktur und Anwendung kann so viel


Programmieraufwand gespart werden. Dabei kann allgemeines
Verhalten der Basisklasse in der abgeleiteten Klasse spezialisiert

WWU Münster
wissen leben
werden.

I Beispiel: Quadrat könnte von Viereck ableiten und die Methode


area() durch eine effizientere Implementierung überschreiben.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 113
Pythonkurs Wintersemester 2016/17 /130

Vererbung
[Link]
class BaseClass :
def __init__ ( self , msg ):
self . _msg = msg

def report ( self ):


print ( self . _msg )

class DerivedClass ( BaseClass ):

WWU Münster
def __init__ ( self , msg ):

wissen leben
self . _msg = msg . upper ()

base = BaseClass ( " Hier Basis ! " )


deriv = DerivedClass ( " Ich bin abgeleitet ! " )

base . report ()
deriv . report ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 114
Pythonkurs Wintersemester 2016/17 /130

Vererbung

[Link]
class BaseClass :
pass

class DerivedClass ( BaseClass ):


pass

i s s u b c l a s s ( DerivedClass , BaseClass ) # True

WWU Münster
wissen leben
basis = BaseClass ()
derived = DerivedClass ()
i s i n s t a n c e ( derived , BaseClass ) # True
i s i n s t a n c e ( basis , BaseClass ) # True
i s i n s t a n c e ( DerivedClass , BaseClass ) # False

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 115
Pythonkurs Wintersemester 2016/17 /130

Aufgaben
(1) Erweitern Sie Ihr vorheriges Python-Programm um eine Klasse Welpe,
die von der Klasse Hund erbt. Fügen Sie der neu definierten Klasse
eine Methode eigener Wahl, die charakteristisch für Welpen ist, hinzu
und testen Sie anhand eines Welpen selbst gewählten Namens und

WWU Münster
Alters.

wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 116
Pythonkurs Wintersemester 2016/17 /130

Zusammenfassung

Bisherige Themen
I Grundlegender Umgang mit matplotlib
I Numerische Mathematik
I Klassen und Vererbung

WWU Münster
wissen leben
Kommende Themen
I Ein paar fortgeschrittene Themen.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 117
Pythonkurs Wintersemester 2016/17 /130

Iteratoren
Ein Iterator bezeichnet einen Zeiger, mit dem man die Elemente eines
iterables (z.B. list, dict, set) durchlaufen kann. Iteratoren können als
argument einer for-Schleife verwendet werden.

Mithilfe der Funktion iter erhält man zu einem iterierbaren Objekts einen
Iterator.
iter

WWU Münster
wissen leben
it = iter ([1 ,4 ,9])
print ( next ( it ))
for i in it :
print ( ’ in for loop ’ , i )
next ( it ) # S t o p I t e r a t i o n E x c e p t i o n

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 118
Pythonkurs Wintersemester 2016/17 /130

Generatoren

Mithilfe von Generatorfunktionen lassen sich leicht neue iterables


definieren:
[Link]
def g e n e r a to r _f un c ti o n ( end ):
i = 1
while i <= end :
yield i # S c h l u e s s e l w o r t yield

WWU Münster
i *= i +2

wissen leben
gen e r a t o r _object = g e ne ra t o r _ f u n c t i o n (3)
next ( g e n e rator_object ) # 1
gen e r a t o r _object . next () # 3
next ( g e n e rator_object ) # S t o p I t e r a t i o n E x c e p t i o n

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 119
Pythonkurs Wintersemester 2016/17 /130

Generatoren
Besonders sinnvoll sind Generatoren um Speicherplatz zu sparen, wie
nachfolgendes Beispiel zeigt:
[Link]
def to_n_list ( n ): # Erste l l t Liste
num , numList = 0 , []
while num < n :
numList . append ( num )
num += 1
return numList

WWU Münster
wissen leben
def to_n_gen ( n ): # G e n e r a t o r
num = 0
while num < n :
yield num
num += 1

s u m _ o f _ f i r s t _ n _l i s t = sum ( to_n_list (100)) # Sehr s p e i c h e r i n t e n s i v


s um _ o f _ f i rs t_ n _g en = sum ( to_n_gen (100)) # Sehr viel s p a r s a m e r

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 120
Pythonkurs Wintersemester 2016/17 /130

Generatoren

Mit Generatorausdrücken lassen sich Generatoren herstellen, die ähnlich


wie list-Comprehensions funktionieren:

Generatorausdrücke
# list
abs ol ut e_ values = [ abs ( i ) for i in range ( -100 ,100)]

WWU Münster
# vs . g e n e r a t o r

wissen leben
a b s o l u t e _ v a l u e s_ g e n = ( abs ( i ) for i in range ( -100 ,100))

abs ol ut e_ values == list ( a b s o l u t e _ v a l u e s _ g e n )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 121
Pythonkurs Wintersemester 2016/17 /130

List Comprehensions
Eine List comprehension ermöglichen dem Nutzer Listen auf folgende
kurze, prägnante Weise zu erstellen:

[Link]
# List
squaresLong = []
for x in range (5):
squaresLong . append ( x **2)

WWU Münster
print ( squaresLong )

wissen leben
# List c o m p r e h e n s i o n
squaresShort = [ x **2 for x in range (5)]
print ( squaresShort )

print ( squaresLong == squaresShort )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 122
Pythonkurs Wintersemester 2016/17 /130

List Comprehensions
[Link]
values = [ -1 , 4 , -9]

# aequiv . zu map ( abs , values )


abs ol ut e_ val ue s = [ abs ( i ) for i in values ]
# aequiv . zu filter ( is_positive , values )
pos it iv e_ values = [ i for i in values if i > 0]

ersteListe = values
zweiteListe = range (2)

WWU Münster
zusammen = [ wert1 + wert2

wissen leben
for wert1 in ersteListe for wert2 in zweiteListe ]
zusammen == [ -1 , 0 , 4 , 5 , -9 , -8]

# entspricht
zusammen = list ()
for wert1 in ersteListe :
for wert2 in zweiteListe :
zusammen . append ( wert1 + wert2 )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 123
Pythonkurs Wintersemester 2016/17 /130

Aufgaben
(1) Schreiben Sie ein Python-Programm, in dem Sie zwei gleich lange
Listen mit Hilfe einer list comprehension elementweise multiplizieren.
(2) Erweitern Sie Ihr Programm aus (1), sodass alle negativen Einträge
der jeweiligen Listen vor der Multiplikation durch eine 0 ersetzt

WWU Münster
werden.

wissen leben
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 124
Pythonkurs Wintersemester 2016/17 /130

Dokumentation

Wir haben bereits kennengelernt wie einfache Kommentare im Python


Code mit # integriert werden können. Um die Dokumentation eines
Codes zu vereinfachen und auch extern Beschreibungen über Module,
Klassen oder Funktionen zu erhalten, lassen sich Docstrings verwenden.

Docstrings stehen immer am Anfang eines Klassen- oder


Funktionskörpers und werden mit drei doppelten oder einfachen

WWU Münster
Hochkommata eingerahmt.

wissen leben
Mithilfe des Attributs _ _doc_ _ einer Klasse oder Funktion oder dem
Aufruf der Funktion help( ) lassen sich diese Beschreibungen dann
ausgeben.

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 125
Pythonkurs Wintersemester 2016/17 /130

Dokumentation
[Link]
class some_class ( object ):
"""
This is the docstring of this class containing information
about its contents : it does nothing !
"""
def __init__ ( self ):
pass

WWU Münster
def some_function ():

wissen leben
"""
This function does nothing
"""
pass

print ( some_class . __doc__ )


print ( some_function . __doc__ )

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 126
Pythonkurs Wintersemester 2016/17 /130

Dekoratoren
In Python lassen sich sogenannte Dekoratoren verwenden. Eine Funktion
die eine Methode oder eine Funktion modifizieren soll und mit einem @
vor die entsprechende Definition geschrieben wird, heißt decorator
Funktion. Diese wirkt wie function=decorator(function), lässt sich aber
wie folgt schreiben:

@decorator

WWU Münster
def function():

wissen leben
<Anweisungen>

Ein decorator kann entweder als Funktion selbst oder als Klasse mit dem
implementierten _ _ call _ _ Attribut definiert werden.
,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 127
Pythonkurs Wintersemester 2016/17 /130

Dekoratoren

[Link]
def twice ( obj ):
def wrapper ( x ):
return obj ( obj ( x ))
return wrapper

@twice

WWU Münster
def function ( x ):

wissen leben
return x **2

function (4)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 128
Pythonkurs Wintersemester 2016/17 /130

Dekoratoren

[Link]
class call_counter :
def __init__ ( self , func ):
self . count = 0
self . func = func
def __call__ ( self , * args , ** kwargs ):
self . count += 1
print ( ’ Funktionsaufruf - Nummer : ’ , self . count )
return self . func (* args , ** kwargs )

WWU Münster
wissen leben
@call_counter
def f (a , b ):
print ( a + b , a * b )

f (2 , 3)
f (1 , 4)

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 129
Pythonkurs Wintersemester 2016/17 /130

Monkey Patching
I Python bietet die Möglichkeit zur Laufzeit Funktionen in Modulen
oder Klassen zu ersetzen.
I Sollte sehr sparsam eingesetzt werden!

[Link]
class Foo :
def run ( self ):
print ( ’ fooooo ’)

WWU Münster
wissen leben
foo = Foo ()
foo . run ()

def run_bar ( self ):


print ( ’ bar ’)
Foo . run = run_bar

foo . run ()

,
,

Stephan Rave
W ESTFÄLISCHE
W ILHELMS -U NIVERSITÄT
M ÜNSTER 130
Pythonkurs Wintersemester 2016/17 /130

ENDE

WWU Münster
wissen leben
,
,

Stephan Rave

Das könnte Ihnen auch gefallen