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


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.