這都不會?Python_迭代器與生成器
阿新 • • 發佈:2018-12-15
一. 迭代器
什麼是迭代器:
- 提供了一個方法,可以不斷獲取物件裡的資料。
- 使用者不需要關心內部細節,只需要通過這個特定介面獲取資料。
- 當沒有資料時,再次呼叫時,會得到一個停止標記。
- 不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問
- 訪問到一半時不能往回退
- 便於迴圈比較大的資料集合,節省記憶體
可迭代物件: 可以通過函式 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的裝飾器 可以讓我們的程式碼變得更加的簡介優雅.