#!/usr/bin/python # -*- coding: iso-8859-1 -*- # # Python Beispiele zu # http://www.thomas-guettler.de/vortraege/python/einfuehrung.html # # (c) 2003-2008 Thomas Güttler # http://www.thomas-guettler.de/ # # Beispiel ZINSEN: # Ein Versicherungsvertreter verspricht dir, dass du einen großen # Betrag bekommst, wenn du 35 Jahre jährlich 900 Euro einzahlst. Du # willst nun wissen, wieviel Geld du hättest, wenn du keine # Rentenversicherung abschließt, sondern das Geld mit 5 Prozent # Zinsen anlegst. Vielleicht gibt es dafür eine Formel, aber iterativ # (in einer Schleife) lässt sich das auch leicht berechnen. sum=0 for i in range(35): sum*=1.05 # 5 Prozent Zinsen sum+=900 print "Jahr %s Betrag: %s" % (i+1, sum) #--------------------------------------------------------------------- #Beispiel FIFO: #FIFO (first in first out) (Queue) #Vergleich: Autobahntunnel # l=[] # Nehme eine leere Liste for i in range(10): l.append(i) # An Liste anhängen print l while l: # Solange 'l' nicht leer ist ... print l.pop(0) # Entferne erstes Element der Liste #Ergebnis: 0, 1, 2, ... #--------------------------------------------------------------------- #Beispiel FILO: #FILO (first in last out) (Stack) #Vergleich: Stapel von Münzen # l=[] for i in range(10): l.append(i) while l: print l.pop() # Entferne letztes Element der Liste #Ergebnis: 9, 8, 7, ... #--------------------------------------------------------------------- #Beispiel ENDE: #Das dicke Ende # file="foo.jpg" if file[-4:]==".jpg": #unschön print "Foto" if file.endswith(".jpg"): #besser, analog "startswith()" print "Foto" #--------------------------------------------------------------------- #Beispiel DIE WAHRHEIT: #Was ist wahr und was ist falsch? #Folgende Bedingungen sind wahr: # if True: print "wahr" if 1: print "wahr" if -1: # Alle Zahlen außer 0 sind wahr print "wahr" if "0": # Nichtleere Zeichenkette print "wahr" if "False": # Nichtleere Zeichenkette print "wahr" if [[]]: # Nichtleere Liste print "wahr" if not False: print "wahr" if not 0: print "wahr" if not []: # Leere Liste print "wahr" if not {}: # Leeres Dictionary print "wahr" if not "": # Leere Zeichenkette print "wahr" if not None: print "wahr" #--------------------------------------------------------------------- #Beispiel REFERENZ: #Referenz vs. Kopie # list1=[1, 2, 3, 4] list2=list1 # Zwei Referenzen zeigen auf eine Liste list2[0]=5 print list1==list2 # --> 1 list1=[1, 2, 3, 4] list2=list1[:] # Erstelle eine Kopie der ersten Liste list2[0]=5 print list1==list2 # --> 0 #--------------------------------------------------------------------- #Beispiel UNIQUE a: #Doppelte Einträge aus einer Liste entfernen: mylist=[1, 1, 7, 7, 7, 6, 2, 3, 4, 4, 4, 5] unique={} # dictionary for item in mylist: unique[item]=1 mylist=unique.keys() mylist.sort() print mylist # --> [1, 2, 3, 4, 5, 6, 7] #Beispiel UNIQUE b: #Mit Python2.3 ist das entfernen von doppelten #Einträgen einfacher: mylist=[1, 1, 7, 7, 7, 6, 2, 3, 4, 4, 4, 5] try: # ab Python 2.4 set except NameError: # Python 2.3 from sets import Set as set myset=set(mylist) mylist=list(myset) mylist.sort() print mylist # --> [1, 2, 3, 4, 5, 6] #--------------------------------------------------------------------- #Beispiel SORTDICT: #Ein Dictionary sortieren. #Da Dictionaries nicht sortiert gespeichert werden, #will man sie für die Ausgabe ggf. sortieren: mydict={"a": ["Auto", "Ampel"], "b": ["Bus", "Banane"], "c": ["Chemnitz", "Chaos"], "d": ["Dame", "Diesel"], "e": ["Esel"]} print "Unsortiert:", mydict items=mydict.items() items.sort() for buchstabe, woerter in items: print "%s: %s" % (buchstabe, woerter) #--------------------------------------------------------------------- #Beispiel SORTITEMS a: #Sortieren einer Liste von Paaren. #Die Einträge bestehen aus einer ID und einem Namen. #Die Liste soll anhand der Namen sortiert werden. # mylist=[ (1, "Dresden"), (2, "Chemnitz"), (3, "Bayreuth"), (4, "Freiburg"), (5, "Berlin")] def mycmp(a, b): # Bsp: a==(1, "Dresden") und b==(2, "Chemnitz") # Diese Compare (Vergleichs) Funktion, vergleicht # jeweils die zweiten Einträge in der Liste. return cmp(a[1], b[1]) # Es wird eine Referenz auf unsere Sortierfunktion übergeben. # Analog einem Funktionspointer in C. mylist.sort(mycmp) print mylist # Erläuterung: Die built-in Funktion "cmp" vergleicht zwei # Elemente. Sie gibt 0 zurück falls beide identisch sind, -1 falls das # erste kleiner ist, und 1 falls das erste Element größer ist. # Beispiele: # cmp( (1, 2, 3), (1, 2, 3) ) ---> 0 # cmp( (1, 2, 3), (1, 2) ) ---> 1 # cmp( (1, 100), (2, 1) ) ---> -1 # cmp( (1, 2), (1, 3) ) ---> -1 #Beispiel SORTITEMS b: #Wenn "mycmp" auf Daten zugreifen muss, die nicht #in den Argumenten a oder b stehen, kann man mit #"Decorate Sort Undecorate" (DSU) arbeiten, das bei großen Listen #auch schneller ist als "mycmp" #Siehe auch http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234 names={ 1: "Dresden", 2: "Chemnitz", 3: "Bayreuth", 4: "Freiburg"} decorated=[] for key, stadt in names.items(): decorated.append((stadt, key)) decorated.sort() # Es wird nach Städten sortiert ids=[] for stadt, key in decorated: ids.append(key) print ids # ids ist nun entsprechend den zugehörigen Werten in "names" sortiert #--------------------------------------------------------------------- ##Beispiel DOWNLOAD: ##Herunterladen eine Webseite: # #import urllib2 #fd=urllib2.urlopen("http://www.python.org/") #content=fd.read() #fd.close() #print content # #--------------------------------------------------------------------- ##Beispiel WEBBROWSER: ##Anzeigen der heruntergeladene Seite in einem Browser: ##Es wird der Standard-Browser des System genommen (Netscape, Mozilla, IE, ...) # #import tempfile #import webbrowser #htmlfile=tempfile.mktemp("foo.html") #fd=open(htmlfile, "w") #fd.write(content) #fd.close() #webbrowser.open("file://%s" % htmlfile) #--------------------------------------------------------------------- #Beispiel ISOTIME: #Datum im ISO-Format (2003-12-31 23:59:59) # import time print "Es ist jetzt: %s" % time.strftime("%Y-%m-%d %H:%M:%S") #--------------------------------------------------------------------- # Beispiel CHARCOUNT: # Zähle wie oft die Zeichen einer Datei vorkommen datei="beispiele.py" fd=open(datei) inhalt=fd.read() # Lese die gesamte Datei countdict={} # Erstelle leeres Dictionary for char in inhalt: # char (character) == Zeichen old=countdict.get(char, 0) # Falls Zeichen noch nicht gezählt, nehme die Null old+=1 # Zähle um eins hoch countdict[char]=old # Speichere Zähler im Dictionary (char == key (Schlüssel) items=countdict.items() # Liste [(key1, value1), (key2, value2), ...] items.sort() # Sortiere die Liste nach den Zeichen for char, count in items: if char=="\n": char="\\n" # Newline als \n ausgeben. print "Zeichen %s: %4d" % ( # %4d --> rechtsbündig (vier Zeichen) char, count) #--------------------------------------------------------------------- #Beispiel ISSTRING #Ist ein Objekt eine Zeichenkette? # myobj='abc' if isinstance(myobj, basestring): print 'Ja, das ist eine Zeichenkette: %s' % myobj #--------------------------------------------------------------------- #Beispiel UNICODE: #Zeichensatz-Konvertierung: # text="Der in deutschland übliche Zeichensatz: iso-8851-1 (latin1)" u=unicode(text, "latin1") utf8=u.encode("utf8") # default Zeichensatz von XML #--------------------------------------------------------------------- #Beispiel EINMALEINS: #Das Einmaleins als HTML-Tabelle # import tempfile import webbrowser rows=[] heading=[] for i in range(1, 11): heading.append('%s' % i) cols=[] for j in range(1, 11): cols.append('%s' % (i*j)) row='%s%s' % (i, ''.join(cols)) rows.append(row) html=""" Einmaleins %s %s
 
