пожалуйста, объясните работу лямбда

Возможный дубликат:
Что такое лямбда и пример реализации?

Вот код лямбды (из Byte of Python):

def make_repeater(n):
    return lambda s: s * n

twice = make_repeater(2)

print twice('word')
print twice(5)

Вывод таков:

wordword
10

Может кто-нибудь объяснить, как лямбда работает в длинной форме? как word и 5 передаются в s в лямбда-функции?

Благодарю.


person dopatraman    schedule 30.12.2011    source источник
comment
Хорошая работа, задающая лучший вопрос, чем возможный дублирующий вопрос, но первый ответ там довольно классный.   -  person sarnold    schedule 31.12.2011
comment
Я думаю, что получу ментальную ошибку переполнения стека из-за повторения повторяющихся вопросов...   -  person Brigand    schedule 31.12.2011
comment
См. понимание-лямбда-функций в python.   -  person nawfal    schedule 04.07.2014


Ответы (2)


Как уже описывал Джейк, ваш make_repeater возвращает другую функцию, в которой n привязан к 2 (это называется закрытие). Таким образом, ваш код примерно эквивалентен:

twice = lambda s: s * 2

print twice('word')
print twice(5)

Что, в свою очередь, примерно эквивалентно:

def twice(s):
    return s * 2

print twice('word')
print twice(5)

Что, в свою очередь, примерно эквивалентно:

print 'word' * 2
print 5 * 2

Итак, что вы на самом деле делаете:

  • оцените выражение 'word' * 2, результатом которого будет 'wordword' (умножение строк определяется Python как повторение строки заданное количество раз)
  • оцените выражение 5 * 2, результатом которого будет 10 (это не должно вас удивлять)

Тот факт, что ваша лямбда-функция не заботится о типе своего аргумента и динамически решает во время выполнения, какой метод умножения является правильным, называется динамическая типизация.

person Niklas B.    schedule 30.12.2011

Функция make_repeater возвращает другую функцию (лямбду). В вашем примере лямбда-функции присваивается имя «дважды». Лямбда имеет один аргумент, "s", и одно "статическое" значение, "n" - "n" определяется при создании лямбды (в данном случае ему присваивается значение "2"). Значение для "s" определяется при вызове лямбды - либо "word", либо 5. word * 2 = "wordword" и 5 * 2 = 10.

person Jake Feasel    schedule 30.12.2011