1. 程式人生 > >[Python3]叠代器和生成器

[Python3]叠代器和生成器

數列 不同 cci == 結合 adding 訪問 python3 處理

叠代器

叠代是Python最強大的功能特色,是遍歷訪問序列元素的一種方式。

叠代器的特性是:

  • 可以記住當前遍歷位置

  • 只能往前遍歷,不能後退

  • 從序列的第一個元素開始訪問,直至所有元素被訪問完

  • 有兩個基本方法: iter() 和 next()

  • 字符串、列表或元組對象可以用於創建叠代器

下面看以下實例:

# -*- coding:utf-8 -*-
__author__ = 谷白

import sys

if __name__ == "__main__":
    seq_tuple = (1, 2, 3, 4, 5)    
    
    
# 創建叠代器 seq_it = iter(seq_tuple) # 訪問打印第一個元素 print("第一個元素:%s" % next(seq_it)) # 訪問打印第二個元素 print("第二個元素:%s" % next(seq_it)) # 訪問打印第三個元素 print("第三個元素:%s" % next(seq_it)) # 使用for循環來遍歷叠代器對象 print("\nfor循環遍歷叠代器對象: ") for_it
= iter(seq_tuple) for x in for_it: print(x, end= ) # 使用while結合next遍歷叠代器對象 print("\n\nwhile & next遍歷叠代器對象: ") while_it = iter(seq_tuple) while True: try: print(next(while_it)) except StopAsyncIteration: sys.exit()

運行結果如下:

第一個元素:1
第二個元素:2
第三個元素:3

for循環遍歷叠代器對象: 
1 2 3 4 5 

while & next遍歷叠代器對象: 
1
2
3
4
5
Traceback (most recent call last):
  File "E:/code/python/sample/叠代器.py", line 32, in <module>
    print(next(while_it))
StopIteration

請註意上述才異常拋出,因為這裏已經遍歷超出了序列的邊界了。

生成器

在Python中使用了yield的函數,我們稱之為生成器。

與普通函數不同的是:生成器返回的是一個叠代器的函數,只能用於叠代操作,直接理解就是:生成器就是功能更強大的叠代器。

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

下面我們通過使用生成器來實現斐波那契數列:

# -*- coding:utf-8 -*-

__author__ = 谷白

import sys

# 生成器函數
# 實現斐波那契數列
def fibonacci(n):
    # 初始化變量
    a, b, count = 0, 1, 0

    while True:        
        if count > n:     
            return

        yield a

        a, b = b, a + b
        count = count + 1

if __name__ == "__main__":    
    # 初始化生成器函數,產生一個生成器函數
    f = fibonacci(10)    
    
    while True:    
        try:
            print(next(f), end= )        
        except StopAsyncIteration:
            sys.exit(0)

運行結果如下:

0 1 1 2 3 5 8 13 21 34 55 Traceback (most recent call last):
  File "E:/code/python/sample/生成器.py", line 30, in <module>
    print(next(f), end= )
StopIteration

註:上述輸出有異常拋出,是正常的。

實踐提升題

大家可以嘗試利用生成器函數去讀大文件,例如10G的文件,你可以利用生成器函數,每次只讀100M進行處理,處理完後再讀取下一個100M,如此叠代下去。

[Python3]叠代器和生成器