Wie haben Sie eine mehrzeilige Aussage entweder in einem Listenverständnis oder in einem Eval?
Ich habe versucht, diesen Code umzudrehen:
%Vor%In eine Lambda-Funktion wie folgt:
%Vor% In x
ist eine Zeichenfolge wie 'onomatopoeia'
und y
ist eine Liste wie ['o','a','o']
.
Aber aus irgendeinem Grund gibt es einen Syntaxfehler zurück. Kann mir das jemand erklären?
Zuerst sollten Sie das wegen der Nebenwirkungen in der Schleife wahrscheinlich nicht mit einem Lambda umschreiben. Wenn du trotzdem willst, benutze kein eval.
Ich würde vorschlagen:
%Vor% Da das Ergebnis von remove None
ist, wird das zweite Argument von or
das Ergebnis sein. Dies vermeidet die Bewertung. Aber es ist immer noch schlimmer als eine For-Schleife.
Wie in den Kommentaren zur ursprünglichen Frage angemerkt, ist 2 * y.pop(y.index(i))
besser lesbar als das or
-Konstrukt. Du wirst zweimal über y
geloopt, aber die Leistung scheint nicht das Problem zu sein.
Ich würde Ihre Funktion sehr bevorzugen, aber das wird tun, was Sie wollen.
%Vor% Wenn Sie gute funktionale Ausdrücke schreiben möchten (mit lambda
s, map
, reduce
, filter
usw.), sollten Sie Nebenwirkungen vermeiden.
Ich würde Ihren Code als Funktion lieber als ein Lambda mit Nebenwirkungen bevorzugen.
Dies ist eine seiteneffektefreie Implementierung in einem Lambda-Ausdruck:
%Vor% Ich fürchte, es ist nicht kurz noch schön noch einfach zu verstehen *, wie man es für ein Lambda haben möchte. :/
(hoffentlich kann jemand eine Verbesserung vorschlagen)
Nur ein Gegenbeispiel, um die Verwendung eines Lambda in diesem Zusammenhang zu verhindern.
IMHO das größte Problem mit Lambdas in Python ist, dass es keine where
Syntax wie in Standard ML gibt, um Variablen Aliase im selben Ausdruck zu definieren. Also, die Dinge werden ziemlich schnell hässlich für alles, was nicht trivial ist.
Wenn Sie daran interessiert sind zu verstehen, was es tut, ist die Idee, mit reduce einen Automaten auszuführen, wobei das Ergebnis (in jedem Schritt) der "Zustand" der Berechnung ist.
Der anfängliche "state" ist ('', ['o','a','o'])
, und die reduce-Funktion wird das Ersetzen nach Bedarf durchführen, beginnend mit 'onomatopoeia'
.
Dies ist die Evolution des "Staates":
%Vor%und wir nehmen nur das erste Element des letzten Zustands.
Tags und Links python lambda eval list-comprehension