Wenn Sie gute funktionelle Ausdrücke schreiben wollen (lambda
s verwenden, map
, reduce
, filter
und so weiter), sollten Sie Nebenwirkungen vermeiden.
Ich würde stark Ihren Code als Funktion lieber als ein Lambda mit Nebenwirkungen bevorzugen.
Dies ist ein Nebeneffekt freie Umsetzung in einem Lambda-Ausdruck:
>>> from functools import reduce
>>> (lambda x, y: reduce(lambda a, b: \
... (a[0]+2*b, a[1][:a[1].index(b)]+a[1][a[1].index(b)+1:]) if b in a[1] \
... else (a[0]+b, a[1]), x, ('',y))[0])('onomatopoeia', ['o','a','o'])
'oonoomaatopoeia'
Ich fürchte, es nicht kurz noch schöne noch einfach ist zu verstehen * wie man es haben wollen würde für ein Lambda. :/
(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 variable 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 zu verwenden, zu verringern, eine Automat zu laufen, wo das Ergebnis (bei jedem Schritt) der „Zustand“ der Berechnung ist.
Der anfängliche "Zustand" ist ('', ['o','a','o'])
, und die Reduce-Funktion führt den Austausch nach Bedarf durch, beginnend mit 'onomatopoeia'
.
Dies ist die Entwicklung der „Staat“:
('', ['o','a','o']) 'o'
('oo', ['a','o']) 'n'
('oon', ['a','o']) 'o'
('oonoo', ['a']) 'm'
('oonoom', ['a']) 'a'
('oonoomaa', []) 't'
('oonoomaat', []) 'o'
('oonoomaato', []) 'p'
('oonoomaatop', []) 'o'
('oonoomaatopo', []) 'e'
('oonoomaatopoe', []) 'i'
('oonoomaatopoei', []) 'a'
('oonoomaatopoeia', [])
und wir nehmen nur das erste Element des letzten Zustand.
Was sind Werte von 'x' und' y'? –
Ich glaube, Lambdas sind absichtlich auf eine Zeile beschränkt, um die Lesbarkeit und Klarheit zu verbessern. Sie könnten versuchen, diese Funktion in Lambda umzuwandeln, aber es ist ein bisschen kontrapythonisch. – J0HN
'eval' benötigt einen Ausdruck, während' y.remove (i); i * 2' eine Anweisung ist. 'eval ('1; 1')' erzeugt auch einen 'SyntaxError'. – nymk