python習題

rottengeek發表於2019-02-16

裝飾器的使用

使用一個裝飾器,檢視任意函式(除遞迴函式)執行時間(20分)

import time


# --exeTime
def exeTime(func):
    def newFunc(*args, **kwargs):
        t0 = time.time()

        print("@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__))
        back = func(*args, **kwargs)
        print("@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__))
        print("@%.3fs taken for {%s}" % (time.time() - t0, func.__name__))
        return back
    return newFunc


# --end of exeTime

@exeTime
def foo():
    for i in range(10000000):
        pass

if __name__ == "__main__":
    foo()
    
    
    

按時間順序輸出歌詞

musicLrc = “””[00:03.50]傳奇
[00:19.10]作詞:劉兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]
04:40.75[00:36.25]只是因為在人群中多看了你一眼
[04:49.00]
02:47.44再也沒能忘掉你容顏
02:54.83夢想著偶然能有一天再相見
03:02.32從此我開始孤單思念
03:08.15
03:09.35想你時你在天邊
03:16.90想你時你在眼前
03:24.42想你時你在腦海
03:31.85想你時你在心田
03:38.67
04:09.96[01:36.25]寧願相信我們前世有約
04:16.37[01:42.47]今生的愛情故事 不會再改變
04:24.82[01:51.18]寧願用這一生等你發現
04:31.38[01:57.43]我一直在你身旁 從未走遠
04:39.55[02:07.85]
“””


# 方法一
import time
dict1 = {}
list_key = []

music_list1 = musicLrc.splitlines()
for i in music_list1:
    music_list2 = i.split(`]`)  # [`[04:40.75`, `[02:39.90`, `[00:36.25`, `只是因為在人群中多看了你一眼`]
    for j in range(len(music_list2)-1):
        list2 = music_list2[j][1:].split(`:`)   # [1:] 是為了去掉[ 獲得完整時間
        times = float(list2[0])*60 + float(list2[1])
        dict1[times] = music_list2[-1]

d = sorted(dict1.items(), key = lambda x:x[0]) # 返回一個
# print(d)

start_time = time.clock()

for key in d:
    tmp = round(key[0],2)
    tmp_min = tmp//60
    tmp_sec = (tmp//1)%60
    tmp_ms = (tmp*100//1)%100
    while True:
        end_time = time.clock()
        if round(end_time,2) == tmp:
            print(`[%02.0f:%02.0f.%02.0f%s]`%(tmp_min,tmp_sec,tmp_ms,key[1]))
            break
            
            
# 方法二
import time
#通過]來得知總共需要列印多少歌詞
counter = musicLrc.count("]")
#分行切割
list1 = musicLrc.splitlines()
# num是計算打了多少行資料了
num = 0
#標記位
time_self_flag = 0
#開始
start_time = time.clock()

while True:
    end_time = time.clock()
    #獲取分鐘
    end_time_min = end_time//60
    #獲取秒鐘
    end_time_sec = (end_time//1)%60
    #獲取微妙
    end_time_ms = (end_time*100//1)%100
    #將時間按照 [時:分:秒 複製給變數time_self1
    time_self1 = "[%02.0f:%02.0f.%02.0f" % (end_time_min, end_time_sec, end_time_ms)
    #這裡進行判斷,是為了避免在同一時間對所有歌詞判斷多遍
    if time_self1 != time_self_flag:
        time_self_flag = time_self1
        # print(time_self1)
        for i in list1:
            list2 = i.split("]")
            for j in list2:
                #時間戳 與 歌詞時間進行對比,相同則列印,不同則推出
                if j == time_self1:
                   print(j+"]"+list2[-1])
                   num += 1
                   break
    #列印完所有歌詞,則退出while迴圈
    if num == counter:
        break

相關文章