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 ifin lambdae 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 ifin lambdae 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 printo raisein una lambda.
ifin 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.
printnon è ancora una funzione in 2.6. :)
def- è generalmente un'idea molto negativa (tm). Basta usare un defprogrammatore 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
ifsintassi è sempre preferita a questo. Il modo ovvio di controllare le condizioni.
ifdichiarazione, 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