使用闭包来记住以前的函数调用
using closures to remember previous function calls
我开始了我的一个新项目,我想创建一个函数,我们将其命名为 foo
,它会记住之前对其进行的调用。
因此,例如,如果函数应该 return 最后使用的参数,我们应该这样:
print(foo(2), foo(7), foo('a'))
打印出来:
None 2 7
问题
我们如何创建一个修饰函数,例如 bar
,它打印给定的参数,除非前一个函数调用与前一个函数调用相同,在这种情况下,该函数不打印任何内容,只是 returns None.
我做了什么?
到目前为止,我已经能够创建函数的骨架,如下所示:
@bar
def printer(*args):
print(*args)
并且在 bar 函数中我应该以某种方式检查之前的调用,但我不知道如何!我不想使用全局变量或其他东西,而只使用函数。我假设我需要为 bar
和 foo
函数使用闭包。你能告诉我如何实现它们吗?
注意
这些调用应该是这样的:
printer("a") # prints a
printer("a") # only returns None
printer("a") # only returns None
printer("b") # prints b
printer("a") # prints a
先写一个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
我开始了我的一个新项目,我想创建一个函数,我们将其命名为 foo
,它会记住之前对其进行的调用。
因此,例如,如果函数应该 return 最后使用的参数,我们应该这样:
print(foo(2), foo(7), foo('a'))
打印出来:
None 2 7
问题
我们如何创建一个修饰函数,例如 bar
,它打印给定的参数,除非前一个函数调用与前一个函数调用相同,在这种情况下,该函数不打印任何内容,只是 returns None.
我做了什么?
到目前为止,我已经能够创建函数的骨架,如下所示:
@bar
def printer(*args):
print(*args)
并且在 bar 函数中我应该以某种方式检查之前的调用,但我不知道如何!我不想使用全局变量或其他东西,而只使用函数。我假设我需要为 bar
和 foo
函数使用闭包。你能告诉我如何实现它们吗?
注意 这些调用应该是这样的:
printer("a") # prints a
printer("a") # only returns None
printer("a") # only returns None
printer("b") # prints b
printer("a") # prints a
先写一个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