Existe uma maneira de realizar "se" no lambda de Python
-
22-09-2019 - |
Pergunta
Dentro Python 2.6, Eu quero fazer:
f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception
Esta claramente não é a sintaxe. É possível realizar um if
dentro lambda
E se sim, como fazer isso?
obrigado
Solução
A sintaxe que você está procurando:
lambda x: True if x % 2 == 0 else False
Mas você não pode usar print
ou raise
em um lambda.
Outras dicas
Por que você não apenas define uma função?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
Realmente não há justificativa para usar o Lambda neste caso.
Você pode facilmente aumentar uma exceção em um Lambda, se é isso que você realmente quer fazer.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
isso é uma boa ideia? Meu instinto em geral é deixar o erro de relatório de Lambdas; Deixe que ele tenha um valor de nenhum e aumente o erro no chamador. Eu não acho que isso seja inerentemente mau, eu considero a sintaxe "Y se x else z" a si mesma-apenas certifique-se de que você não está tentando encher muito em um corpo de lambda.
Provavelmente a pior linha Python que escrevi até agora:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Se x == 2 você imprime,
Se x! = 2 você aumenta.
Lambdas em Python são bastante restritivos em relação ao que você tem permissão para usar. Especificamente, você não pode ter nenhuma palavra -chave (exceto operadores como and
, not
, or
, etc) em seu corpo.
Portanto, não há como você usar um lambda para o seu exemplo (porque você não pode usar raise
), mas se você estiver disposto a conceder isso ... você pode usar:
f = lambda x: x == 2 and x or None
Observe que você pode usar vários mais ... se Declarações em sua definição de lambda:
f = lambda x: 1 if x>0 else 0 if x ==0 else -1
Se você ainda quiser imprimir, pode importar o futuro módulo
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
O que você precisa exatamente é
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
Agora chame a função da maneira que você precisa
f(2)
f(3)
Este trecho deve ajudá -lo:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Você também pode usar operadores lógicos para ter algo como um condicional
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Você pode ver mais sobre operadores lógicos aqui
A seguir, o código de exemplo funciona para mim. Não tenho certeza se ele se relaciona diretamente com essa pergunta, mas espero que ajude em alguns outros casos.
a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
Tente:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
Fora:
True
False