python 生成器與迭代器的區別


python 生成器與迭代器的區別

迭代器

迭代只是訪問集合元素的一種方式。

迭代器有兩個基本的方法:iter()next()

簡單來說字符串,元組,列表都是迭代器,只不過這些變量(迭代器對象)在被遍歷的時候自動調用next()方法

#!/usr/bin/python3
 
list=[1,2,3,4]

for x in list:
    print (x, end=" ")
    
-------------------
1 2 3 4 

也可以自己調用iter()創建迭代器對象並for循環遍歷

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 創建迭代器對象
for x in it:
    print (x, end=" ")
   
-------------------
1 2 3 4

或者通過next()方法訪問

list=[1,2,3,4]

it = iter(list)   # 創建迭代器對象
print(next(it))  # 輸出迭代器的下一個元素
print(next(it))

-------------------
1 2

但循環遍歷時需注意程序調用完迭代器中最后一個變量時並不會停止繼續訪問便拋出異常

image-20210117222901311

StopIteration 異常標志着迭代器的完成

image-20210117223103953

生成器

在 Python 中,使用了 yield 的函數被稱為生成器(generator)。

跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用於迭代操作,更簡單點理解生成器就是一個迭代器。

在調用生成器運行的過程中,每次遇到 yield 時函數會暫停並保存當前所有的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。

調用一個生成器函數,返回的是一個迭代器對象。

以下實例使用 yield 實現斐波那契數列:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函數 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
        
--------------------
0 1 1 2 3 5 8 13 21 34 55 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM