@zybk

Как параметр в лямбде соотносится с параметром в функции?

Изучаю Python здесь w3schools
Там есть следующий пример для вычисления удвоенного числа:

def myfunc(n):
  return lambda a : a * n

mydoubler = myfunc(2)

print(mydoubler(11))


Я не понимаю до конца этот пример.
Программа доходит до строки print(mydoubler(11)). Чтобы напечать результат выполнения функции mydoubler, программа вызывает эту функцию с аргументом 11, для этого программа идёт к строке mydoubler = myfunc(2).
В строке mydoubler = myfunc(2) вызывается функция mydoubler, которая ссылается на другую функцию — myfunc, с аргументом 2.
Функция myfunc в свою очередь идёт к блоку кода
def myfunc(n):
  return lambda a : a * n

и передаёт аргумент 2 в определение функции def myfunc(n):
Блок кода
def myfunc(n):
  return lambda a : a * n

содержит третью функцию, лямбда-функцию. Эта лямбда стоит после оператора return функции myfunc, то есть myfunc возвратит то, что вычислится в результате выполнения лямбды.
Лямбда принимает содержит "a" в качестве параметра, а возвращает результат умножения "a" на "n", где "n" — параметр myfunc.
Я не могу понять, как "a" в лямбде соотносится с аргументом mydoubler. Когда посмотрел, как выполняется программа, то я понял, что "a" и аргумент mydoubler — это одно и то же. Как программа понимает, что 11 надо поместить в "a" лямбды?
Спасибо заранее.
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
lambda - это безымянные функции.
например
f = lambda x: x**2
print(f(4))
выведет 16. f - это указатель на безымянную функцию с одним параметром.
Тоже самое и в твоем коде твоя функция myfunc, возвращает безымянную функцию, твой n подставит выражение и вернет функцию. lambda a:a*2 дальше как в пример выше ты вызываешь свою функцию с аргументом a=11 и получаешь 22.

Эта лямбда стоит после оператора return функции myfunc, то есть myfunc возвратит то, что вычислится в результате выполнения лямбды.
Вот здесь ошибка в твоей логике. Он вернет функцию а не вычислит ее только вместо n ,будет параметр из myfunc.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Программа доходит до строки print(mydoubler(11)). Чтобы напечать результат выполнения функции mydoubler, программа вызывает эту функцию с аргументом 11, для этого программа идёт к строке mydoubler = myfunc(2).

Ну вот тут ты уже неправ. Программа не идёт назад по коду.

Сначала отрабатывает оператор def, определяющий функцию myfunc. После этого в текущей области видимости программы появляется переменная myfunc, хранящая ссылку на объект-функцию.
Затем отрабатывает строка mydoubler = myfunc(2). Происходит вызов функции myfunc, при этом ей передаётся объект-число 2 как параметр. Внутри локальной области видимости myfunc теперь есть имя a, ссылающееся на объект-число 2. В ходе выполнения создаётся лямбда-функция, которая ссылается на этот параметр.
Лямбда функция возвращается из myfunc, myfunc завершает выполнение. Поскольку лямбда-функция продолжает существовать (мы её вернули), а она ссылается на объект-число 2, то этот объект тоже продолжает существовать.
Возвращённая функция присваивается имени mydoubler в текущей области видимости. Это позволяет её продолжать существовать (её не собирает сборщик мусора), ну и позволяет её вызвать по этому имени.

Если бы ты сделал ещё один вызов, скажем, mytripler = myfunc(3), это бы создало новую, отдельную лямбда-функцию, совершенно независимую от mydoubler, и ссылающуюся на объект-число 3.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы