список функций python прикован - PullRequest
1 голос
/ 26 октября 2010

В 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)))

Спасибо!

Rgs,

KC

Ответы [ 3 ]

5 голосов
/ 26 октября 2010

Нет необходимости в «Null» в «lf».

def execu(lst, seq, raw_para):  
    para = raw_para  
    for i in reversed(seq):  
        para = lst[i](para)
    return para
4 голосов
/ 26 октября 2010

Вы можете использовать уменьшить для этого:

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 в последнем примере.

3 голосов
/ 26 октября 2010
def execu(lst, seq, raw_para):
  return reduce(lambda x, y: y(x), reversed(operator.itemgetter(*seq)(lst)), raw_para)
...