Einführung in Python Proseminar Softwaretechnologie David Voigt [email protected] Beispiele: 1. Grundlegende Konzepte & Bei Python handelt es sich um eine imperative Programmiersprache, welche die Programmierparadigmen von funktionalen und objektorientierten Programmiersprachen vereint. Diese Sprache wird interpretiert, das heißt der Code wird von einem Compiler in Python Byte-Code übersetzt und dann auf einer virtuellen Maschine (Python-Interpreter) ausgeführt. Dies ermöglicht eine Ausführungen auf allen gängigen Plattformen, wie Windows, Linux und Mac. Python kann einfach erweitert werden, was sich besonders bei Problemen lohnt, welche maschinennah oder zeitkritisch gelöst werden müssen. Für diesen Fall kann einfach eine Erweiterung in C geschrieben werden. Desweiteren wird Python unter PSF-Lizenz veröffentlicht, welche es kommerziellen Nutzern ermöglicht den Python-Interpreter lizenzkostenfrei zu nutzen. | 0 1 1 0 1 1 0 1 109 1 0 1 1 0 1 0 1 181 0 0 1 0 0 1 0 1 37 0 1 1 0 1 1 0 1 109 1 0 1 1 0 1 0 1 181 1 1 1 1 1 1 0 1 253 Gleitkommazahlen (float) Hierbei handelt es sich um reele Zahlen. Boolesche Werte (bool) Variablen diesen Typs können nur die Wahrheitswerte true und false annehmen. Operationen: Operation not x x and y x or y 2. Datentypen NoneType Hierbei handelt es sich um einen leeren Datentyp, dessen einzige Instanz die Konstante None ist. Operationen: var = None prüfen auf None: if var is None: print(“var ist None”) Numerische Datentypen ganze Zahlen (int und long) Bei dem Datentyp int handelt es sich um ganze Zahlen im Bereich von -231 bis 231-1. Bei dem Datentyp long handelt es sich um ganze Zahlen, welche theoretisch unbegrenzt sind. Operationen: Operation x=x+y x=x–y x=x*y x=x/y x=x%y x = +x x = -x x = x ** y x = x // y Operator x=x&y x=x|y x=x^y x = ~x x = x << n x = x >> n Kurzschreibweise x += y x -= y x *= y x /= y x %= y x **= y x //= y Kurzschreibweise x &= y x |= y x ^= y x <<= n x >>= n Vergleichsoperationen x == y x != y x<y x <= y x>y x >= y Bedeutung Bitweise UND von x und y Bitweise OR von x und y Bitweise XOR von x und y Bitweise Komplement von x Bitverschiebung um n Stellen nach links Bitverschiebung um n Stellen nach rechts Wahrheitswerte bei anderen Datentypen: Basisdatentyp NoneType int, long float complex str list tuple dict set, frozenset False-Wert None 0 0.0 0 + 0j „“ [] () {} set(), frozenset() True-Wert alle Zahlen außer 0 alle Zahlen außer 0 alle Zahlen außer 0 jeder nicht leere String jede nicht leere Liste jedes nicht leere Tupel jedes nicht leere Dictionary jede nicht leere Menge komplexe Zahlen (complex) Dieser Datentyp kann komplexe Zahlen speichern. Zu beachten ist hier, dass der Imaginärteil nicht mit einem i, sondern mit einem j gekennzeichnet wird. Darstellung: x + yj Methoden und Attribute: Methoden und Attribute x.real x.imag x.conjugate() Rückgabewert liefert den Realteil von x liefer den Imaginärteil von x liefert die zu x konjugiert komplexe Zahl sequentielle Datentypen Operationen: Operation s in x s not in x x + y (x += y) x * n oder n * x (x *= n) Erklärung prüft, ob s in x ist (liefert Wahrheitswert) prüft, ob s nicht in x ist (liefert Wahrheitswert) Verkettung von x und y (Verkettung von x und y wird x zugewiesen) Verkettung, welche n Kopien von x enthält (Verkettung, welche n Kopien von x enthält wird x zugewiesen) Operation x[n] x[n:m] Erklärung liefert das n-te Element von x liefert eine Sequenz mit den Elementen von n bis m liefert eine Sequenz mit den Elementen von n bis m, wobei nur jedes k-te Element beachtet wird gibt die Anzahl der Elemente von x zurück gibt das kleinste Element zurück, sofern eine Ordnungsreleation def. ist gibt das größte Element zurück, sofern eine Ordnungsrelation def. ist x[n:m:k] len(x) min(x) max(x) Strings (str, unicode) Die Typen str und unicode dienen zur Darstellung beliebiger Zeichenketten. Der Typ unicode hat im Vergleich zum Typ str variable Kodierungslängen und kann daher mehr Zeichen darstellen. In diesem Dokument soll aber nicht auf die Unterschiede eingegangen werden, daher wird hier nur am Beispiel des Datentyp str gearbeitet. String-Erzeugung: str1=”...” str2=’...’ str3= ”””zeile1 zeile2“““ str4=( „zeile1“ „zeile2“) Erklärung erzeugt Signalton Backspace Seitenvorschub Linefeed Carriage Return horizontaler Tab vertikaler Tab Doppeltes Hochkomma (erscheint als Zeichen) Einfaches Hochkomma (erscheint als Zeichen) Backslash (erscheint als Zeichen) Methoden zum Trennen von Strings: Methode s.split([sep[, maxsplit]]) s.rsplit([sep[, maxsplit]]) s.splitlines([keepends]) s.partition(sep) s.rpartition(sep) s.rfind(sub[, start[, end]]) s.index(sub[, start[, end]]) s.rindex(sub[, start[, end]]) s.count(sub[, start[, end]]) Erklärung zerteilt einen String anhand des im Parameter sep angegebene Zeichen und gibt eine Liste zurück (der Parameter maxsplit kann die Anzahl der Teilungen begrenzen) macht das selbe wie die Funktion split, nur das rsplit am Ende des String mit dem Teilen beginnt Gibt eine Liste mit den Zeilen des String zurück (Um Zeilenvorschübe am Ende zu erhalten ist der Parameter keepends auf True zu setzen) Der String wird in drei Teile geteilt, welche in einem Tupel zurück gegeben werden. Der erste Teil ist die Zeichenkette vor dem String sep, der zweite Teil ist der String sep und der dritt Teil ist der hinter dem String sep. macht das selbe wie die Funktion partition, nur das rpartition am Ende des String beginnt Methoden zum Suchen in Strings: Die optionalen Parameter start und end dienen dazu, den Sichbereich im String einzugrenzen Erklärung Es wird der Index des ersten Vorkommens von sub in s zurück geben (falls sub nicht in s vorkommt wird -1 zurück gegeben). Macht dasselbe wir find, nur das die Suche am Ende des Strings begonnen wird. Macht dasselbe wie find, nur das hier im Fehlerfall eine ValueError Exception geworfen wird. Macht dasselbe wie rfind, nur das hier im Fehlerfall eine ValueError Exception geworfen wird. Zählt die Anzahl der Vorkommen von sub in s Methoden zum Ersetzen von Teilstrings: Methode s.replace(old, new[, count]) s.lower() s.upper() s.swapcase() Escape-Sequenzen: Escape-Sequenz \a \b \f \n \r \t \v \“ \\‘ \\ Methode s.find(sub[, start[, end]]) s.capitalize() s.title() s.expandtabs([tabsize]) Erklärung Rückgabe eines Strings, indem alle Vorkommen von old durch new ersetzt wurden (durch count kann die Anzahl der Ersetzungen begrenzt werden) Rückgabe eines Strings, indem nur Kleinbuchstaben sind Rückgabe eines Strings, indem nur Großbuchstaben sind Rückgabe eines Strings, indem die Großbuchstaben nun klein sind und die Kleinbuchstaben nun groß sind Rückgabe eines Strings, indem der erste Buchstabe ein Großbuchstabe ist Rückgabe eines Strings, indem jeweils alle Wörter mit einem Großbuchstaben beginnen Rückgabe eines Strings, indem alle Tabulatoren durch Leerzeichen ersetzt wurden (optional kann durch tabsize die Anzahl der Leerzeichen angegeben werden) Beispiele: str1 = „a,b,c,d,e,f,g“ str1.split(„,“) #[a,b,c,d,e,f,g] str1 = „a,b,c,d,e,f,g“ str1.count(„,“) #6 str1 = „www.google.de“ str1.partition(„.“) #(„www“,“.“,“google.de“) str1.rpartition(„.“) #(„www.google“,“.“,“de“) str1 = „a,b,c,d,e,f,g“ str1.replace(„,“,“.“) # „a.b.c.d.e.f.g“ str1 = „a,b,c,d,e,f,g“ str1.find(„c“) #4 str1 = „a,b,c,d,e,f,g“ str1.upper() # „A,B,C,D,E,F,G“ Formatierung von Strings: „…%...X…%...Y…“ % (Wert1,Wert2) Kennung d i o u x X e E Erklärung Ganzzahl mit Vorzeichen siehe d Oktalzahl ohne Vorzeichen Ganzzahl ohne Vorzeichen Hexadezimalzahl ohne Vorzeichen siehe x Fließkommazahl in wissenschaftl. Format (kleines „e“) Fließkommazahl in wissenschaftl. Format (großes „e“) Kennung f F g Erklärung Fließkommazahl in Dezimalschreibweise siehe f Fließkommazahl in wissenschaftl. Schreibweise, wenn Exponent < -4 siehe g Zeichen (Länge 1) String (durch Methode repr) String (durch Methode str) Ausgabe des Prozentzeichen G c r s % Umwandlungsflags: Flag # 0 (Leerzeichen) + Erklärung Ausgabe im alternativen Modus Bei einer Unterschreitung der Mindestlänge bei numerischen Werten wird mit Nullen aufgefüllt Bei Unterschreitung wird von rechts aufgefüllt Bei numerischen Werten, welche positiv sind, wird ein Leerzeichen davor geschrieben Bei numerischen Werten wird das Vorzeichen immer angegeben Beispiele: str = „Preis: %5.2f EUR“ %(8.443) #Preis: 8.44 EUR str = „Preis: %+5.2f EUR“ %(8.443) #Preis: +8.44 EUR str = „Preis: %06d EUR“ %(28) #Preis: 000028 EUR str = „Preis: %-6d EUR“ %(28) #Preis: 28 EUR l.remove(x) l.reverse() Sortierung: l.sort([key[,reverse]]) Der Parameter key kann verwendet werden, um eine Funktion anzugeben, welche als Rückgabe einen Wert liefert, für den eine Ordnungsrelation definiert ist. Die Liste wird dann entsprechend der Rückgaben sortiert. Der Parameter reverse dient zum Sortieren in umgekehrter Reihenfolge. def real_teil(z): return z.real l[n:m] = t l[n:m:k] = t del l[n] del l[n:m] del l[n:m:k] unveränderliche Listen (tuple) Dieser Datentyp hat weniger Funktionen als die normalen Listen, da alle Funktionen wegfallen, welche die Liste verändern würden. Es gilt aber zu beachten, dass eine unveränderliche Liste durchaus veränderlichen Datentypen, wie Listen beinhalten kann. Mappings Dictonary (dict) Bei einem Dictonary handelt es sich um eine Zuordnung von Schlüssel zu Wert. Der Schlüssel muss eindeutig sein. Dictonary-Erzeugung: d={ Erklärung Das Element von l mit dem Index n wird durch x ersetzt Die Elemente der Liste von n bis m-1 werden durch t ersetzt (t muss iterierbar sein) Die Elemente der Liste von n bis m-1 werden durch t ersetzt, wobei nur jedes k-te Element beachtet wird (t muss iterierbar sein) Das Element an der Stelle n wird entfernt Die Elemente der Liste von n bis m-1 werden entfernt Die Elemente der Liste von n bis m-1 werden entfernt, wobei nur jedes k-te Element beachtet wird Methoden: Methode l.append(x) l.extend(t) l.count(x) l.index(x[,m[,k]]) l.insert(n,x) l.pop([n]) liste = [5, 8, 6, 2, 4] liste.sort(reverse=True) # [8, 6, 5, 4, 2] liste = [10 + 12j, 3 + 6j, 8 + 22j, 5-2j] liste.sort(key=real_teil) # [3 + 6j, 5 – 2j, 8 + 22j, 10 + 12j] Listen (list) Operationen: Operator l[n] = x Das erste Vorkommen von x in der Liste wird gelöscht Die Reihenfolge der Elemente in der Liste wird umgekehrt Erklärung Das Element x wird an das Ende der Liste angeangen Es werden alle Elemente von t an das Ende der Liste angehangen Gibt an, wie oft das Element x in der Liste vorkommen Der Index i des ersten Vorkommens des Element x wird ausgegeben (optional kann Suchbereich angegeben werden, es wird dann entweder ab m oder von m bis k-1 gesucht) Das Element x wird in der Liste an die Stelle n eingefügt. Alle folgenden Element werden eine Stelle nach hinten geschoben) Das n-te Element der Liste wird zurück gegeben (falls n nicht angegeben das letzte), anschließen wird das Element aus der Liste gelöscht „Sachsen“ : „Dresden“, „Thüringen“ : „Erfurt“, } Operationen: Operation len(d) d[k] del d[k] k in d k not in d Erklärung Gibt die Anzahl der Element von d zurück Gibt den Wert mit dem Schlüssel k zurück Löscht den Schlüssel k und den dazugehörigen Wert liefert Wahrheitswert, ob der Schlüssel k in d enthalten ist liefert Wahrheitswert, ob der Schlüssel k nicht in d enthalten ist Methoden: Methode d.clear() d.copy() d.items() d.keys() d.values() d.update(e) d.fromkeys(l[, v]) d.get(k[, a]) d.setdefault(k[, a]) d.popitem() Erklärung Löscht den gesamten Inhalt des Dictonarys Kopiert das Wörterbuch (aber nicht den Inhalt) Erzeugt eine Liste von Tupeln (Schlüssel, Wert) mit allen Paaren aus d Erzeugt eine Liste, welche alle Schlüssel enthält Erzeugt eine Liste, welche alle Werte enthält Fügt dem Wörterbuch d das Wörterbuch e hinzu Rückgabe ist ein neues Wörterbuch, welches seine Schlüssel aus der Liste l bezieht (optional können die Werte mit v initialisiert werden) Falls der Schlüssel k existiert wird der Wert von k geliefert, sonst a Falls der Schlüssel k nicht existiert wird er mit a initialisiert Rückgabe ist ein zufälliges Tupel (Schlüssel, Wert), Paar wird anschließend aus d entfernt Mengen Operationen: Operation len(s) e in s e not in s Erklärung Gibt die Anzahl der Element von s zurück Liefert Wahrheitswert, ob e in s enthalten ist Liefert Wahrheitswert, ob e nicht in s enthalten ist Mengenoperationen: Operation s <= m s<m s >= m s>m s|m s&m s-m s^m Erklärung Liefert True, wenn s Teilmenge von m Liefert True, wenn s echte Teilmenge von m Liefert True, wenn m Teilmenge von s Liefert True, wenn m echte Teilmenge von s Rückgabe einer Menge, welche Vereinigung von s und m bildet Rückgabe einer Menge, welche Schnittmenge von s und m bildet Rückgabe einer Menge, welche Differenz von s und m bildet Rückgabe einer Menge, welche symmetrische Differenz von s und m bildet Mengen (set) Hierbei handelt es sich um Mengen, denen beliebig viele Elemente hinzugefügt werden können. Zu beachten gilt aber, dass ein Element nur einmal in einer Menge vorkommen kann. unveränderliche Mengen (frozenset) Hierbei handelt es sich um Mengen, welche zum Beginn einmal mit bestimmten Elementen initialisiert werden und dann nicht mehr verändert werden können. 3. Kontrollstrukturen If, elif, else if Bedingung: … elif Bedingung: … else: … While-Schleife while Bedingung: … else: … For-Schleife for Variable in Objekt: ... if x==1: print(“x=1”) elif x==2: print(“x=2”) else: print(“x ungleich 1”) #abkürzende Schreibweise: y = (1 if x == 2 else 2) x=4 while x>1: print (x) x=x-1 else: print („x ist 1“) for i in range (1, 5, 2): print (i) #1 #3 Schleifenabbruch vorzeitiger Abbruch einer Schleife break vorzeitiger Abbruch eines Schleifendurchlauf continue while Bedingung: while Bedingung: … … break continue … … else: else: … … … … eigene Funktionen definieren def Funktionsname (Parameter 1, ..., Parameter n): ... def sum1 (a, b): return Wert print (a+b) def sum2 (a,b): return a+b optionale Parameter: (Parameter 1 = Standardwert, ...) def mult (a, b, c, d=0): def mult (a, b, c, d=0): return (a*b*c)+d return (a*b*c)+d print (mult(c=2, b=4, a=3)) print (mult(2, 4, 3)) # 24 # 24 print (mult(d=2, a=4, b=3, c=8)) print (mult(2, 4, 3, 8)) # 98 # 32 Variablenzugriff innerhalb einer Funktion: Durch das Schlüsselwort global ist der Zugriff auf globale Variablen möglich. def funktion (): a = „lokal“ a = „global“ funktion() print (a) # global def funktion (): global a a = „lokal“ a = „global“ funktion() print (a) # lokal anonyme Funktionen: funktion = lambda a, …, z: Rückgabewert mult = lambda a, b, c: a*b*c d = mult (1,2,4) print (d) #8 del-Anweisung: Diese Anweisung löscht Variablen oder Teile von sequentiellen Datenstrukturen. a = [2, 3, 8] del a[1] print (a) # [2, 8] del a print (a) # NameError: name 'a' is not defined pass-Anweisung: Diese Anweisung hat keine Funktion und dient lediglich als Platzhalter. def funktion(): pass y=1 if y==1: pass else: pass 4. Ausnahmebehandlung Exceptions in Python Alle Exceptions in Python erben von der Klasse BaseException. wichtige Exceptions: ArithmeticError o OverflowError o ZeroDivisionError LookupError o IndexError SyntaxError KeyboardInterrupt Abfangen einer Exception def funktion (liste, n): try: try: … back = liste[n] except Exceptiontyp: except IndexError: ... print („Fehler“) else: back = 0 else: ... print („kein Fehler“) finally: finally: ... return back eigene Exceptions In Python besteht die Möglichkeit eigene Exception-Klassen zu definieren, welche dann geworfen werden können. class ExceptionName(Exception): … end file Funktion dir dir(object) Diese Funktion liefer alle Attribute und Methoden zu einem Objekt. Funktion help help(object=““) Ohne einen Parameter wird die interaktive Hilfe von Python gestartet. Bei Angabe eines Parameters wird die Hilfe zu diesem Objekt angezeigt. 6. Module und Pakete Module und Pakete importieren Module und Pakete dienen dazu, ein Programm zu strukturieren und übersichtlicher zu machen. Variante des Importes import Mod1 import Mod1, Mod2 import Mod1 as Name1 from Mod1 import * from Mod1 import fkt1, fkt2 raise Ausnahme() #Traceback (most recent call last): #File „…", line 25, in <module> #__main__.Ausnahme from Mod1 import fkt1 as Funktion1 Funktion print print(*value, sep=„ “, end=„\n“, file=sys.stdout) sep a = „Ich bin ein String!“ if isinstance(a,str): print(„Ja, du bist wirklich ein String“) class Ausnahme(Exception): pass 5. Built-in Funktionen Parameter *value Funktion input input(prompt=„“) Diese Funktion dient zum einlesen eines Wertes über die Eingabeaufforderung. Der optionale Parameter promt dient zum Anzeigen eines Textes vor der Eingabe. Funktion isinstance isinstance(object, class-or-type-or-tuple) isinstance(a, (A, B, C)) prüft ob a Instanz von A, B oder C Erklärung Angabe einer oder mehrerer Strings, welche ausgegeben werden sollen Angabe eines String, welche zwischen den Strings von *value ausgegeben werden soll Angabe eines String, welche nach dem letzten String von *value ausgegeben werden soll Angabe, wohin die Strings ausgegeben werden sollen print(„ein String“, „noch ein String“) #ein String noch ein String print(„Str1“, „Str2“, sep=„_“, end=„“) print(„Str3“,“Str4“,sep=„.“) #Str1_Str2Str3.Str4 import math x=math.sin(math.pi) Erklärung Das Modul Mod1 wird importiert Die Module Mod1 und Mod2 werden importiert Mod1 wird unter dem Namen Name1 importiert Es wird alles aus Mod1 in den globalen Namensraum importiert Es werden nur die Funktionen fkt1 und fkt2 in den globalen Namensraum importiert Es wird nur die Funktionen fkt1 unter dem Namen Funktion1 in den globalen Namensraum importiert import math from math import sin as Sinus x=Sinus(math.pi) eigene Module Module werden durch Dateien realisiert. Der Modulname entspricht dem Dateinamen. Die eigenen Module müssen im gleichen Ordner, wie das Hauptprogramm liegen. def fkt1(a, b) return a+b def fkt2(a, b) return a*b python.py import funktionen c=funktionen.fkt(2,3) d=funktionen.fkt(2,3) print(c) print(d) #5 #6 Zusammenfassung von Modulen in Paketen Pakete werden durch Ordner realisiert. Der Paketname entspricht dem Ordnernamen. In jedem Ordner muss die Datei „__init__.py“ vorhanden sein. from paket1.paket1 import modul1 from paket1 import paket1 from paket1 import modul1 from paket1 import modul2 from paket2 import modul1 Iteratoren Iteratoren sind Klassen, welche die Möglichkeit bieten Reihen von Werten zu verarbeiten. class Iteratorname(object) def __init__(self, Parameterliste): … def __iter__(self): … def __next__(self): if Bedingung: … else raise StopIteration class Iter: def __init__(self, max): self.max=max self.aktuell=0 def __iter__(self): return self def __next__(self): if self.aktuell<self.max: self.aktuell=self.aktuell+1 return self.aktuell+3 else: raise StopIteration for i in Iter(3): print(i) import paket1 import paket2 print(paket1.modul2.fkt(2,3)) #5 7. Weitere Spracheigenschaten List Comprehensions List Comprehensions erstellen aus einer Liste mehrere Listen. [neues_Element for Variable in Liste] [neues_Element for Variable in Liste if Bedingung] [neues_Element for Var1 in Liste1 for Var2 in Liste2] liste = [1, 2, 3, 4] liste2 = [x+2 for x in liste if x<4] print(liste2) #3, 4, 5 ls1 = [1, 2] ls2 = [3, 4] ls3 = [a+b for a in ls1 for b in ls2] # 4, 5, 5, 6 liste1 = [2, 4, 6, 8] liste2 = [1, 3, 4, 2] liste3 = [liste1[i]+liste2[i] for i in range(4)] print(liste3) #3, 7, 10, 10 Generatoren Generatoren sind Funktionen, welche eine Möglichkeit bieten Reihen von Werten zu verarbeiten. Das yield-Statement in der Generator-Funktion sorgt dafür, dass ein entsprechender Wert zurück gegeben wird und die Funktion an dieser Stelle fortgesetzt wird. def quad_gen(max): i=1 while i <= max: x = i*i yield x i = i+1 for i in quad_gen(3): print(i) def name_gen(more1): yield „Name1“ if more1==False: return yield „Name2“ yield „Name3“ Copyright Es besteht die Berechtigung dieses Dokument für den persönlichen Gebrauch oder Unterrichtszwecke zu kopieren. Für alle anderen Verwendungszwecke ist eine schriftliche Genehmigung des Autors nötig. Haftungsausschluss Für eventuelle Fehler in diesem Dokument wird keine Haftung übernommen. Verbesserungsvorschläge und Kommentare können gern an die oben genannte E-Mail-Adresse gesendet werden. Quellen • • Python – Das umfassende Handbuch von Peter Kaise und Johannes Ernesti http://www.python.org