[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萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...