如何动态定义函数?
我有一些这样的函数:
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
...