Existe uma maneira de executar "se" no lambda do python


358

No 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

Essa claramente não é a sintaxe. É possível realizar uma entrada e, ifem lambdacaso afirmativo, como fazê-lo?

obrigado


2
Você não pode imprimir ou aumentar em uma lambda. Lambdas são apenas funções, você sempre pode usar uma função.
Lennart Regebro 18/10/09

10
Eu discordo de você. Preciso de quatro funções diferentes, muito curtas, como a acima, que precisam ser colocadas em uma lista / dicionário para que eu possa iterar sobre elas e selecionar quais usar em cada iteração. Em vez de muitas linhas de código de just inits, antes da iteração, eu posso reduzi-lo a apenas 4 linhas de código init. Quanto menos, melhor ..
Guy

5
4 linhas de código não é uma solução louvável quando outras pessoas precisam ler, interpretar, entender e manter o código. Além disso, o problema "imprimir / aumentar" no exemplo mostra isso que não pode e não deve ser feito em lambdas.
214/09 S.Lott

Os lambdas do @LennartRegebro não são funções em python, são apenas expressões, é por isso que há muitas coisas que você não pode fazer com elas.
Aaron McMillin

11
@AaronMcMillin Lambdas são funções. Eles estão restritos a expressões por motivos de sintaxe, mas são funções.
Lennart Regebro 17/08/16

Respostas:


660

A sintaxe que você está procurando:

lambda x: True if x % 2 == 0 else False

Mas você não pode usar printou raiseem uma lambda.


33
em python 3, você pode usar print
recursiva

11
Claro, mas a pergunta era "como eu uso ifem uma lambda?" não "qual é a melhor maneira de escrever um lambda que retorne True se um número for par?"
2111 Robert Robertney

99
É uma sintaxe horrível - facilmente a pior construção da linguagem Python, que se aproxima dos níveis de absurdo Perl em sua avaliação fora de ordem - mas é o que foi solicitado. Você está votando seriamente nas respostas por estar correto?
9119 Glenn Maynard

41
É a resposta correta para a pergunta "Como escrevo uma função lambda que informa se um número é par?" Não é, no entanto, uma resposta correta para a pergunta que o OP originalmente fez. Por mais que você não como o exemplo I planejado, o meu post é que , de fato, responder claramente à pergunta do OP.
2111 Robert Robertney

10
É dolorosamente óbvio que alguém sugerindo "x% 2 == 0" - ou votando em um comentário que o recomende, o que faz pelo menos sete pessoas - nem leu a pergunta original.
21119 Glenn Maynard

40

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 lambda neste caso.


3
printainda não é uma função no 2.6. :)
Lukáš Lalinský

7
@ Lukáš Lalinský: ainda funciona no 2.x. ele vai ser tratado como um par de parênteses redundantes
newacct

24
Você não conhece o caso de uso real, portanto não há como dizer que não há razão para usar um lambda.
9119 Glenn Maynard

6
@ Glenn Maynard: Quase não há razão para usar um lambda, ponto final. Atribuir um lambda a uma variável - como substituto def- geralmente é uma Very Bad Idea (tm). Basta usar um programa deftão simples que os mortais podem ler, interpretar, entender e manter.
285/09 S.Lott

17
Há muitos usos legítimos de lambdas. Se você não consegue pensar em nada, isso não é culpa de lambda. (Não sou fã da sintaxe em si, é claro - é uma solução desajeitada pelo fato de a sintaxe de indentação mal concebida do Python não poder lidar com funções embutidas como linguagens normais.)
Glenn Maynard

25

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ê imprimir,

se x! = 2 você aumenta.


parabéns, acho que esta é a única resposta na página que realmente responde à pergunta
theEpsilon

22

Você pode facilmente criar uma exceção em um lambda, se é isso que realmente deseja 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 relatório de erros fora das lambdas; deixe que ele tenha o valor None e aumente o erro no chamador. Porém, não acho que isso seja inerentemente ruim - considero a sintaxe "y se x mais z" pior - apenas verifique se você não está tentando inserir muita coisa no corpo lambda.


11
Criá-lo em um chamador é provavelmente o método mais bonito, se você me perguntar.
Dominic Bou-Samra

Possivelmente, mas isso depende muito do caso em particular. Obviamente, você também pode decorar o lambda após criá-lo. x = RaiseValueErrorOnNone(x), novamente, dependendo do caso.
21119 Glenn Maynard

15

Lambdas em Python são bastante restritivas em relação ao que você pode usar. Especificamente, você não pode ter as palavras-chave (exceto para os operadores como and, not,or , etc) em seu corpo.

Portanto, não há como você usar um lambda como exemplo (porque você não pode usar raise), mas se estiver disposto a conceder isso ... Você pode usar:

f = lambda x: x == 2 and x or None

16
A restrição específica do lambda é que você não tem permissão para usar instruções, apenas expressões.
Daniel Werner

13

note que você pode usar várias outras instruções ... if em sua definição lambda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1

2

Se você ainda deseja imprimir, pode importar o módulo futuro

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

2

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


Isso não combina com a filosofia do python em termos de clareza. Mesmo logicamente equivalente, a ifsintaxe é sempre preferida a isso. A maneira óbvia de verificar as condições.
0xc0de 12/07/2018

Obrigado! Eu usei isso em um trabalho de linguagem funcional na faculdade por causa das restrições que o professor impôs a quem diz que eu não poderia usar a ifdeclaração, então achei esse caminho não óbvio .
Victor Lucas

2

o que você precisa exatamente é

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

agora chame a função do jeito que você precisa

f(2)
f(3)


0

O código de exemplo a seguir funciona para mim. Não tenho certeza se isso está diretamente relacionado a essa questão, mas espero que ajude em outros casos.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))

0

Tente:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

Fora:

True
False

0

Uma maneira fácil de executar um if in lambda é usando a compreensão da lista.

Você não pode gerar uma exceção no lambda, mas esta é uma maneira no Python 3.x de fazer algo próximo ao seu exemplo:

f = lambda x: print(x) if x==2 else print("exception")

Outro exemplo:

retorne 1 se M caso contrário 0

f = lambda x: 1 if x=="M" else 0
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.