python中的生成器、迭代器、裝飾器分別是什么意思呢?具體的含義,一些其具體的用途,下面小編就給大家詳細的解答下。
一、裝飾器
由于一個函數能實現一種功能,現在想要在不改變其代碼的情況下,讓這個函數進化一下,即能保持原來的功能,還能有新的"技能",怎么辦?
現已經存在一個自定義的函數func1
def func1(): print('hello,world!')
讓func1進化一下:(繼承func1之前的所有功能,而且還有新的‘技能’)
效果和下面定義的函數func2效果是一樣的
def func2(): func1()#調用func1,即可保持func1這一函數的所有的功能都被這個新的函數繼承下來 print('hello,boy!')#添加的新功能,相當于func1這一函數學到的新技能
但是,func2是一個新的函數,已經完全改頭換面了,雖然有一部分是能實現func1的功能,但并不是func1的進化型,所以當我們還想用調用func1這個函數的調用方法調用的時候,并不能調用func2.
當函數不進行調用時候,可以將這個函數當成一個變量進行對待。所以,如果把func2這個函數的內存地址賦給func1,然后調用func1,那么就能用func1這個名字,調用func2這個函數,也就實現了func1這個函數的進化。
所以,如果定義如下一個可以實現上述功能的函數deco,deco這個函數就要完成以下的兩件事情:
1.讓func2這個函數的內存地址出現,即:定義func2這個函數
2.在其執行之后能夠,拿到func2的內存地址,即把func2的內存地址作為返回值返回
def deco(func1): def func2(): func1()#調用func1,即可保持func1這一函數的所有的功能都被這個新的函數繼承下來 print('hello,boy!')#添加的新功能,相當于func1這一函數學到的新技能 return func2
完成上述deco函數的定義之后,當執行deco這個函數之后,其執行結果,就是func2的內存地址。
接下來,將這個內存地址賦值給func1這個變量之后,再對func1進行調用,就可以完成對函數func1的"進化"(即:在不改變func1的代碼,還賦予了其新的功能)
func1=deco(func1) func1()
上述的過程可以用以下的代碼進行實現:
def deco(func1): def func2(): func1()#調用func1,即可保持func1這一函數的所有的功能都被這個新的函數繼承下來 print('hello,boy!')#添加的新功能,相當于func1這一函數學到的新技能 return func2 def func1(): print('hello,world!') func1=deco(func1) func1() 其中,deco這個函數就是所謂的裝飾器 (裝飾器:在不改變源代碼和調用方式的基礎之上給函數增加新的功能) 將上述代碼進行優化之后就有了下面的代碼: def deco(func1): def func2(): func1()#調用func1,即可保持func1這一函數的所有的功能都被這個新的函數繼承下來 print('hello,boy!')#添加的新功能,相當于func1這一函數學到的新技能 return func2 deco#效果等同于func1=deco(func1) def func1(): print('hello,world!') func1() 1.1含參數的裝飾器: def deco(func): def wrapper(username,password): if username=='root'and password=='root': func(username,password)else: print('用戶名或密碼錯誤') return wrapper deco def baidu_index(username,password): print('welcome to百度') baidu_index('root','root')
由于定義的函數baidu_index,必須要傳遞參數,所以裝飾器內部定義的函數wrapper也需要定義形參,wrapper函數內部調用函數時,也需要有參數!!
1.2多層裝飾器
將裝飾器1看成一個整體,在這個裝飾器上在添加一個裝飾器2,就能實現..........
例如:
def deco1(deco): print('你好不好?') def deco(func): def func2(): print('你不好!') func() return func2 return deco deco1 def deco(func): def func2(): print('你不好!') func() return func2 deco def func1(): print('你好!') func1()
二、迭代器:
1.什么是迭代?
1.迭代是一個重復的過程,即每一次重復為一次迭代,
2.并且每次迭代的結果都是下一次迭代的初始值
例如:
l=[1,2,3] count=0 while count<len(l):#首先是重復動作,其次上一次的結果是下一次的初始值,因此,是迭代 print(l[count]) count+=1
2.什么是迭代器?為何要有迭代器?
自媒體培訓
對于序列類型:字符串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對于字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴于索引的迭代方式,這就是迭代器。
3.什么叫做迭代器對象?
obj有.__iter__和.__next__方法的叫做迭代器對象
總結:迭代器對象一定是可迭代對象,而可迭代對象不一定是迭代器對象
4.for的作用:
1.把可迭代對象變成迭代器對象
2.過濾錯誤信息
l1=[1,2,3] for i in l1:#iter(l1) print(i)
三、生成器
1.什么是生成器?
只要函數里有yield關鍵字,那么函數名()得到的結果就是生成器,生成器就是迭代器,并且不會執行函數內部代碼
2.return和yield用法十分類似,但是也有區別,區別在于:return只能返回一個值,而yield可以返回多個值
3.生成器優點:
同一時間只存儲一個值,節省內存空間
4.生成器的缺點:
只能向后取值,不能往前取值
def test(): for i in range(100): yield i res=test() for k in res: print(k)
四、總結
迭代器
迭代是Python最強大的功能之一,是訪問集合元素的一種方式;迭代器是一個可以記住遍歷的位置的對象;迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退;迭代器有兩個基本的方法:iter()和next();字符串,列表或元組對象都可用于創建迭代器:
生成器
在Python中,使用了yield的函數被稱為生成器;跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器;在調用生成器運行的過程中,每次遇到yield時函數會暫停并保存當前所有的運行信息,返回yield的值,并在下一次執行next()方法時從當前位置繼續運行;調用一個生成器函數,返回的是一個迭代器對象。
裝飾器
裝飾器:在不改變原函數的基礎上,對函數執行前后進行自定義操作。把目標函數作為參數傳給裝飾器函數,裝飾器函數執行過程中,執行目標函數,達到在目標函數運行前后進行自定義操作的目的。
應用場景:如記錄函數運行時間;flask里的路由、before_request;django中的緩存、用戶登錄等。
裝飾器在實現的時候,被裝飾后的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變),為了不影響,Python的functools包中提供了一個叫wraps的裝飾器來消除這樣的副作用。寫一個裝飾器的時候,最好在實現之前加上functools的wrap,它能保留原有函數的名稱和文檔字符串。
綜上所述,這篇文章就為大家介紹到這里了,希望可以給大家帶來一定的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128022.html
摘要:在學習的時候,三大名器對沒有其他語言編程經驗的人來說,應該算是一個小難點,本次博客就博主自己對裝飾器迭代器和生成器理解進行解釋。 在學習python的時候,三大名器對沒有其他語言編程經驗的人來說,應該算是一個小難點,本次博客就博主自己對裝飾器、迭代器和生成器理解進行解釋。 裝飾器 什么是裝飾器?裝飾從字面意思來誰就是對特定的建筑物內按照一定的思路和風格進行美化的一種行為,所謂器就是工具...
摘要:常規的使用來統計一段代碼運行時間的例子輸出結果總結其實是一門特別人性化的語言,但凡在工程中經常遇到的問題,處理起來比較棘手的模式基本都有對應的比較優雅的解決方案。 python的高級特性 名詞與翻譯對照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...
摘要:裝飾器的應用場景比如插入日志,性能測試,事務處理,緩存等等場景。裝飾器完美的遵循了這個開放封閉原則。迭代器迭代器遵循迭代器協議必須擁有方法和方法。直到函數執行結束。調用相關函數用于檢查一個對象是否是可調用的。 裝飾器 裝飾器的含義: 1.裝飾器本質上就是一個python函數,他可以讓其他函數在不需要做任何代碼變動的前提下,增加額外的功能,裝飾器的返回值也是一個函數對象。2.裝飾器的應用...
摘要:所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 對于已經對 閉包 或者 裝飾器有一定概念的,可以直接通過右側標題目錄直接定位到相應段落查看所需的內容。 什么是裝飾器? 裝飾器(Decorator)相對簡單,咱們先介紹它:裝飾器的功能是將被裝飾的函數當作參數傳遞給與裝飾器對應的函數(名稱相同的函數),并返回包裝后的被裝飾的函數,聽起來有點繞,沒關系,直接看示意圖,...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02