Как уже описывал Джейк, ваш 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