生成器與迭代器

2021-09-24 03:41:10 字數 4555 閱讀 8429

[i * i for i in

range(8

)]#列表推導器

#[0, 1, 4, 9, 16, 25, 36, 49]

(i * i for i in

range(8

))#生成器表示式

#at 0x00000133c3945c00>

上面使用類似生成式的語法得到的生成器被稱為生成器表示式。此外,當推算的演算法比較複雜時,還可以使用生成器函式得到生成器。

生成器函式中通過關鍵字yield返回推算出的元素。生成器函式與普通函式的區別在於:當呼叫內建函式next()或使用for-in語句迭代時,執行完yield語句就會將生成器函式掛起,下次會從掛起的地方繼續執行。

def

fib(n)

: i =

0 a, b =1,

1while i < n:

print

(a, end =

',')

a, b = b, a + b

i +=

1fib(6)

#1, 1, 2, 3, 5, 8

def

fib(n)

: i =

0 a, b =1,

1while i < n:

yield a

a, b = b, a + b

i +=

1fib(6)

#

gf = fib(6)

print

(next

(gf)

)#1

print

(next

(gf)

)#1

print

(next

(gf)

)#2

print

(next

(gf)

)#3

print

(next

(gf)

)#5

print

(next

(gf)

)#8

print

(next

(gf)

)#stopiteration

gf = fib(6)

for item in gf:

print

(item)

#1#1

#2#3

#5#8

1.可以用於for-in語句的物件被稱為可迭代物件(iterable)物件

2.可以呼叫內建函式isinstance()判斷乙個物件是否是可迭代物件。標準庫模組collection中的類iterable用於表示可迭代物件。

from collections import iterable

print

(isisnstance([1

,2,3

], iterable)

)#true

print

(isisnstance(

'abc'

], iterable)

)#true

print

(isisnstance(

(i * i for i in range91,7)

), iterable)

)#true

如果乙個可迭代物件可以作為內建函式next()的實參從而支援惰性推算,那麼該物件被稱為迭代器(iterable)物件。

對於range、列表、元組、字串。字典和集合等可迭代物件,都不可作為內建函式next()的實參,而生成器可以。所以,生成器是迭代器的一種。

可以呼叫內建函式isinstance()判斷乙個物件是否是迭代物件。標準庫模組collections中的類iterable用於表示迭代器物件。

l =[1

,2,3

]next

(l)#typeerror: 'list' object is not an iterator

s ='abc'

next

(s)#typeerror: 'str' object is not an iterator

from collections import iterator

print

(isinstance

(l, iterator)

)print

(isinstance

(l, iterator)

)#false

#false

print

(isinstance

((i * i dor i in

range(1

,7))

, iterator)

)#true

可以呼叫內建函式iter()把不支援惰性推算的可迭代物件轉換為迭代器物件。

iter_l = ietr(l)

iter_s =

iter

(s)print

(isinstance

(iter_l, iterator)

)#true

print

(isinstance

(iter_s, iterator)

)#true

print

(next

(iter_l))#1

print

(next

(iter_l))#2

print

(next

(iter_l))#3

print

(next

(iter_l)

)#stopiteration

print

(next

(iter_s))#a

print

(next

(iter_s))#b

print

(next

(iter_s))#c

print

(next

(iter_s)

)#stopiteration

如果乙個同時物件實現了特殊方法__iter__()和___next__(),那麼該物件也被稱為迭代器物件。如果將該物件用於for-in語句首先會呼叫特殊方法__iter__()返回乙個可迭代物件,然後不斷呼叫該可迭代物件的特殊方法__next__()返回下一次迭代的值,知道遇到stopiteration時退出迴圈。

class

myiterator

(object):

def__init__

(self)

: self.data =

0def

__iter__

(self)

:return self

def__next__

(self)

:if self.data >5:

raise stopiteration(

)else

: self.data +=

1return self.data

for item in myiterator():

print

(item)

#1#2

#3#4

#5#6

class

fib(

object):

def__init__

(self)

: self.a, self.b =0,

1def

__iter__

(self)

:return self

def__next__

(self)

: self.a, self.b = self.b, self.a + self.b

if self.a >50:

raise stopiteration(

)return self.a

for item in fib():

print

(item)

#1#1

#2#3

#5#8

#13#21

#34

for-in語句在預設情況下不能用於自定義類物件的例項物件。

1.如果想要for-in語句可以用於自定義物件的例項物件,必須在自定義類物件中實現特殊方法__iter__()和__next__()。for-in語句首先會呼叫特殊方法__iter__()返回乙個可迭代物件,然後不斷呼叫可迭代物件的特殊方法__next__()返回下一次迭代的值,直到遇到stopiteration時退出迴圈。

只實現了特殊方法__iter__()的類物件,被稱為可迭代物件;同時實現了特殊方法__iter__()和__next__()的類物件,被稱為迭代器類物件。

之所以for-in語句可以用於某些內建類物件(例如:list、tuple、str等)的例項物件,是因為這些內建類物件中都同時實現了特殊方法__iter__)和__next__()。

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...