2012-10-03 17 views
20

Stavo scrivendo alcune funzioni lambda e non riuscivo a capirlo. C'è un modo per avere qualcosa come lambda x: x if (x<3) in python? Come lambda a,b: a if (a > b) else b funziona bene. Finora lambda x: x < 3 and x or None sembra essere il più vicino che ho trovato.Python lambda con if ma senza altro

risposta

36

Un lambda, come qualsiasi funzione, deve avere un valore di ritorno.

lambda x: x if (x<3) non funziona perché non specifica cosa restituire se non x<3. Per impostazione predefinita funzioni restituiscono None, in modo che si possa fare

lambda x: x if (x<3) else None 

Ma forse quello che stai cercando è una list comprehension con una condizione if. Ad esempio:

In [21]: data = [1, 2, 5, 10, -1] 

In [22]: [x for x in data if x < 3] 
Out[22]: [1, 2, -1] 
+0

@ ubuntu - grazie. Non sono sicuro del motivo per cui ho pensato che dovrebbe restituire Nessuno senza specificarlo. – root

+3

Questa è una supposizione ragionevole poiché le funzioni restituiscono Nessuno per impostazione predefinita. La cosa importante da ricordare è che ciò che segue 'lambda x:' deve essere un * espressione *, non un'affermazione. – unutbu

+3

@root A volte trovo utile pensare a un 'lambda' come se fosse in realtà scritto come' def lambda (x, y): return ... ' –

6

Cosa c'è che non va con lambda x: x if x < 3 else None?

+0

la mia comprensione è che di lista è più appropriato in questo scenario – zinking

+0

La questione non menziona iterazione, quindi non sono sicuro di quello che vuoi dire. Puoi elaborare? – user4815162342

+0

giusto, è solo una supposizione, probabilmente. -_- – zinking

1

Si può sempre provare ad invocare 'filtro' per i controlli condizionali. Fondamentalmente, map() deve lavorare su ogni occorrenza dei iterables, quindi non può scegliere e scegliere. Ma il filtro può aiutare a restringere le scelte. Ad esempio, creo un elenco da 1 a 19 ma desidero creare una tupla di quadrati di soli numeri pari.

x = list(range(1,20)) 

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x))) 

print (y)