【问题标题】:create dynamic functions keeping state创建保持状态的动态函数
【发布时间】:2014-12-24 12:26:51
【问题描述】:

Python 初学者问题。假设您想动态创建一个保持某种状态的函数(在整数 i 下面的代码中)。然后由于定义的函数是一个对象,我们可以稍后使用它。在下面的代码中,我将函数添加到列表中,每次调用 print(fn(0)) 都应该得到 0 1 2 3 4,但我得到的是 4 4 4 4 4,好像只使用了最新的 i 值。

fns = []
for i in range(5):

    def fn(x):
        return x + i

    fns += [fn]
print(fns)

for fn in fns:
    print(fn(0))
quit()

是否有可能在 Python 中完成这段代码试图做的事情?

【问题讨论】:

    标签: python python-3.3 function-object dynamic-function


    【解决方案1】:

    要解决后期绑定问题,您可以使用默认关键字参数:

    for i in range(5):
        def fn(x, i=i):  # <-----
            return x + i
        ....
    

    【讨论】:

    • 这是语言功能吗?还是某种黑客行为?
    • @aaragon,这是一种常用的方式,尤其是在 gui 代码中(对我而言)。 (当您创建具有几乎相同主体的多个事件处理程序时)
    【解决方案2】:

    保留自己状态的函数?我会这样做:

    class func:
        # can behave as a function, but can also hold its own value
        def __init__(self, value=0):
            self.value = value
    
        # this function is the actual 'function' that is called each time
        def __call__(self, arg): 
            self.value += arg
            return self.value
    
    fns = []
    for i in range(5):
    
        # create new function, and give it a starting value of  i
        fn = func(i)
    
        fns += [fn]
    
    
    for fn in fns:
        print( fn(0) )
    

    结果是0 1 2 3 4

    【讨论】:

    • 那是一个函数对象(一个函子)
    猜你喜欢
    • 2021-09-15
    • 2012-03-09
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多