本文屬於個人對知識總結,若有不當或錯誤,還望各位看官糾正
- 說到迭代器和生成器,就必須知道:
- 可迭代對象;
- 迭代器;
- 生成器.
重要的寫在前面
迭代器和生成器的區別和關係
生成器是迭代器的一種
迭代器是惰性執行的,調用一次執行一次
1.迭代器是對已知數據進行操作next()
2.生成器是通過算法計算,返回數據,一般生成器函數都會有 yield 這個關鍵字
什麼是可迭代對象呢?
- 我們已經知道可以對list、tuple、str等類型的數據使⽤for…in…的循環語法從其中依次拿到數據進⾏使⽤,這樣的過程也被稱爲遍歷,也叫迭代。
- 總結 : 可遍歷
(for ... in ... :)
的對象,就是一個可迭代對象.
迭代器
-
判斷是否是迭代器
- python中的 isinstance() 可以判斷你傳入的對象是否是某一特定的類型,是返回true,否返回
false.
- 用法:
from collections import Iterable,Iterator l = [1,2,3,4,56,6,6,] print(isinstance(l,Iterable)) # true print(isinstance(l,Iterator)) # false lo = iter(l) #獲得 l 的迭代器對象 print(isinstance(lo,Iterable)) # true print(isinstance(lo,Iterator)) # true
- python中的 isinstance() 可以判斷你傳入的對象是否是某一特定的類型,是返回true,否返回
-
iter()函數,Python中的 iter( object[, sentinel]) 函數可用來返回一個迭代器對象,iter( )函數只傳入一個參數時,參數必須爲可迭代對象;當使用第二個參數sentinel(哨兵)時,第一個參數必須是一個可調用對象.
- 迭代器簡單使用
l = [1,2,3,4,56,6,6,] lo = iter(l) for i in range(len(l): print(next(lo)) # 在lo元素調用完之後,在使用next() print(next(lo))# 會報 StopIteration異常
- 迭代器簡單使用
-
把一個類作爲一個迭代器使用需要在類中實現兩個方法 iter() 與 next() 。
iter() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 next() 方法並* 通過 StopIteration 異常標識迭代的完成。 -
next() 方法(Python 2 裏是 next())會返回下一個迭代器對象。
-
例子請看 https://www.runoob.com/python3/python3-iterator-generator.html
生成器
-
如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器(Generator)
def gen(): for i in range(10): n = i + 1 yield n g = gen() print(g) print(next(g)) for n in g: print(n)
輸出結果
解釋: 語句 print(g) 輸出的不是數據,而是一個生成器對象,需要使用next(),調用 gen() 函數, 不斷的計算 n 的值,並通過 yield 返回 n 值.
yeild
當程序執行到 yield 這裏時,系統一般會保存程序當前的執行狀態,當下一次調用(此函數的next(n)
),程序就會接着上一次保存的狀態,繼續執行.
總結:
迭代器和生成器的區別和關係
生成器是迭代器的一種
迭代器是惰性執行的,調用一次執行一次
1.迭代器是對已知數據進行操作next()
2.生成器是通過算法計算,返回數據,一般生成器函數都會有 yield 這個關鍵字