Closure:一个返回其先前调用值的函数

问题描述 投票:2回答:3

我正在尝试构建一个使用闭包返回其先前调用的值的函数。第一次调用函数时,它将返回None。我不确定如何将last_in从一个呼叫更新为另一个呼叫。

def last_in(x):
    last_in = [None]

    def get():
        temp = last_in[0]
        last_in[0] = x
        # print(last_in)
        return temp
    return get()

例如,print(last_in(1),last_in(2),last_in(3))应打印:None 1 2

python
3个回答
5
投票

您的方法的问题在于,每当调用last_in(即“外部”函数)时,存储在last_in(数组而不是函数)中的先前值将重置为None。相反,外部函数应仅被调用一次,以免每次调用时都不会重置该值。

[不确定您需要什么,但是我认为为此创建装饰器函数(即修改现有函数的函数)是有意义的。这样,所有的存储和检索最后结果都可以在装饰器中完成,而不会影响实际功能。外部函数(装饰器)仅被调用一次,原始函数被装饰后的版本替换,该版本将正确检索存储的值。

def return_previous(f):
    f.last_result = None
    def _f(*args, **kwargs):
        res = f.last_result
        f.last_result = f(*args, **kwargs)
        return res
    return _f

@return_previous
def some_function(x):
    return x**2

print(some_function(1), some_function(2), some_function(3))
# None 1 4

2
投票

我喜欢@tobias_k提供的解决方案,但这是符合您代码当前组织/结构的另一种选择。

def last_in(x):
    def get():
        temp = last_in.__dict__.get('prev', None)
        last_in.__dict__['prev'] = x
        return temp
    return get()

print(last_in(1),last_in(2),last_in(3))

None 1 2

1
投票

这与请求略有不同,因为它需要第二个关键字参数,但是您可以利用以下事实:默认参数仅设置一次(请参阅here),以进行如下操作:

def last_in(x, __last=[None]):
    last = __last[0]
    __last[0] = x
    return last

[__last在函数声明时设置一次,并且由于它是可变的,因此您可以在每次函数调用时对其进行更新,并且更新的值将在两次调用之间保留。

© www.soinside.com 2019 - 2024. All rights reserved.