Python 2 Listenverständnis und Eval

8

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?

    
Beta Decay 22.06.2015, 17:29
quelle

3 Antworten

3

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.

    
Noctua 22.06.2015, 17:51
quelle
2

Ich würde Ihre Funktion sehr bevorzugen, aber das wird tun, was Sie wollen.

%Vor%     
Padraic Cunningham 22.06.2015 17:47
quelle
0

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.

    
fferri 22.06.2015 18:15
quelle