为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-07-05 15:40:00
我已经开始了一个新项目,我想创建一个函数,我们将其命名为foo,它会记住之前对其进行的调用。因此,如果函数应该返回最后使用的参数,我们应该这样:print(foo(2), foo(7), foo('a'))打印出:None 2 7问题我们如何创建一个装饰器函数,例如调用bar它打印给定的参数,除非前一个函数调用与前一个相同,在这种情况下,该函数不打印任何内容,只是返回 None 。我设法做了什么?到目前为止,我已经能够创建该函数的框架,如下所示:@bardef printer(*args):    print(*args)在 bar 函数中,我应该以某种方式检查之前的调用,但我不知道如何!我不想使用全局变量或其他东西,而只想使用函数。bar我假设我需要对and函数使用闭包foo。你能告诉我如何实施它们吗?注意 ,这些调用应该发生以下情况:printer("a")  # prints aprinter("a")  # only returns None printer("a")  # only returns Noneprinter("b")  # prints bprinter("a")  # prints a
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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没有内存,但包裹在装饰器中:


@bar

def foo(arg):

    return arg


>>> print(foo(1), foo(2), foo(2), foo(3))

1 2 None 3



查看完整回答
反对 回复 2023-07-05
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信