您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“如何掌握Python生成器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
1. 什么是可迭代對象?
可迭代對象,英文Iterable,是一個形容詞,這類對象和Java語言類似,都可看作是一類接口,抽象地描述事物具備怎樣的能力。所以,Iterable自然具備可迭代能力。
如下,常見的list,Iterator等都是Iterable對象:
In [33]: from collections.abc import Iterable,Iterator In [34]: issubclass(list,Iterable) Out[34]: True In [35]: issubclass(Iterator,Iterable)
2. 什么是一個生成器?
生成器是可迭代的(Iterable),最簡單的創(chuàng)建生成器方法是通過一對(),如下所示:
In [37]: g = (i*i for i in [1,4,0]) In [38]: g Out[38]: <generator object <genexpr> at 0x7fe8956e96d0>
g 是一個生成器對象,generator object
獲取生成器對象的元素,可使用next函數(shù),如下所示,獲取第一個元素:
In [39]: next(g) Out[39]: 1
獲取第二個元素:
In [40]: next(g) Out[40]: 16
3. 創(chuàng)建生成器的幾種方法?
如上所見,使用一對()能夠創(chuàng)建一個生成器對象。
除此之外,想必大家也都知道,是使用關鍵字 yield. yield出現(xiàn)在一個函數(shù)中,運行到y(tǒng)ield處,返回的對象便是生成器對象(generator object).
4. 生成器是迭代器嗎?
生成器對象(generator object)一定也是迭代器對象(Iterator object),如上面的生成器g,使用內(nèi)置函數(shù)isinstance驗證,返回True:
In [43]: isinstance(g,Iterator) Out[43]: True
因此,它具備一切迭代器的特性,關于迭代器我們已在上一個話題討論,簡而言之,迭代器的幾個特點:
是有去無回的,
迭代器無需提前知道整個列表的所有元素,
無需加載所有元素到RAM中盡而它是節(jié)省內(nèi)存的(memory-efficient).
生成器同樣具備這些特性。除此之外,它還有一些獨有的特性,下面跟隨yield 我們便能看出來。
5. 如何用一句話描述 yield?
yield 關鍵字的用法在stackoverflow上也是最熱的問題之一,借用一個最熱回答中的解釋:
yield is a keyword that is used like return, except the function will return a generator. |
yield 是一個特殊的return, 它返回一個生成器對象。
說實話,理解這些只是皮毛。那么,如何精通yield的用法呢?
6. 如何精通yield的用法?
要想精通yield,你必須首先搞清楚一點:
當你調(diào)用帶有yield的函數(shù)時,函數(shù)并沒有執(zhí)行任何一行,只是返回一個生成器對象 |
為了幫助大家理解,創(chuàng)建一個帶有yield的函數(shù):
def gfun(): mylist = range(3) for i in mylist: yield i*i g = gfun() print(g)
為了加深印象,你可以自己調(diào)試驗證一遍,函數(shù)第一行打的斷點始終未被命中。
帶yield的函數(shù)和for結(jié)合使用,第一次調(diào)用上一步創(chuàng)建的生成器對象后,將會進入函數(shù)體直到遇到y(tǒng)ield返回值。
然后,for循環(huán)再進入函數(shù)時,直接跑到y(tǒng)ield的下一句。直到生成器對象變空為止。
使用下面代碼演示yield的上面過程:
def createGenerator(): mylist = range(3) for i in mylist: yield i*i print(i*i) g = createGenerator() print(g) for gi in g: pass
參考錄制的gif:
7. yield 都有哪些重要價值?
Python引入yield后,便擁有具備實現(xiàn)協(xié)程的能力,協(xié)程的確是一種高效的編程模型,關于協(xié)程的理解,后面專題會詳細討論。包括更高級的功能如異步等,根基都是yield.
8. yield 和 itertools
yield重要性和使用廣泛性還提現(xiàn)在,Python單獨一個模塊專門用于管理迭代器和生成器對象,便是itertools,里面封裝的方法特性后面再討論。
9. yield 使用案例
yield實現(xiàn)浮點數(shù)步長的frange:
def frange(start,end,step): i = start while i<end: yield round(i,3) i+=step
調(diào)用frange:
for item in frange(10,14,0.8): print(item)
結(jié)果:
10 10.8 11.6 12.4 13.2
“如何掌握Python生成器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。