Python裝飾器用法與知識(shí)點(diǎn)小結(jié)
本文實(shí)例講述了Python裝飾器用法與知識(shí)點(diǎn)。分享給大家供大家參考,具體如下:
(1)裝飾器含參數(shù),被裝飾函數(shù)不含(含)參數(shù)
實(shí)例代碼如下:
import time # 裝飾器函數(shù) def wrapper(func): def done(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print('the func run time is %s' % (stop_time - start_time)) return done # 被裝飾函數(shù)1 @wrapper def test1(): time.sleep(1) print("in the test1") # 被裝飾函數(shù)2 @wrapper def test2(name): #1.test2===>wrapper(test2) 2.test2(name)==dome(name) time.sleep(2) print("in the test2,the arg is %s"%name) # 調(diào)用 test1() test2("Hello World")
(2)裝飾器含有參數(shù),被裝飾函數(shù)含(不含)參數(shù)
import time user,passwd = 'admin','admin' def auth(auth_type): print("auth func:",auth_type) def outer_wrapper(func): def wrapper(*args, **kwargs): print("wrapper func args:", *args, **kwargs) if auth_type == "local": username = input("Username:").strip() password = input("Password:").strip() if user == username and passwd == password: print("\033[32;1mUser has passed authentication\033[0m") res = func(*args, **kwargs) # from home print("---after authenticaion ") return res else: exit("\033[31;1mInvalid username or password\033[0m") elif auth_type == "ldap": print("ldap鏈接") return wrapper return outer_wrapper @auth(auth_type="local") # home = wrapper() def home(): print("welcome to home page") return "from home" @auth(auth_type="ldap") def bbs(): print("welcome to bbs page" print(home()) #wrapper() bbs()
總結(jié):
(1)裝飾器實(shí)質(zhì)為函數(shù)內(nèi)嵌,返回函數(shù)地址。
(2)裝飾器帶參數(shù)與不帶參數(shù)相比裝飾器帶參數(shù)的多了一層函數(shù)定義用于接收裝飾器中傳遞的參數(shù),其余基本相同。
(3)先驗(yàn)證裝飾器中的參數(shù),在驗(yàn)證普通函數(shù)的參數(shù)
小知識(shí):
列表生產(chǎn)式:[i for i in range(5)]---->[0,1,2,3,4,5]
生成器與迭代器:
第一種方式通過(guò)括號(hào)的方式生成
生成器:()---(i for i in range(5)) ==>generator
這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。
生成器只有在調(diào)用時(shí)才會(huì)生成相應(yīng)的數(shù)據(jù),只記錄當(dāng)前位置。
只有一個(gè)__next__()方法
第二種方式通過(guò)yield生成
在函數(shù)中使用yield即可將一個(gè)函數(shù)變?yōu)橐粋€(gè)生成器
迭代器:
直接作用于for循環(huán)的數(shù)據(jù)類型:
一類是集合數(shù)據(jù)類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象
from collections import Iterable isinstance([], Iterable)=========true
*可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象:
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) ======>True
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
例如:iter([])<====迭代器
Python的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤??梢园堰@個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算。
Iterator甚至可以表示一個(gè)無(wú)限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的。
小結(jié):
凡是可作用于for循環(huán)的對(duì)象都是Iterable類型;
凡是可作用于next()函數(shù)的對(duì)象都是Iterator類型,它們表示一個(gè)惰性計(jì)算的序列;
集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過(guò)可以通過(guò)iter()函數(shù)獲得一個(gè)Iterator對(duì)象。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- 淺談解除裝飾器作用(python3新增)
- Python學(xué)習(xí)筆記之裝飾器
- Python閉包及裝飾器運(yùn)行原理解析
- Python帶參數(shù)的裝飾器運(yùn)行原理解析
- Python類中的裝飾器在當(dāng)前類中的聲明與調(diào)用詳解
- python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧裝飾器信號(hào)與槽詳細(xì)使用方法與實(shí)例
- python 裝飾器功能與用法案例詳解
- Python @property裝飾器原理解析
- python裝飾器相當(dāng)于函數(shù)的調(diào)用方式
- Python如何解除一個(gè)裝飾器
相關(guān)文章
Python利用ROI進(jìn)行圖像合成的問(wèn)題小結(jié)
圖像的 ROI (region of interest) 是指圖像中感興趣區(qū)域、在 OpenCV 中圖像設(shè)置圖像 ROI 區(qū)域,實(shí)現(xiàn)只對(duì) ROI 區(qū)域操作,本文給大家介紹Python利用ROI進(jìn)行圖像合成的問(wèn)題小結(jié),感興趣的朋友一起看看吧2021-07-07Python實(shí)現(xiàn)PC屏幕截圖并自動(dòng)發(fā)送郵件
在當(dāng)前的數(shù)字化世界中,自動(dòng)化已經(jīng)成為我們?nèi)粘I詈凸ぷ髦械年P(guān)鍵部分,本文我們將探討如何使用Python來(lái)實(shí)現(xiàn)一個(gè)特定的自動(dòng)化任務(wù) - PC屏幕截圖自動(dòng)發(fā)送到指定的郵箱,感興趣的可以了解下2023-11-11Python 切片索引越界的問(wèn)題(數(shù)組下標(biāo)越界)
Python語(yǔ)言處理字符串、數(shù)組類的問(wèn)題時(shí)有一定概率需要使用切片方法,本文主要介紹了Python 切片索引越界的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03python使用smtplib模塊通過(guò)gmail實(shí)現(xiàn)郵件發(fā)送的方法
這篇文章主要介紹了python使用smtplib模塊通過(guò)gmail實(shí)現(xiàn)郵件發(fā)送的方法,涉及Python使用smtplib模塊發(fā)送郵件的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05python 回調(diào)函數(shù)和回調(diào)方法的實(shí)現(xiàn)分析
這篇文章主要介紹了python 回調(diào)函數(shù)和回調(diào)方法的實(shí)現(xiàn)分析,需要的朋友可以參考下2016-03-03Python中文分詞庫(kù)jieba(結(jié)巴分詞)詳細(xì)使用介紹
這篇文章主要介紹了Python中文分詞庫(kù)jieba(結(jié)巴分詞)提取詞,加載詞,修改詞頻,定義詞庫(kù)詳細(xì)使用介紹,需要的朋友可以參考下2022-04-04解決pycharm無(wú)法調(diào)用pip安裝的包問(wèn)題
今天小編就為大家分享一篇解決pycharm無(wú)法調(diào)用pip安裝的包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python輸出當(dāng)前目錄下index.html文件路徑的方法
這篇文章主要介紹了python輸出當(dāng)前目錄下index.html文件路徑的方法,涉及Python操作目錄的相關(guān)技巧,需要的朋友可以參考下2015-04-04