![](/img/trans.png)
[英]Why is timeit slower when called from a python file with map and a predefined function over being called via cli with map and a lambda expression?
[英]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.