iterator 與 gerater的作用是優化記憶體,當處理大檔案,大資料的時候可以使用。
1. 對大列表進行優化
2. 大檔案的優化
迭代器: 一種資料型別,用來處理大資料
可迭代物件:乙個物件,能每次返回資料組中的乙個成員,for迴圈中每次返回乙個資料或者用來作為iter內建函式的引數,返回迭代器物件
生成器: 生成器是通過yield 或 生成器表示式,用一種比較方便的方式生成了迭代器。
yield函式就是乙個生成器:
yield的作用:
1. 相當於return返回乙個值
2. 記住該位置,下次進來從這個位置開始。
兩種使用方式:
1. 使用next 和 send 需結合異常處理(當超出最大值的時候,會報錯)
2. 使用for迴圈,for內部自動幫我們處理異常
def使用for處理ge():
yield 8
yield 88
yield 888g =ge()
(next(g))
(next(g))
(next(g))
print(next(g)) #
報錯,超出
defgen_num2():
for i in range(8): #
range是乙個惰性機制。
yield
ifor i in
gen_num2():
print(i)
from collections import使用iter內建函式iterator, iterable, generator
#列表的型別判斷
li = [1, 2, 3, 4]
print(isinstance(li, iterable)) #
true
print(isinstance(li, iterator)) #
false
print(isinstance(li, generator)) #
false
#字典的型別判讀
dic =
print(isinstance(dic, iterable)) #
true
print(isinstance(dic, iterator)) #
false
print(isinstance(dic, generator)) #
false
#range的型別判斷
#range是乙個可迭代物件,不是迭代器。但是他跟迭代器有類似的地方,又乙個惰性機制,所有也很節約記憶體
r = range(10)
(type(r))
print(isinstance(r, iterable)) #
true
print(isinstance(r, iterator)) #
false
print(isinstance(r, generator)) #
false
#檔案物件 是乙個迭代器
with open('
1.txt
', 'wb'
) as f:
pass
print(isinstance(f, iterable)) #
true
print(isinstance(f, iterator)) #
true
print(isinstance(f, generator)) #
false
#yield物件
defge():
for i in range(9):
yield
(i)g =ge()
print(isinstance(g, iterable)) #
true
print(isinstance(g, iterator)) #
true
print(isinstance(g, generator)) #
false
from collections importgenerator, iterable, iterator
x = [x for x in range(10)]
y = iter(x) #
列表轉換為迭代器
(next(y))
(next(y))
(next(y))
(next(y))
(isinstance(y, iterable))
print(isinstance(y, iterator)) #
是迭代器物件,
(isinstance(y, generator))
dic =
(isinstance(dic, iterable))
(isinstance(dic, iterator))
(isinstance(dic, generator))
d = iter(dic) #
字典轉換為迭代器
(type(d))
(isinstance(d, iterable))
(isinstance(d, iterator))
print(isinstance(d, generator))
#1. 函式優化列表表示式
y = [x for x in range(10)]
#生成器表示式
z = (x for x in range(10))
print(type(z), z)
#2. 大檔案優化斐波那契
#0,1,1,2,3
deffb(n):
a, b = 0, 1
while a
(a) a,b = b, a+b
deffb_list(n):
a, b = 0, 1fblist =
while a
#當資料量非常大的時候,就會造成記憶體**
a, b = b, a+b
return
fblist
print(fb_list(1000))
deffb_ge(n):
a, b = 0, 1fblist =
while a
yield a #
使用生成器每次來取,優化記憶體
a, b = b, a+b
for i in fb_ge(1000):
print(i, end='
')
開啟檔案的物件,本身就是乙個迭代器。
with open('1.txt
', 'wb'
) as f:
pass
print(isinstance(f, iterable)) #
true
print(isinstance(f, iterator)) #
true
print(isinstance(f, generator)) #
false
可迭代物件 迭代器,生成器
可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...
可迭代物件 迭代器 生成器
可迭代物件 for迴圈機制 迭代器生成器 總結type所返回的型別是例項物件的類物件,而isinstance所進行的判斷則包含了例項物件的類物件及其父類。如圖 可迭代物件 迭代器 生成器所屬的型別分別為collections包裡的iterable,iterator,generator.實現了 ite...
可迭代物件 迭代器 生成器
名詞解釋 可迭代物件 1 遵循了 實現了 迭代器協議的物件。物件內部定義了乙個 iter 方法,以實現迭代器協議 2 列表 元組 字典 字串等等的都不是可迭代物件,當用for迴圈遍歷的時候,其實for先去執行了.iter 方法,將列表 元組 字串等變成乙個可迭代的物件,在進行迭代。iter 下有 n...