簡體   English   中英

Python:為什么需要通過lambda函數調用計時器函數?

[英]Python: Why does a timer function need be be called via a lambda function?

我之前有一個錯誤。 (“ NoneType對象不可調用”),我找到了解決問題的方法,而不是直接通過lambda函數調用“ update”函數來調用它。

該代碼每秒打印開始時間10秒鍾,然后更新一次打印時間。

(這是我的一個較大項目的概念證明代碼。我使用此構造來創建一個新的時間戳,在該時間戳上打開日志文件。第二天而不是打開舊的日志文件,而是創建並使用一個新的時間戳每天00:00:00)

now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
delta_t_seconds = 10

def update():
    global now
    now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print "Time updated"
    return

t = timer(delta_t_seconds, lambda: update())
t.start()

while (True):
    print("Time is:" + now)
    time.sleep(1)

我的問題是:為什么我必須通過lambda函數調用它?

t = timer(delta_t_seconds, lambda: update())

而不是直接:

t = timer(delta_t_seconds, update())

調用function2似乎是很愚蠢的,其唯一目的是調用function1。 與直接調用function1相比。

您不需要使用lambda,可以直接傳遞函數:

t = timer(delta_t_seconds, update)

通過執行timer(delta_t_seconds, update()) (請注意額外的括號),可以調用一次update ,它返回None 然后timer嘗試調用None ,這是不可能的( None不可調用),給您遇到的錯誤。

使用t = timer(delta_t_seconds, update()) ,您正在將返回值(首先調用函數以獲取它)而不是函數本身傳遞給timer

如果要將update傳遞給timer ,只需使用t = timer(delta_t_seconds, update) ,則無需使用lambda

你不

update()不是函數,而是對函數的調用。 因此,它在被調用時執行更新。 您需要傳遞一個函數,該函數將是t = timer(delta_t_seconds, update) 請注意update后缺少的括號。

顯然, timer期望第二個參數是可調用的(fx是一個函數),而函數update不會返回可調用的(實際上,它什么也不返回-即None )。 Lambda是從表達式創建可調用對象的一種方法(調用Lambda時會評估表達式)。 請注意,lambda lambda: update()等同於update (即函數對象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM