|
Aus der Python-Trickkiste
Mit dem Python-Release 2.3 (www.python.org) erhält der Programmierer effiziente neue Sprachmittel/Konstrukte und Module. Generell läßt sich konstatieren, dass viele Standard-Aufgaben weiter vereinfacht wurden. Los geht's.
Die "Comma-separated values" (kurz CSV) begegnen einem zum Beispiel im Kontext von Programmen wie Excel (aber auch in einigen Datenbanken); es handelt sich dabei platt gesagt, um ein allgemeines Austauschformat. Python bietet für die Arbeit mit den CSV nun ein eigenes Modul an. Damit kann der Anwender solche Daten entweder Lesen bzw. Schreiben. Apropos: Dieses Modul ist ein in C geschriebenes Erweiterungsmodul (das bedeutet selbstredend Performance). Ein kleines Beispiel demonstriert die einfache Verwendung.
import csv, sys row = [5, 7, 23, 'Hallo', None, 98] csv.writer(sys.stdout).writerow(row) >>>5,7,23,Hallo,,98 csv.writer(sys.stdout, dialect='excel-tab').writerow(row) >>> 5 7 23 Hallo 98
Ein anderes neues Modul, mit dem Namen sets, bietet ebenfalls sehr viel nützliche Funktionalität - mit diesem Modul lassen sich Aufgaben leicht bewältigen, die mit Mengen zu tun haben. So kann man zum Beispiel mit Hilfe von sets ganz fix die Schnittmenge, oder die Vereinigungsmenge ermitteln. Dieses einfache Beispiel hingegen ermittelt die gleichen Buchstaben in zwei verschiedenen Zeichenketten:
>>>import sets >>>print ''.join(sets.Set('Wo geht es lang?') & sets.Set('Wie geht es?'))
Der Beispiel-Code gibt folgendes Ergebnis aus: "eghstW?". Die Reihenfolge der Treffer kann variieren (wie das Resultat von dictionaries), da es intern keine feste Ordnung für die gefundenen Zeichen gibt.
Es gibt aber nicht nur neue Module in Python2.3, sondern auch brandneue built-in Funktionen. Da wären zum Beispiel die Funktionen enumerate() und sum(). Mit beiden Funktionen werden bestimmte Python-Idiome erheblich vereinfacht - d.h. der Code wird kürzer, damit einfacher und lesbarer und zudem auch noch schneller. Schauen wir uns zuerst die Verwendung von enumerate() genauer an. Es ist jetzt absolut einfach, über eine bestimmte Sequenz zu iterieren und gleichzeitig den Index für jedes Element mitzuverfolgen. In den Vorgängerversionen Pythons sah das so aus:
words = ['eins', 'zwei', 'drei'] for i in range(len(words)): word = words[i] print i, '->', word
Nun, auf den ersten Blick ist der Code nicht ganz einfach zu lesen. Die neue Variante ist kürzer und prägnanter:
words = ['eins', 'zwei', 'drei'] for i, word in enumerate(words): print i, '->', word
Übrigens, das funktioniert auch mit Dateiobjekten, da dieses Idiom für jede indizierbare Sequenz in Frage kommt.
Die Funktion sum() tut genau das, was man von ihr erwartet (wenn das nur immer so wäre ... ): man kann eine Liste mit Zahlen an sum() übergeben und erhält prompt das Ergebnis. Das alte Idiom sah so aus:
total = 0 while number in numbers: total += number
Nun die neue Variante:
total = sum(numbers)
Das ist wesentlich einfacher und obendrein schneller.
Der built-in Typ dict() ist natürlich nicht neu. Neu ist aber, dass Sie diesem Typ jetzt Schlüsselwortparameter zur Initialisierung übergeben können. Das geht so:
>>>print dict(a=23, b=45, c=67) {'a': 23, 'c': 67, 'b': 45}
Sehr praktisch!
Zudem gibt es noch die neue Methode fromkeys(): Was kann man damit anstellen?
>>>print dict.fromkeys(range(5)) {0: None, 1: None, 2: None, 3: None, 4: None}
Und eine weitere hübsche Neuerung: Mit dem in Operator kann man jetzt testen, ob ein substring in einer Zeichenkette enthalten ist.
if 'bc' in 'abc': print 'substring enthalten'
Beim Slicing gibt es ebenfalls ein neues sinnvolles Feature. So kann man ganz schnell eine umgekehrte Kopie jeder Art von Sequenz erzeugen. Ja, Python ist schon cool;-).
>>>print 'Kuckuck'[::-1] kcukcuK
An dieser Stelle ein Danke an A. Martelli für einige Beispiele.
Thomas Kaufmann
|