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
PHP-Code in Python
Erstmal ack, lambda ist beknntermaßen unschön und hoffentlich bald nicht mehr Teil von Python.
Ums nochmal kurz zu erklären:
ist dasselbe wie:
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.
Ums nochmal kurz zu erklären:
Code: Alles auswählen
funk = lambda a, b: a*2 + b
Code: Alles auswählen
def funk(a, b):
return a*2 + b
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.
[/quote]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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Aha, nun hab auch ich es verstanden
Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen:
Ist zwar nicht so verbreitet, aber ich find's einleuchtend...
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 )
Ich normalerweise auch, weil es an sich besser lesbar ist,jens hat geschrieben: Also in dem Falle würde ich mir einfach eine Funktion in einer Funktion machen
(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...
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.
Danke, aber wieso heißt diese eigenartige Funktion gerade lambda, und was bewirkt die, wenn ihr ergebnis übergeben wird...?
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!?
Den zweiten Teil der Frage habe ich nicht verstanden!?
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...)
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...)
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.
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)]