生成器 generator
一. 推導(dǎo)式
語法 : [表達式 值域 篩選條件]
eg : (var+100 for var in range(0,100) if not var & 1)
返回 : 返回值域內(nèi)符合條件的數(shù)據(jù)經(jīng)表達式運算后的對象集合
Note : 使用_next__
訪問下一個元素,只可遍歷一次,延時操作
二. 函數(shù)生成器 yield
#菲波那切數(shù)列--yield
def Fib(max):
n, x, y = 0, 0, 1;
while n < max:
yield y; #1
x, y = y, x + y;
n += 1;
return 'None';
f = Fib(20); #2
for x in f:
print(x);
print(next(f)); #Error: StopIteration
- 生成器(generator)是一種特殊的迭代器(iterator)
- 當(dāng)函數(shù)中含有
yield
關(guān)鍵字,那么這個函數(shù)就變?yōu)樯善?/li> - #2相當(dāng)于實例化,但程序不會運行糖驴。當(dāng)循環(huán)f調(diào)用x的時候程序第一次執(zhí)行
- 首次調(diào)用必須使用
__next__
或next()
- for循環(huán)默認(rèn)每次調(diào)用
__next__
或next()
- 第一次循環(huán)程序到#1處程序掛起并返回yield右側(cè)值
- 第二次循環(huán)程序從yield處開始運行
-
yield
只能遍歷一次菲茬,遍歷到最后會拋出異常StopIteration -
send()
函數(shù)可以傳遞參數(shù)求晶,通過yield
右側(cè)表達式給左側(cè)賦值
特點
- 只可遍歷一次
- 延時操作
- 調(diào)用生成器中的元素時才會執(zhí)行函數(shù)生成數(shù)據(jù)
- 節(jié)省內(nèi)存吓笙,提高CPU效率