for in列表一次性加載列表的所有數(shù)據(jù)到內(nèi)存锥忿,而迭代器通過(guò)一次只加載一項(xiàng)數(shù)據(jù)匆瓜,有效避免了當(dāng)加載的列表過(guò)大導(dǎo)致內(nèi)存不足問(wèn)題
生成器
有兩種方法提供生成器:生成器函數(shù)舷嗡,生成器表達(dá)式
- 生成器函數(shù):常規(guī)函數(shù)定義盔几,只是用yield而不是return返回結(jié)果日月。yield語(yǔ)句一次返回一個(gè)結(jié)果灼狰,在每個(gè)結(jié)果蹭掛起函數(shù)狀態(tài)宛瞄,以便下次從它離開(kāi)的地方繼續(xù)執(zhí)行
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print(item)
# 使用普通函數(shù)一次性生成一個(gè)列表
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print(item)
- 生成器表達(dá)式:類似列表推導(dǎo),只不過(guò)不是一次性生成一個(gè)結(jié)果列表
squares = (x**2 for x in range(5))
for item in squares(5):
print(item)
顯然使用推導(dǎo)式代碼更少更易理解
為了避免定義難理解交胚,可以簡(jiǎn)單地認(rèn)為
迭代器就是一個(gè)可迭代對(duì)象份汗,可以在for in中迭代出各元素
生成器的作用差不多就是生成一個(gè)可迭代對(duì)象
注意:生成器生成的可迭代對(duì)象只能遍歷一次