理解可迭代對(duì)象 迭代器 生成器 生成器表達(dá)式

關(guān)系圖

容器(container)

容器是一種把多個(gè)元素組織在一起的數(shù)據(jù)結(jié)構(gòu),容器中的元素可以逐個(gè)地迭代獲取,可以用in, not in關(guān)鍵字判斷元素是否包含在容器中

  • list
  • set
  • dict
  • tuple
  • str

可迭代對(duì)象

但凡是可以返回一個(gè)迭代器的對(duì)象都可稱之為可迭代對(duì)象

  • socket
  • files等
x = [1, 2, 3]
 y = iter(x)
z = iter(x)

迭代器有一種具體的迭代器類型,比如list_iterator,set_iterator??傻鷮?duì)象實(shí)現(xiàn)了iter方法,該方法返回一個(gè)迭代器對(duì)象。

舉例

迭代器(iterator)

那么什么迭代器呢?它是一個(gè)帶狀態(tài)的對(duì)象,他能在你調(diào)用next()方法的時(shí)候返回容器中的下一個(gè)值,任何實(shí)現(xiàn)了iternext()(python2中實(shí)現(xiàn)next())方法的對(duì)象都是迭代器,iter返回迭代器自身,next返回容器中的下一個(gè)值,如果容器中沒(méi)有更多元素了,則拋出StopIteration異常,至于它們到底是如何實(shí)現(xiàn)的這并不重要。

生成器(generator)

生成器算得上是Python語(yǔ)言中最吸引人的特性之一,生成器其實(shí)是一種特殊的迭代器,不過(guò)這種迭代器更加優(yōu)雅。它不需要再像上面的類一樣寫iter()和next()方法了,只需要一個(gè)yiled關(guān)鍵字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一種懶加載的模式生成值。

生成器表達(dá)式(generator expression)

生成器表達(dá)式是列表推倒式的生成器版本,看起來(lái)像列表推導(dǎo)式,但是它返回的是一個(gè)生成器對(duì)象而不是列表對(duì)象。

>>> (x*x for x in range(10))
<generator object <genexpr> at 0x1034a7bf8>

總結(jié)

  • 容器是一系列元素的集合,str、list、set、dict、file、sockets對(duì)象都可以看作是容器,容器都可以被迭代(用在for,while等語(yǔ)句中),因此他們被稱為可迭代對(duì)象。
  • 可迭代對(duì)象實(shí)現(xiàn)了iter方法,該方法返回一個(gè)迭代器對(duì)象。
  • 迭代器持有一個(gè)內(nèi)部狀態(tài)的字段,用于記錄下次迭代返回值,它實(shí)現(xiàn)了nextiter方法,迭代器不會(huì)一次性把所有元素加載到內(nèi)存,而是需要的時(shí)候才生成返回結(jié)果。
    *生成器是一種特殊的迭代器,它的返回值不是通過(guò)return而是用yield。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容