python进阶(小白也能看懂)——装饰器浅谈(一)
生活随笔
收集整理的這篇文章主要介紹了
python进阶(小白也能看懂)——装饰器浅谈(一)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
python進(jìn)階(小白也能看懂)——裝飾器(一)
第四篇
文章目錄
- python進(jìn)階(小白也能看懂)——裝飾器(一)
- 1.函數(shù)基礎(chǔ)知識
- 例子1.1
- 例子1.2
- 例子1.3
- 例子1.4
- 2.不帶參數(shù)的裝飾器
- 3.帶參數(shù)的裝飾器
- 參考
1.函數(shù)基礎(chǔ)知識
談裝飾器前,先了解一下函數(shù)的基礎(chǔ)知識
例子1.1
## 定義加法函數(shù) def add_a_b(a, b):print(a+b) ## 將該加法函數(shù)賦給t,這樣t也就是一個函數(shù)了,擁有加法功能 t = add_a_b t(1,2)""" 3 """例子1.2
# 在函數(shù)內(nèi)部定義函數(shù) def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 調(diào)用inner函數(shù),且只能在ouer函數(shù)里面調(diào)用innerinner()outer() """ I'm in outer I'm in inner of outer """ inner() """ NameError: name 'inner' is not defined """例子1.3
# 函數(shù)中將另一個函數(shù)作為返回值返回 def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 調(diào)用inner函數(shù),且只能在ouer函數(shù)里面調(diào)用innerreturn inner# 這里p相當(dāng)于inner p = outer() p()""" I'm in outer I'm in inner of outer """例子1.4
import timedef runningtime(func):def wrapper(*args, **kwargs):## 添加計時功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("運(yùn)行完{}花費(fèi)了{(lán)}秒".format(func.__name__, interval))return wrapperdef add_a_b(a, b):print(a+b)## equipped_func接收從runningtime返回的函數(shù) equipped_func = runningtime(add_a_b) equipped_func(1000,54489)""" 55489 運(yùn)行完add_a_b花費(fèi)了0.0009965896606445312秒 """2.不帶參數(shù)的裝飾器
所謂裝飾器是作用在函數(shù)身上的,主要是豐富函數(shù)的功能,并且非常方便。
假設(shè)我們寫了10000個函數(shù),我們想測試運(yùn)行每個函數(shù)所需要的時間,那么可以用裝飾器添加計算時間的功能:
與例子1.4對比不難發(fā)現(xiàn)在函數(shù)前面加上@runningtime的作用就相當(dāng)于function = runningtime(function)。
3.帶參數(shù)的裝飾器
from functools import wraps import time## 帶參數(shù)的裝飾器 def logging(logfile):def runningtime(func):@wraps(func)def wrapper(*args, **kwargs):## 添加計時功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("運(yùn)行完{}花費(fèi)了{(lán)}秒".format(func.__name__, interval))## 將日志寫入日志文件中with open(logfile,'a') as f:f.write(str(interval)+'\n')return wrapperreturn runningtime@logging('test.txt') def add_a_b(a, b):print(a+b)add_a_b(1000,54489)""" 55489 運(yùn)行完add_a_b花費(fèi)了0.0030028820037841797秒 """在這里,帶參數(shù)的裝飾器起的作用相當(dāng)于function = logging('test.txt')(function)
參考
定義一個帶參數(shù)的裝飾器
總結(jié)
以上是生活随笔為你收集整理的python进阶(小白也能看懂)——装饰器浅谈(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python进阶(小白也能看懂)——Ma
- 下一篇: 高斯判别分析(GDA)和朴素贝叶斯(NB