迭代器與生成器
阿新 • • 發佈:2018-12-10
isinstance關鍵字
用來判斷一個物件的變數型別
a=[1,2,3,4,5]
print(isinstance(a,list))
>>>
True
enumerate 函式
用於遍歷序列中的元素以及它們的下標
for i,j in enumerate(('a','b','c')):
print i,j
0 a
1 b
2 c
迭代器:
#for 建立list a=['a','b','c'] b=[i for i in a] print(b) >>>['a','b','c'] #對a中的元素乘以10,形成新的列表 a=[1,2,3,4,5] b=[i*10 for i in a] print(b) >>>[10,20,30,40,50] #對a中的元素進行判斷 a=[1,2,3,4,5] b=[i for i in a if i%2==0] print(b) >>>[2,4] #兩個列表相加生成新列表 a=[1,2,3] b=[100,200,300] c=[m+n for m in a for n in b] print(c) >>>[101, 201, 301, 102, 202, 302, 103, 203, 303]
生成器
一邊迴圈一邊計算的機制(generator)
建立list運用 ' [ ] ',而建立generator運用 ' ( ) '
l=(x*x for x in range(10)) print(l) print(next(l)) print(next(l)) print(next(l)) >>> <generator object <genexpr> at 0x000002D2C3B70FC0> 0 1 4 #改進一下哈 l=(x*x for x in range(4)) for n in l: print(n) >>> 0 1 4 9
此時generator儲存的是演算法,每次呼叫 next (g),就計算出 l 下一個元素的值,直到計算出最後一個元素,沒有更多的元素,就丟擲錯誤:StopIteration
def fib(max): n,a,b=0,0,1 while n<max: yield b a,b=b,a+b #print(a,b) n+=1 return "done" data=fib(6) print(data) print(data.__next__()) print(data.__next__()) print("中場休息一下!") print(data.__next__()) print(data.__next__()) print(data.__next__()) print(data.__next__()) >>> <generator object fib at 0x000002A2F40D0FC0> 1 1 中場休息一下! 2 3 5 8
generator與函式的執行流程不一樣。函式順序執行,遇到return,或者最後一行就會自動返回;generator呼叫時遇到next ( ) 執行,遇到yield返回,自此執行時繼續上次執行。