一、裝飾器簡介
1、什麼是裝飾器
裝飾器本質就是函式,為其他函式新增附加功能
2、原則:
(1)、不修改被修飾函式的源**
(2)、不修改被修飾函式的呼叫方式
開放封閉原則,程式上線後,就不應該更改內部源**。
3、裝飾器知識儲備
裝飾器 = 高階函式 + 函式巢狀 + 閉包
高階函式:
(1)、函式接收的引數是乙個函式名
(2)、函式的返回值是乙個函式名
(3)、滿足以上任意乙個條件,都可以稱之為高階函式
函式巢狀:
(1)、函式中呼叫另乙個函式
(2)、函式中巢狀函式
閉包:#閉包的意義:返回的函式物件,不僅僅是乙個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域
#應用領域:延遲計算(原來我們是傳參,現在我們是包起來)
#練習練習:嘗試使用高階函式來完成功能
import
time
#第一種
#def foo():
## 原有的函式功能
#time.sleep(2)
#print('from foo~')
#return##
def timer(func):
## 高階函式之引數為函式名
#star_time = time.time()
#func()
#stop_time = time.time()
#print("函式的執行時間為 %s" %(stop_time - star_time) )##
timer(foo) # 這種可以實現,但是更改了函式的執行方式##
第二種#
def foo():
## 原有的函式功能
#time.sleep(2)
#print('from foo~')
#return##
def timer(func):
## 高階函式之引數為函式名and返回值也是函式
#star_time = time.time()
#func()
#stop_time = time.time()
#print("函式的執行時間為 %s" % (stop_time - star_time))
#return func
#foo = timer(foo)# 這種雖然沒有更改呼叫方式,也算是實現了,但是 該功能函式被呼叫了兩次。
#foo()
#練習:嘗試融合使用
#import time
#def timer(func):##
star_time = time.time()
#res = func(*args,**kwargs) # 就是在執行test() 引數怎麼接收的怎麼傳入
#stop_time = time.time()
#print('函式的執行時間是%s '%(stop_time-star_time))
#return res##
#@timer
#def foo():
#time.sleep(2)
#print("來自foo~")##
foo()
## 如果foo 加引數##
def foo(name,age):
#time.sleep(2)
#print("來自foo~")
#print('我是 %s,我的年紀是%d。'%(name,age))
#return##
foo('吳克群',40)
#補充,解壓序列
#1、不使用索引,拿到列表首尾的值 與 去除首尾後的值
#li = [1,2,3,4,5,6,7,8]
#a,*_,c = li # 拿列表的第一位 和最後一位
#print(a,c)
#a,*d,c = li # 拿到去除首尾 中間的值。 *後面只是用於接收引數的變數。
#print(d)
#2、變數交換
#a = 1
#b = 2
#a, b = b, a # 就等於把a的值給b,b的值給a
python簡易裝飾器 python裝飾器簡單理解
裝飾器定義 1 把乙個函式名當作實參傳給另外乙個函式 在不修改裝飾函式源 的情況下為其新增功能 2 返回值中包含函式名 不改變函式呼叫方式 源 1 deff 2 deff 3 time.sleep 2 4 print i am f 5 加基本計算程式執行時間函式 1 deff 2 print i a...
python之裝飾器篇
一.基本裝飾器 基本裝飾器的作用 在不改變原函式的基礎上,通過裝飾器,給原函式新增某些功能 實現方法 在原函式上加 裝飾器名字 其中 叫做語法糖 定義裝飾器 第一層函式傳入引數 用於傳入原函式 第二層使用原函式的同時,加入需要新增的功能 第一層函式要返回第二層函式名 整個函式形成閉包 import ...
python之裝飾器的學習
遇到問題 1 函式帶括號與不帶括號的區別 加括號是執行函式 呼叫的是函式的return結果 不加括號是函式索引 呼叫的是函式本身 2 函式中 args和 kwargs所代表的意義 python函式中 args和 kwargs是用來傳遞變長引數的用法。單星號形式 args 用來傳遞非命名鍵可變引數列表...