将列表中的功能作为链执行

问题描述 投票:1回答:3

在Python中,我定义了这些功能:

def foo_1(p): return p + 1
def foo_2(p): return p + 1
def foo_3(p): return p + 1
def foo_4(p): return p + 1
def foo_5(p): return p + 1

我想像这样在链中执行这些功能:

foo_1(foo_2(foo_3(foo_4(foo_5(1)))))

我想将这些功能指定为列表,以精确的顺​​序按链执行这些功能。这是我尝试过的:

lf = [Null,foo_1,foo_2,foo_3,foo_4,foo_5]  # Null is for +1 issue here

def execu(lst, seq, raw_para):
    # in some way

execu(lf,(1,2,3,4,5), 1)   # = foo_1(foo_2(foo_3(foo_4(foo_5(1)))))
execu(lf,(1,2,3), 1)       # = foo_1(foo_2(foo_3(1)))
execu(lf,(3,3,3), 1)       # = foo_3(foo_3(foo_3(1)))
python function composition
3个回答
3
投票
def execu(lst, seq, raw_para):
  return reduce(lambda x, y: y(x), reversed(operator.itemgetter(*seq)(lst)), raw_para)

5
投票

您可以为此使用reduce

reduce(lambda x, y: y(x), list_of_functions, initial_value)

例如:

reduce(lambda x, y: y(x), reversed([foo_1, foo_2, foo_3, ...]), 1)

注意,如果要按foo_1(foo_2(etc...))的顺序应用功能,则必须确保foo_1是功能列表的最后一个元素。因此,在后一个示例中,我使用reversed


5
投票

不需要“ lf”中的“ Null”。

def execu(lst, seq, raw_para):  
    para = raw_para  
    for i in reversed(seq):  
        para = lst[i](para)
    return para
© www.soinside.com 2019 - 2024. All rights reserved.