Функция как аргумент другой функции - PullRequest
2 голосов
/ 24 января 2020

Я изучаю этот язык, поэтому я новичок с Python. Код:

def add(a, b):
    return a + b

def double_add(x, a, b):
    return x(x(a, b), x(a, b))

a = 4
b = 5
print(double_add(add, a, b))  

Функция add проста, она добавляет два числа. Функция double_add имеет три аргумента. Я понимаю, что происходит (с некоторыми сомнениями). Результат 18. Я не могу понять, как double_add использует add для работы.

Вопрос в том, какова связь между этими двумя функциями?

Было бы полезно, если бы вы рассказали мне несколько примеров использования функции в качестве аргумента другой функции.
Заранее спасибо.

Ответы [ 7 ]

4 голосов
/ 24 января 2020

На python языке функции (и методы) являются объектами первого класса . First Class объекты - это те объекты, которые могут обрабатываться единообразно.

Итак, вы просто передаете method в качестве аргумента .

Ваш метод вернет add(add(4, 5), add(4, 5)) что равно add(9, 9) и равно 18.

1 голос
/ 24 января 2020

Функция - это объект, как и любой другой в 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.

1 голос
/ 24 января 2020

Если вы добавите print(x) в функцию double_add, вы увидите, что она напечатает <function add at 0x10dd12290>. Поэтому код double_add в основном такой же, как если бы вы делали следующее:

print(add(add(a,b), add(a,b))) # returns 18 in your case
1 голос
/ 24 января 2020

Функции являются объектами в Python, как и все остальное, например списки, строки ... и вы можете передавать их так же, как и с переменными.

0 голосов
/ 24 января 2020
def double_add(x, a, b):
    return x(x(a, b), x(a, b))

Давайте напишем по-другому, чтобы было легче объяснить:

def double_add(x, a, b):
    result1 = x(a, b)
    result2 = x(a, b)
    return x(result1, result2)

Это означает, что возьмите функцию x и примените ее к параметрам a и b. x может быть любой функцией здесь.

print(double_add(add, a, b))  

Тогда это означает: вызов функции double_add , giving it add as the first parameter. So double_add`, сделает:

result1 = add(a, b)
result2 = add(a, b)
return add(result1, result2)
0 голосов
/ 24 января 2020

Это очень простой пример того, что называется «внедрение зависимости». Это означает, что вы явно не определяете взаимодействие между двумя функциями, вместо этого вы определяете, что double_add должна использовать некоторую функцию, но она знает только то, что происходит, когда код фактически выполняется. (Во время выполнения вы вводите зависимость от конкретной функции c вместо жесткого кодирования в самой функции),

Попробуйте, например, следующее

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def double_add(x, a, b):
    return x(x(a, b), x(a, b))

a = 4
b = 5

print(double_add(add, a, b))  
print(double_add(subtract, a, b))  

Другими словами, double_add стала обобщенной c функцией, которая выполнит все, что вы дадите ей дважды, и напечатает результат

0 голосов
/ 24 января 2020

Объект функции add передается в качестве аргумента double_add, где он локально называется x. x затем вызывается для каждого, а затем для двух возвращаемых значений из этого.

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