Получить ввод функции высшего порядка в Python - PullRequest
0 голосов
/ 31 мая 2018

Допустим, у меня есть HOF

def some_func(lst):
    def func(args):
        if args[0]=='compute':
            return sum(lst)
        elif args[0]=='add':
            XXXXX  #Return a new HOF with the 2 sub HOF input parameters added together.  
    return func
x1=some_func([1,2,3])
x2=some_func([2,3,4])

Один из аргументов * для HOF - ('add', another_hof), который требует, чтобы HOF добавил другой параметр HOF и возвратил HOF с добавленным параметром.

пример:

x3=x1('add',x2)
x4=some_func([3,5,7])

Тогда,

x3 should equal x4.
test_case: 
x1=some_func([1,2,3])
x2=some_func([2,3,4])
x1('compute')=6
x2('compute')=9
x3=x1('add',x2)
x3('compute')=15

Когда я выполняю x HOF, ('add, x2) для функции x1, возможно, я знаю x2'входной параметр [2,3,4] внутри функции func (* args)?

1 Ответ

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

Как я понимаю, суть проблемы заключается в следующем: учитывая ссылку на экземпляр func, вам нужно получить значение lst, которое в нем содержится.

Один из способов сделать этодобавить другой режим в ваш условный блок, который возвращает lst.Давайте назовем это get_lst:

def some_func(lst):
    def func(*args):
        if args[0]=='compute':
            return sum(lst)
        elif args[0]=='add':
            new_lst = [a+b for a,b in zip(lst, args[1]("get_lst"))]
            return some_func(new_lst)
        elif args[0] == "get_lst":
            return lst
    return func

x1=some_func([1,2,3])
x2=some_func([2,3,4])
print(x1('compute'))
print(x2('compute'))
x3=x1('add',x2)
print(x3('compute'))

Результат:

6
9
15

Вы также можете присвоить lst атрибуту объекта функции:

def some_func(lst):
    def func(*args):
        if args[0]=='compute':
            return sum(lst)
        elif args[0]=='add':
            new_lst = [a+b for a,b in zip(lst, args[1].params)]
            return some_func(new_lst)
    func.params = lst
    return func

x1=some_func([1,2,3])
x2=some_func([2,3,4])
print(x1('compute'))
print(x2('compute'))
x3=x1('add',x2)
print(x3('compute'))
...