[python-users] lambda

Christopher Arndt chris.arndt at web.de
Fr Mai 15 14:48:00 CEST 2009


Dirk Hünniger schrieb:
> Also letzen ende eine funktionsdefinition mit geringfügig anderer Syntax.
> Aber ich lasse mich gerne aufklären wenn da wirklich noch mehr drin 
> steckt als das was ich hier
> gesagt habe.

So sehe ich das auch. Mit der wichtigen Einschränkung, dass der
Funktionskörper auf *einen Ausdruck* beschränkt ist, dessen Wert als
Rückgabewert der Funktion verwendet wird. Das heißt, man keine
Statements, also import, if/else/etc. oder print (Python < 3.0) verwenden.

Seit es list comrehensions, generator expressions, Iteratoren und das
ternäre Konstrukt (x if y else z) in Python gibt, macht diese
Einschränkung nur selten Probleme, aber oft leidet die Lesbarkeit sehr
darunter. Manchmal ist es also besser, einfach eine Hilfsfunktion zu
definieren, als eine lange, unleserliche lambda-Konstruktion zu verwenden.

Man verwendet lambdas oft, wenn statt eines konkreten Wertes eine
Funktion, die den Wert erzeugt, als Argument übergeben werden soll, um
die Definition einer Hilfsfunktion zu vermeiden. Ein einfaches Beispiel:

Sortiere eine Liste von Namen unabhängig von Groß- und Kleinschreibung:

Statt:

    def sortfunc(a, b):
        return cmp(a.lower(), b.lower())

    l.sort(sortfunc)

Kann man

    l.sort(lambda a,b: cmp(a.lower(), b.lower()))

schreiben.


Seit Python 2.4 ist es besser, statt der Sortierfunktion eine Funktion
zum Umwandeln der Listenitems in die Sortierschlüssel zu verwenden.

Ohne lambda:

    def keyfunc(x):
        return x.lower()

    l.sort(key=keyfunc)

Mit lambda:

    l.sort(key=lambda x: x.lower())

Sortieren einer Liste von dictionaries der Form {'name': '...',
'firstname': '...'} nach dem Wert des Keys 'name':

Ohne lambda:

    def get_name(x):
        return x['name']

    l.sort(key=get_name)

Mit lambda:

    l.sort(key=lambda x: x['name'])

Oder unter Zuhilfenahme des "operator" Moduls (effizienter, weil in C
implementiert):

    from operator import attrgetter

    l.sort(key=attrgetter('name'))



Chris



Mehr Informationen über die Mailingliste python-users