背景
今天在B站上看有關 Python 最火的一個教學視頻,零基礎入門學習 Python,這也是我們 Python基礎刻意練習活動 的推薦視頻教程。
在學習魔法方法的時候,有一節視頻是製作一個簡單的定時器,基本要求如下:
- 定製一個計時器的類。
start
和stop
方法代表啓動計時和停止計時。- 假設計時器對象
t1
,print(t1)
和直接調用t1
均顯示結果。 - 當計時器未啓動或已經停止計時時,調用
stop
方法會給予溫馨的提示。 - 兩個計時器對象可以進行相加:
t1+t2
。 - 只能使用提供的有限資源完成。
技術分析
Python 的time
模塊中,時間表現的格式主要有三種:
timestamp
時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。struct_time
時間元組,共有九個元素組。format time
格式化時間,用格式化的結構使時間更具可讀性。包括自定義格式和固定格式。
獲取時間戳
time.time()
返回當前時間的時間戳(1970紀元後經過的浮點秒數)。
import time
ticks = time.time()
print('當前時間戳爲:', ticks) # 當前時間戳爲: 1570793479.162907
獲取當前時間元組
time.localtime([sec])
格式化時間戳爲本地的時間。 如果sec
參數未輸入,則以當前時間爲轉換標準。
import time
localtime = time.localtime(time.time())
print("本地時間爲 :", localtime)
# 本地時間爲 : time.struct_time(tm_year=2019, tm_mon=10, tm_mday=11, tm_hour=19, tm_min=35, tm_sec=31, tm_wday=4, tm_yday=284, tm_isdst=0)
tm_year
:4位數年tm_mon
:月tm_mday
:日tm_hour
:小時tm_min
:分鐘tm_sec
:秒tm_wday
:一週的第幾日,0到6 (0是週一)tm_yday
:一年的第幾日tm_isdst
:夏令時,值有:1(夏令時)、0(不是夏令時)、-1(未知),默認 -1
獲取格式化的時間
time.asctime([tupletime])
接受時間元組並返回一個可讀的形式。
import time
t = time.localtime()
print("本地時間爲 : %s " % time.asctime(t))
# 本地時間爲 : Fri Oct 11 19:42:34 2019
格式化時間
time.strftime(format[,tupletime])
接收以時間元組,並返回以可讀字符串表示的當地時間,格式由format決定。time.strptime(str,format='%a %b %d %H:%M:%S %Y')
根據format的格式把一個時間字符串解析爲時間元組。time.mktime(tupletime)
接受時間元組並返回時間戳(1970紀元後經過的浮點秒數)。
import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 2019-10-11 19:48:31
print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
# Fri Oct 11 19:48:31 2019
a = "Fri Oct 11 19:48:31 2019"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))
# 1570794511.0
%y
兩位數的年份表示(00-99)%Y
四位數的年份表示(000-9999)%m
月份(01-12)%d
月內中的一天(0-31)%H
24小時制小時數(0-23)%I
12小時制小時數(01-12)%M
分鐘數(00=59)%S
秒(00-59)%a
本地簡化星期名稱%A
本地完整星期名稱%b
本地簡化的月份名稱%B
本地完整的月份名稱%c
本地相應的日期表示和時間表示%j
年內的一天(001-366)%p
本地A.M.或P.M.的等價符%U
一年中的星期數(00-53)星期天爲星期的開始%w
星期(0-6),星期天爲星期的開始%W
一年中的星期數(00-53)星期一爲星期的開始%x
本地相應的日期表示%X
本地相應的時間表示%Z
當前時區的名稱%%
%號本身
Time 模塊
time.gmtime([secs])
接收時間戳(1970紀元後經過的浮點秒數)並返回格林威治天文時間下的時間元組。time.ctime([secs])
把一個時間戳(按秒計算的浮點數)轉化爲time.asctime()
的形式,作用相當於asctime(localtime(secs))
,未給參數相當於asctime()
。time.sleep(secs)
推遲調用線程的運行,secs指秒數。
代碼實現
import time
class Mytime(object):
def __init__(self):
self.__info = '未開始計時!'
self.__begin = None
self.__end = None
self.__jg = 0
def __str__(self):
return self.__info
def __repr__(self):
return self.__info
def start(self):
print('計時開始...')
self.__begin = time.localtime()
def stop(self):
if not self.__begin:
print('提示:請先調用start()開始計時!')
return
self.__end = time.localtime()
self.__jg = time.mktime(self.__end) - time.mktime(self.__begin)
self.__info = '共運行了%d秒' % self.__jg
print('計時結束!')
return self.__jg
def __add__(self, other):
return '共運行了%d秒' % (other.__jg + self.__jg)
t1 = Mytime()
print(t1)
# 未開始計時!
t1.stop()
# 提示:請先調用start()開始計時!
t1.start()
# 計時開始...
time.sleep(5)
t1.stop()
# 計時結束!
print(t1)
# 共運行了5秒
t2 = Mytime()
t2.start()
# 計時開始...
time.sleep(7)
t2.stop()
# 計時結束!
print(t2)
# 共運行了7秒
print(t1 + t2)
# 共運行了12秒
總結
這個題目讓我們熟悉了 Python 中time
模塊的使用方法,以及類的定義和類中的一系列魔法方法,如__init__
、__str__
、__repr__
、__add__
等等,Python 的魔法方法很是神奇啊,把面向對象中的構造函數、析構函數、運算符的重載等全部包含了進去。需要好好體會才能把這塊的知識學好。今天就這樣吧!See You!
參考文獻
- https://www.bilibili.com/video/av4050443
- https://www.cnblogs.com/lichunl/p/9098024.html
相關圖文: