Что означает "лямбда" в Python и какой самый простой способ использовать его?
Можете ли вы привести пример и другие примеры, показывающие, когда и когда не использовать Лямбду?
Моя книга дает мне примеры, но они запутывают.
Ответы
Ответ 1
Lambda, которая возникла из Lambda Calculus и (AFAIK) была впервые реализована в Lisp, в основном анонимная функция - функция, которая не имеет имени, и используется в строке, другими словами, вы можете назначить идентификатор лямбда-функции в одном выражении как например:
>>> addTwo = lambda x: x+2
>>> addTwo(2)
4
Это назначает addTwo
анонимной функции, которая принимает 1 аргумент x, а в теле функции добавляет 2 к x, возвращает последнее значение последнего выражения в теле функции, поэтому нет ключевого слова return
.
Приведенный выше код примерно эквивалентен:
>>> def addTwo(x):
... return x+2
...
>>> addTwo(2)
4
За исключением того, что вы не используете определение функции, вы назначаете идентификатор лямбда.
Лучшее место для их использования - это когда вы не хотите определять функцию с именем, возможно потому, что эта функция будет использоваться только один раз и не много раз, и в этом случае вам будет лучше с помощью определение функции.
Пример дерева хешей с использованием lambdas:
>>> mapTree = {
... 'number': lambda x: x**x,
... 'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'
В этом примере я действительно не хочу определять имя для любой из этих функций, потому что я буду использовать их только в хэше, поэтому я буду использовать lambdas.
Ответ 2
Я не знаю, какую книгу вы используете, но "Погружение в Python" имеет раздел, который, по моему мнению, информативен.
Ответ 3
Использование лямбда - это своего рода стиль. Когда вы можете уйти с очень простой функцией, и обычно там, где вы просто храните ее где-нибудь (в списке функций, возможно, или в структуре данных инструментария GUI и т.д.), Люди чувствуют, что лямбда уменьшает беспорядок в их коде.
В Python можно сделать только лямбду, которая возвращает одно выражение, и лямбда не может охватывать несколько строк (если вы не присоединитесь к нескольким строкам, используя трюк обратной косой черты в конце строки). Люди просили, чтобы Python добавлял улучшения для лямбда, но этого не произошло. Насколько я понимаю, изменения, сделанные лямбдой, способной писать любую функцию, значительно усложнят код разбора в Python. И, поскольку у нас уже есть def
для определения функции, коэффициент усиления не считается стоящим осложнением. Таким образом, есть случаи, когда вы можете использовать лямбда, где это невозможно. В этом случае вы можете просто использовать def
:
object1.register_callback_function(lambda x: x.foo() > 3)
def fn(x):
if x.foo() > 3:
x.recalibrate()
return x.value() > 9
elif x.bar() > 3:
x.do_something_else()
return x.other_value < 0
else:
x.whatever()
return True
object2.register_callback_function(fn)
del(fn)
Первая функция обратного вызова была простой и достаточно лямбда. Для второго просто невозможно использовать лямбда. Мы достигаем такого же эффекта, используя def
и создавая объект функции, привязанный к имени fn
, а затем передаем fn
в register_callback_function()
. Затем, чтобы показать, что мы можем, мы назовем del()
именем fn
, чтобы развязать его. Теперь имя fn
больше не связано с каким-либо объектом, но register_callback_function()
все еще имеет ссылку на объект функции, поэтому объект функции живет.