C'è un modo per eseguire “se” in pitone lambda
-
22-09-2019 - |
Domanda
Nel Python 2.6 , che voglio fare:
f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception
Questo chiaramente non è la sintassi. E 'possibile eseguire un if
in lambda
e se sì, come si fa?
grazie
Soluzione
La sintassi che stai cercando:
lambda x: True if x % 2 == 0 else False
Ma non è possibile utilizzare print
o raise
in un lambda.
Altri suggerimenti
perchè non solo definisce una funzione?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
Non c'è davvero alcuna giustificazione per utilizzare lambda in questo caso.
Si può facilmente sollevare un'eccezione in un lambda, se è questo che si vuole veramente fare.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
E 'una buona idea? Il mio istinto, in generale, è di lasciare la segnalazione degli errori di lambda; lasciare che hanno un valore di None e sollevare l'errore nel chiamante. Non credo che questo è intrinsecamente malvagio, anche se - considero il "y se x il resto z" sintassi in una posizione svantaggiata -. Basta assicurarsi che non si sta cercando di roba troppo in un corpo lambda
Probabilmente la linea di pitone peggiore che ho scritto finora:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Se x == 2 si stampa,
se x! = 2 si sollevano.
lambda in Python sono abbastanza restrittive per quanto riguarda ciò che si è permesso di 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 si potrebbe usare un lambda per il tuo esempio (perché non è possibile utilizzare raise
), ma se siete disposti a concedere su quel ... Si potrebbe utilizzare:
f = lambda x: x == 2 and x or None
Nota È possibile utilizzare diversi altra cosa ... se affermazioni nella definizione lambda:
f = lambda x: 1 if x>0 else 0 if x ==0 else -1
Se si desidera continuare a stampare è possibile importare il modulo futuro
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
quello che vi serve è esattamente
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
ora richiamare la funzione del modo in cui è necessario
f(2)
f(3)
Questo frammento di codice dovrebbe aiutare a:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
È inoltre possibile utilizzare gli operatori logici di avere qualcosa come un condizionale
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Si può vedere di più operatori logici qui
A seguito di codice di esempio funziona per me. Non sono sicuro se si riferisce direttamente a questa domanda, ma spero che aiuta in alcuni altri casi.
a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
Da provare:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
Out:
True
False