1. 程式人生 > >這都不會?Python_迭代器與生成器

這都不會?Python_迭代器與生成器

一. 迭代器

什麼是迭代器:

  1. 提供了一個方法,可以不斷獲取物件裡的資料。
  2. 使用者不需要關心內部細節,只需要通過這個特定介面獲取資料。
  3. 當沒有資料時,再次呼叫時,會得到一個停止標記。
  4. 不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問
  5. 訪問到一半時不能往回退
  6. 便於迴圈比較大的資料集合,節省記憶體

可迭代物件: 可以通過函式 iter(物件) 生成一個迭代器的物件,都是可迭代物件

迭代器: next(物件) 使用next 能夠獲取到物件的下一個值,這個物件就被稱為迭代器

next()函式的本質,就是 呼叫 物件的  __next__() 方法,實現了 __next__() 方法的物件,就是迭代器

生成迭代器的方法: iter(可迭代物件) 通過模組 itertools

檢測一個物件是否是可迭代物件: isinstance(物件,類)

from  collections import Iterable
isinstance(物件,Iterable)</pre>

可迭代物件:

    實現了 __iter__()         方法的物件,就是可迭代物件  
def __iter__(self):
    return self</pre>

例 需求: 使用迭代器實現斐波那契數列

"""
迭代一個斐波那契數列             Python資料提升群519970686
"""
class Fibonacci(object):
    def __init__(self):      #  初始化引數
        self.__f1 = 1
        self.__f2 = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.__f1, self.__f2 = self.__f2, self.__f2 +self.__f1         #  實現邏輯的方法

        return self.__f1

res = Fibonacci(20)   #  傳入一個實參
i = 0
for v in res:
    if i <= 10:     #  遍歷列印輸出10次
        print(v)
        i += 1
    else:

二 . 生成器

什麼事生成器:

利用迭代器,我們可以不斷的獲取資料。在實際開發中,我們有時候希望資料一開始不存放在記憶體上,而且在遵循某種規律的情況下,用的時候再給使用者.

生成器其實是一種特殊的迭代器,不過這種迭代器更加優雅。它不需要再像上面的類一樣寫iter()和next()方法

列表生成器:

li1 = [v * 5 for v in range(10)] # 這是列表推導式, 掉不呼叫都生成一個列表,耗資源

print(li)

li2 = (v * 5 for v in range(10)) # 這是列表生成器,呼叫時再載入,節約資源

print(next(li2))

print(next(li2))

print(next(li2))

函式生成器: yield

使用yield,yield相當與return,但不是停止函式執行,而是相當於暫停函式執行

注意: 函式生成器,是通過函式內部使用yield來實現的,一旦函式內部使用yield,函式名()呼叫時,函式的程式碼不會執行,會返回一個生成器,使用next(生成器)時,函式程式碼從開始執行,直到遇到yield,程式碼暫停執行,當再次使用next是,繼續執行.(意思就是呼叫一次,載入一次)

例 需求: 使用函式生成器_斐波那契數列

def fib(n):   # 定義一個待傳入的形參
    x, y = 0, 1
    i = 0
    while i <= n:
        x, y = y, x + y             #   斐波那契數列( 普通函式 )
        print(x)
        i += 1

fib(10)     #   傳入實參,範圍顯示

擴充套件: @property的裝飾器 可以讓我們的程式碼變得更加的簡介優雅.