python生成器与迭代器。
生成器
在python 中一邊循環(huán)一邊計算的機(jī)制,叫做生成器(generator)。
通過列表生成式,我們可以直接創(chuàng)建一個列表。但是,收到內(nèi)存的限制,列表容量肯定是有限的。而且,創(chuàng)建一個包含100萬個元素的列表,不僅占用很大的內(nèi)存,如果我們只需要前面幾個元素,那么后面卻大多數(shù)的元素占用的內(nèi)存就白白浪費(fèi)掉了。所以,如果列表元素可以按照某種算法推算出來,就可以在循環(huán)過程中不斷推算出后續(xù)的元素。就不用創(chuàng)建完整的list,從而節(jié)省大量的空間。
生成器保存的是算法,每次調(diào)用 next(G) ,就計算出 G 的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出 StopIteration 的異常。
?
資料參考:?https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000
https://www.zhihu.com/question/20829330
創(chuàng)建生成器的方法
①要把一個列表生成式的 [ ] 改成 ( )
類似于列表推導(dǎo),但是,生成器返回按需產(chǎn)生結(jié)果的一個對象,而不是一次構(gòu)建一個結(jié)果列表
a = (x for x in range(5)) print(a)next(a)
next(a)
list(a)
②使用yieId
yieId 與 ruturn 一樣會返回一個值,但是這兩者是有區(qū)別的:
yieId語句一次返回一個結(jié)果,在每個結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次重它離開的地方繼續(xù)執(zhí)
def gensquares(N):for i in range(N):yield i ** 2a = gensquares(5) b = gensquares(6)print(next(a)) print(next(b)) print(next(a)) print(next(b)) print(next(a)) print(next(b))print(list(a)) print(list(b))?
總結(jié)
生成器是這樣一個函數(shù),它記住上一次返回時在函數(shù)體中的位置。對生成器函數(shù)的第二次(或第 n 次)調(diào)用跳轉(zhuǎn)至該函數(shù)中間,而上次調(diào)用的所有局部變量都保持不變。
生成器不僅“記住”了它數(shù)據(jù)狀態(tài);生成器還“記住”了它在流控制構(gòu)造(在命令式編程中,這種構(gòu)造不只是數(shù)據(jù)值)中的位置。
生成器的特點:
?
?迭代器
迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator。
?可迭代對象
以直接作用于 for 循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型,如 list 、 tuple 、 dict 、 set 、 str 等;
一類是 generator ,包括生成器和帶 yield 的generator function。
這些可以直接作用于 for 循環(huán)的對象統(tǒng)稱為可迭代對象: Iterable 。
?
iter()函數(shù)
生成器都是 Iterator 對象,但 list 、 dict 、 str 雖然是 Iterable ,卻不是 Iterator 。
把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用 iter() 函數(shù):
?
?總結(jié)
- 凡是可作用于 for 循環(huán)的對象都是 Iterable 類型;
- 凡是可作用于 next() 函數(shù)的對象都是 Iterator 類型
- 集合數(shù)據(jù)類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函數(shù)獲得一個 Iterator 對象。
迭代器與生成器的區(qū)別
參考資料:http://blog.csdn.net/jinixin/article/details/72232604
生成器是一種特殊的迭代器,但迭代器不一定是生成器。
生成器是一種特殊的迭代器,生成器自動實現(xiàn)了“迭代器協(xié)議”(即__iter__和next方法),不需要再手動實現(xiàn)兩方法。
生成器在迭代的過程中可以改變當(dāng)前迭代值,而修改普通迭代器的當(dāng)前迭代值往往會發(fā)生異常,影響程序的執(zhí)行。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ksunone/p/8572088.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python生成器与迭代器。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux-实用快捷键操作
- 下一篇: 使用pipenv代替virtualenv