Функция - это объект, как и любой другой в Python. Таким образом, вы можете передать его в качестве аргумента, присвоить ему атрибуты, и, может быть, наиболее важно - вызвать его. Мы можем взглянуть на более простой пример, чтобы понять, как работает передача функции:
def add(a, b):
return a + b
def sub(a, b):
return a - b
def operate(func, a, b):
return func(a, b)
a = 4
b = 5
print(operate(add, a, b))
print(operate(sub, a, b))
operate(print, a, b)
И это выводит на печать:
9
-1
4 5
Это потому, что в каждом случае назначается func
с соответствующим функциональным объектом , переданным в качестве аргумента, а затем, выполнив func(a, b)
, он фактически вызывает эту функцию с данными аргументами.
Так что же происходит с вашей линией:
return x(x(a, b), x(a, b))
сначала оба x(a, b)
оцениваются как add(4, 5)
, что дает 9
. И тогда внешний x(...)
оценивается как add(9, 9)
, что дает 18
.