Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用函数时如何使用变量?_Python_Function_Variables - Fatal编程技术网

Python 调用函数时如何使用变量?

Python 调用函数时如何使用变量?,python,function,variables,Python,Function,Variables,基本上,我有很多函数都有相似的名称(p1(),p2(),p3(),…,p20()),我不想手工调用它们。我想这样做: for i in range(1, 21): p{i}() 但这似乎不起作用。是否有其他方法解决此问题?函数可以像任何其他对象一样放入列表中,因此您可以构建函数列表,然后在其上迭代: p_funcs = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p

基本上,我有很多函数都有相似的名称(
p1()
p2()
p3()
p20()
),我不想手工调用它们。我想这样做:

for i in range(1, 21):
     p{i}()

但这似乎不起作用。是否有其他方法解决此问题?

函数可以像任何其他对象一样放入列表中,因此您可以构建函数列表,然后在其上迭代:

p_funcs = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20]
for f in p_funcs:
    f()

请注意,需要这样做可能表明,如果您将这些函数重构为数量较少的更复杂的函数,您的生活会更轻松。

此函数基于
eval
cmd from

输出

testing function p1()
testing function p2()

一个潜在的解决方案是创建一种机制,在其中注册/存储函数,以便可以对它们进行迭代

下面是一个解决方案,它使用一个装饰器“注册”每个函数,并将它们存储在一个列表中,以便对它们进行迭代

registered_funcs = []


def register_func(f):
    registered_funcs.append(f)
    return f


@register_func
def p1():
    print('p1')


@register_func
def p2():
    print('p2')


for func in registered_funcs:
    func()

您可以使用
globals()
来动态访问对象/变量(函数是对象/变量)。创建一个包含函数(如列表或dictSee)的数据结构可能更明智。TL;医生:不要。问:那么这两个函数之间的“关系”是什么呢?问:有一个函数指针的“集合”(例如数组或字典)有意义吗?问:将它们全部封装在一个类中,然后在一个类方法中集体调用它们是否有意义?您是否可以将其中一些函数作为示例的一部分?它们都很短吗?你曾经单独调用它们吗,或者它们总是作为一个单元调用(如果是这样,为什么它们首先是单独的函数)?有比(可能是危险的)eval函数更好的替代方法。@Ruperto-这是非常非常糟糕的建议。@palsm4我希望我知道为什么:)Ruperto:因为使用
eval()
(或
exec()
)本质上是一种安全隐患,通常是可以避免的。使用eval()调用一个我们知道是安全的函数是否足够安全?我不确定OP为什么对其函数的命名如此糟糕,或者他们是否试图做任何事情,但用糟糕的设计保存击键……但这是一个很好的解决方案。对于一个有疑问的问题;)
registered_funcs = []


def register_func(f):
    registered_funcs.append(f)
    return f


@register_func
def p1():
    print('p1')


@register_func
def p2():
    print('p2')


for func in registered_funcs:
    func()