生成器:
在python中,一邊循環(huán)一邊計算的機制巡李,稱為生成器:generator抚笔。
生成器不會把所有結(jié)果全部保存在內(nèi)存中,而是保存生成的計算規(guī)則侨拦,每次迭代的時候返回一個計算出來的值殊橙,直到遇到Stoplteration異常結(jié)束。
創(chuàng)建生成器:
- 生成器表達(dá)式:
通過和列表生成式相同的語法來生成,唯一不同只是把列表生成式的[]
換成()
膨蛮。例:
#生成列表
L=[x*x for x in range(10)]
#生成生成式
g=(x*x for x in range(10))
- 生成器函數(shù):
若函數(shù)存在關(guān)鍵字yeild叠纹,那么該函數(shù)就是一個generator函數(shù)。例:
#生成斐波那契數(shù)列的生成器
def fib():
a,b=0,1
while True:
yield b
temp=b
b=a+b
a=temp
yield和return與generator之間的關(guān)系:
-
在一個generator中若沒有return敞葛,則默認(rèn)執(zhí)行到函數(shù)完畢時候返回StopIteration
-
函數(shù)執(zhí)行遇到return誉察,直接拋出Stoplteration且return返回值就是Stoplteration的錯誤信息。
生成器的操作:
-
next()
前面我們說了制肮,生成器保存的是計算出下一個生成值的算法冒窍,那么怎么獲取生成的下一個值呢,用next()
函數(shù)來獲取生成器的下一個值豺鼻,當(dāng)計算出最后一個元素后综液,若繼續(xù)調(diào)用,則會報StopIteration的錯誤儒飒。
-
for
因為生成器也是一個可迭代對象Interable谬莹。
迭代器
可以直接作用于
for
循環(huán)的對象統(tǒng)稱為可迭代對象Iterable
可以被next()
調(diào)用并不斷返回下一個值的對象稱為迭代器Iterator
迭代器就是可迭代對象,可迭代對象不一定是迭代器桩了,比如list附帽、dict、set
是可迭代對象井誉,但不是迭代器蕉扮。但是list...
等可迭代對象可以通過itor()
函數(shù)轉(zhuǎn)化為迭代器