Announcement

Collapse
No announcement yet.

Aus der Python-Trickkiste

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aus der Python-Trickkiste

    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>

Working...
X