迭代器包含有next方法的實現,在正確的範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代
可以直接作用於for 迴圈的物件統稱為可迭代物件:iterable,例如集合資料型別,如list,tuple,dict,set,str等
乙個實現了iter方法的物件是可迭代的,乙個實現next方法並且是可迭代的物件是迭代器。可以使用isinstance()判斷乙個物件是否是iterator物件
>>
>
from collections import iterator
>>
>
isinstance
((x for x in
range(10
)), iterator)
true
>>
>
isinstance([
], iterator)
false
>>
>
isinstance
(, iterator)
false
>>
>
isinstance
('abc'
, iterator)
false
s=
'hello'
#字串是可迭代物件,但不是迭代器l=[
1,2,
3,4]
#列表是可迭代物件,但不是迭代器t=(
1,2,
3)#元組是可迭代物件,但不是迭代器
d=#字典是可迭代物件,但不是迭代器
set=
#集合是可迭代物件,但不是迭代器
f=open
('test.txt'
)#檔案是可迭代物件,是迭代器
通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,而且建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。
所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間,在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator
生成器是乙個特殊的程式,可以被用作控制迴圈的迭代行為,python中生成器是迭代器的一種,使用yield返回值函式,每次呼叫yield會暫停,而可以使用next()函式和send()函式恢復生成器。生成器一次只能產生乙個值,這樣消耗的記憶體數量將大大減小,而且允許呼叫函式可以很快的處理前幾個返回值,因此生成器看起來像是乙個函式,但是表現得卻像是迭代器
類似於列表解析,只需把列表解析式的[ ]換成( )就ok了
#列表生成式
lis =
[x*x for x in
range(10
)]print
(lis)[0
,1,4
,9,16
,25,36
,49,64
,81]#生成器
>>
>generator_ex =
(x*x for x in
range(10
))>>
>
print
(generator_ex)
generator object
at 0x000002a4cbf9eba0
>
#可以通過next()函式獲得下乙個返回值
>>
>
print
(next
(generator_ex))0
>>
>
print
(next
(generator_ex))1
#也可以利用for迴圈列印
>>
>
for i in generator_ex:
print
(i)014
9162536
4964
81
生成器函式
def
create_counter
(n):
print
("create_counter"
)while
true
:yield n
print
("increment n"
) n +=
1gen= create_counter(2)
print
(gen)
#print
(next
(gen)
)#create_counter
#2print
(next
(gen)
)#increment n
#3
函式是順序執行的,遇到return語句或者最後一行函式語句就返回, 而變成generator的函式,在每次呼叫next()的時候執行,執行完yield語句返回,再次被next()呼叫時候從上次的返回yield語句之後繼續執行,也就是用多少,取多少,不佔記憶體
yield是乙個類似return 的關鍵字,迭代一次遇到yield的時候就返回yield右面的值。而且下一次迭代的時候,從上一次迭代遇到的yield後面的**開始執行
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...