生成器表達(dá)式來源于迭代和列表解析的組合,生成器和列表解析類似,但是它使用尖括號而不是方括號
>>>#列表解析生成列表
>>>[x**3forxinrange(5)]
[0,1,8,27,64]
>>>
>>>#生成器表達(dá)式
>>>(x**3forxinrange(5))
at0x000000000315F678>
>>>#兩者之間轉(zhuǎn)換
>>>list(x**3forxinrange(5))
[0,1,8,27,64]
一個迭代既可以被寫成生成器函數(shù),也可以被協(xié)程生成器表達(dá)式,均支持自動和手動迭代。而且這些生成器只支持一個active迭代,也就是說生成器的迭代器就是生成器本身。
迭代器(迭代就是循環(huán))
迭代器包含有next方法的實現(xiàn),在正確的范圍內(nèi)返回期待的數(shù)據(jù)以及超出范圍后能夠拋出StopIteration的錯誤停止迭代。
我們已經(jīng)知道,可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型,如list,tuple,dict,set,str等
一類是generator,包括生成器和帶yield的generatorfunction
這些可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable
可以使用isinstance()判斷一個對象是否為可Iterable對象
>>>fromcollectionsimportIterable
>>>isinstance([],Iterable)
True
>>>isinstance({},Iterable)
True
>>>isinstance('abc',Iterable)
True
>>>isinstance((xforxinrange(10)),Iterable)
True
>>>isinstance(100,Iterable)
False
而生成器不但可以作用于for循環(huán),還可以被next()函數(shù)不斷調(diào)用并返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續(xù)返回下一個值了。
所以這里講一下迭代器
一個實現(xiàn)了iter方法的對象是可迭代的,一個實現(xiàn)next方法并且是可迭代的對象是迭代器。
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator。
所以一個實現(xiàn)了iter方法和next方法的對象就是迭代器。
可以使用isinstance()判斷一個對象是否是Iterator對象:
>>>fromcollectionsimportIterator
>>>isinstance((xforxinrange(10)),Iterator)
True
>>>isinstance([],Iterator)
False
>>>isinstance({},Iterator)
False
>>>isinstance('abc',Iterator)
False
生成器都是Iterator對象,但list、dict、str雖然是Iterable(可迭代對象),卻不是Iterator(迭代器)。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
>>>isinstance(iter([]),Iterator)
True
>>>isinstance(iter('abc'),Iterator)
True
你可能會問,為什么list、dict、str等數(shù)據(jù)類型不是Iterator?
這是因為Python的Iterator對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤??梢园堰@個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。
Iterator甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲全體自然數(shù)的。
以上內(nèi)容為大家介紹了python生成器表達(dá)式,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。