Подтвердить что ты не робот

Что означает "лямбда" в Python и какой самый простой способ использовать его?

Можете ли вы привести пример и другие примеры, показывающие, когда и когда не использовать Лямбду? Моя книга дает мне примеры, но они запутывают.

4b9b3361

Ответ 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.

Ответ 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() все еще имеет ссылку на объект функции, поэтому объект функции живет.