/
Die
Programmiersprache Python
1 Einführung in Python [toc]
- Python ist eine leicht zu lernende, objektorientierte Programmiersprache.
- Plattformunabhängig: Windows, Unix und Mac
- Interpretierte Sprache (Script-Sprache)
- Es existieren viele Module
2 Beispiel: Taschenrechner [toc]
- Dank der Readline-Bibliothek kann man den Interpreter sehr bequem
interaktiv benutzen.
- Beispiel: Verwendung von Python als Taschenrechner.
Aufgabe: Wenn ich
ein 56k Modem habe, wie lange dauert es eine 8MB Datei herunterzuladen?
- Code:
==guettli@sonne:~$ python
Python 2.1.3 (#1, Apr 20 2002, 10:14:34)
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> bps=56000 # Bit pro Sekunde
>>> byte_pm=(bps/8)*60
>>> byte_pm
420000
>>> datei=8*10**6 # acht mal zehn hoch sechs
>>> dauer=datei/byte_pm
>>> dauer
19
--> Es dauert rund 19 Minuten
- Integer: i=1
- Float: f=0.1
- String: s="hallo"
- Liste: l=[1, 2, 3]
#veränderbar
- Tuple: t=(1, 2, 3)
#unveränderbar
- Dictionary/Hash: d={1: "eins", 2:
"zwei", 3: "drei"}
- Strings (Zeichenketten) sind eine Folge von Zeichen. Man muss sich nicht
um die Terminierung von Zeichenketten, wie z.B. in C kümmern.
- Zeichenketten können in einfachen oder doppelten Anführungszeichen
geschrieben werden. Mehrzeilige Zeichenketten sind durch dreifache
Anführungszeichen möglich:
s1='Beispiel'
s2='Er sagte "Hallo" zu mir'
s3="er ist der 20'te"
s4="""Mehrere Zeilen
Zeile 2
Zeile 3
"""
s5='''Ebenfalls mehrere
Zeilen
'''
- Die Formatierung wie mit printf in C ist möglich:
s="Sonne"
m="Mond"
t="Sterne"
satz="%s, %s und %s" % (s, m, t)
--> Sonne, Mond und Sterne
#Erstes Zeichen
s[0]
#Letztes Zeichen
s[-1]
#Zugriff auf Teile der Liste
s[1:4]
#Länge
len(s)
# Formatieren von Gleitkommazahlen:
f=0.123456
s="%06.2f" % f
# Ergebnis: 000.12
#Längere Zeichenketten:
table="""
<table border="1">
<tr>
<td>%s</td> ....
</tr>
</table> """ % (variable)
- Zeichenketten können, sollten aber nicht, mit dem Plus Operator verbunden
werden. Es ist effizienter mit einer Liste zu arbeiten:
s=[]
for i in range(10):
s.append(str(i))
s=''.join(s)
assert(s=="0123456789")
- Die in C üblichen Sonderzeichen sind vorhanden:
\n == Newline (Zeilenumbruch)
\r == Carriage Return
\t == Tabulator
\\ == Backslash
Möchte man das Interpretieren der Escape Sequenzen unterbinden, kann
dies durch ein vorangestelltes 'r' geschehen. s = 'a\nb' # --> \n wird zu einem Newline
s = r'a\nb' # --> \n wird *nicht* zu einem Newline
- Zeichenketten können auch getrennt werden, um z.B. den Quellcode nicht
breiter als 80 Zeichen zu machen. Die Variablensubstitution funktioniert
trotzdem:
print("Text ......Wert1 = %s "
"Wert2 = %s "
"Wert3 = %s " % (
wert1, wert2, wert3))
3.4 Dictionaries (Hash-Tables) [toc]
- Dictionaries sind ein wichtiger Datentyp, der die tägliche Arbeit
vereinfacht. Dictionaries bestehen aus einen Schlüssel (Key) und einem
zugeordneten Wert (Value). Hier ein Beispiel, wie man Telefonnummern verwalten
kann. Die Keys sind Zeichenketten (die Namen) und die Values sind die
Telefonnummern.
- Code:
mydict={}
mydict["hans"]="030/312783"
mydict["bernd"]="0921/76499"
mydict["susi"]="0371/233444"
print "Hans: ", mydict["hans"]
print "Das Telefonbuch: ", mydict
#Alle Einträge ausgeben:
for (key, item) in mydict.items():
print "Key: %s Value: %s" % (key, item)
# Weitere Funktionen
mydict.keys() # Alle Schlüssel
mydict.values() # Alle Werte
mydict.has_key(mykey) # Ist dieser Schlüssel vorhanden
mydict.get(mykey, default) # Wert von "mykey", falls nicht vorhanden, "default"
4 Flusssteuerung [toc]
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import sys
print("Bitte Zahl eingeben:")
input=sys.stdin.readline()
input=input.strip() # Newline (\n) am Ende der Eingabe entfernen
i=int(input)
if i<0:
print "%s ist kleiner als Null." %i
elif i==0:
print "%s ist gleich Null." % i
else:
print "%s ist größer als Null." % i
- Die Blockstruktur wird durch das Einrücken mit vier Leerzeichen
gekennzeichnet (Tabs sollten nicht verwendet werden):
for x in [1, 2, 3, 4]:
print x
for x in range(6):
if x==1:
# Überspringe diese Zahl
continue
if x==4:
# Beende die Schleife
break
print x
- Funktionen werden durch das Schlüsselwort "def" definiert:
def plus(a, b):
return a+b
print plus(5, 7)
--> 12
- Paramter werden Call-By-Reference übergeben. Das heißt die Parameter
können innerhalb der Funktion geändert werden. Außnahme: Integer, Float,
Zeichenketten und Tuppel sind unveränderbar.
def fuelleListe(liste):
liste.append("eins")
liste.append("zwei")
liste.append("drei")
liste=[]
fuelleListe(liste)
print liste
--> ["eins", "zwei", "drei"]
- Default Argumente:
def printEtwas(etwas="Gurkensalat"):
print etwas
printEtwas()
--> Gurkensalat
printEtwas("Tomatensuppe")
--> Tomatensuppe
- Keyword Arguments: Argumente die per Schlüsselwort gesetzt werden sind
sehr nützlich, da man sich bei Funktionen mit vielen Parametern schlecht die
Reihenfolge merken kann:
def berechneWiderstand(volt, ampere):
return float(volt)/ampere
print berechneWiderstand(volt=12, ampere=4)
print berechneWiderstand(ampere=4, volt=12)
6 Python-Datei [toc]
Ein Python Script wird in einer Datei gespeichert, die mit ".py" endet. Als
Vorlage kann folgende Datei dienen: reverse.py
Wie führt man nun dieses Programm aus?
Unter Unix ruft man es von
der Shell auf: python myscript.py
Steht in der ersten Zeile #!/usr/bin/env python und hat man die
Ausführungsrechte gesetzt (chmod a+rx
myscript.py) kann man es direkt ausführen: ./myscript.py
Unter Windows kann man ein Script durch Doppelklick aus dem Explorer
ausführen. Endet die Datei mit ".py" wird es in einer MS-DOS Eingabeaufforderung
ausgeführt. Wenn es die Endung ".pyw" hat, wird es ohne zusätzlichem Fenster
gestartet. Der Nachteil vom Anklicken ist, das man dem Script keine Argumente
übergeben kann. Zur Not kann man das Script aus der MS-DOS Eingabeaufforderung
aufrufen und dort Argumente übergeben.
Startet man ein Programm durch
Doppelklick auf eine .py Datei, schließt sich das Fenster sobald das Script
beendet ist. Möchte man, dass das Fenster offen bleibt, kann man ein
"sys.stdin.readline()" am Ende einfügen.
Ein typischen Programm in
Python: #!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# Python Imports
import os
import sys
def usage():
print """Usage: %s
....
""" % (
os.path.basename(sys.argv[0]))
def main():
if len(sys.argv)==1:
usage()
sys.exit()
if __name__=="__main__":
main()
Die Funktion "main" wird aufgerufen, wenn das Script aufgerufen wird.
Wird das Script von einer anderen Datei importiert (import myscript),
wir die Main-Funktion nicht aufgerufen. Es werden dann nur die Funktionen und
Klassen bereitgestellt.
- Klassen sind Datenstrukturen, die aus Methoden und Attributen bestehen.
Methoden sind Funktionen einer Klasse, und Attribute sind Daten einer Klasse.
Ein Beispiel: klasse-auto.py
- Python unterstützt auch Vererbung, sowie Mehrfachvererbung und Exceptions.
9 Standardbibliotheken [toc]
9.1 Module importieren [toc]
Ein Modul (bzw. Bibliothek) wird mit der import-Anweisung eingebunden. Die
Funktionen, Variablen und Klassen dieses Moduls sind über den Modulnamen
anzusprechen. import sys
sys.argv[0] # Scriptname
from types import * # Globaler Namensraum wird mit überschrieben. Selten verwenden!
assert type(myvar) == IntType
from xml import sax
sax.parse(...)
Folgende Pakete gehören zur Standardbibliothek und sind in der Regel immer
vorhanden.
- re: Python unterstützt reguläre Ausdrücke (Regular Expressions).
- sys: Sys enthält unter anderem:
sys.exit() sofortiges Beenden des Programms
sys.stdin, sys.stdout, sys.stderr
sys.argv Liste der Argumente beim Programmaufruf. Der Scriptname steht in sys.argv[0]
- pickle: Pickle (Serialisieren) bedeutet, dass man Datenstrukturen
zu einer Bytefolge konvertiert. Diese Bytes können dann in einer Datei
gespeichert werden. Für kleine Programme kann man somit der Einsatz einer
Datenbank vermieden werden.
import pickle
dict={}
dict["hans"]="0815"
dict["gerd"]="007"
fd=open("datei.pickle", "w")
#Speichern der Daten
pickle.dump(dict, fd)
fd.close()
# Die Pickle-Datei ist reines ASCII
Laden des Dictionaries aus der Datei: import pickle
fd=open("datei.pickle")
dict=pickle.load(fd)
fd.close()
print dict
- math: Mathematische Funktionen: sin(), cos() ...
- os: Betriebsystem-Funktionen:
os.popen() (Pipe-Open: Ausführen von Kommandos)
os.system(), os.chdir(), os.getcwd(), os.nice(), os.kill(), os.environ["PATH"]
- urllib: Öffnen von Dateien per http://... oder ftp://...
- cgi
- cgitb: Falls in einer Webanwendung ein Fehler auftritt, kann man
mit cgitb eine HTML Seite erzeugen lassen, die sehr viele Informationen
enthält die zur Fehlersuche hilfreich sind (lila Seiten). Man kann sich auch
einen eigenen "Handler" schreiben, der einem die Fehlermeldung automatisch per
E-Mail zuschickt: cgitb.html
- poplib, imaplib, smtplib
- email: Emails im MIME-Format bearbeiten.
- html, sgml, xml
- Kryptography: md5, sha
- tkinter: Graphisch Benutzeroberflächen mittels TK
10 Externe Bibliotheken [toc]
- pyGTK: Python Anbindung an die GUI-Bibliothek GTK.
- ZODB: Objektorientierte Datenbank. Vortrag
- Quixote: Webserverunbabhängige Schnittstelle zwischen CGI und
Python: Quixote
- DB-API: Anbindung an relationale Datenbanken: MySQL, Postgres,
Oracle, ...
- epydoc: Erstellt API-Dokumentation anhand von Kommentaren im
Quelltext. Ausgabeformate sind HTML oder Latex.
12 Externe Links [toc]
13 Nachteile von Python [toc]
Einige Dinge sind auch an Python nicht optimal:
- Für Programmierer die vorher mit Visual Basic, Delphi oder Visual C++
gearbeitet haben, ist der Einstieg in Python ernüchtern: Die mitgelieferte
Entwicklungsumgebung IDLE ist nicht geeignet um grafische Benutzeroberflächen
"zusammenzuklicken". Außerdem gibt es keine Intelli-Sense (automatische
Namenserweiterung).
Auf den zweiten Blick ist es jedoch eine logische
Trennung von unabhängigen Teilen: Der Quelltext kann mit jedem beliebigen
Editor erstellt werden (Xemacs, vim, Ultra-Edit, Kate usw.) und grafisch
Benutzeroberflächen können mit dem jeder beliebigen GUI-Bibliothek erstellt
werden (gtk, tk, qt usw.).
- Wenn man mit der Syntax von Python und der umfangreichen
Standardbibliothek vertraut ist, möchte man meist keine weitere
Programmiersprache mehr lernen.
14 Persönliche Einschätzung zur Programmiersprache
Python [toc]
- Die Programmiersprache Python bietet sehr viele Bibliotheken. Die Module
aus der Standardbibliothek werden gut gepflegt.
- Man bekommt bei Fehlern immer einen Stacktrace mit Zeilennummer des
Fehlers. In "C" muss man dafür extra den Debugger starten.
- Segmentation Faults sind nicht möglich --> Programmentwicklung ist
schneller als in C oder C++.
- Die Entwicklungsgeschwindigkeit ist heutzutage wichtiger als die
Ausführungsgeschwindigkeit zur Laufzeit. Zeitkritische Abschnitte können in C
oder C++ geschrieben werden.
- Sehr schön ist, dass man keine Makefiles mehr braucht. Die vorkompilierten
PYC-Dateien (Bytecode) werden automatisch neu erstellt, falls sich die
zugehörige PY-Datei geändert hat.
- Python verfügt über eine einfache Entwicklungsumgebung: IDLE. Das ist ein
Vorteil für den Unterricht und Schulungen, da nicht zusätzlich ein Editor
installiert werden muss.
- Die Python Newsgroups sind sehr anfängerfreundlich. Jeder Python
Programmierer sollte hin und wieder hineinschauen. Man lernt immer dazu.
- Python lässt sich auch sehr gut in vorhandene Anwendungen einbetten. So
wird z.B. die nächste Version von Paint Shop Pro den Python Interpreter
intergriert haben. Einige Nokia Handies lassen sich mit Python Programmieren.
- Die Programmiersprache ist stabil. Änderungen die nicht abwärtskompatibel
sind, sind nicht zu erwarten (Vgl. Perl5 nach Perl6).
15 Hinweise zur Python Programmierung [toc]
Diese Seite entstand im Rahmen meines Python-Vortrages bei der Linux User Group Dresden am 13.
Februar 2002. Überarbeitet für den Dresdner Linux-InfoTag 2003 und 2004.
Überarbeitet für die Chemnitzer Linux-Tage 2005.
© 2002-2005 Thomas Güttler. Der Text darf nach belieben kopiert und
modifiziert werden, solange dieser Hinweis zum Copyright und ein Links zu dem
Original unter http://www.thomas-guettler.de/vortraege.html
erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge mitteilen:
guettli@thomas-guettler.de