2009-10-18 2 views
189

В питона 2,6, я хочу сделать:Есть ли способ, чтобы выполнить «если» в лямбда питона

f = lambda x: if x==2 print x else raise Exception() 
f(2) #should print "2" 
f(3) #should throw an exception 

Это явно не синтаксис. Можно ли выполнить if в lambda, и если да, то как это сделать?

благодаря

+1

Вы не можете распечатать или поднять в лямбда. Lambdas - это просто функции, вы можете использовать функцию вместо этого. –

+10

Я не согласен с вами. Мне нужны 4 разные, очень короткие функции, такие как выше, которые нужно поместить в список/словарь, чтобы я мог перебирать их и выбирать, какие из них использовать на каждой итерации. Вместо многих строк кода только inits, перед итерацией, я могу довести ее до 4 строк кода init. Чем меньше веселее .. – Guy

+5

4 строки кода не похвальные решения, когда другие люди должны читать, интерпретировать, понимать и поддерживать код.Кроме того, проблема «print/raise» в примере показывает это, которое невозможно и не должно делать в лямбдах. –

ответ

398

Синтаксис вы ищете:

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

Но вы не можете использовать print или raise в лямбда.

+21

в python 3, вы можете использовать печать – recursive

+37

f = lambda x: x% 2 == 0 также будет работать. – unutbu

+8

Несомненно, но вопрос был «как использовать' if' в лямбда? » а не «лучший способ написать лямбду, которая возвращает True, если число равно?» –

13

Лямбда в Python довольно ограничительным в отношении того, что вам разрешено использовать. В частности, у вас не может быть ключевых слов (кроме операторов, таких как and, not, or и т. Д.) В их теле.

Таким образом, нет никакого способа, которым вы могли бы использовать лямбда для примера (потому что вы не можете использовать raise), но если вы готовы уступить в том, что ... Вы можете использовать:

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

Специфическое ограничение lambda заключается в том, что вам не разрешено использовать утверждения, а только выражения. –

29

почему разве вы не просто определяете функцию?

def f(x): 
    if x == 2: 
     print(x) 
    else: 
     raise ValueError 

В этом случае на самом деле нет оснований использовать лямбда.

+3

'print' еще не является функцией в 2.6. :) –

+6

@ Lukáš Lalinský: он все еще работает в 2.x. он будет рассматриваться как пара лишних круглых скобок. – newacct

+17

Вы не знаете его фактический прецедент, так что вы не можете сказать, что нет причины использовать лямбда. –

19

Вы можете легко создать исключение в лямбда, если это то, что вы действительно хотите сделать.

def Raise(exception): 
    raise exception 
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value")) 

Это хорошая идея? Мой инстинкт вообще заключается в том, чтобы оставить сообщение об ошибке из лямбда; пусть оно имеет значение None и вызывает ошибку в вызывающем абоненте. Я не думаю, что это по своей сути является злым, но я считаю, что синтаксис «y if x else z» хуже - просто убедитесь, что вы не пытаетесь слишком много влиться в тело лямбда.

+1

Поднять его в вызывающем, возможно, более красивый метод, если вы спросите меня. –

+0

Возможно, но это зависит в большой степени от конкретного случая. Конечно, вы можете украсить лямбду после ее создания. 'x = RaiseValueErrorOnNone (x)', опять же, в зависимости от случая. –

21

Возможно худший питон линия я написал до сих пор:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2]) 

Если х == 2 печати,

если х = 2 вы поднимаете!.

3

нота, которую вы можете использовать несколько еще ... если заявления в вашем определении лямбда:

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

Если вы все еще хотите напечатать, вы можете импортировать модуль будущему

from __future__ import print_function 

f = lambda x: print(x) if x%2 == 0 else False 
Смежные вопросы