[Изменить] Читать этот ответ. Объясняет, почему многострочная лямбда не вещь.
Проще говоря, это не пифонично. Из поста Гвидо ван Россума:
Я считаю неприемлемым любое решение, которое встраивает блок на основе отступа в середину выражения. Поскольку я нахожу альтернативный синтаксис для группировки операторов (например, фигурные скобки или ключевые слова begin / end) одинаково неприемлемым, это в значительной степени делает многострочную лямбду неразрешимой загадкой.
Что касается остальной части этого ответа. Либо используйте однострочную 1 лямбду или именованную функцию. Пожалуйста, не используйте exec
- я сожалею, что когда-либо предлагал.
1 Вы будете удивлены, что вы можете сделать с одной строкой Python.
Обходной путь для получения многострочных лямбда-функций (расширение ответа skriticos):
(lambda n: (exec('global x; x=4; x=x+n'), x-2)[-1])(0)
Что он делает:
Python упрощает (выполняет) каждый компонент кортежа до
чтение разделителей.
например, lambda x: (functionA(), functionB(), functionC(), 0)[-1]
будет выполнять все три функции, хотя единственная информация
используется последний элемент в списке (0).
Обычно вы не можете назначать или объявлять переменные в списках или кортежах в python, однако, используя функцию exec
, вы можете (обратите внимание, что она всегда возвращает: None
).
Обратите внимание, что если вы не объявите переменную как global
, она не будет существовать вне этого exec
вызова функции (это верно только для exec
функций в операторах lambda
).
например, (lambda: exec('x=5;print(x)'))()
отлично работает без объявления global
. Однако (lambda: (exec('x=5'), exec('print(x)')))()
или (lambda: (exec('x=5'), x)()
нет.
Обратите внимание, что все переменные global
хранятся в глобальном пространстве имен и будут продолжать существовать после завершения вызова функции. По этой причине это не очень хорошее решение, и его следует избегать, если это вообще возможно. global
переменные, объявленные из функции exec
внутри лямбда-функции, хранятся отдельно от пространства имен global
. (протестировано в Python 3.3.3)
[-1]
в конце кортежа получает последний индекс. Например, [1,2,3,4][-1]
- это 4
. Это делается для того, чтобы возвращались только желаемые выходные значения, а не весь кортеж, содержащий None
из exec
функций и других посторонних значений.
Эквивалентная многострочная функция:
def function(n):
x = 4
x = x+n
return x-2
function(0)
Способы избежать многострочной лямбды:
Рекурсия:
f = lambda i: 1 if i==0 or i==1 else f(i-1)+f(i-2)
Булевы числа - это целые числа:
lambda a, b: [(0, 9), (2, 3)][a<4][b>3]
итераторы:
lambda x: [n**2 for n in x] #Assuming x is a list or tuple in this case