技術圖文:如何利用 Python 做一個簡單的定時器類?

背景

今天在B站上看有關 Python 最火的一個教學視頻,零基礎入門學習 Python,這也是我們 Python基礎刻意練習活動 的推薦視頻教程。

python視頻

在學習魔法方法的時候,有一節視頻是製作一個簡單的定時器,基本要求如下:

  • 定製一個計時器的類。
  • startstop方法代表啓動計時和停止計時。
  • 假設計時器對象t1print(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

相關圖文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章