In Python 2.6 , voglio fare:
f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception
Questa chiaramente non è la sintassi. E 'possibile eseguire un if
in lambda
e se sì come si fa?
Grazie
In Python 2.6 , voglio fare:
f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception
Questa chiaramente non è la sintassi. E 'possibile eseguire un if
in lambda
e se sì come si fa?
Grazie
Risposte:
La sintassi che stai cercando:
lambda x: True if x % 2 == 0 else False
Ma non puoi usare print
o raise
in una lambda.
if
in una lambda?" non "qual è il modo migliore per scrivere un lambda che restituisce True se un numero è pari?"
perché non definisci semplicemente una funzione?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
non c'è davvero alcuna giustificazione per usare lambda in questo caso.
print
non è ancora una funzione in 2.6. :)
def
- è generalmente un'idea molto negativa (tm). Basta usare un def
programmatore mortale così semplice da poterlo leggere, interpretare, capire e mantenerlo.
Probabilmente la peggior linea di pitone che ho scritto finora:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Se x == 2 stampi,
se x! = 2 rilanci.
Puoi facilmente sollevare un'eccezione in una lambda, se è quello che vuoi davvero fare.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
E 'questa una buona idea? Il mio istinto in generale è di lasciare l'errore riferendosi a lambdas; lasciare che abbia un valore di Nessuno e aumentare l'errore nel chiamante. Non penso che questo sia intrinsecamente malvagio, però - considero la sintassi "y if x else z" stessa peggiore - assicurati solo che non stai cercando di infilare troppo in un corpo lambda.
x = RaiseValueErrorOnNone(x)
, di nuovo, a seconda del caso.
Le lambda in Python sono abbastanza restrittive rispetto a ciò che ti è permesso usare. In particolare, non si può avere qualsiasi parola chiave (ad eccezione di operatori come and
, not
, or
, ecc) nel loro corpo.
Quindi, non c'è modo di usare un lambda per il tuo esempio (perché non puoi usarlo raise
), ma se sei disposto a concederlo ... Puoi usare:
f = lambda x: x == 2 and x or None
Se vuoi ancora stampare puoi importare il modulo futuro
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
Puoi anche usare gli operatori logici per avere qualcosa come un condizionale
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Puoi vedere di più sugli operatori logici qui
if
sintassi è sempre preferita a questo. Il modo ovvio di controllare le condizioni.
if
dichiarazione, quindi ho trovato questo modo non ovvio .
quello di cui hai bisogno è esattamente
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
ora chiama la funzione nel modo che ti serve
f(2)
f(3)
Questo frammento dovrebbe aiutarti:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Provalo:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
Su:
True
False
Un modo semplice per eseguire un if in lambda è usare la comprensione dell'elenco.
Non puoi sollevare un'eccezione in lambda, ma questo è un modo in Python 3.x di fare qualcosa di simile al tuo esempio:
f = lambda x: print(x) if x==2 else print("exception")
Un altro esempio:
ritorna 1 se M altrimenti 0
f = lambda x: 1 if x=="M" else 0