2016-06-13 94 views
-1
import time 

def sleep_dec(function): 
    def wrapper(*args, **kwargs): 
    time.sleep(2) 
    return function(*args, **kwargs) 
    return wrapper 


@sleep_dec 
def countdown(n): 
    while n > 0: 
    print(n) 
    n -= 1 
print(countdown(5)) 

我試圖做一個倒計時功能,但每個輸出之間使用裝飾器睡眠2秒。目前它不工作。我在這裏錯過了什麼?使用python修飾器的定時器倒計時

回答

1
def countdown(n): 
    while n > 0: 
     return n 
     n -= 1 

n -= 1永遠不會到達。實際上,while循環只會迭代一次,你的函數只返回n

您想改爲使用yield

但是,它仍然不起作用。會發生什麼情況是,您將在呼叫countdown前暫停2秒,但不會在每次迭代之間進行。

在該使用情況我甚至不會用一個裝飾,只是默認參數:

def countdown(n, wait=None): 
    while n > 0: 
     if wait: 
      time.sleep(wait) 
     yield n 
     n -= 1 

# no sleep between iterations 
for i in countdown(5): 
    print(i) 

# 2 seconds sleep between every iteration 
for i in countdown(5, wait=2): 
    print(i) 

編輯如果你堅持使用裝飾。請注意,這是次優(並沒有多大意義),我不會在生產代碼中使用它:

import time 

def sleep_dec(function): 
    def wrapper(*args): 
     return function(*args, wait=2) 
    return wrapper 

@sleep_dec 
# it might make more sense to accept **kwargs instead of wait=None 
def countdown(n, wait=None): 
    while n > 0: 
     if wait: 
      time.sleep(wait) 
     yield n 
     n -= 1 

# 2 seconds sleep between each iteration 
for i in countdown(5): 
    print(i) 
+0

感謝您的等待方法......但我特別尋找裝飾方法。 – purple

+0

@purple查看我的更新回答 – DeepSpace

+0

在這個例子中,裝飾者看起來像過度殺傷力。但它的工作原理。 – purple