python基礎與高階特性 七 八 (練習)

2021-09-24 04:31:00 字數 3964 閱讀 9237

一. 記錄日誌裝飾器練習題

好的日誌對乙個軟體的重要性是顯而易見的。如果函式的入口都要寫一行**來記

錄日誌,這種方式實在是太低效了。 那麼請你建立乙個裝飾器, 功能實現函式運

行時自動產生日誌記錄。 日誌格式如下:

程式執行時間 主機短名

程式名稱: 函式[%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...