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