Seite 2 von 2

Verfasst: Montag 29. August 2005, 16:37
von jens
Also ich programmiere jetzt schon länger Python, weiß allerdings auch nicht alles... Mit lambda umgehen kann ich auch nicht und ich glaube das muß man auch nicht unbedingt... Es gibt auch andere Möglichkeiten... Außerdem soll doch lambda auch irgendwann abgeschafft werden:

http://www.python.org/peps/pep-3000.html

http://www.python-forum.de/viewtopic.php?t=3875
http://www.python-forum.de/viewtopic.php?t=3455

Verfasst: Montag 29. August 2005, 16:52
von henning
Erstmal ack, lambda ist beknntermaßen unschön und hoffentlich bald nicht mehr Teil von Python.

Ums nochmal kurz zu erklären:

Code: Alles auswählen

funk = lambda a, b: a*2 + b
ist dasselbe wie:

Code: Alles auswählen

def funk(a, b):
  return a*2 + b
Mit dem Unterschied, dass die Funktion, wenn man sie mit Lambda definiert keinen Namen kriegen muss (wird gern da verwendet, wo man eine kleine Funktion als Paramter übergeben will, z.B. bei sort oder map)

Lambda ist aber auch recht beschränkt: Man kann keine zweite "Zeile" in die Funktion einbauen, das gibt die Syntax schon nicht her,
lambdas dürfen halt nur "Expressions" beinhalten.
pydoc lambda hat geschrieben: Lambda forms (lambda expressions) have the same syntactic position as expressions. They are a shorthand to create anonymous functions; the expression lambda arguments: expression yields a function object.
[/quote]

Verfasst: Montag 29. August 2005, 16:57
von jens
Aha, nun hab auch ich es verstanden ;)

Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen:

Code: Alles auswählen

def meineFunktion( x, y ):
    def funk(a, b):
        return a*2 + b 
    
    print funk( x, y )
Ist zwar nicht so verbreitet, aber ich find's einleuchtend...

Verfasst: Montag 29. August 2005, 17:08
von henning
jens hat geschrieben: Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen
Ich normalerweise auch, weil es an sich besser lesbar ist,
(ich schätze mal, darum soll lambda auch abgeschafft werden)
aber ich persönlich nutze doch noch manchmal lambda für die ganz kurzen Dinger...

Verfasst: Dienstag 30. August 2005, 00:50
von BlackJack
lambda soll wohl hauptsächlich abgeschafft werden, weil es in Python so eingeschränkt ist. In anderen Sprachen hat man bei anonymen Funktionen den vollen Sprachumfang zur Verfügung und nicht nur eine Untermenge.

Verfasst: Dienstag 30. August 2005, 16:11
von gree
Danke, aber wieso heißt diese eigenartige Funktion gerade lambda, und was bewirkt die, wenn ihr ergebnis übergeben wird...?

Verfasst: Dienstag 30. August 2005, 22:17
von BlackJack
Der Name geht auf das Lambda-Kalkül zurück. Ein paar funktionale Programmiersprachen basieren auf der getypten Variante wie z.B. Haskell. Da wird das Lambda mit '\' abgekürzt, aber es gibt auch Programmiersprachen wo ebenfalls das Schlüsselwort `lambda` benutzt wird, z.B. in Scheme.

Den zweiten Teil der Frage habe ich nicht verstanden!?

Verfasst: Donnerstag 1. September 2005, 18:47
von gree
Danke, zweiter Teil:
sorted(lambda a,b:cmp(a[1],b[1]))
Was macht diese Funktion mit den eigenartigen ihr übergebenen Werten, und was bedeuten die (was lambda macht hab ich jetzt verstanden, aber was das bringt...)

Verfasst: Donnerstag 1. September 2005, 21:43
von BlackJack
Um sortieren zu können muss man Elemente miteinander vergleichen, damit man weiss welche weiter vorne in die Liste gehören und welche weiter hinten. Wenn man nur `list.sort()` oder `sorted(liste)` benutzt, dann werden die Elemente vom Sortieralgorithmus einfach mit '<' oder '>' verglichen.

Bei den Tupeln (Buchstabe, Anzahl) aus Deinem Beispiel würde erst nach Buchstabe und dann nach Anzahl verglichen. Da die Buchstaben alle unterschiedlich sind, weil sie Schlüssel eines Dictionaries sind, wird effektiv nur nach Buchstaben sortiert. Das ist bei dem Tupel das 0-te Element. Du wolltest aber nach der Anzahl, also dem 1-ten Element des Tupels sortieren. Und dazu kannst Du eine Funktion angeben die genau das tut: zwei Objekte entgegennehmen und das Element an Index 1 miteineinder vergleichen.

Oder man kann den `key`-Parameter übergeben, der eine Funktion sein muss, die aus einem Element einen Schlüssel zum Vergleichen "errechnet". Das habe ich in meinem Beispiel mit der `itemgetter()` Funktion gemacht. Das ist letztendlich Geschmackssache.

Code: Alles auswählen

In [20]: a = [('b', 200), ('z', 42), ('a', 100), ('b', 10)]

In [21]: sorted(a)
Out[21]: [('a', 100), ('b', 10), ('b', 200), ('z', 42)]

In [22]: sorted(a, lambda x, y: cmp(x[1], y[1]))
Out[22]: [('b', 10), ('z', 42), ('a', 100), ('b', 200)]

In [23]: import operator

In [24]: sorted(a, key=operator.itemgetter(1))
Out[24]: [('b', 10), ('z', 42), ('a', 100), ('b', 200)]