Python: Reduce () и функция в качестве аргумента функции - PullRequest
2 голосов
/ 27 апреля 2020

В Python3 Я пытаюсь выяснить, как уменьшить () и функцию в качестве аргумента функции, или лучше передать функцию в качестве аргумента другого, для которого первый не является явным, см. Ниже

учитывая:

# define a function `call` where you provide the function and the arguments
def call(y,f):
    return f(y)

# define a function that returns the square
square = lambda x : x*x

# define a function that returns the increment
increment = lambda x : x+1

# define a function that returns the cube
cube = lambda x : x*x*x

# define a function that returns the decrement
decrement = lambda x : x-1

# put all the functions in a list in the order that you want to execute them
funcs = [square, increment, cube, decrement]

#bring it all together. Below is the non functional part. 
#in functional programming you separate the functional and the non functional parts.
from functools import reduce # reduce is in the functools library
print(reduce(call, funcs,1)) # output 7 , 2  res 124

почему это не работает, если

я меняю

def call(y,f)
       f(y)

в

def call(f,y)
       f(y)

и выдает ошибку:

................py", line 27, in call
    return f(y)

TypeError: 'int' object is not callable

1 Ответ

2 голосов
/ 27 апреля 2020

functools.reduce ()

Чтобы понять это, мы должны сначала понять, как работает reduce, Reduce принимает 3 аргумента:

  • Функция
  • Итерируемый элемент
  • Инициализатор.

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

Ниже приведены официальные документы functools:

functools.reduce(function, iterable[, initializer])

Примените функцию двух аргументов кумулятивно к элементам итерируемых слева направо, чтобы свести итерируемое к одному значению. Например, Reduce (лямбда x, y: x + y, [1, 2, 3, 4, 5]) вычисляет ((((1 + 2) +3) +4) +5). Левый аргумент x - это накопленное значение, а правый аргумент y - это значение обновления из итерируемого. Если присутствует необязательный инициализатор, он помещается перед элементами итерируемого в вычислении и служит по умолчанию, когда итерируемый является пустым. Если инициализатор не задан и итеративный содержит только один элемент, возвращается первый элемент.

Примерно эквивалентно:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

Здесь вы можете понять, что он принимает функцию передается в первом аргументе и выполняет его со значением, element в качестве аргументов для переданной функции. Обратите внимание, что каждый элемент element во втором аргументе iterable. Поэтому, когда вы вызвали reduce(call, funcs, 1),

Произошло следующее: Поскольку initializer = 1, value = initializer,

для каждого удовольствия c в функциях, произошло следующее

звонок (1, веселье c)

TLDR; Когда вы заменяете y и f, вы пытаетесь вызвать 1 (fun c), что невозможно, и поэтому первое начальное решение работает, потому что оно вызывает fun c (1)

Ссылка: Python Документы - functools

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