一. 記錄日誌裝飾器練習題
好的日誌對乙個軟體的重要性是顯而易見的。如果函式的入口都要寫一行**來記
錄日誌,這種方式實在是太低效了。 那麼請你建立乙個裝飾器, 功能實現函式運
行時自動產生日誌記錄。 日誌格式如下:
程式執行時間 主機短名
程式名稱: 函式[%s]執行結果為[%s]
產生的日誌檔案並不直接顯示在螢幕上, 而是儲存在 file.log 檔案中, 便於後期
軟體執行結果的分析。
import time
import os
import sys
defdecorator
(fun)
:def
(*args,
**kwargs)
: result = fun(
*args,
**kwargs)
now_time = time.ctime(
) hostname = os.uname(
).nodename.split(
'.')[0
] process_full_name = sys.ar**[0]
process_name = os.path.split(process_full_name)[-
1]info =
'函式[%s]的執行結果為%s'
%(fun.__name__, result)
log =
' '.join(
[now_time, hostname, process_name, info]
)with
open
('file.log'
, mode=
'a')
as f:
print
(f.write(log)
)return result
@decorator
defroll
(name, age,
**kwargs)
:print
(name, age, kwargs)
roll(name=
'fentiao'
, age=
4, gender =
'male'
)
二. 斐波那契數列的裝飾器練習: 實現快取記憶體遞迴
在數學上,費波那契數列是以遞迴的方法來定義:
用文字來說,就是費波那契數列由 0 和 1 開始,之後的費波那契係數就是由之前的兩數相
加而得出。首幾個費波那契係數是:
0,1,1,2,3,5,8,13,21,34,55,89,144,233…(oeis 中的數列 a000045)
裝飾器 1: 新增快取記憶體的裝飾器 num_cache
如果第一次計算 f(5) = f(4) + f(3) = 5
第二次計算 f(6) = f(5) + f(4)
顯然 f(5)已經計算過了, f(4)也已經計算了, 我們可否新增乙個裝飾器, 專門用
來儲存 費波那契數列已經計算過的快取, 後期計算時, 判斷快取中是否已經計算過了, 如
果計算過,直接用快取中的計算結果. 如果沒有計算過, 則開始計算並將計算的結果儲存在緩
存中.裝飾器 2: 程式執行計時器的裝飾器 timeit
該裝飾器用來測試有無快取記憶體求斐波那契數列, 它們兩者執行的時間效率高低.
「」"
def
num_cache
(fun)
:def
(*args)
: cachelist =
if args not
in cachelist:
result = fun(
*args)
return result
import time
deftimeit
(fun)
:def
(*args,
**kwargs)
: start_time = time.time(
) result = fun(
*args,
**kwargs)
end_time = time.time(
)print
('執行時間為%s'
三.比較版本號
def
compare
(version1, version2)
: version =
input
('請輸入版本號:')if
len(version)!=0
:print
('error,請輸入正確的版本號'
)else
:if version1 > version1:
return
1elif version1 < version2:
return-1
else
:return
0
import itchat
import json
itchat.auto_login(hotreload=
true
)friends = itchat.get_friends(
)with
open
("friends.txt"
,'w'
)as f:
f.write(json.dumps(friends, indent =
2, ensure_ascii=
false))
dict_province =
dict()
for friend in friends:
key = friend[
'province'
] value = friend[
'remmarkname'
]if key not
in dict_province.keys():
dict_province[key]=1
else
: dict_province[key]+=1
key_list =
value_list =
for key, value in dict_province.items():
if key =="":
key =
"其他地區"
python學習 基礎 高階特性
高階特性 print list range 1,100,2 切片 切片 字串,物件,陣列都可以使用 print list range 1,100,2 list1 michael sarah tracy bob jack 取陣列前n個元素 0 n 1 取出前3個元素,如果第乙個索引是0,還可以省略 p...
Python高階特性
l csx sarah tracy bob jack print l 0 l 1 l 2 輸出 csx sarah tracy l 0 3 輸出 csx sarah tracy 如果第乙個索引是0,還可以省略 print l 2 輸出 bob jack print l 2 1 輸出 bob d fo...
Python高階特性
python 高階特性 from collections import iterable from collections import iterator 切片 list切片 l list range 100 print l 0 3 取前3個元素 print l 3 取前3個元素 print l 4...