2017-03-31 25 views
1

我有一個函數列表。我想調用這些函數的每個可能的組合,其中每個函數被調用一次或根本不調用。這不要緊,以便他們在以各種可能的組合調用函數

例:

functionList = [function1, function2, function3] 

我想調用自身的功能1()以及功能1()+函數2()以及功能1()+ function2()+ function3()和function2()等

我將如何在Python中實現?我以爲使用itertools.combinations但它似乎並不能用於我的問題。

+0

https://stackoverflow.com/questions/374626/how-可以-I-發現,所有的-子集對的一集 - 與 - 這正是正元 – Ryan

回答

1

可以使用冪函數從該itertools recipe page

from itertools import chain, combinations 

def powerset(iterable): 
    """ 
    powerset([1,2,3]) -->() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3) 
    """ 
    xs = list(iterable) 
    # note we return an iterator rather than a list 
    return chain.from_iterable(combinations(xs,n) for n in range(len(xs)+1)) 

def f1(): 
    return "f1" 

def f2(): 
    return "f2" 

def f3(): 
    return "f3" 

functions = [f1, f2, f3] 

for function_comb in powerset(functions): 
    out = "" 
    if not function_comb: 
     continue # skip the empty set of functions 
    for f in function_comb: 
     out += f() 
    print out 

它產生以下輸出:

f1 
f2 
f3 
f1f2 
f1f3 
f2f3 
f1f2f3 
2

itertools正常工作。但是你需要查看你想使用的號碼......在1和你的號碼之間。不確定你是否需要0作爲你的退化情況。以下作品。它可以被壓縮,但是它的可讀性非常好。查找「python函數指針」。

import itertools as it 

def f1(): 
    return 1 

def f2(): 
    return 2 

def f3(): 
    return 3 

functionList = [f1, f2, f3] 
fsets = set([]) 
for num in range(1, len(functionList)+1): 
    for combo in it.combinations(functionList, num): 
     fsets.add(combo) 

for fc_combo in fsets: 
    temp = 0 
    for f in fc_combo: 
     temp += f() 
    print temp