裝飾器 裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。 先看簡單例子: 現有一個新的需求,希望可以記錄下函數的運行時間,需要在代碼中計算時間的代碼: login()等多個函數也有類型的需求,怎麼做?若在每個函數內都寫一 ...
裝飾器
裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。
先看簡單例子:
def run(): time.sleep(1) print('run....')
現有一個新的需求,希望可以記錄下函數的運行時間,需要在代碼中計算時間的代碼:
def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() print('run time', end_time - start_time)
login()等多個函數也有類型的需求,怎麼做?若在每個函數內都寫一個開始、結束時間,然後再算差值,這樣代碼就冗餘了,可以定義一個函數,專門計算執行時間,再執行真的業務代碼,如下:
def timer(func): #計算時間 start_time = time.time() func() end_time = time.time() print('run time', end_time - start_time) def run(): #業務代碼 time.sleep(1) print('run....') timer(run)
以上代碼邏輯不能理解,但這樣的話,每次都將一個函數作為參數傳遞給timer()函數,而且這種方式已經破壞了原有的代碼邏輯結構,之前執行業務邏輯時,執行運行run(),但現在不得不運行timer()。使用裝飾器,可以解決以上問題。
簡單裝飾器
def timer(func): #計算時間 def deco(*args, **kwargs): #可以傳參 start_time = time.time() func(*args, **kwargs) #函數調用 end_time = time.time() print('run time', end_time - start_time) return deco #return 函數名,函數即變數 def run(): #業務代碼 time.sleep(1) print('run....') run = timer(run) #run相當於deco run() #run調用相當於deco()
函數即變數,在python裡面的函數就是一個變數、函數名就是一個變數,這個函數名存放的是這個函數的記憶體地址,它把函數體放到記憶體里,在調用的時候從函數名裡面的這個記憶體地址找到函數體然後運行這個函數。函數名後面加上小括弧就是調用這個函數,如果只寫這個函數名的話,列印一下就是這個函數的記憶體地址。
函數timer就是裝飾器,它把執行真正業務方法的func包裹在函數裡面,看起來像run被timer裝飾了。繼續演變如下:
def timer(func): #計算時間 def deco(*args, **kwargs): #可以傳參 start_time = time.time() func(*args, **kwargs) #函數調用 end_time = time.time() print('run time', end_time - start_time) return deco #return 函數名,函數即變數 @timer #使用 @ 形式將裝飾器附加到函數上時,就會調用此方法.timer(func) 返回的是函數名deco,所以run== deco,函數名即變數,此時run的代碼已更新,func() = run之前的代碼 def run(): #業務代碼 time.sleep(1) print('run....')
run()
run()函數更新後代碼如下:其實run的代碼並沒有直接改動,只是調用裝飾器時,run的代碼進行了更新。
def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() print('run time', end_time - start_time)
python 內置函數
print(all([1, 2, 3, 0, 11, -1])) #判斷可迭代對象裡面的值是否都為真,有一個為假即為False,非空即真非0即真 print(any([0, 1, 2])) #判斷可迭代對象裡面的值是否有一個為真,即為True print(bin(10)) #將十進位轉換為二進位 print(bool('sdf')) #將一個對象轉換為布爾類型 func = '' print(callable(func)) #判斷傳入的對象是否可調用,func為變數不可調用,即返回False def adf(): pass print(callable(adf)) #判斷傳入的對象是否可調用,adf為方法即可調用,即返回True print(chr(98)) #列印數字對應的ASCII碼,98=b print(ord('a')) #列印字元串對應的ASCII碼, a=97 print(dict(a=1, b=2)) #轉換成字典,{'b': 2, 'a': 1} #print(eval('[a=1]')) print(exec('def a():pass')) #執行python代碼,只能執行簡單的,定義數據類型和運算 def func(num): name = '88' print(locals()) print(globals()) return num print(list(filter(func, [0, 1, 2, 3, 4]))) #在python3裡面這麼用是沒問題 filter(func, [1, 2, 3, 4]) #根據前面的函數處理邏輯,依次處理後面可迭代對象裡面的每個元素,返回true保存 print(list(map(func, [0, 1, 2, 3, 4]))) #根據前面的函數處理邏輯,依次處理後面可迭代對象裡面的每個元素,保存前面函數返回的所有結果 </span> print(globals()) #返回程式內所有的變數,返回的是一個字典,函數裡面的局部變數不會返回 print(locals()) #返回局部變數 print(hex(111)) #數字轉成16進位 print(max(111, 12, 13, 14, 16, 19)) #取最大值 print(oct(111)) #把數字轉換成8進位 print(round(11.1198, 2)) #取幾位小數,會四捨五入 print(sorted([2, 31, 34, 6, 1, 23, 4], reverse=False))#排序
dic={1:2,3:4,5:6,7:8} print(sorted(dic.items())) #按照字典的key排序,[(1, 2), (3, 4), (5, 6), (7, 8)] print(sorted(dic.items(), key=lambda x:x[1])) #按照字典的value排序 import time #導入一個模塊 import sys print(sys.path) #查看系統環境變數有哪些目錄 sys.path.append(r'E:\python_workspace\base-code') #將base-code下的代碼添加到環境變數,允許python xxx.py就不報錯 from day4.day5_test import hhh hhh() #直接右鍵允許不報錯,使用python model2.py允許時報錯,找不到day4模塊No module named 'day4'
random 模塊
import random print(random.randint(1, 20)) #在1-19之間隨機生成一個整數,隨機 print(random.choice('abs123')) #隨機取一個元素,隨機可迭代對象:字元串、字典、list、元組 print(random.sample('abcdfgrtw12', 3)) #隨機取幾個元素,3是長度,['2', 'a', 'b'],返回結果是list類型 print(random.uniform(1, 9)) #隨機浮點數,隨機取1-9之間的浮點數,可指定範圍,5.8791750348305625 print(random.random()) #隨機0-1的浮點數,0.9465901444615425 random.shuffle([1, 2, 3, 4, 5, 6]) #隨機打亂list的值,只能是list
JSON函數
使用 JSON 函數需要導入 json 庫:import json。
函數 | 描述 |
json.dumps | 將字典轉換為json串 |
json.dump | 將字典轉換的json串寫入文件 |
json.loads | 將json串轉換為字典 |
json.load | 從文件中讀取json數據,然後轉換為字典 |
舉例說明,如下:
a.json內容格式:
{"car":{"price":1100,"color":"red"},"mac":{"price":7999,"color":"black"},"abc":{"price":122,"color":"green"}}
json.load()
import json with open('a.json') as fp: shop_dic = json.load(fp) #從a.json文件內讀取數據,返回結果為字典:{'abc': {'price': 122, 'color': 'green'}, 'mac': {'price': 7999, 'color': 'black'}, 'car': {'price': 1100, 'color': 'red'}} print(shop_dic)
json.loads()
s_json = '{"name":"niuniu","age":20,"status":true}' print(json.loads(s_json)) #將json串轉換為字典:{'age': 20, 'status': True, 'name': 'niuniu'}
json.dump()
import json with open('a.json', 'a+') as fp: dic = {'name': 'niuniu', 'age': 18} fp.seek(0) fp.truncate() json.dump(dic, fp) #將字典轉換為json串寫入文件
寫入的a.json如下:
{"age": 18, "name": "niuniu"}
json.dumps()
import json dic = {'name': 'niuniu', 'age': 18} print(json.dumps(dic)) #將字典轉換為json串:{"name": "niuniu", "age"