什麼是迭代器:python
可迭代對象: 能夠經過函數 iter(對象) 生成一個迭代器的對象,都是可迭代對象
迭代器: next(對象) 使用next 可以獲取到對象的下一個值,這個對象就被稱爲迭代器
next()函數的本質,就是 調用 對象的 __next__() 方法,實現了 __next__() 方法的對象,就是迭代器
生成迭代器的方法: iter(可迭代對象) 經過模塊 itertools
檢測一個對象是不是可迭代對象: isinstance(對象,類)函數
from collections import Iterable isinstance(對象,Iterable)
可迭代對象:spa
實現了 __iter__() 方法的對象,就是可迭代對象 code
def __iter__(self): return self
例 需求: 使用迭代器實現斐波那契數列對象
""" 迭代一個斐波那契數列 """ 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:
什麼事生成器:blog
利用迭代器,咱們能夠不斷的獲取數據。在實際開發中,咱們有時候但願數據一開始不存放在內存上,並且在遵循某種規律的狀況下,用的時候再給用戶.接口
生成器實際上是一種特殊的迭代器,不過這種迭代器更加優雅。它不須要再像上面的類同樣寫__iter__()和__next__()方法內存
列表生成器:ci
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的裝飾器 能夠讓咱們的代碼變得更加的簡介優雅.