В Python 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
и если да , то как это сделать?
Спасибо
В Python 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
и если да , то как это сделать?
Спасибо
Ответы:
Синтаксис, который вы ищете:
lambda x: True if x % 2 == 0 else False
Но вы не можете использовать print
или raise
в лямбду.
if
в лямбде?" а не "как лучше написать лямбду, которая возвращает True, если число четное?"
почему бы вам просто не определить функцию?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
в этом случае нет оправдания использованию лямбды.
print
еще не является функцией в 2.6. :)
def
- обычно является очень плохой идеей (тм). Просто используйте def
так, чтобы простые смертные программисты могли читать, интерпретировать, понимать и поддерживать это.
Вероятно, худшая строка на Python, которую я написал до сих пор:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Если х == 2 вы печатаете,
если х! = 2 вы повышаете.
Вы можете легко вызвать исключение в лямбде, если вы действительно этого хотите.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
Это хорошая идея? В общем, мой инстинкт состоит в том, чтобы оставить лямбда-сообщения об ошибках; пусть оно имеет значение None и выдает ошибку в вызывающей стороне. Я не думаю, что это изначально зло, хотя я считаю, что сам синтаксис «у, если х иначе z» хуже, - просто убедитесь, что вы не пытаетесь слишком много вставить в лямбда-тело.
x = RaiseValueErrorOnNone(x)
опять же в зависимости от случая.
Лямбды в Python довольно ограничительны в отношении того, что вам разрешено использовать. В частности, вы не можете иметь какие - либо ключевые слова (за исключением операторов нравится and
, not
, or
и т.д.) в их теле.
Таким образом, вы не могли бы использовать лямбду для своего примера (потому что вы не можете использовать raise
), но если вы готовы признать это ... Вы можете использовать:
f = lambda x: x == 2 and x or None
Если вы все еще хотите распечатать, вы можете импортировать будущий модуль
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
Вы также можете использовать логические операторы, чтобы иметь что-то вроде условного
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Вы можете увидеть больше о логических операторах здесь
if
синтаксис всегда предпочтительнее этого. Очевидный способ проверки условий.
if
утверждение, поэтому я нашел это неочевидным способом.
что вам нужно именно
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
теперь вызываем функцию так, как вам нужно
f(2)
f(3)
Этот фрагмент должен помочь вам:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Попробуй это:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
Вне:
True
False
Самый простой способ выполнить if в лямбде - использовать понимание списка.
Вы не можете вызвать исключение в лямбде, но в Python 3.x это способ сделать что-то похожее на ваш пример:
f = lambda x: print(x) if x==2 else print("exception")
Другой пример:
вернуть 1, если M в противном случае 0
f = lambda x: 1 if x=="M" else 0