Mit dem Python-Release 2.3 <a href="http://www.python.org">(www.python.org)</a> erhält der Programmierer effiziente neue Sprachmittel/Konstrukte und Module. Generell läßt sich konstatieren, dass viele Standard-Aufgaben weiter vereinfacht wurden. Los geht es.
Die "Comma-separated values" (kurz <i>CSV</i>) 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 <i>CSV</i> 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.
<PRE>
import csv, sys
row = [5, 7, 23, 'Hallo', None, 98]
csv.writer(sys.stdout).writerow(row)
<i>>>></i>5,7,23,Hallo,,98
csv.writer(sys.stdout, dialect='excel-tab').writerow(row)
<i>>>></i> 5 7 23 Hallo 98
</PRE>
Ein anderes neues Modul, mit dem Namen <i>sets</i>, bietet ebenfalls sehr viel nützliche Funktionalität - mit diesem Modul lassen sich sehr viele Aufgaben leicht bewältigen, die mit Mengen zu tun haben. So kann man zum Beispiel mit Hilfe von <i>sets</i> ganz fix die Schnittmenge, oder die Vereinigungsmenge ermitteln. Dieses einfache Beispiel hingegen ermittelt die gleichen Buchstaben in zwei verschiedenen Zeichenketten:
<PRE>
<i>>>></i>import sets
<i>>>></i>print ''.join(sets.Set('Wo geht es lang?') & sets.Set('Wie geht es?'))
</PRE>
Der Beispiel-Code gibt folgendes Ergebnis aus: "<i>eghstW?</i>". Die Reihenfolge der Treffer kann variieren (wie das Resultat von <i>dictionaries</i>), da es intern keine feste Ordnung für die ermittelten Zeichen gibt.
Es gibt aber nicht nur neue Module in Python2.3, sondern auch brandneue <i>built-in</i> Funktionen. Da wären zum Beispiel die Funktionen <i>enumerate()</i> und <i>sum()</i>. 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 <i>enumerate()</i> 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:
<PRE>
words = ['eins', 'zwei', 'drei']
for i in range(len(words)):
word = words[i]
print i, '->', word
</PRE>
Nun, auf den ersten Blick ist der Code nicht ganz einfach zu lesen. Die neue Variante ist kürzer und prägnanter:
<PRE>
words = ['eins', 'zwei', 'drei']
for i, word in enumerate(words):
print i, '->', word
</PRE>
Übrigens, das funktioniert auch mit Dateiobjekten, da dieses Idiom für jede indizierbare Sequenz in Frage kommt.
Die Funktion <i>sum()</i> tut genau das, was man von ihr erwartet (wenn das nur immer so wäre ... ): man kann eine Liste mit Zahlen an <i>sum</i> übergeben und erhält prompt das Ergebnis. Das alte Idiom sah so aus:
<PRE>
total = 0
while number in numbers:
total += number
</PRE>
Nun die neue Variante:
<PRE>
total = sum(numbers)
</PRE>
Das ist wesentlich einfacher und obendrein schneller.
Der built-in Typ <i>dict()</i> ist natürlich nicht neu. Neu ist aber, dass Sie diesem Typ jetzt Schlüsselwortparameter zur Initialisierung übergeben können. Das geht so:
<PRE>
<i>>>></i>print dict(a=23, b=45, c=67)
{'a': 23, 'c': 67, 'b': 45}
</PRE>
Sehr praktisch!
Zudem gibt es noch die neue Methode <i>fromkeys()</i>: Was kann man damit anstellen?
<PRE>
print dict.fromkeys(range(5))
{0: None, 1: None, 2: None, 3: None, 4: None}
</PRE>
Eine weitere hübsche Neuerung: Mit dem <i>in</i> Operator kann man jetzt testen, ob ein <i>substring</i> in einer Zeichenkette enthalten ist.
<PRE>
if 'bc' in 'abc':
print 'substring enthalten'
</PRE>
Die "Comma-separated values" (kurz <i>CSV</i>) 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 <i>CSV</i> 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.
<PRE>
import csv, sys
row = [5, 7, 23, 'Hallo', None, 98]
csv.writer(sys.stdout).writerow(row)
<i>>>></i>5,7,23,Hallo,,98
csv.writer(sys.stdout, dialect='excel-tab').writerow(row)
<i>>>></i> 5 7 23 Hallo 98
</PRE>
Ein anderes neues Modul, mit dem Namen <i>sets</i>, bietet ebenfalls sehr viel nützliche Funktionalität - mit diesem Modul lassen sich sehr viele Aufgaben leicht bewältigen, die mit Mengen zu tun haben. So kann man zum Beispiel mit Hilfe von <i>sets</i> ganz fix die Schnittmenge, oder die Vereinigungsmenge ermitteln. Dieses einfache Beispiel hingegen ermittelt die gleichen Buchstaben in zwei verschiedenen Zeichenketten:
<PRE>
<i>>>></i>import sets
<i>>>></i>print ''.join(sets.Set('Wo geht es lang?') & sets.Set('Wie geht es?'))
</PRE>
Der Beispiel-Code gibt folgendes Ergebnis aus: "<i>eghstW?</i>". Die Reihenfolge der Treffer kann variieren (wie das Resultat von <i>dictionaries</i>), da es intern keine feste Ordnung für die ermittelten Zeichen gibt.
Es gibt aber nicht nur neue Module in Python2.3, sondern auch brandneue <i>built-in</i> Funktionen. Da wären zum Beispiel die Funktionen <i>enumerate()</i> und <i>sum()</i>. 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 <i>enumerate()</i> 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:
<PRE>
words = ['eins', 'zwei', 'drei']
for i in range(len(words)):
word = words[i]
print i, '->', word
</PRE>
Nun, auf den ersten Blick ist der Code nicht ganz einfach zu lesen. Die neue Variante ist kürzer und prägnanter:
<PRE>
words = ['eins', 'zwei', 'drei']
for i, word in enumerate(words):
print i, '->', word
</PRE>
Übrigens, das funktioniert auch mit Dateiobjekten, da dieses Idiom für jede indizierbare Sequenz in Frage kommt.
Die Funktion <i>sum()</i> tut genau das, was man von ihr erwartet (wenn das nur immer so wäre ... ): man kann eine Liste mit Zahlen an <i>sum</i> übergeben und erhält prompt das Ergebnis. Das alte Idiom sah so aus:
<PRE>
total = 0
while number in numbers:
total += number
</PRE>
Nun die neue Variante:
<PRE>
total = sum(numbers)
</PRE>
Das ist wesentlich einfacher und obendrein schneller.
Der built-in Typ <i>dict()</i> ist natürlich nicht neu. Neu ist aber, dass Sie diesem Typ jetzt Schlüsselwortparameter zur Initialisierung übergeben können. Das geht so:
<PRE>
<i>>>></i>print dict(a=23, b=45, c=67)
{'a': 23, 'c': 67, 'b': 45}
</PRE>
Sehr praktisch!
Zudem gibt es noch die neue Methode <i>fromkeys()</i>: Was kann man damit anstellen?
<PRE>
print dict.fromkeys(range(5))
{0: None, 1: None, 2: None, 3: None, 4: None}
</PRE>
Eine weitere hübsche Neuerung: Mit dem <i>in</i> Operator kann man jetzt testen, ob ein <i>substring</i> in einer Zeichenkette enthalten ist.
<PRE>
if 'bc' in 'abc':
print 'substring enthalten'
</PRE>