Sven Goldschmidt
wi7502@fh-wedel.de
Fachhochschule Wedel
WS 99/00
Um diese Sprachen gehts:
Python (Name von Monty Python's Flying Circus)
Autor: Guido van Rossum (Centre voor Wiskunde en Informatica (CWI) Amsterdam)
Python ist in C geschrieben, stammt aus der Modula-Familie und leiht sich Features aus Lisp, Smalltalk, FP und UNIX-Shells. Nichts wirklich neues. Rosinen aus vielen Kuchen zu einem uebersichtlichen Paket zusammengeschnuert.
Die "Python Software Activity" (PSA) (http://www.python.org) steuert die Weiterentwicklung und stellt im Internet umfangreiche Informationen zur Verfuegung.
Perl (Practical Extraction and Report Language)
Autor: Larry Wall
Ziel bei der Entwicklung war die Schaffung von Funktionen fuer allgemeine Anwendungsgebiete. Perl ist im Wesentlichen eine Synthese aus C und den UNIX-Funktionen sed und awk.
Unter http://www.perl.com laufen bei Perl die Faeden zusammen.
Tcl (Tool Command Language)
Autor: John Ousterhout (U.C. Berkeley / Sun Microsystems)
Die offizielle Tcl/Tk-Homepage findet man unter http://www.scriptics.com.
[ weiter ] [ nach oben ]
Die folgenden Fragen sollten bei der Auswahl einer Sprache gestellt werden:
Auf den ersten Blick gibt es also keinen wirklich zwingenden Grund, die Sprache zu wechseln, wenn man sich erstmal fuer eine entschieden hat.
Diesen Eindruck gewinnt man auch im Internet. Im Bereich Skriptsprachen argumentiert man mit betont objektiven Statements. - Meistens.
[ weiter ] [ nach oben ]
Python ist eine relativ junge Sprache und deckt dieselben Bereiche ab, auf die Tcl und Perl spezialisiert sind. Es stellt sich die Frage nach dem Sinn einer weiteren Skriptsprache. - Die Devise beim Design von Python lautete: Weniger ist mehr.
Python ist eine minimalistische Sprache, die auf Erweiterbarkeit setzt.
Guido van Rossum konzentrierte sich beim Design auf wenige Prinzipien:
[ nach oben ]
Sowohl Python als auch Perl und Tcl verfuegen ueber einen "interaktiven Modus". Die Zeilenediereigenschaften sind im Allgemeinen nicht sehr fortgeschritten, der "interaktive Modus" ist aber hilfreich, um Codesemente zu testen oder um ein Skript zu debuggen.
Auf den meisten Systemen koennen Skripte aehnlich wie ein Shell-Skript ausgefuehrt werden, indem zu Beginn des Skriptes der Interpretierer angegeben wird und die Datei ausfuehrbar gemacht wird.
[ weiter ] [ nach oben ]
Die Interpretierer koennen mit oder ohne Parameter aufgerufen werden. Die Bedienung der Interpretierer im "interaktiven Modus" aehnelt sich sehr. Alle liefern einen primaeren Prompt zurueck und verhalten sich dann aehnlich wie eine UNIX-Shell. Sie lesen Kommandos und fuehren sie interaktiv aus. Quellcode kann importiert und getestet werden.
Tcl und Python bieten zusaetzlich einen Interpretierer als Fensteranwendung mit Namen "wish" bzw. "idle" an. Sie nutzen die Vorteile des GUI.
[ nach oben ]
Python und Perl kommen mit einer Fuelle eingebauter Typen daher. Auch Tcl verfuegt ueber eingebaute Typen, diese wurden allerdings bis zur Version 8.0 alle als Strings implementiert - immernoch ein beliebter Kritikpunkt an dieser Skriptsprache, denn die Umwandlung der Strings verursacht eine im Vergleich niedrige Geschwindigkeit. Seit der Version 8.0 unterstuetzt Tcl einen internen Datentyp, der Tcl-Objekte nicht nur als Zeichenkette, sondern zusaetzlich als Zieltyp speichert.
Eine Zuweisung kopiert in Python keine Werte, sondern nur Referenzen. Sie bindet Namen an Objekte - was einschliesst, dass mehrere Namen an dasselbe Objekt gebunden sein koennen. Das faellt bei unveraenderlichen Objekten nicht weiter auf. Bei veraenderlichen Objekten (Dictionaries, Listen) kann es aber Quelle unangenehmer Ueberraschungen werden.
Python ist wie Tcl und Perl deklarationsfrei. Variablen muessen in Python (wie auch in Perl) nicht besonders referenziert werden.
Python assoziiert mit jeder aktiven Programmkomponente einen Namensraum (Namespace), der den ihr angehoerenden Namen Objekte zuordnet.
[ weiter ] [ nach oben ]
Die Syntax von Ausdruecken in Python ist simpel. Die Operatoren +, -, * und / funktionieren wie in den meisten anderen Sprachen, ebenso Vergleichsoperatoren. Klammern koennen zum Gruppieren verwendet werden. Ein Wert kann mehreren Variablen gleichzeitig zugewiesen werden und auch Mehrfachzuweisungen sind in Python moeglich. Es gibt volle Unterstuetzung fuer Fließkommazahlen und auch komplexe Zahlen werden unterstuetzt.
Python | Perl | Tcl |
a = 10 b = 3*(3+2) c = d = 2 e,f = 7,8 g = 7/8 h = 7.0/8 i = (1+2j)/(1+1j) |
$a = 10; $b = 3*(3+2); $c = $d = 3; $g = 7/8 $h = 7.0/8 |
set a 10 set b [expr $a+2] set c [set d 3] set g [expr 7/8] set h [expr 7.0/8] |
Es gibt in Python diverse Varianten, einer Variablen einen String-Wert zuzuweisen. Auch mehrzeilige String-Literale koennen zugewiesen werden. Ausserdem gibt es Operatoren zum Vervielfaeltigen und Zusammensetzen, sowie ausgefeilte Teilbereichsoperatoren.
Python | Perl | Tcl |
s1 = 'spam eggs' s2 = 'waer\'' s3 = '"Ich wollt\'," wuenscht sie.' s4 = "\"...ich "+s2+"\" meint sie." s5 = '"Is\' nich\'" ruft er.' |
$s1 = 'foo bar'; $s2 = 'waer\''; $s3 = '"Ich wollt\'," wuenscht sie.'; $s4 = "\"...ich $s2\" meint sie."; $s5 = '"Is\' nich\'," ruft er.'; |
set s1 "foo bar" set s2 waer' set s3 "\"Ich wollt',\" wuenscht sie." set s4 "\"...ich $s2\" meint sie." set s5 "\"Is' nich',\" ruft er." |
Python-Quelltext: strings.py
Auch Perl und Tcl verstehen sich sehr gut auf die Verarbeitung von Zeichenketten. Perl ist bekannt fuer seine regulaeren Ausdruecke, die bereits implementiert sind. Tcl kennt diese ebenfalls. Fuer Python existiert ein entsprechendes Modul zur Auswertung von regulaeren Ausdruecken.
[ weiter ] [ nach oben ]
Die vielseitigste Art, in Python Werte zu gruppieren sind Listen. Sie besteht aus von Kommata getrennten Werten innerhalb von eckigen Klammern und kann Listenelemente verschiedenen Typs enthalten. Wie bei Strings, kann auch bei Listen in Python ein indizierter Zugriff mit ausgefeilter Teilbereichsnotation genutzt werden. Zusaetzlich wird fuer Listen eine erschoepfende Auswahl interner Methoden und Werkzeuge angeboten, die keine Wuensche offen lassen.
Listenelemente lassen sich (im Gegensatz zu Strings und Tupeln, welches unveraenderbare (immutable) Typen sind) veraendern (mutable).
Python-Quelltext: listen.py
Da Listen eine sehr gaengige Datenstruktur sind, gibt es sie natuerlich auch in Tcl und in Perl (da heissen sie dann auch gerne "anonyme Arrays").
[ weiter ] [ nach oben ]
Ein Tupel besteht in Python aus einer Anzahl von Werten, die durch Kommata getrennt sind. Sie koennen durch Nutzung runder Klammern verschachtelt werden. Auf einzelne Elemente eines Tupels kann nicht schreibend zugegriffen werden. Durch das sogenannte "Tupeleinpacken" (tuple packing) ist es moeglich, einem Tupel mit einer Zuweisung mehrere Werte zuzuweisen. Das "Tupelauspacken" (tupel unpacking) weist einer Liste von Variablen die Elemente eines Tupels zu.
Python-Quelltext: tupel.py
In Tcl und Perl heisst dieser Datentyp "Array" (gerne werden auch "mehrdimensionale Arrays" gebastelt).
[ weiter ] [ nach oben ]
Im Gegensatz zu Sequenzen, die mit Zahlenintervallen indiziert werden, werden Dictionaries ueber unveraenderliche Schluessel indiziert ("assoziativer Speicher"). Eine durch Kommata getrennte Liste von Schluessel:Werte-Paaren innerhalb geschwungener Klammern fuegt initiale Schluessel:Wert-Paare in das Woerterbuch ein.
Die Methode items gibt die Schluessel:Wert-Paare, die Methode keys allein die Schluessel eines Woerterbuches in einer Liste zurueck. Es gibt ausserdem verschiedene Methoden um z.B. Wertepaare zu loeschen oder zu sortieren.
Python-Quelltext: dictionaries.py
In Perl heisst dieser Datentyp "Hash" (eine assoziative Liste skalarer Werte).
Sequenz-Objekte duerfen mit anderen Objekten vom gleichen Sequenztyp verglichen werden. Unterstuetzt werden die Vergleichsoperatoren in und not in, die Operatoren is und is not sowie die Booleschen (Abkuerzungs-)Operatoren and und or. Vergleiche koennen verkettet und geklammert werden. Ausdruecke werden von links nach rechts (verkuerzt) ausgewertet. Der Vergleich basiert auf lexikographischer Ordnung.
[ nach oben ]
Zur Gruppierung von Anweisungen werden keine Klammern oder Schluesselworte genutzt. Die Gruppierung erfolgt durch Einruecken.
[ weiter ] [ nach oben ]
Python kennt die Befehle if, elif und else. Es darf keine oder mehrere elif-Teile geben, und das else ist optional. elif ersetzt die switch- oder case-Anweisungen in anderen Sprachen.
[ weiter ] [ nach oben ]
Bei der for-Schleife in Python wird nicht (wie in Perl und Tcl) ueber eine Folge von Zahlen sondern ueber Elemente einer Sequenz iteriert. In Perl stellt die foreach-Funktion die Iteration ueber Elemente zur Verfuegung.
Auch fuer die for-Schleife gibt es in Python eine else-Anweisung. Sie tritt ein, wenn eine Schleife vollstaendig durchlaufen wurde.
Mit der break- und continue-Anweisung kann aus Schleifen "ausgebrochen" werden.
Sehr nuetzlich: Die range-Funktion erzeugt eine Liste, die einer arithmetischen Aufzaehlung entspricht. =)
In Kombination mit der len-Funktion kann man dann zum Beispiel ueber die Indizes einer Sequenz iterieren.
Ausserdem gibt es noch eine pass-Anweisung. Sie tut nichts und soll benutzt werden, wenn eine Anweisung syntaktisch notwendig ist.
[ weiter ] [ nach oben ]
Das Schluesselwort def leitet in Python die Definition einer Funktion/Prozedur ein (Perl: sub; Tcl: proc). Es folgt der Funktionsname und eine Liste von formalen (Werte-)Parametern (call by value).
Argumente koennen mit Vorgabewerten spezifiziert werden. Auch der Aufruf mit Schluesselwort-Argumenten ist moeglich. Der Aufruf kann auch mit variabel vielen Parametern erfolgen.
Tcl-Quelltext: fib1.tcl
Perl-Quelltext: fib1.pl
Python-Quelltext: fib1.py
[ weiter ] [ nach oben ]
Python unterstuetzt sowohl den prozeduralen als auch den funktionalen Programmierstil und stellt dafuer einige aus Lisp bekannte Werkzeuge zur Verfuegung:
map wendet eine Funktion auf alle Elemente einer Sequenz an und liefert die Reihe der Ergebnisse in einer Liste zurueck.
filter extrahiert die Elemente einer Sequenz, die einem Praedikat genuegen.
reduce faltet eine Squenz, indem es deren Elemente mit einer binaeren Operation verknuepft.
Mit dem lambda-Schluesselwort koennen kleine anonyme Funktionen erzeugt werden.
Auch die apply-Funktion (ebenfalls von Lisp stammend) sei hier erwaehnt. Sie ermoeglicht es Funktionsaufrufe zur Laufzeit zu konstruieren (Dynamik). Die Funktionen eval und exec werten Ausdruecke und fuehren Anweisungen aus, die man zur Laufzeit in Zeichenketten uebergibt.
Python-Quelltext: dmap_f.py
[ nach oben ]
Python ist eine objektorientierte Sprache. Klassen sind Pythons hauptsaechliches OOP-Werkzeug. Sie erlauben mehrfache Kopien, Attributvererbung und das Ueberladen von Operatoren.
[ weiter ] [ nach oben ]
Eine Klasse beginnt mit dem Schluesselwort class, gefolgt vom Klassennamen, einem Doppelpunkt und dann (eingerueckt) den Anweisungen. Durch jede Klassendefinition wird ein neuer Namensraum erzeugt und als lokaler Geltungsbereich verwendet.
Klassenobjekte unterstuetzen zwei Arten von Operationen: Attributreferenzen und Instanziierung. Attributreferenzen verwenden die gaengige Attributierungssyntax (obj.name). Zur Instanziierung von Klassen wird die Funktionsnotation verwendet (x = MyClass()).
Instanzobjekte koennen mit Attributreferenzen operieren. Diese Attributreferenzen koennen "Datenattribute" ("Klassen- oder Instanzvariablen") oder "Methoden" (Funktionen, die zu einem Objekt gehoeren) sein.
Um eine Klasse von einer anderen Klasse erben zu lassen, wird die zu erbende Klasse als Parameter in der Klassendefinition angegeben.
Zur Mehrfachvererbung wird einfach eine Sequenz von Klassen als Parameter uebergeben. Die Aufloesung geschieht mit einer Tiefensuche von links nach rechts.
Klassen koennen hilfreich sein, um Datentypen zu schaffen, die eine Anzahl mit Namen versehener Daten gruppiert (Record in Pascal, Struct in C). Ausserdem sind benutzerdefinierte Ausnahmen nicht auf Stringobjekte beschraenkt - es koennen auch Klassen sein.
Python-Quelltext: class_b.py
[ weiter ] [ nach oben ]
Python wird mit einer Reihe Standardmodulen verbreitet. Diese Module sind im Interpretierer eingebaut.
Eine Datei, in der in Python-Definitionen und -Anweisungen abgelegt sind, ist in Python ein Modul. Diese Module (sie sollten die Endung .py haben) koennen in anderen Modulen oder im Hauptmodul importiert werden.
Zur Strukturierung des Namenraums in gibt es in Python die Moeglichkeit, aus mehreren Modulen sogenannte Pakete zu "schnueren", die dann komplett oder teilweise importiert werden koennen.
Die dir-Funktion liefert eine Liste der Namen zurueck, die in einem Modul definiert sind.
[ weiter ] [ nach oben ]
Die Perl-Regeln objektorientierter Programmierung lauten wie folgt:
In Tcl wird Objektorientierung ueber die [incr Tcl]-Erweiterung realisiert.
[ nach oben ]
Python bietet einige nuetzliche Methoden um eine Reihe von Strings in Tabellenform auszugeben.
Python-Quelltext: einausgabe.py
Auch das Einlesen und Manipulieren von Dateien ist unkompliziert. Geeignete bereits implementierte Methoden fuer Dateiobjekte stehen zur Verfuegung.
Python bietet zusaetzlich ueber das Pickle-Modul die Moeglichkeit persistente Objekte zu erzeugen.
Komplexe Datenstrukturen werden dabei durch das "Pickling" (Einlegen, haltbar machen) in eine String-Repraesentation umgewandelt und als Dateiobjekt gespeichert. Durch spaeteres "Unpickling" kann das Objekt dann weiterverwendet werden.
[ nach oben ]
Bei Syntaxfehlern und Ausnahmen, die bei der Ausfuehrung von Programmen auftreten, meldet Python aussagekraeftige Fehlermeldungen und bezeichnet die Stelle des Fehlers mit Zeilennummer und Wort oder mit dem Namen der aufgetretenen Ausnahme sowie dem Kontext in dem der Fehler aufgetreten ist.
Zur Ausnahmebehandlung stellt Python ein try-except-Konstrukt zur Verfuegung, das auftretende Ausnahmen, die auch selbst definiert werden koennen, abfangen kann. Die try-except-Anweisung hat eine optionale else-Klausel. Sie bietet Platz fuer Code, der ausgefuehrt wird, wenn die try-Klausel keine Ausnahme ausloest.
Python-Quelltext: exceptions.py
Ausnahmen koennen auch Klassen sein. Die Ausloesung von Ausnahmen kann erzwungen werden.
[ nach oben ]
Das Tk-Toolkit ist das bekannteste Toolkit zur Darstellung grafischer Frontends. Tcl/Tk hat es zu seiner Popularitaet verholfen - und auch in Perl und Python soll es an Fenstern nicht fehlen.
Python liefert mit dem Paket Tkinter das Pendant zu Perls Perl/Tk.
Tkinter wird standardmaessig mit Python mitgeliefert und bietet ein objektorientiertes Interface zur Nutzung aller Tk-Widgets.
Es gibt aber auch noch andere GUI-Frameworks: Z.B. wpy oder wxPython.
Python-Quelltext: tkinter_bsp.py
[ nach oben ]
Tcl wird immernoch die schlechteste Performance nachgesagt. Seit der Version 8.0 (1997!) nutzt aber auch Tcl einen Bytecode-Interpretierer (speichert ausserdem nicht mehr alle Daten als Zeichenkette) und kann nach eigenen Aussagen mit Perl gut mithalten.
Geschwindigkeitsmessungen sind aber immer abhaengig vom Testgebiet.
Python ist z.B. im folgenden Test schneller als Tcl:
Python-Quelltext: performance.py
Tcl-Quelltext: performance.tcl
[ nach oben ]
Sven Goldschmidt
wi7502@fh-wedel.de
Fachhochschule Wedel
WS 99/00