Функция представляет собой первоклассный объект в 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=[]
в вышеприведенных примерах, тот же список может быть повторно использован непредвиденным образом.