#python #python-3.x
#python #python-3.x
Вопрос:
В приведенном ниже коде print(first)
возвращает адрес first_child
функции, что для меня имеет смысл, поскольку parent()
функция возвращает ссылку на first_child
, а не на first_child
саму функцию — то есть parent()
возвращает first_child
, а не first_child()
.
Поскольку возвращается ссылка на first_child
функцию, а не сама функция, я не понимаю, почему print(first())
на самом деле возвращается вывод функции first_child — отображается «Привет, я Эмма». Почему / как возможно вызвать first_child()
функцию таким образом?
def parent(num):
def first_child():
return "Hi, I am Emma"
def second_child():
return "Call me Liam"
if num == 1:
return first_child
else:
return second_child
first = parent(1)
second = parent(2)
print(first)
print(first())
Комментарии:
1.
first
это не адрес чего-либо, это другое имя функции, которую вы изначально назвалиfirst_child
. Итак, неудивительно, что вы получаете ее выходные данные при ее вызове.2. «Поскольку возвращается ссылка на функцию first_child, а не на саму функцию», в Python такого различия нет. Вы всегда работаете со ссылками на объекты. Функция точно такая же, как любой другой объект.
Ответ №1:
Сначала вам нужно понять, что: В Python функции являются гражданами первого класса. Они могут — и ведут себя — как обычные переменные.
Забудьте все о функциях C или Java. Думайте о функции python как о просто другой переменной — за исключением того, что вы можете ее вызывать — т.е. f()
имеет значение для f
переменной.
Теперь давайте вернемся к вашему вопросу, parent
возвращает first_child
или second_child
— это как переменные. Теперь, когда вы берете одну из этих переменных и ставите ()
после них, вызывается переменная. Этот вызов завершается вычислением строк, которые вы определили внутри parent
— и, следовательно, вы получаете «Привет, я Эмма»
Вы должны понимать, что «ссылка на функцию» так же хороша, как и «сама функция» в python.
Если вы хотите получить более подробные сведения, ознакомьтесь: https://medium.com/python-pandemonium/function-as-objects-in-python-d5215e6d1b0d