Python Grundkurszur Übung Diskrete Strukturen
Christof Brä[email protected]
Bauhaus-Universität Weimar
Fakultät Medien
2. November 2012
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 1 / 46
Outline
Einführung
GrundlagenVariablenDatentypenKontrollstrukturenInput/OutputModuleEin komplettes Skript
Hinweise
Referenzen
Übungsaufgaben
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 2 / 46
Einführung
Python
I Programmiersprache
I �Interpreter�: Programm, das Anweisungen einliest, verarbeitet undauswertet
I �Skript�: Textdatei mit Python-Anweisungen, kann vom Interpreterverarbeitet werden (�ein Skript ausführen�)
I Aktuelle (10/2012) Sprachversionen:Python 2: 2.7.3, Python 3: 3.3.0
I Bevorzugt sollte Python 3 eingesetzt werden
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 3 / 46
Einführung
Hello, Python!
http://xkcd.com/353/
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 4 / 46
Einführung
Motivation
I Einfach und leicht zu erlernen
I Algorithmen lassen sich schnell und unkompliziert umsetzen
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 5 / 46
Einführung
Beispielprogramm: Primzahltest� �def isprime(n):
"""Gibt True zurueck, wenn n eine Primzahl ist,ansonsten False. n muss eine Ganzzahl >= 0 sein.
"""if n <= 1:
return False# teste alle moeglichen Divisoren von 2 bis n-1# wenn der Divisionsrest 0 ist, wurde ein Teiler gefundenfor d in range(2, n):
if (n % d) == 0:return False
return True # kein Teiler gefunden, n ist prim
if isprime(23):print('23 ist eine Primzahl')
else:print('23 ist keine Primzahl')� �
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 6 / 46
Einführung
Einrückungen
I Python benutzt Einrückungen um Codeblöcke zu kennzeichnen
I Aufeinanderfolgende Codezeilen mit gleicher Einrücktiefe werden alszusammengehörig interpretiert
I Zur Einrückung sollten Leerzeichen genutzt werden, niemals Tabs
I Anzahl der Leerzeichen ist nicht vorgeschrieben, Standard sind 4
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 7 / 46
Grundlagen Variablen
Variablen
� �greeting = 'Hello'number = 23food_list = ['spam', 'eggs', 'bacon']2go = 'coffee' # Error (wirft SyntaxError)� �
I Variablen speichern (korrekter: referenzieren) Daten
I Der Zuweisungsoperator (=) weist einer Variablen (links) einen Wert(rechts) zu
I Variablennamen dürfen nur aus Buchstaben, Zi�ern und demUnterstrich (_) bestehen (und dürfen nicht mit Zi�ern beginnen)
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 9 / 46
Grundlagen Datentypen
Ganze Zahlen (Z)
� �a = 31 # Dezimalnotation (Basis 10)# Programmierer nutzen oft andere Notationen:a = 0b11111 # 31 in Binaernotation (Basis 2)a = 0o37 # 31 in Oktalnotation (Basis 8)a = 0x1F # 31 in Hexadezimalnotation (Basis 16)� �
I Ganze Zahlen (int) können beliebig groÿ (bzw. klein) werden(begrenzt nur durch den Speicher des Rechners)
I Angabe in Dezimal-, Binär-, Oktal- oder Hexadezimalnotation
I Achtung: In Python 2 werden führende Nullen auch ohne das kleine�o� als Oktal interpretiert (027 ist 23)!
I Weitere Zahlentypen (�oat und complex) spielen im Rahmen derVorlesung Diskrete Strukturen keine Rolle
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 11 / 46
Grundlagen Datentypen
Arithmetische Operatoren� �x + y # Additionx - y # Subtraktionx * y # Multiplikationx / y # Division (Anmerkung beachten)x // y # Ganzzahldivisionx % y # Modulo (Divisionsrest)pow(x, y) # Potenzierung, von x ** y wird abgeratendivmod(x, y) # (x//y, x%y)-x # Negation� �
I Anmerkung zur Division:In Python 2 sind Division und Ganzzahldivision identisch, beide lieferndas Ergebnis abgerunded. In Python 3 liefert die Division einenFliesspunktwert (3 / 2 liefert 1.5).Im Rahmen der Vorlesung Diskrete Strukturen ist ausdrücklich dieGanzzahldivision zu verwenden.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 12 / 46
Grundlagen Datentypen
Wahrheitswerte und None� �>>> 3 >= 2True>>> True and FalseFalse>>> not FalseTrue>>> test = print('spam')spam>>> print(test)None� �
I True und False kennzeichnen Wahrheitswerte (�boolesche Werte�)I Vergleichsoperatoren (==, !=, <, <=, > und >=) liefern
WahrheitswerteI Boolesche Operatoren: and, or zum Verknüpfen und not zum
Umkehren von WahrheitswertenI None kennzeichnet die Abwesenheit eines WertesI Funktionen ohne de�nierten Rückgabewert liefern None
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 13 / 46
Grundlagen Datentypen
Sequenztypen� �s = 'eggs and spam' # ein String ist eine Zeichensequenzs[0] # liefert 'e's[0:4] # liefert 'eggs''spam' + 'eggs' # Sequenzen koennen verknuepft werden� �
I string, list und tuple
I Darstellung geordneter Mengen
I Geordnet: Jedes Element hat eine eindeutige Position (�index�)
I �Slicing�: Zugri� auf einen Bereich (�range�) der Sequenz
I Indexzählung beginnt bei 0
I Bereichsangaben sind nichtinklusiv, d.h. [x:y] liefert den Ausschnittvon Position x bis Position y-1
I Verknüpfung ist nur für Sequenzen gleichen Typs erlaubt
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 14 / 46
Grundlagen Datentypen
Sequenztypen (2)
� �numbers = [5, 42, 23]42 in numbers # liefert True5 not in numbers # liefert Falselen(numbers) # liefert 3min(numbers) # liefert 5max(numbers) # liefert 42� �
I Mit den Operatoren in und not in kann man auf das Vorkommeneines Elements in der Sequenz testen
I len() liefert die Anzahl der Elemente
I min() und max() liefern das kleinste bzw. gröÿte Element (in Python 3müssen die Elemente dabei vom gleichen Typ sein)
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 15 / 46
Grundlagen Datentypen
Sequenztypen: string
� �s = 'Spam and Eggs. 's.split('a') # liefert ['Sp', 'm ', 'nd Eggs. ']s.replace('Spam', 'Bacon') # liefert 'Bacon and Eggs. 's.lower() # liefert 'spam and eggs. 's.strip() # liefert 'Bacon and Eggs.'� �
I Geordnete Menge von Zeichen
I �Immutable�: Modi�kationsoperatoren wie replace() oder strip()erzeugen einen neuen String
I split() ohne Parameter teilt an Whitespace (Leerzeichen, Tabs,Zeilenumbruch, . . . )
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 16 / 46
Grundlagen Datentypen
Sequenztypen: list
� �l = ['spam', 3]l.append('eggs') # ['spam', 3, 'eggs']l[1] = 'bacon' # ['spam', 'bacon', 'eggs']l[0] # liefert 'spam'l[-1] # liefert 'eggs'l[3] # Error (wirft IndexError)k = l[:] # Kopie von l, k = l waere nur eine
# weitere Referenz auf die gleiche Liste� �I Geordnete Menge beliebiger Werte
I �Mutable�: Der Inhalt der list kann geändert werden
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 17 / 46
Grundlagen Datentypen
Sequenztypen: tuple
� �t = ('christof', 'braeutigam', 40008)t[2] # liefert 40008t[2] = 11105 # Error (wirft TypeError)vname, nname, matnr = t # tuple unpacking� �
I Geordnete Menge beliebiger Werte
I �Immutable�: Der Inhalt ist nicht änderbar
I �Tuple unpacking�:Im Beispiel werden 3 Variablen gesetzt, vname = 'christof', nname ='braeutigam' und matnr = 40008. Diese Methode ist dem Zugri� überden Index vorzuziehen, da die Semantik der Elemente des Tupels klarererkennbar ist.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 18 / 46
Grundlagen Datentypen
Abbildungstyp: dict
� �d = {'eggs': 1, 'spam': 3}d['spam'] # liefert 3'spam' in d # True3 in d # Falsed['spam'] = 5 # {'eggs': 1, 'spam': 5}d['bacon'] = 2 # {'bacon': 2, 'eggs': 1, 'spam': 3}d['egs'] # Error (wirft KeyError)for k in d: # iteriert ueber keys
print(k)for k, v in d.items(): # iteriert ueber (key, value) Tupel
print(k, v)� �I Ungeordnete Menge von Key:Value Paaren, mutable
I Key muss immutable sein, Value ist beliebig
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 19 / 46
Grundlagen Kontrollstrukturen
Fallunterscheidung (Bedingte Verzweigung)
� �if 'spam' in food:
print("I don't like spam")elif 'eggs' in food:
print("I don't like eggs")else:
print("Ok, i'll give it a try")� �I if leitet eine Fallunterscheidung ein
I Beliebig viele weitere Fälle können mit elif behandelt werden
I else behandelt den Fall, daÿ keine Bedingung zutri�t
I Genau eine Verzweigung wird ausgeführt: Die erste, deren BedingungTrue liefert oder der else-Zweig
I Die elif-Zweige und der else-Zweig sind optional
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 21 / 46
Grundlagen Kontrollstrukturen
Schleife (while loop)
� �# ziehe so lange eine Zufallszahl bis es eine Primzahl istn = some_random_number()while not isprime(n):
n = some_random_number()# n ist jetzt eine Primzahl� �
I while führt einen Codeblock so oft aus, wie die Bedingung True liefert(die Bedingung ist der Teil zwischen while und dem Doppelpunkt)
I Die Funktion isprime() im Beispiel liefert False wenn n prim ist,darum wird ihr Rückgabewert mit dem Operator not negiert
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 22 / 46
Grundlagen Kontrollstrukturen
Iteration (for loop)
� �for name in ['Alice', 'Bob', 'Carol']:
print('Hello,', name)for x in range(100):
print(x)� �I for iteriert über eine Menge von Werten
I Die Funktion range(n) wird in diesem Zusammenhang häu�geingesetzt um den Codeblock genau n-mal auszuführen
I Die Variable x nimmt dabei jeden Wert der Menge genau einmal an(im Beispiel 0 bis 99) und kann im Schleifenkörper verwendet werden
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 23 / 46
Grundlagen Kontrollstrukturen
Funktionen� �def add(lval, rval):
return lval + rval
result = add(23, 42)� �I Funktionsde�nition: Beschreibung der Funktion
I �Kopf� bzw. �Signatur�: Name der Funktion, formale Parameter
I �Körper�: Codeblock mit beliebigen Anweisungen (eingerückt!)
I Jede Funktion hat einen Rückgabewert, angegeben mit demSchlüsselwort return
I Die return-Anweisung kann weggelassen werden, in diesem Fall gibtdie Funktion den Wert None zurück
I Funktionsaufruf mit Übergabe von Argumenten und Zuweisung desRückgabewertes an eine Variable (result)
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 24 / 46
Grundlagen Kontrollstrukturen
Funktionen (2)
� �def fibonacci(n):
"""Gibt die n-te Fibonaccizahl zurueck."""if n in (0, 1):
return nelif n > 1:
return fibonacci(n - 1) + fibonacci(n - 2)else:
raise ArithmeticError('n muss positiv sein')� �I �Rekursion�: Funktionen können sich selbst aufrufen
I (Achtung: Rekursion dient häu�g eher der eleganten Darstellung alsder e�zienten Berechnung)
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 25 / 46
Grundlagen Input/Output
Ausgabe
� �print "I'm a Python 2 print statement!"print("I'm a Python 3 print function!")
print('{0} bottles of {1}'.format(99, 'beer'))# gibt '99 bottles of beer' aus� �
I print() gibt Text auf der Standardausgabe aus
I In Python 3 ist print() eine Funktion. In Python 2 ist print nur eineAnweisung, in der aktuellen Python 2 Version kann es aber schon alsFunktion genutzt werden.
I Formatstring zur Einbettung von Daten in Text (die gezeigte Variantefunktioniert in beiden Python-Versionen)
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 27 / 46
Grundlagen Input/Output
Arbeiten mit Files� �fin = open('in.txt') # in.txt im nur-lese-modus oeffnenfout = open('out.txt', 'w') # (1) out.txt wird geloescht!for line in fin:
fout.write(line) # (2) Python 2 Variantefout.close() # files immer schliessen!fin.close()� �
I open() ermöglicht den Zugri� auf ein File
I Standardmäÿig werden Files im nur-lese-Modus geö�net
I open() mit dem Argument 'w' ö�net das File zum schreiben
I (1) Achtung: Mit dem Ausführen dieser Zeile wird 'out.txt' neuangelegt. Gab es zuvor schon ein File mit diesem Namen wird esgelöscht.
I (2) Obwohl es auch so funktioniert, würde man in Python 3 hierprint(line, end=““, file=fout) schreiben
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 28 / 46
Grundlagen Module
Module
� �import sys # importiert das Modul syssys.argv[1] # liefert das erste Kommandozeilenargument
# alternativ kann nur ein bestimmter Name importiert werden:from sys import argvargv[1] # die Angabe von sys. ist dann unnoetig� �
I Ein Modul bündelt Python-Code um ihn anderen Modulen bzw.Skripten zur Verfügung zu stellen
I Die import-Anweisung macht den Inhalt eines Moduls im eigenenSkript verfügbar
I Jedes Python-Skript stellt ein Modul dar
I Die Python-Standardbibliothek ist in Modulen organisiert
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 30 / 46
Grundlagen Module
Module
� �import math # mathematische Funktionen und Konstantenmath.log(10, 2) # liefert den Zweierlogarithmus von 10math.pi
import random # Funktionen zur Zufallswerterzeugungrandom.randrange(100) # liefert einen Zufallswert von 0-99
import os # Systemfunktionenos.listdir('.') # liefert Liste des aktuellen Verzeichnisses� �
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 31 / 46
Grundlagen Ein komplettes Skript
Skript Template und Aufruf� �import sys
def show_arguments():"""Gibt alle Kommandozeilenargumente aus."""for arg in sys.argv: # ['script.py', ...]
print(arg)
if __name__ == '__main__':show_arguments()� �
I Das if-Konstrukt verhindert den Aufruf der Funktionshow_arguments() wenn das Skript als Modul importiert wird
I Den Code in ein Text�le �script.py� speichern und aufrufen:� �$ python3 script.py some arguments go here� �Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 33 / 46
Hinweise
Geschützte Namen
I Variablen und Funktionen deren Namen mit einem oder zweiUnterstrichen beginnen, sollte man nicht benutzen
I Eine Ausnahme bildet das Konstruktif __name__ == ’__main__’
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 34 / 46
Hinweise
Hilfesystem
� �>>> help(isprime)Help on function isprime in module __main__:
isprime(n)Gibt True zurueck, wenn n eine Primzahl ist,ansonsten False. n muss eine Ganzzahl >= 0 sein.� �
I help() ruft Pythons Hilfesystem auf
I Beispiel: help(isprime) zeigt die Signatur der Funktion (Name undParameter), sowie den Docstring � wenn man einen geschrieben hat.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 35 / 46
Hinweise
Hilfreiche Tools
I pydoc � Die Python-Dokumentation auf der Kommandozeile
I py�akes � Analysiert Skripte und weist auf typische Fehler hin
I pylint � Analysiert den Stil eines Skripts
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 36 / 46
Hinweise
Hinweise zur Bearbeitung der Programmieraufgaben
I Python-Skripte sind einfache Textdateien mit der Dateiendung �.py�.
I Skripte werden mit einem Editor verfasst, nicht mit einerTextverarbeitung.
I Brauchbare Editoren: notepad++, gEdit, kate, vim, emacs, TextMate
I Kommandozeilenargumente sind Argumente, die einem Programmbeim Aufruf auf der Kommandozeile übergeben werden.
I Für alle Übungsaufgaben ist davon auszugehen, dass alle Eingaben alsKommandozeilenargumente übergeben werden sollen!
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 37 / 46
Hinweise
Hinweise zur Bearbeitung der Programmieraufgaben (2)
I Bitte nicht mehr Aufwand treiben als notwendig.
I Ausnahme: Kommentare(einzeilige Kommentare werden mit dem Hash-Zeichen (#) eingeleitet,wie in den meisten Beispielen zu sehen ist)
I Bitte in jedem abgegebenen Skript die Namen aller Gruppenmitgliederau�ühren.
I Bitte die vorgegebenen Skriptnamen sowie Input- und Outputformateeinhalten, damit die Ergebnisse automatisiert geprüft werden können.
I Skripte sollten im UTF8-Encoding vorliegen und keine Umlaute o.a.Sonderzeichen enthalten.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 38 / 46
Referenzen
Python online
I Python Website [http://python.org/]
Binaries für jedes System gibt es im Downloadbereich
I Das Python Tutorial:[http://docs.python.org/py3k/tutorial/index.html]
I Die library reference:[http://docs.python.org/py3k/library/index.html]
I Styleguide[http://docs.python.org/tutorial/controlflow.html#
intermezzo-coding-style]
[http://www.python.org/dev/peps/pep-0008/]
I Spaÿ mit Python: [http://www.python.org/doc/humor/]
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 39 / 46
Referenzen
Bücher
Je�rey Elkner, Allen B. Downey, and Chris MeyersHow to Think Like a Computer Scientist - Learning with Pythonhttp://www.openbookproject.net/thinkcs/python/english2e/
Mark PilgrimDive into Python 3Apress; 2009http://getpython3.com/diveintopython3/
Zed A. ShawLearn Python the hard wayhttp://learnpythonthehardway.org/
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 40 / 46
Referenzen
Video-Tutorials
I Google's Python class[http://code.google.com/edu/languages/google-python-class/]
I Udacity � Introduction to Computer Science: Building a Search Engine(CS101) [http://www.udacity.com/overview/Course/cs101]
I Udacity � Design of Computer Programs: Programming Principles(CS212) [http://www.udacity.com/overview/Course/cs212]
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 41 / 46
Referenzen
Fragen?
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 42 / 46
Übungsaufgaben
Übungsaufgaben
� �$ python3 sumhex.py 42235 97310xcafe� �
I Schreiben Sie ein Skript, das zwei Zahlen alsKommandozeilenparameter übergeben bekommt und die Summe alsHexadezimalzahl ausgibt. Hinweis: Die Funktionen int() und hex() sindhilfreich zum erledigen dieser Aufgabe.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 43 / 46
Übungsaufgaben
Übungsaufgaben (2)
I Das folgende Programm würde richtig rechnen, enthält aber vieleProgrammierfehler. Korrigieren Sie es.� �
import math
define project_to_distance(point_x point_y distance):dist_to_origin = math.sqr(pointx**2 + pointy**2)scale == distance / dist_to_originreturn point_x * scale, point_y * scale
print project-to-distance(2,7,4)� �
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 44 / 46
Übungsaufgaben
Übungsaufgaben (3)
� �$ python3 isbncheck.py 123456789Xgueltige ISBN� �
I Schreiben Sie ein Skript, das eine ISBN als Argument entgegennimmtund ausgibt, ob die ISBN gültig ist, oder nicht.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 45 / 46
Übungsaufgaben
Übungsaufgaben (4)
� �$ python3 count.py spam.txt123� �
I Schreiben Sie ein Skript, das den Inhalt einer Textdatei 'spam.txt'einliest, zählt wie oft der Begri� 'spam' (in beliebiger Schreibweise -Spam, spAm, SPAM) darin auftaucht und diesen Wert ausgibt.
Christof Bräutigam (BUW) Python Grundkurs 2. November 2012 46 / 46