Se si vuole scrivere buone espressioni funzionali (utilizzando lambda
s, map
, reduce
, filter
e così via), si dovrebbe evitare effetti collaterali.
Preferisco fortemente il codice come funzione piuttosto che un lambda con effetti collaterali.
Questa è un'implementazione libera-effetto collaterale nell'espressione una lambda:
>>> 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'
temo che non è breve né bella né facile da capire * come ci si vuole che sia per un lambda. :/
(speriamo che qualcuno possa suggerire un miglioramento)
Solo un contro-esempio per scoraggiare l'uso di un lambda in questo contesto.
IMHO il problema più grande con lambdas in python è che non esiste una sintassi where
come in Standard ML per definire alias variabili nella stessa espressione. Quindi, le cose diventano brutte abbastanza veloci per qualsiasi cosa non banale.
Se siete interessati a capire ciò che fa, l'idea è di utilizzare ridurre per eseguire un automi, dove il risultato (ad ogni passo) è lo "stato" del calcolo.
Lo "stato" iniziale è ('', ['o','a','o'])
e la funzione di riduzione eseguirà la sostituzione secondo necessità, a partire da 'onomatopoeia'
.
Questa è l'evoluzione dello "stato":
('', ['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', [])
e prendiamo solo il primo elemento del ultimo stato.
quali sono i valori di 'x' e' y'? –
Credo che lambda siano intenzionalmente limitati alla singola riga per migliorare la leggibilità e la leggibilità. Potresti provare a convertire quella funzione in lambda, ma è un po 'contro-pitonica. – J0HN
'eval' richiede un'espressione, mentre' y.remove (i); i * 2' è un'istruzione. 'eval ('1; 1')' produce anche un 'SyntaxError'. – nymk