裝飾器本質上是一個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相当于decorun() #run调用相当于deco()
函數即變量,在python裡面的函數就是一個變數、函數名稱就是一個變量,這個函數名稱存放的是這個函數的記憶體位址,它把函數體放到記憶體裡,在呼叫的時候從函數名稱裡面的這個記憶體位址找到函數體然後運行這個函數。函數名稱後面加上小括號就是呼叫這個函數,如果只寫這個函數名稱的話,列印一下就是這個函數的記憶體位址。
函數timer就是一個裝飾器,它把執行真正業務方法的func包裹在函數裡面,看起來像run被timer裝飾了。繼續演變如下:
timer(func): deco(*args, **kwargs): start_time =*args, **kwargs) end_time =(, end_time - deco @timer run(): time.sleep(1() 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)
print(all([1, 2, 3, 0, 11, -1])) #判断可迭代对象里面的值是否都为真,有一个为假即为False,非空即真非0即真print(any([0, 1, 2])) #判断可迭代对象里面的值是否有一个为真,即为Trueprint(bin(10)) #将十进制转换为二进制print(bool('sdf')) #将一个对象转换为布尔类型func = ''print(callable(func)) #判断传入的对象是否可调用,func为变量不可调用,即返回Falsedef adf():passprint(callable(adf)) #判断传入的对象是否可调用,adf为方法即可调用,即返回Trueprint(chr(98)) #打印数字对应的ASCII码,98=bprint(ord('a')) #打印字符串对应的ASCII码, a=97print(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 numprint(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 sysprint(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'
import randomprint(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.8791750348305625print(random.random()) #随机0-1的浮点数,0.9465901444615425random.shuffle([1, 2, 3, 4, 5, 6]) #随机打乱list的值,只能是list
使用JSON 函數需要匯入json 函式庫:import json。
函數 | 描述 |
#json.dumps | 將字典轉換為json字串 |
json.dump | 將字典轉換的json字串寫入檔案 |
json.loads | 將json字串轉換為字典 |
json.load | 從檔案讀取json數據,然後轉換為字典 |
{"car":{"price":1100,"color":"red"},"mac":{"price":7999,"color":"black"},"abc":{"price":122,"color":"green"}}
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)
s_json = '{"name":"niuniu","age":20,"status":true}'print(json.loads(s_json)) #将json串转换为字典:{'age': 20, 'status': True, 'name': 'niuniu'}
import json with open('a.json', 'a+') as fp: dic = {'name': 'niuniu', 'age': 18} fp.seek(0) fp.truncate() json.dump(dic, fp) #将字典转换为json串写入文件
{"age": 18, "name": "niuniu"}
import json dic = {'name': 'niuniu', 'age': 18}print(json.dumps(dic)) #将字典转换为json串:{"name": "niuniu", "age"
#
以上是python中裝飾器、內建函數、json的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!