Есть ли способ выполнить «если» в лямбда-питоне


359

В 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и если да , то как это сделать?

Спасибо


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

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

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

@LennartRegebro lambdas не являются функциями в python, они являются только выражениями, поэтому есть много вещей, которые вы не можете с ними сделать.
Аарон Макмиллин

1
@AaronMcMillin Лямбды - это функции. Они ограничены выражениями по синтаксическим причинам, но они являются функциями.
Леннарт Регебро

Ответы:


661

Синтаксис, который вы ищете:

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

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


33
в Python 3 вы можете использовать print
recursive

11
Конечно, но вопрос был "как мне использовать ifв лямбде?" а не "как лучше написать лямбду, которая возвращает True, если число четное?"
Роберт Росни

99
Это ужасный синтаксис - легко худшая языковая конструкция Python, приближающаяся к уровням абсурда Perl в своей неупорядоченной оценке - но это то, о чем просили. Вы серьезно голосуете за ответы за то, что вы правы?
Гленн Мейнард

41
Это правильный ответ на вопрос «Как мне написать лямбда-функцию, которая сообщает мне, является ли число четным?» Однако это не является правильным ответом на вопрос, который первоначально задал ФП. Однако много вы не как пример , я ухитрился, мой пост делает , на самом деле, однозначно ответить на вопрос OP еще.
Роберт Россни

10
Страшно очевидно, что любой, кто предложил "x% 2 == 0" - или проголосовал за комментарий, рекомендующий его, что составляет как минимум семь человек, - даже не читал оригинальный вопрос.
Гленн Мейнард

40

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

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

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


3
printеще не является функцией в 2.6. :)
Лукаш Лалинский

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

24
Вы не знаете его фактического варианта использования, поэтому вы не можете сказать, что нет причин использовать лямбду.
Гленн Мейнард

6
@ Гленн Мейнард: Почти нет причин использовать лямбду, точка. Присвоение лямбды переменной - в качестве замены def- обычно является очень плохой идеей (тм). Просто используйте defтак, чтобы простые смертные программисты могли читать, интерпретировать, понимать и поддерживать это.
S.Lott

17
Существует множество законных способов использования лямбд. Если вы не можете думать ни о чем, то это не ошибка лямбды. (Конечно, я не фанат самого синтаксиса - это неуклюжий обходной путь из-за того, что плохо продуманный синтаксис отступов Python не может обрабатывать встроенные функции, как нормальные языки.)
Гленн Мейнард,

25

Вероятно, худшая строка на Python, которую я написал до сих пор:

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

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

если х! = 2 вы повышаете.


слава Богу, я думаю, что это единственный ответ на странице, который фактически отвечает на вопрос
TheEpsilon

22

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

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

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


1
Поднять его в вызывающей стороне, возможно, самый красивый метод, если вы спросите меня.
Доминик Бу-Самра

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

15

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

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

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

16
Конкретное ограничение лямбды заключается в том, что вы не можете использовать операторы, только выражения.
Даниэль Вернер

13

обратите внимание, что вы можете использовать несколько других ... if операторов в вашем лямбда-определении:

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

2

Вы также можете использовать логические операторы, чтобы иметь что-то вроде условного

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

Вы можете увидеть больше о логических операторах здесь


Это не соответствует философии питона с точки зрения ясности. Хотя логически эквивалентный, ifсинтаксис всегда предпочтительнее этого. Очевидный способ проверки условий.
0xc0de

Спасибо! Я использовал это в работе по функциональному языку в колледже из-за ограничений, которые наложил профессор, который говорит, что я не могу использовать ifутверждение, поэтому я нашел это неочевидным способом.
Виктор Лукас



0

Следующий пример кода работает для меня. Не уверен, имеет ли это прямое отношение к этому вопросу, но надеюсь, что это поможет в некоторых других случаях.

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


0

Самый простой способ выполнить 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.