Чи є спосіб виконати "якщо" в лямбда пітона


358

У 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 різні, дуже короткі функції, такі як вище, які потрібно помістити в список / словник, щоб я міг перебирати їх і вибирати, які з них використовувати для кожної ітерації. Замість багатьох рядків коду просто inits, перед ітерацією, я можу звести його лише до 4 рядків коду init. Чим менше веселощів ..
Хлопець

5
4 рядки коду не є похвальним рішенням, коли іншим людям доводиться читати, інтерпретувати, розуміти та підтримувати код. Далі, проблема "надрукувати / підняти" в прикладі показує це, чого не можна і не слід робити в лямбдах.
С.Лотт

@LennartRegebro лямбди не є функціями в python, вони є лише виразами, тому є багато речей, з якими ви не можете зробити.
Аарон Макміллін

1
@AaronMcMillin Lambdas - це функції. Вони обмежені виразами з синтаксичних причин, але вони функціонують.
Леннарт Регебро

Відповіді:


660

Синтаксис, який ви шукаєте:

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

Але ви не можете використовувати printабо raiseв лямбда.


33
у python 3 ви можете використовувати print
рекурсивний

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
@ Лукаш Lalinský: він як і раніше працює в 2.x. це трактуватиметься як пара зайвих дужок
newacct

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

6
@Glenn Maynard: майже немає причин використовувати лямбда, період. Присвоєння лямбда змінної - як резервної def- це, як правило, дуже погана ідея (tm). Просто використовуйте defтак просто смертні програмісти, які можуть читати, інтерпретувати, розуміти та підтримувати.
С.Лотт

17
Існує безліч законних способів використання лямбда. Якщо ви нічого не можете придумати, то це не вина лямбда. (Звичайно, я не прихильник самого синтаксису - це незграбне вирішення того факту, що погано продуманий синтаксис синтаксису Python не може обробляти вбудовані функції, як звичайні мови.)
Гленн Мейнард

25

Мабуть, найгірший рядок пітона, який я написав досі:

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

Якщо x == 2 ви друкуєте,

якщо х! = 2 ви піднімаєте.


Кудо, я думаю, що це єдина відповідь на сторінці, яка насправді відповідає на питання
TheEpsilon

22

Ви можете легко підняти виняток у лямбда, якщо це дійсно ви хочете зробити.

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

Це гарна ідея? Взагалі мій інстинкт - залишати повідомлення про помилки поза лямбдами; нехай воно має значення None і підвищить помилку у абонента. Я не думаю, що це по суті зло, але я вважаю синтаксис "y if x else z" гіршим - просто переконайтеся, що ви не намагаєтеся занадто сильно вписати в тіло лямбда.


1
Підвищити його у абонента - це, мабуть, гарніший спосіб, якщо ви запитаєте мене.
Домінік Бу-Самра

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

15

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

Отже, ви не можете використовувати лямбда для свого прикладу (тому що ви не можете використовувати raise), але якщо ви готові поступитися на цьому ... Ви можете використовувати:

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

16
Особливим обмеженням лямбда є те, що вам заборонено використовувати оператори, а лише вирази.
Даніель Вернер

13

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

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.