使用闭包来记住以前的函数调用

我已经开始了一个新项目,我想创建一个函数,我们将其命名为foo,它会记住之前对其进行的调用。


因此,如果函数应该返回最后使用的参数,我们应该这样:


print(foo(2), foo(7), foo('a'))

打印出:


None 2 7

问题

我们如何创建一个装饰器函数,例如调用bar它打印给定的参数,除非前一个函数调用与前一个相同,在这种情况下,该函数不打印任何内容,只是返回 None 。


我设法做了什么?

到目前为止,我已经能够创建该函数的框架,如下所示:


@bar

def printer(*args):

    print(*args)

在 bar 函数中,我应该以某种方式检查之前的调用,但我不知道如何!我不想使用全局变量或其他东西,而只想使用函数。bar我假设我需要对and函数使用闭包foo。你能告诉我如何实施它们吗?


注意 ,这些调用应该发生以下情况:


printer("a")  # prints a

printer("a")  # only returns None 

printer("a")  # only returns None

printer("b")  # prints b

printer("a")  # prints a


暮色呼如
浏览 105回答 1
1回答

有只小跳蛙

foo首先编写一个您希望装饰器生成的版本,例如def foo(arg, prev=[]):    if arg in prev[-1:]:        return None    else:        prev.append(arg)        return arg>>> print(foo(1), foo(2), foo(2), foo(3))1 2 None 3现在您知道您希望装饰器做什么。def bar(f):    def bar(arg, prev=[]):        if arg in prev[-1:]:            return None        else:            prev.append(arg)            return(f(arg))    return bar现在重新定义foo没有内存,但包裹在装饰器中:@bardef foo(arg):    return arg>>> print(foo(1), foo(2), foo(2), foo(3))1 2 None 3
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python