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

歡迎訪問 生活随笔!

生活随笔

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

python

python_装饰器

發布時間:2023/12/18 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python_装饰器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閉包:

在一個外部函數中定義了一個內部函數,內部函數里運用了外部函數的臨時變量,并且外部函數的返回值是內部函數的引用。這樣就構成了一個閉包。

一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然后自己再結束。

1 def outer(x): 2 y=10 3 def inner(): 4 print(x+y) 5 return inner 6 7 outer_func=outer(10) 8 outer_func() 9 10 >>>20

?裝飾器:

引用知乎上一段比喻:

  內褲可以用來遮羞,但是到了冬天它沒法為我們防風御寒,聰明的人發明了長褲,有了長褲后的寶寶再也不冷了,裝飾器就想我們這里說的長褲,在不影響內褲作用的前提下,為我們的身子提供保暖的功效。

?

裝飾器就是用于拓展原來函數功能的一種函數,這個函數的特殊之處在于它的返回值也是一個函數,使用python裝飾器的好處就是在不用更改原函數的代碼前提下給函數增加新的功能。

裝飾器示例:

??? 假如我們有一個函數,實現輸出“hello world”的功能:

1 import time 2 def print_info(): 3 print("-------------") 4 time.sleep(2) 5 print("Hello world") 6 print("-------------") 7 8 9 print_info()

?

  現在有個需求是需要統計上邊函數的執行時間,最簡單的做法是直接修改上邊的函數,這么做的好處是能讓自己被抄魷魚的時間縮短。那么一般小鳥會怎么做:

  把統計函數執行時間的功能再封裝成一個函數,將需要被統計執行時間的函數當作參數傳進去。函數即變量(知識點)

1 import time 2 def print_info(): 3 print("-------------") 4 time.sleep(2) 5 print("Hello world") 6 print("-------------") 7 8 def time_mode(func): 9 StartTime=time.time() 10 func() 11 EndTime=time.time() 12 print("When the function is executed:%s m"%(EndTime- StartTime)) 13 14 time_mode(print_info) 15 16 >>>------------- 17 Hello world 18 ------------- 19 When the function is executed:2.0000147819519043 m

?

  當你欣喜若狂,自信滿滿,內心甚至還有些許小激動的拿給你領導過目,你清清嗓子準備念你早已準備好的獲獎感言。沒想到你領導面帶微笑,和藹可親的遞給你一個白眼,想讓你好好體會一下。然后用盡量溫柔的語氣告訴你:“腦子其實是個好東西,你可以嘗試擁有一下”

  你懊惱,你氣憤,然后深吸一口氣坐下來重新審視這段代碼,才發現:我檫,這么寫不是改變了人家原函數的調用方式了嗎!尷尬,大寫的尷尬 !然后你又重新提筆,寫下下邊一段代碼:

1 import time 2 def print_info(): 3 print("-------------") 4 time.sleep(2) 5 print("Hello world") 6 print("-------------") 7 8 def wrapper(func): 9 def time_mode(): 10 StartTime=time.time() 11 func() 12 EndTime=time.time() 13 print("When the function is executed:%s m"%(EndTime- StartTime)) 14 return time_mode 15 16 print_info=wrapper(print_info) 17 print_info() 18 19 >>>------------- 20 Hello world 21 ------------- 22 When the function is executed:2.0003576278686523 m

?

你用高階函數(知識點)似乎已經完成了想要的需求。但是每次執行都需要給源函數重新賦值。太繁瑣,太low,主要是你猜想領導肯定會罵。怎么辦,百度呀寶貝。經過百度你引進了魔法糖這個概念:

1 import time 2 3 def wrapper(func): 4 def time_mode(): 5 StartTime=time.time() 6 func() 7 EndTime=time.time() 8 print("When the function is executed:%s m"%(EndTime- StartTime)) 9 return time_mode 10 11 @wrapper 12 def print_info(): 13 print("-------------") 14 time.sleep(2) 15 print("Hello world") 16 print("-------------") 17 18 print_info() 19 20 >>>------------- 21 Hello world 22 ------------- 23 When the function is executed:2.0005741119384766 m

?

牛逼,自信心一股腦的涌上了心頭,你覺得你又可以秒天,秒地,秒空氣了。然后你的思路像那什么一樣開始不受控制,你就在想 這TM要是源函數要傳參咋JB整?你開始了你的摸索、你的嘗試:

1 import time 2 3 def wrapper(func): 4 def time_medo(*args,**kwargs): 5 StartTime = time.time() 6 func(*args,**kwargs) 7 EndTime=time.time() 8 print("When the function is executed:%s m"%(EndTime- StartTime)) 9 return time_medo 10 11 @wrapper 12 def Add(*args,**kwargs): 13 print("++++++++++") 14 time.sleep(1) 15 sums=0 16 for i in args: 17 sums+=i 18 print(sums) 19 print("++++++++++") 20 21 Add(9,9,18,22) 22 23 >>>++++++++++ 24 58 25 ++++++++++ 26 When the function is executed:1.0002260208129883 m

完事兒,你嘿嘿一笑,深藏功與名!

轉載于:https://www.cnblogs.com/Adairye/p/8729834.html

總結

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

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