如何动态定义函数?

24 投票
4 回答
30507 浏览
提问于 2025-04-16 03:59

我有一些这样的函数:

def activate_field_1():
   print 1

def activate_field_2():
   print 2

def activate_field_3():
   print 3

我想知道怎么定义 activate_field_[x],让 x 从1到10,而不需要一个一个地写出来?当然,我更希望能传一个参数来处理,但在我的情况下,这样做是不可能的。

4 个回答

5

你可以把新的符号放进当前变量绑定的字典里,这个字典是通过 vars() 返回的:

for i in range(1, 11):
    def f(x):
        def g():
            print x
        return g
    vars()['activate_field_%d' % i] = f(i)

>>> activate_field_3()
3

不过,这种做法一般不推荐,除非你非常确定你需要这样做。

12

这里有一个方法,可以生成你想要的函数名称,实际上比动态/运行时方法创建中提到的被接受的答案要简单一些,那个答案是@Goutham之前删除的。

FUNC_TEMPLATE = """def activate_field_{0}(): print({0})"""
for x in range(1, 11): exec(FUNC_TEMPLATE.format(x))

>>> activate_field_1()
1
>>> activate_field_7()
7

在Python 3.6及以上版本中,可以使用所谓的f-string字面量来写,如下所示:

for x in range(1, 11): exec(f"""def activate_field_{x}(): print({x})""")
26

你想在源文件中单独定义这些东西吗?如果是这样,最好的办法就是写一个脚本来生成它们。

但如果你想在程序运行时使用这些功能,可以用一个高阶函数。比如说:

>>> def make_func(value_to_print):
...     def _function():
...         print value_to_print
...     return _function
...
>>> f1 = make_func(1)
>>> f1()
1
>>> f2 = make_func(2)
>>> f2()
2

你可以生成一个这些功能的列表,并在程序运行时存储它们。

>>> my_functions = [make_func(i) for i in range(1, 11)]
>>> for each in my_functions:
...     each()
...
1
2
3
...

撰写回答