PHP-Code in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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]
Benutzeravatar
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:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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...
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.
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

Danke, aber wieso heißt diese eigenartige Funktion gerade lambda, und was bewirkt die, wenn ihr ergebnis übergeben wird...?
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!?
gree
User
Beiträge: 9
Registriert: Samstag 27. August 2005, 16:56
Kontaktdaten:

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...)
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)]
Antworten