微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中的`for`循环中定义函数时出现问题

如何解决在Python中的`for`循环中定义函数时出现问题

我有以下最小的示例重现了这个问题:

def f1(a,b):
    print(1)
    return a + b


def f2(a,b):
    print(2)
    return a * b


funcs = f1,f2


_funcs = []
for func in funcs:

    def _func(x):
        return func(*x)

    _func.__name__ = func.__name__
    _funcs.append(_func)
funcs = _funcs


for func in funcs:
    print(func([2,3]))

这会引发TypeErro

TypeError:_func()接受1个位置参数,但给出了2个

具有以下追溯:

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-93-e24e67b5e525> in <module>()
     22 
     23 for func in funcs:
---> 24     print(func([2,3]))

<ipython-input-93-e24e67b5e525> in _func(x)
     14 
     15     def _func(x):
---> 16         return func(*x)
     17 
     18     _func.__name__ = func.__name__

TypeError: _func() takes 1 positional argument but 2 were given

我不确定为什么_func()总是用单个参数调用

我怀疑我想用functools来完成什么,但是我仍然看不到为什么上面的代码如此工作。有提示吗?

解决方法

定义以下内容时,您正在关闭自由变量func

def _func(x):
    return func(*x)

但是,在循环中,您重复使用了这个名称,

for func in funcs:
    print(func([2,3]))

所以func现在引用了您定义的单参数函数,甚至在_func 内部!因此,当然,当该函数调用func(*x)时,它实际上是在递归地调用自身。使用其他名称:

for f in funcs:
    print(f([2,3]))

或者更好的是,不要依赖您不打算自由的自由变量:

def func_maker(func):
    def _func(x):
        return func(*x)
    return _func

并使用它:

...

_funcs = []
for func in funcs:

    _func = func_maker(func)

    _func.__name__ = func.__name__
    _funcs.append(_func)
funcs = _funcs

...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。