迭代器是一個更抽象的概念,任何對象,如果它的類別有next 方法和iter 方法返回自己本身,對於string、list、dict、tuple 等這類容器對象,使用for 迴圈遍歷是很方便的。
在後台 for 語句對容器物件呼叫 iter()函數,iter()是 python 的內建函數。 iter()會傳回一個定義了 next()方法的迭代器對象,它在容器中逐一存取容器內元素,next() 也是 python 的內建函數。在沒有後續元素時,next()會拋出一個 StopIteration 異常。 (建議學習:Python影片教學)
# 随便定义一个list listArray=[1,2,3] # 使用iter()函数 iterName=iter(listArray) print(iterName)
產生器(Generator)是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在需要傳回資料的時候使用 yield 語句。每次next()被呼叫時,生成器會傳回它脫離的位置(它記憶語句最後一次執行的位置和所有的資料值)
# 菲波那切数列 def Fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return '亲!没有数据了...' # 调用方法,生成出10个数来 f=Fib(10) # 使用一个循环捕获最后return 返回的值,保存在异常StopIteration的value中 while True: try: x=next(f) print("f:",x) except StopIteration as e: print("生成器最后的返回值是:",e.value) break
##差異:
生成器能做到迭代器能做的所有事,而且因為自動創建了iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省記憶體。除了創建和保存程式狀態的自動方法,當發生器終結時,還會自動拋出 StopIteration 異常。 更多Python相關技術文章,請造訪Python教學欄位學習!
以上是python迭代器和生成器區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!