1. 程式人生 > >迭代器與生成器

迭代器與生成器

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返回,自此執行時繼續上次執行。