У 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
- це, як правило, дуже погана ідея (tm). Просто використовуйте def
так просто смертні програмісти, які можуть читати, інтерпретувати, розуміти та підтримувати.
Мабуть, найгірший рядок пітона, який я написав досі:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Якщо x == 2 ви друкуєте,
якщо х! = 2 ви піднімаєте.
Ви можете легко підняти виняток у лямбда, якщо це дійсно ви хочете зробити.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
Це гарна ідея? Взагалі мій інстинкт - залишати повідомлення про помилки поза лямбдами; нехай воно має значення None і підвищить помилку у абонента. Я не думаю, що це по суті зло, але я вважаю синтаксис "y if x else 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