5.3 项目:超级秒表
假設要記錄在沒有自動化的枯燥任務上花了多少時間。你沒有物理秒表,要為
筆記本或智能手機找到一個免費的秒表應用,沒有廣告,且不會將你的瀏覽歷史發送給市場營銷人員,又出乎意料地困難(在你同意的許可協議中,它說它可以這樣做。你確實閱讀了許可協議,不是嗎?)。你可以自己用?
Python 寫一個簡單的秒表程序。
總的來說,你的程序需要完成:
? ? ?記錄從按下回車鍵開始,每次按鍵的時間,每次按鍵都是一個新的“單圈”。
? ? ?打印圈數、總時間和單圈時間。
這意味著代碼將需要完成以下任務:
? ? ?在程序開始時,通過調用 time.time()得到當前時間,將它保存為一個時間戳。在每個單圈開始時也一樣。
? ? ?記錄圈數,每次用戶按下回車鍵時加 1。
? ? ?用時間戳相減,得到計算流逝的時間。
? ? ?處理 KeyboardInterrupt 異常,這樣用戶可以按Ctrl-C 退出。打開一個新的文件編輯器窗口,并保存為 stopwatch.py。
第 1 步:設置程序來記錄時間
秒表程序需要用到當前時間,所以要導入的 time?
模塊。程序在調用input()之前,也應該向用戶打印一些簡短的說明,這樣計時器可以在用戶按下回車鍵后開始。然后,代碼將開始記錄單圈時間。在文件編輯器中輸入以下代碼,為其余的代碼編寫 TODO?
注釋,作為占位符:
#! ?python3
# ?stopwatch.py ?- ?A ?simple ?stopwatch ?program. import ?time
# ?Display ?the ?program's ?instructions.
print('Press ?ENTER ?to ?begin. ?Afterwards, ?press ?ENTER ?to ?"click" ?the ?stopwatch. Press ?
Ctrl-C ?to ?quit.')
input() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# ?press ?Enter ?to ?begin print('Started.')
startTime ?= ?time.time() ? ? ? ? # ?get ?the ?first ?lap's ?start ?time lastTime ?= ?startTime
lapNum ?= ?1
# ?TODO: ?Start ?tracking ?the ?lap ?times.
既然我們已經編碼顯示了用戶說明,那就開始第一圈,記下時間,并將圈數設為 1。
第 2 步:記錄并打印單圈時間
現在,讓我們編碼開始每一個新的單圈,計算前一圈花了多少時間,并計算自啟動秒表后經過的總時間。我們將顯示的單圈時間和總時間,為每個新的單圈增加圈計數。將下面的代碼添加到程序中:
#! ?python3
# ?stopwatch.py ?- ?A ?simple ?stopwatch ?program. import ?time
--snip--
# ?Start ?tracking ?the ?lap ?times.
? ?try:
? ? ? ? ? ?while ?True: input()
? ? ? ? ? ? ? ? ? ? ? lapTime ?= ?round(time.time() ?- ?lastTime, ?2)
? ? ? ? ? ? ? ? ? ? ? totalTime ?= ?round(time.time() ?- ?startTime, ?2)
? ? ? ? ? ? ? ? ? ? ? print('Lap ?#%s: ?%s ?(%s)' ?% ?(lapNum, ?totalTime, ?lapTime), ?
end='') lapNum ?+= ?1
lastTime ?= ?time.time() ?# ?reset ?the ?last ?lap ?time
? ?except ?KeyboardInterrupt:
# ?Handle ?the ?Ctrl-C ?exception ?to ?keep ?its ?error ?message ?from ?displaying.?
print('\nDone.')
如果用戶按 Ctrl-C 停止秒表,KeyboardInterrupt 異常將拋出,如果程序的執行不是一個 try 語句,就會崩潰。為了防止崩潰,我們將這部分程序包裝在一個 try?
語句中?。我們將在 except 子句中處理異常?,所以當 Ctrl-C 按下并引發異常時,程序執行轉向 except 子句,打印Done,而不是?
KeyboardInterrupt 錯誤消息。在此之前,執行處于一個無限循環中?,調用?
input()并等待,直到用戶按下回車鍵結束一圈。當一圈結束時,我們用當前時間time.time()減去該圈開始的時間?
lastTime,計算該圈花了多少時間?。我們用當前時間減去秒表最開始啟動的時間 startTime,計算總共流逝的時間?。
由于這些時間計算的結果在小數點后有許多位(如 4.766272783279419),所以我們在?和?行用?
round()函數,將浮點值四舍五入到小數點后兩位。
在?行,我們打印出圈數,消耗的總時間和單圈時間。由于用戶為 input()調用按下回車時,會在屏幕上打印一個換行,所以我們向 print()函數傳入?
end='',避免輸出重復空行。打印單圈信息后,我們將計數器 lapNum 加 1,將 lastTime 設置為當前時間(這就是下一圈的開始時間),從而為下一圈做好準備。
第 3 步:類似程序的想法
時間追蹤為程序打開了幾種可能性。雖然可以下載應用程序來做其中一些事情,但自己編程的好處是它們是免費的,而且不會充斥著廣告和無用的功能。可以編寫類似的程序來完成以下任務:
? ? ?創建一個簡單的工時表應用程序,當輸入一個人的名字時,用當前的時間記錄下他們進入或離開的時間。
? ? ?為你的程序添加一個功能,顯示自一項處理開始以來的時間,諸如利用 requests
模塊進行的下載(參見第 11 章)。
? ? ?間歇性地檢查程序已經運行了多久,并為用戶提供了一個機會,取消耗時太長的任務。
?
總結
以上是生活随笔為你收集整理的5.3 项目:超级秒表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tga缩略图预览_甜蜜的缩略图预览库
- 下一篇: 《区块链工程技术人员等职业信息》