Как упаковать функции последовательности, которые действуют на параметр в порядке Python - PullRequest
1 голос
/ 18 июня 2020

Представьте, что есть три функции, все они принимают и возвращают аргументы одного и того же типа.

Обычно мы можем записать это как fun3(fun2(fun1(args)), это может означать, что функция последовательности действует на параметр по порядку, которому нравится одна разновидность "map" функций высшего порядка.

Вы знаете, в системе Mathematica мы можем записать это как fun3@fun2@fun1@args.

Теперь вопрос в том, можем ли мы интегрировать fun3@fun2@fun1 как еще одно развлечение без изменения их определения, поэтому fun(args) можно заменить fun3(fun2(fun1(args)), это выглядит более элегантно и лаконично.

Ответы [ 3 ]

1 голос
/ 18 июня 2020
def merge_steps(*fun_list):
    def fun(arg):
        result = arg
        for f in fun_list:
            result = f(result)
        return result

    return fun


def plus_one(arg):
    return arg + 1


def double_it(arg):
    return arg ** 2


def power_ten(arg):
    return arg ** 10


combine1 = merge_steps(power_ten, plus_one, double_it)
combine2 = merge_steps(plus_one, power_ten, double_it)

combine1(3) 
> 3486902500

или используйте лямбда:

steps = [power_ten, plus_one, double_it]

reduce(lambda a, f: f(a), steps, 3)
> 3486902500
0 голосов
/ 18 июня 2020

Я не уверен, что понимаю ваш вопрос, но вы говорите о композиции функций в этих строках?

# Some single-argument functions to experiment with.

def double(x):
    return 2 * x

def reciprocal(x):
    return 1 / x

# Returns a new function that will execute multiple single-argument functions in order.

def compose(*funcs):
    def g(x):
        for f in funcs:
            x = f(x)
        return x
    return g

# Demo.

double_recip_abs = compose(double, reciprocal, abs)
print(double_recip_abs(-2))   # 0.25
print(double_recip_abs(.1))   # 5.0
0 голосов
/ 18 июня 2020

Думаю, для этого можно использовать рекурсию функций в python.

def function(args, times):
    print(f"{times} Times - {args}")
    if times > 0 : 
        function(args,times - 1)

function("test", 2)

Примечание: я просто добавляю аргумент раз, чтобы не генерировать бесконечное l oop.

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