日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python储备知识与装饰器

發布時間:2025/3/20 python 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python储备知识与装饰器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

儲備知識:

1、 *args, **kwargs

def index(x,y):print(x,y)def wrapper(*args,**kwargs):index(*args,**kwargs) #wrapper(222,111)

2、名稱空間與作用域:名稱空間的的"嵌套"關系是在函數定義階段,即會檢測語法的錯誤

def func():print(x)x = 111func()

3、函數對象:

  • 可以把函數當做參數傳入
  • 可以把函數當做返回值返回
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def func():print(x) x = 111def index():return 123def foo(func):return funcfoo(index)

4、函數的嵌套定義:

def outter(func):def wrapper():passreturn wrapper 

閉包函數

def outter():x = 0def wrapper():nonlocal xx += 1return xreturn wrapperwrapper = outter() print(wrapper())

傳參的方式一:通過參數的形式為函數體傳值

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def wrapper(x):print(1)print(2)print(3)xwrapper(1) wrapper(2) wrapper(3

傳參的方式二:通過閉包的方式為函數體傳值

def outter(x):def wrapper():print(1)print(2)print(3)xreturn wrapperwrapper=outter(1) print(wrapper())

裝飾器:裝飾器指的定義一個函數,該函數是用來為其他函數添加額外的功能

開放封閉原則

  • 開放:指的是對拓展功能是開放的
  • 封閉:指的是對修改源代碼是封閉的
# 需求:在不修改index函數的源代碼以及調用方式的前提下為其添加統計運行時間的功能 def index(x,y):time.sleep(3)print('index %s %s' %(x,y))index(111,222)

解決方案一:失敗

問題:沒有修改被裝飾對象的調用方式,但是修改了其源代碼

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y):start=time.time()time.sleep(3)print('index %s %s' %(x,y))stop = time.time()print(stop - start)index(111,222)

解決方案二:失敗
問題:沒有修改被裝飾對象的調用方式,也沒有修改了其源代碼,并且加上了新功能
但是代碼冗余

import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))start=time.time() index(111,222) stop=time.time() print(stop - start)start=time.time() index(111,222) stop=time.time() print(stop - start)

解決方案三:失敗

問題:解決了方案二代碼冗余問題,但帶來一個新問題即函數的調用方式改變了

import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))def wrapper():start=time.time()index(111,222)stop=time.time()print(stop - start)wrapper()

方案三的優化一:將index的參數寫活了

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def wrapper(*args,**kwargs):start=time.time()index(*args,**kwargs) stop=time.time()print(stop - start)wrapper(3333,4444,5555)

方案三的優化二:在優化一的基礎上把被裝飾對象寫活了,原來只能裝飾index

import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()func(*args,**kwargs) stop=time.time()print(stop - start)return wrapperindex=outter(index) home=outter(home)

方案三的優化三:將wrapper做的跟被裝飾對象一模一樣,以假亂真

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapperhome=outter(home)

語法糖:在被裝飾對象正上方的單獨一行寫@裝飾器名字

import time # 裝飾器 def timmer(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapper@timmer def index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))@timmer def home(name):time.sleep(2)print('welcome %s to home page' %name)index(x=1,y=2,z=3) home('egon')

總結無參裝飾器模板

def outter(func):def wrapper(*args,**kwargs):# 1、調用原函數# 2、為其增加新功能res=func(*args,**kwargs)return resreturn wrapper

總結

以上是生活随笔為你收集整理的Python储备知识与装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。