使用for循环来定义多个函数 - Python
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用for循环来定义多个函数 - Python相关的知识,希望对你有一定的参考价值。
假设我需要创建10个名为add1,add2,...,add10的函数。对于每个i,addi接受整数x并输出x + i。
当我尝试以下内容并评估add2(10)时,Python给了我一个NameError。
for i in range(10):
def addi(x):
return x + (i+1)
我知道上面的代码是错误的,因为我定义的addi函数不是可变的;我很确定我所做的一切都是重新定义了10次。如何快速定义这10个功能?
在这种情况下使用functools.partial
结合字典。
我假设你真正想做的事情更复杂,因为这个特定任务不需要多个功能。
from functools import partial
def add(x, i):
return x + i
d = {f'add{k}': partial(add, i=k) for k in range(1, 10)}
d['add3'](5) # 8
说明
- 最好将可变数量的相关对象存储在特定定义的字典中。
functools.partial
是一个高阶函数,它返回一个输入函数,其中选定的参数是固定的。
功能一般不可变;但他们可能会引用数据。在你的代码片段中,这个引用有点不清楚,但i
只在函数体中出现一次,作为读取。因此,它从一些外部范围读取,通常是包含在其中的for
循环的函数或模块。因为这恰好是一个共享的上下文,每个addi
函数最终将使用相同的i
。
另一个问题是你在每次迭代时都使用名称addi
,并且该函数从未出现在另一个名称下。因此,无论前面定义的addi
函数都丢失了。这引出了第三个问题;为什么要动态创建名称(如函数名称)?使用集合几乎总是更好,例如jpp的答案中的d
字典。否则,什么代码甚至会引用您创建的函数?
所有这一切,仍然可以做你所要求的,虽然很奇怪。这是一种方式:
def addfunc(n):
def addn(x):
return x+n
return addn
for i in range(1,10):
globals()['add{}'.format(i)] = addfunc(i)
这会滥用globals
将动态创建的名称注入模块的命名空间,并将这些函数中的每一个嵌套到另一个函数中,以创建包含其各自n
值的名称空间。另一个经典的黑客是使用默认参数,partial application的operator.add
是一个更整洁的功能风格。
一个办法:
from types import FunctionType
from copy import copy
def copy_function(fn, name):
return FunctionType(
copy(fn.func_code),
copy(fn.func_globals),
name=name,
argdefs=copy(fn.func_defaults),
closure=copy(fn.func_closure)
)
for i in range(10):
name = 'add' + str(i)
def _add(x):
return x + (i+1)
globals()[name] = copy_function(_add, name)
print add1(2) # 4
print add3(8) # 12
使用https://stackoverflow.com/a/34796018/7529716的复制功能
这有帮助吗?
def createFunc(i):
def func(x):
return x + (i+1)
return func
然后只需创建函数并将它们存储在一个数组中:
add = [createFunc(i) for i in range(10)]
print add[0](1) # 1+(0+1) = 2
print add[0](2) # 2+(0+1) = 3
print add[2](10) # 10+(2+1) = 13
print add[2](11) # 11+(2+1) = 14
正如其他人所指出的那样,你是否应该在生产代码中这样做是值得怀疑的。但是,出于教育目的,这里是如何通过生成函数名称并将它们注入全局名称空间来实现的:
>>> def f(x, i):
... return x + i + 1
...
>>> from functools import partial
>>> for i in range(10):
... globals()['add%s' % i] = partial(f, i=i)
...
>>> add8(5)
14
>>> add3(5)
9
functools.partial
在Python中实现currying以创建单个函数定义的副本,其中每个副本“硬编码”一个或多个函数参数。
以上是关于使用for循环来定义多个函数 - Python的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]