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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top