python入門(三)迭代器和生成器

迭代器

  • 迭代器可以記住遍歷位置的對象
  • 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...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容