我已經(jīng)開始了一個新項目,我想創(chuàng)建一個函數(shù),我們將其命名為foo,它會記住之前對其進行的調(diào)用。因此,如果函數(shù)應該返回最后使用的參數(shù),我們應該這樣:print(foo(2), foo(7), foo('a'))打印出:None 2 7問題我們?nèi)绾蝿?chuàng)建一個裝飾器函數(shù),例如調(diào)用bar它打印給定的參數(shù),除非前一個函數(shù)調(diào)用與前一個相同,在這種情況下,該函數(shù)不打印任何內(nèi)容,只是返回 None 。我設法做了什么?到目前為止,我已經(jīng)能夠創(chuàng)建該函數(shù)的框架,如下所示:@bardef printer(*args): print(*args)在 bar 函數(shù)中,我應該以某種方式檢查之前的調(diào)用,但我不知道如何!我不想使用全局變量或其他東西,而只想使用函數(shù)。bar我假設我需要對and函數(shù)使用閉包foo。你能告訴我如何實施它們嗎?注意 ,這些調(diào)用應該發(fā)生以下情況:printer("a") # prints aprinter("a") # only returns None printer("a") # only returns Noneprinter("b") # prints bprinter("a") # prints a
1 回答

有只小跳蛙
TA貢獻1824條經(jīng)驗 獲得超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
現(xiàn)在您知道您希望裝飾器做什么。
def bar(f):
def bar(arg, prev=[]):
if arg in prev[-1:]:
return None
else:
prev.append(arg)
return(f(arg))
return bar
現(xiàn)在重新定義foo沒有內(nèi)存,但包裹在裝飾器中:
@bar
def foo(arg):
return arg
>>> print(foo(1), foo(2), foo(2), foo(3))
1 2 None 3
添加回答
舉報
0/150
提交
取消