Что означает скобка после функции - PullRequest
0 голосов
/ 04 мая 2018

Меня попросили написать функцию в Python 3 для: Напишите функцию с именем general_poly, которая будет, например, оценивать general_poly([1, 2, 3, 4])(10) до 1234, потому что 1*10^3 + 2*10^2 + 3*10^1 + 4*10^0.

Теперь я не понимаю, что означает вторая скобка, (10).

Откуда моя функция general_poly узнает, чтобы взять это значение внутри себя и использовать его?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

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

Ваш конкретный пример можно записать следующим образом:

def general_poly(A):
    k = len(A)
    def power(n):
        return sum(j*n**(k-i) for i, j in enumerate(A, 1))
    return power

res = general_poly([1, 2, 3, 4])(10)  # 1234

Внешняя функция general_poly возвращает внутренняя функция power. Первый принимает список или массив, а второй - скаляр.


Альтернативный способ структурирования вашей логики - использовать functools.partial. Это создает новую функцию, которая фиксирует один или несколько параметров, и устраняет необходимость во внутренней функции.

from functools import partial

def general_poly(A, n):
    k = len(A)
    return sum(j*10**(k-i) for i, j in enumerate(A, 1))

genral_poly_10 = partial(general_poly, n=10)
res = genral_poly_10([1, 2, 3, 4])  # 1234

Конечно, это полезно, только если вы хотите создать функцию для определенной степени; тривиально, n может использоваться непосредственно как дополнительный параметр без functools.partial.


Примечание : Остерегайтесь изменяемых аргументов по умолчанию . Так что если ваша функция имеет изменяемый аргумент по умолчанию, например, установка A=[] в вышеприведенных примерах, тот же список может быть повторно использован непредвиденным образом.

0 голосов
/ 04 мая 2018

Второй набор парантезов на самом деле не взаимодействует с функцией, они применяются ко всему, что возвращает функция. Это тот же принцип, что и returnsAList()[0], который даст вам первый элемент списка, возвращаемый returnsAList().

0 голосов
/ 04 мая 2018

Это означает, что ваша функция должна возвращать функцию:

def multiplier(times):
    def inner(num):
         return num * times
    return inner

result = multiplier(2)(3)
print(result)
# 6

times_four = multiplier(4)
print(times_four(3))
# 12

Это может быть или не быть избыточным, но если вам нужно сохранить состояние, вы даже можете использовать класс и реализовать __call__:

class multiplier:
    def __init__(self, times):
        self.times = times
    def __call__(self, num):
        return num * self.times

print(multiplier(2)(3))
# 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...