Python 3.x 用于可变管道和单独使用的循环函数集

Python 3.x 用于可变管道和单独使用的循环函数集,python-3.x,function,loops,Python 3.x,Function,Loops,我有以下10项职能: def function1(data1,data2): ... return value def function2(data1,data2): ... return value ... def function10(data1,data2): ... return value 我想在需要时单独使用这些函数,但 在用于计算属性并附加到列表的管道中。 像这样: collecting_list = [] for idx i

我有以下10项职能:

def function1(data1,data2):
    ...
    return value

def function2(data1,data2):
    ...
    return value

...

def function10(data1,data2):
    ...
    return value
我想在需要时单独使用这些函数,但 在用于计算属性并附加到列表的管道中。 像这样:

collecting_list = []
for idx in range(10):  
    collecting_list.append(function1(data1[idx],data2[idx]))
    collecting_list.append(function2(data1[idx],data2[idx]))
    collecting_list.append(function3(data1[idx],data2[idx]))
    collecting_list.append(function4(data1[idx],data2[idx]))
    collecting_list.append(function5(data1[idx],data2[idx]))
    collecting_list.append(function6(data1[idx],data2[idx]))
    collecting_list.append(function7(data1[idx],data2[idx]))
    collecting_list.append(function8(data1[idx],data2[idx]))
    collecting_list.append(function9(data1[idx],data2[idx]))
    collecting_list.append(function10(data1[idx],data2[idx])
显然,我需要一些属性来循环函数名,但我以前从未遇到过这个问题,只是想知道我是否可以在循环中调用这些函数,而无需硬编码,只需调整函数号(例如function1()、function2()、function10())。 提示和想法感谢

嗯,当然可以

import sys
import types

module_name = sys.modules[__name__]   

def function1(data1, data2):
    return ("func1", data1 + data2)

def function2(data1, data2):
    return ("func2", data1 + data2)

def function3(data1, data2):
    return ("func3", data1 + data2)

def function4(data1, data2):
    return ("func4", data1 + data2)

def function5(data1, data2):
    return ("func5", data1 + data2)

def get_functions():
    func_list = list()
    for k in sorted(module_name.__dict__.keys()):
        if k.startswith('function'):
            if isinstance(module_name.__dict__[k], types.FunctionType):
                func_list.append(module_name.__dict__[k])
    return func_list

def get_functions_2():
    func_list = list()
    for itr in range(1, 100):
        try:
            func_list.append(getattr(module_name, "function%s" % itr))
        except:
            break
    return func_list

def run_pipeline(function_list):
    collecting_list = list()
    for idx, func in enumerate(function_list):
        collecting_list.append(func(idx, idx))
    return collecting_list

if __name__ == "__main__":
    funcs = get_functions()
    results = run_pipeline(funcs)
    print(results)
产出:

[('func1', 0), ('func2', 2), ('func3', 4), ('func4', 6), ('func5', 8)]
注意:如果我试图构建动态计算管道,我可能不会这样做,但您可以使用这种方法。理论上,您可以为每个管道创建一个文件并命名它们,以便使用此方法

编辑:每个请求添加了两个获取函数,确定吗

import sys
import types

module_name = sys.modules[__name__]   

def function1(data1, data2):
    return ("func1", data1 + data2)

def function2(data1, data2):
    return ("func2", data1 + data2)

def function3(data1, data2):
    return ("func3", data1 + data2)

def function4(data1, data2):
    return ("func4", data1 + data2)

def function5(data1, data2):
    return ("func5", data1 + data2)

def get_functions():
    func_list = list()
    for k in sorted(module_name.__dict__.keys()):
        if k.startswith('function'):
            if isinstance(module_name.__dict__[k], types.FunctionType):
                func_list.append(module_name.__dict__[k])
    return func_list

def get_functions_2():
    func_list = list()
    for itr in range(1, 100):
        try:
            func_list.append(getattr(module_name, "function%s" % itr))
        except:
            break
    return func_list

def run_pipeline(function_list):
    collecting_list = list()
    for idx, func in enumerate(function_list):
        collecting_list.append(func(idx, idx))
    return collecting_list

if __name__ == "__main__":
    funcs = get_functions()
    results = run_pipeline(funcs)
    print(results)
产出:

[('func1', 0), ('func2', 2), ('func3', 4), ('func4', 6), ('func5', 8)]
注意:如果我试图构建动态计算管道,我可能不会这样做,但您可以使用这种方法。理论上,您可以为每个管道创建一个文件并命名它们,以便使用此方法


编辑:添加了每个请求的get_函数2

使用
lambda
exec

您可以有一个函数名的字符串数组,以及返回数据的lambda函数,如下所示。使用lambda函数,您可以反复重用相同名称的dataX,并通过适当的实现获得所需的正确数据。下面是一个非常基本的抽象示例:

import random

def getData1():
    return random.randint(1, 10)

def getData2():
    return random.randint(11, 20)

def function1(data1):
    print("f1, {}".format(data1))

def function2(data1, data2):
    print("f2, {} and {}".format(data1, data2))

data1 = lambda: getData1() # these can be any function that serves as the
data2 = lambda: getData2() # source for your data. using lambda allows for
                           # anonymization and reuse

functionList = ["function1({})".format(data1()), "function2({},{})".format(data1(), data2())]

for f in functionList:
    exec(f)

function1(data1())

您可能会问为什么不在函数列表中使用getData1()而不是data1,答案与参数有关。如果getDataX函数需要参数,则不希望每次参数名称更改时都计算functionList。这是使用
lambda
exec
的好处之一使用
lambda
exec

您可以有一个函数名的字符串数组,以及返回数据的lambda函数,如下所示。使用lambda函数,您可以反复重用相同名称的dataX,并通过适当的实现获得所需的正确数据。下面是一个非常基本的抽象示例:

import random

def getData1():
    return random.randint(1, 10)

def getData2():
    return random.randint(11, 20)

def function1(data1):
    print("f1, {}".format(data1))

def function2(data1, data2):
    print("f2, {} and {}".format(data1, data2))

data1 = lambda: getData1() # these can be any function that serves as the
data2 = lambda: getData2() # source for your data. using lambda allows for
                           # anonymization and reuse

functionList = ["function1({})".format(data1()), "function2({},{})".format(data1(), data2())]

for f in functionList:
    exec(f)

function1(data1())

您可能会问为什么不在函数列表中使用getData1()而不是data1,答案与参数有关。如果getDataX函数需要参数,则不希望每次参数名称更改时都计算functionList。这是使用
lambda
exec

的好处之一。哇,我还没有完全看过这个例子,但是有没有更符合python风格的方法呢?例如,在函数名上循环如下:
将_str_变成_函数(“func”+“str(idx”))((data1,data2))
@SolingerMUC您可以使用getattr(module_name,func+idx)代替模块名字典循环。这将产生预期的效果,但您必须事先知道函数计数。上述方法的好处是,您只需不断添加函数,get_函数就会找到它们。每次添加/删除函数时,都必须修改您要求的内容。如果这是你想要的,我会改变主意answer@SolingerMUC使用getattr()添加了一个额外的方法哇,我还没有完全了解这个示例,但是有没有更符合python风格的方法呢?例如,在函数名上循环如下:
将_str_变成_函数(“func”+“str(idx”))((data1,data2))
@SolingerMUC您可以使用getattr(module_name,func+idx)代替模块名字典循环。这将产生预期的效果,但您必须事先知道函数计数。上述方法的好处是,您只需不断添加函数,get_函数就会找到它们。每次添加/删除函数时,都必须修改您要求的内容。如果这是你想要的,我会改变主意answer@SolingerMUC使用getattr()添加了一个附加方法