объявление функции и присвоение переменной - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу задать вопрос о том, как функции назначаются переменным.

Я новичок в Python и изучаю функции.

Рассмотрим следующий блок кода из w3schools :

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

mydoubler = myfunc(2)

print(mydoubler(11))

Я знаю, что lambda является анонимной функцией только с one выражение, которое оценивается и возвращается.

Это показано внутри myfunc(n):

return lambda a: a * n

myfunc принимает аргумент, который в этом случае равен 2, поэтому любое число a будет удвоено.

Однако я запутался здесь.

В этой строке:

mydoubler = myfunc(2)

Я думал, что мы присваиваем результат myfunc mydoubler, но в выражении print:

print(mydoubler(11))

мы передавая аргумент 11, но мы никогда не указывали параметр a где-либо в объявлении функции.

Как код python знает, что 11 в этом случае внутри оператора print связан с a?

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Функция, созданная lambda a: a * n, является замыканием . Когда функция вызывается как mydoubler(11), она использует 11 в качестве значения для a и 2 (значение n внутри myfunc во время оценки lambda a: a * n) в качестве значения для n.

mydoubler ведет себя так, как если бы оно было определено как

def mydoubler(a):
    return a * 2

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

>>> mydoubler.__closure__[0].cell_contents
2

(На самом деле, вы можете изменить это, хотя сделали бы это, только если хотите сделать ваш код безнадежно сложным:

>>> mydoubler.__closure__[0].cell_contents = 3
>>> mydoubler(2)
6

)

0 голосов
/ 13 апреля 2020

Возвращаемое значение из myfunc(2) эквивалентно этой лямбде

lambda a: a * 2

Эта лямбда принимает 1 аргумент и удваивает его. Когда вы вызываете его, в данном случае присваивая ему имя mydoubler, любой аргумент, который вы передаете ему, равен a, то есть один аргумент, который принимает лямбда.

Эквивалентный код:

mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22
0 голосов
/ 13 апреля 2020

В этом случае вы фактически присвоили функцию удвоителя для mydoubler:

mydoubler = myfunc(2)

Там вы также указали параметр a, namly 2. Поэтому, когда вы передаете число в mydoubler() функция, Python знаю, что вы уже указали n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...