迭代器
- 迭代器可以記住遍歷位置的對象
- list、tuple、dict都只是可以迭代的對象,不是迭代器,所以要創(chuàng)建一個(gè)迭代器
- 迭代器的倆個(gè)基本方法 iter() 和 next()
- iter() 用于創(chuàng)建一個(gè)迭代器、next() 輸出當(dāng)前位置的對象,只能往前不能后退
- 從一個(gè)簡單的例子開始,list 輸出前倆個(gè)元素
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num) #創(chuàng)建迭代器
print(next(it))
print(next(it))
#輸出結(jié)果
1
2
- 如何用于for循環(huán)呢
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
for x in it:
print(x)
#輸出結(jié)果
1
2
3
4
5
6
7
8
9
- 使用next()方法來遍歷呢
- next()遍歷到最后的時(shí)候會拋出StopIteration異常,捕獲然后跳出循環(huán)
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
while True:
try:
print(next(it))
except StopIteration:
break
#輸出結(jié)果 同上
生成器
- 生成器是迭代器的一種
- 使用yield函數(shù) 就像單步調(diào)試一樣記住當(dāng)前執(zhí)行的位置,使用next()之后會從原來的位置繼續(xù)執(zhí)行。
- 先來個(gè)簡單的例子看下怎么使用
#!/usr/bin/python3
def foo():
while True:
yield 4
print('end....')
f = foo()
print(next(f))
print('中間')
print(next(f))
#輸出結(jié)果
4
中間
end....
4
- 使用def 定一個(gè)了一個(gè)函數(shù)foo,單獨(dú)看這個(gè)函數(shù)while循環(huán)一直是true,這里先把yield 看成return返回4
- f = foo() 將函數(shù)賦值給了f
- 執(zhí)行print(next(f)) 會先輸出4
- 由于使用了yield 所以函數(shù)不會繼續(xù)執(zhí)行
- 那就執(zhí)行print('中間') 輸出了 ‘中間’
- print(next(f)) 這次再次執(zhí)行會在原來的執(zhí)行位置繼續(xù)執(zhí)行 print('end....')
- 最后while繼續(xù)執(zhí)行輸出 4
總結(jié)一下:其實(shí)從例子完全可以看出, yield會返回一個(gè)結(jié)果,并且記住當(dāng)前執(zhí)行的位置,通過使用next() 會在原來執(zhí)行的位置繼續(xù)執(zhí)行程序。
來一個(gè)稍微復(fù)雜點(diǎn)的,使用生成器實(shí)現(xiàn)斐波那契數(shù)列
#!/usr/bin/python3
def foo(n):
a, b, item = 0, 1, 1
while True:
if(item > n):
return
yield b
a, b = b, a+b
item+=1
f = foo(10)
while True:
try:
print(next(f))
except StopIteration:
print('end...')
break
#輸出結(jié)果
1
1
2
3
5
8
13
21
34
55
end...