""" % (''.join(heading), ''.join(rows)) temp="%s.html" % tempfile.mktemp() fd=open(temp, "w") fd.write(html) fd.close() webbrowser.open("%s" % temp) # Bei Mozilla oder Firefox muss ggf. noch "strg-r" (Reload) gedrückt werden. #--------------------------------------------------------------------- #Beispiel SCRIPTDIR: #Script-Verzeichnis finden: #Oft stehen im Verzeichnis des Scripts zusätzliche Dateien (z.B. Bilder) #Das Verzeichnis in dem das Script steht #erhält man wie folgt: import os import sys scriptdir=os.path.abspath(os.path.dirname(sys.argv[0])) print "Scriptdir:", scriptdir #--------------------------------------------------------------------- #Beispiel STACKTRACE: #Stacktrace einer Exception als String #Anwendung: Fehler bei einer Web-Anwendung als Email #verschicken: def foo(): raise Exception("Das ist eine Exception") try: foo() except Exception: import traceback exc_string=''.join(traceback.format_exc()) print exc_string # raise ohne Argumente führt ein 're-raise' aus: #Die aufgefangene Exception wird wieder ausgelöst raise # Hinweis: Eine "catch-all" Regel, die alle Exceptions auffängt # sollte vermieden werden. Normalerweise sollte man # nur bestimmte Exceptions auffangen. Beispiel: i="abc" try: i=int(i) except ValueError: print "'%s' ist keine Ganzzahl" % i #--------------------------------------------------------------------- #Beispiel KONFIG: #Parsen einfacher Konfig-Dateien #Variable=Wert import re fd=open("myapp.config") for line in fd: line=line.strip() # Leerzeichen am Anfang und Ende entfernen if not line: continue # Überspringe leere Zeilen if line.startswith("#"): continue # Überspringe Kommentarzeilen match=re.match(r'(.*?)\s*=\s*(.*)$', line) # Regulärer Ausdruck assert match, "Syntax Fehler in folgender Zeile: %s" % line variable=match.group(1) wert=match.group(2) print "%s --> %s" % (variable, wert) #--------------------------------------------------------------------- #Beispiel DICTTEMPLATE: #HTML im Quelltext ist nicht schön. Noch schlimmer finde ich jedoch, #Programmierung in HTML wie bei PHP. #Dem "magischen" Prozentzeichen kann man auch ein Dictionary übergeben. #Zum Beispiel locals() (Dictionary der lokalen Variablen) import time heute=time.strftime("%d.%m.%Y") title="Das ist der Titel" # Wird zweimal verwendet (Im Kopf, und als

) html=''' %(title)s

%(title)s ... Heute ist der %(heute)s .... ''' % locals() print html #--------------------------------------------------------------------- #Beispiel LISTCOMPREHENSION: #Listcomprehension verwende ich selten, da man genauso mit einer #Schleife arbeiten kann: #Mit Listcomprehension staedte=["Augsburg", "Bremen", "Hamburg", "Berlin"] staedte_mit_b=[s for s in staedte if s.startswith("B")] print staedte_mit_b #Mit Schleife staedte_mit_b=[] for s in staedte: if s.startswith("B"): staedte_mit_b.append(s) print staedte_mit_b #--------------------------------------------------------------------- #Beispiel OWNEXCEPTIONS: #Eigene Exceptions # #Hinweis: Das auffangen aller Exceptions sollte vermieden werden, #da Fehler wie MemoryError, KeyboardInterrupt oder ZeroDivisionError #nicht stillschweigend übergangen werden sollten. class MyException(Exception): pass def test_func(): raise MyException("Test") try: test_func() except MyException, exc: print "Fehler: %s" % str(exc) # --> "Fehler: Test" #--------------------------------------------------------------------- #Beispiel DATETIME: #Rechnen mit Tagen import datetime heute=datetime.date.today() gestern=heute - datetime.timedelta(days=1) morgen=heute + datetime.timedelta(days=1) print gestern, heute, morgen #--------------------------------------------------------------------- #Beispiel MTIME ZU DATETIME: #mtime zu datetime import os import datetime mtime=os.path.getmtime('/etc/fstab') # Wert: Sekunden seit 1970 datetime.datetime.fromtimestamp(mtime) # High-Level Datumsangabe #--------------------------------------------------------------------- #Beispiel SETS: #Mengenlehre try: # ab Python 2.4 set except NameError: # Python 2.3 from sets import Set as set bis_fuenf = set([1, 2, 3, 4, 5]) gerade = set([2, 4, 6, 8, 10]) vereinigung = bis_fuenf | gerade # Union schnittmenge = bis_fuenf & gerade # Intersection print vereinigung, schnittmenge #--------------------------------------------------------------------- # Beispiel WRAPPER: # Einen Funktionsaufruf mit allen Argumenten weiterleiten. # Sie wollen einen Wrapper (Hülle/Mantel) um eine Funktion programmieren, # um vor und nach dem Funktionsaufruf bestimmte Dinge zu tun. Zum Beispiel: # Mittels Locking den eine Datei sperren. Mit "*args" und "**kwargs" # (Keywordarguments) geht das ganz einfach: def myfunc(a, b, c, name="..."): print a, b, c, name def wrapper(*args, **kwargs): # Vorbereitungen ... myfunc(*args, **kwargs) # Aufräumarbeiten wrapper(1, 2, 3, name="Till") #--------------------------------------------------------------------- # Beispiel HOME: # Unter Unix hat jeder Nutzer ein Home-Verzeichnis. Meist steht der Pfadname in # der Umgebungsvariable HOME (os.environ['HOME']). Manchmal steht diese # Variable jedoch nicht zu Verfügung. So kann man das HOME-Verzeichnis bekommen: import os import pwd home=pwd.getpwuid(os.getuid())[5] #--------------------------------------------------------------------- # Beispiel os.walk(): # Das Unix-Tool 'find' durchsucht Verzeichnisse rekursiv. # In Python kann man dafür die Funktion os.walk() verwenden. # Damit die Ergebnisse reproduzierbar sind, empfiehlt es sich # die Verzeichnisse und Dateien vor dem durchforsten zu sortieren. # In diesem Beispiel werden alle Verzeichnisse übersprungen die 'temp' # oder 'tmp' heißen und Dateien die mit '.pyc' enden. import os start="." for root, dirs, files in os.walk(start): dirs[:]=[dir for dir in sorted(dirs) if not dir in ['temp', 'tmp']] for file in sorted(files): if file.endswith(".pyc"): continue file=os.path.join(root, file) print file #--------------------------------------------------------------------- # Beispiel ETREE: # Die Bibliothek ElementTree bietet eine einfache API um mit XML-Daten # zu arbeiten. Einfache XPath Suchen sind möglich: # Funktioniert ab Python 2.5 from xml.etree import ElementTree etree=ElementTree.fromstring('') print etree.findall('.//test')