Ich habe gerade angefangen, Python zu lernen. Ich stieß auf Lambda-Funktionen. Bei einem der Probleme bat der Autor darum, eine Lambda-Funktion mit einem Liner für den Faktor einer Zahl zu schreiben.
Dies ist die Lösung, die gegeben wurde:
%Vor%Ich kann die seltsame Syntax nicht verstehen. Was bedeutet a (a, b)?
Kann jemand das erklären?
Danke
Lasst uns diesen einen Liner wie eine Zwiebel aufschälen.
%Vor%Wir machen eine anonyme Funktion (das Schlüsselwort lambda bedeutet, dass wir eine Reihe von Parameternamen eingeben, dann einen Doppelpunkt und dann eine Funktion, die diese Parameter verwendet) und übergeben sie dann num, um ihren einen Parameter zu erfüllen / p> %Vor%
Innerhalb des Lambda definieren wir ein anderes Lambda. Nennen Sie dieses Lambda Y. Dieses nimmt zwei Parameter, a und b. a heißt mit a und b, also ist a ein Callable, das sich selbst und einen anderen Parameter annimmt
%Vor%Dies sind die Parameter von Y. Die erste ist eine Lambda-Funktion, nennen wir sie X. Wir können sehen, dass X die faktorielle Funktion ist, und dass der zweite Parameter seine Nummer wird.
Das heißt, wenn wir nach oben gehen und Y betrachten, können wir sehen, dass wir rufen werden:
%Vor%was macht
%Vor%und rufen Sie sich selbst auf und bilden den rekursiven Teil von factorial.
Und wenn wir den ganzen Weg zurück nach draußen schauen, können wir sehen, dass b num ist, das wir in das äußerste lambda übernommen haben.
%Vor%Das ist irgendwie verwirrend, weil es als ein verwirrender Liner geschrieben wurde:)
Die Fakultät selbst ist fast so, wie Sie es erwarten würden. Sie folgern, dass a
... die Fakultät ist. b
ist der tatsächliche Parameter.
Dieses Bit ist die Anwendung der Fakultät:
%Vor% a
ist die faktorielle Funktion selbst. Es nimmt sich als erstes Argument und der Bewertungspunkt als zweites an. Dies kann auf recursive_lambda
verallgemeinert werden, solange Sie a(a, b - 1)
anstatt a(b - 1)
:
So haben wir den äußeren Teil:
%Vor%Wie Sie sehen, muss der Aufrufer den Bewertungspunkt bestehen.
Wenn Sie tatsächlich ein rekursives Lambda haben wollten, könnten Sie einfach benenne das Lambda :
%Vor% Wenn nicht, können Sie eine einfache Hilfsfunktion verwenden. Sie werden bemerken, dass ret
ein Lambda ist, das auf sich selbst verweisen kann, anders als im vorherigen Code, wo kein Lambda auf sich selbst verweisen kann.
In beiden Fällen müssen Sie nicht auf lächerliche Mittel zurückgreifen, um das Lambda an sich selbst zu übergeben.
Es gibt zwei schwierige Teile dieser Funktion.
1. lambda a, b: b*a(a, b-1) if b > 0 else 1
.
2. das "b", das nach 1 folgt.
Für 1 ist es nichts anderes als:
%Vor%Für 2, das b
%Vor%ist eigentlich das b:
%Vor%Der Grund ist, dass es nicht innerhalb der Definition des zweiten und dritten Lambda ist, also bezieht es sich auf das erste b.
Nachdem wir num angewendet und die äußere Funktion entfernt haben:
%Vor% Es wird nur eine Funktion auf ein Tupel angewendet, (Lambda a, b: b * a (a, b-1) falls b & gt; 0 else 1, num)
Nennen wir dieses Tupel als (f, num) (fs def ist oben)
Wenn wir lambda a, b: a(a, b)
darauf anwenden, erhalten wir
f (f, num).
Angenommen, Ihre Nummer ist 5.
Nach der Definition von f wird zuerst zu
Dann zu:
%Vor%Ganz nach unten bis
%Vor%f (f, 0) geht zu 1.
%Vor%Hier gehen wir, die Fakultät von 5.
Das verallgemeinerte def von rekursivem Lambda ist wie folgt
%Vor%Sehr schön erklärt! Nur eine kleine Korrektur: wenn b & gt; 1 NICHT, wenn b & gt; 0
Das Ergebnis ist das gleiche, aber logisch korrekter, da es eine unnötige zusätzliche Schleife ausführt (obwohl es mit 1 multipliziert)
Wikipedia = & gt; n !, ist das Produkt aller positiven ganzen Zahlen kleiner oder gleich n
Tags und Links python lambda python-2.7