1. 程式人生 > >叠代器_可叠代對象_生成器

叠代器_可叠代對象_生成器

port yield iter() als ins typeerror tor list collect

[可叠代對象]保存的是已經生成好的數據,占用大量的空間
有__iter__方法 就是可叠代對象(Iterable)

[叠代器]保存的是生成數據的方法,占用極小的空間,需要時才返回數據
既有__iter__,也有__next__ 就是叠代器(Iterator)

[生成器]是一個[特殊]的叠代器,保存生成數據的方法
(標誌就是def中的[yiled],有了yield的def就不是函數(function)
生成器的send(參數) 可以在喚醒時返回參數(需要變量接收),

可叠代對象(iterable):能用for...in...來遍歷其中內容的 數據類型
包含:[list、tuple、dict、set、str](集合數據類型)、[生成器\列表生成式\叠代器]

叠代器(Iterator):能被next()查詢的 數據類型 Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算
包含:生成器、generator function

for...in...循環的本質
1.判斷是否是可叠代對象
  1.1 是 可叠代對象
    2.1 通過可叠代對象的iter()函數,調用可叠代對象中的__iter__方法的的來返回可叠代對象的叠代器,
    2.2 然後通過叠代器的next()函數,調用叠代器的__next__方法返回數據
    2.3 直到異常StopIteration產生,退出叠代for...in...過程.
1.2 否 報錯
TypeError: ‘xxx‘ object is not iterable

判斷方式:
from collections import Iterable #調用collections模塊中的Iterable
#例子:
isinstance(‘abc‘, Iterable) # str是否可叠代
True
isinstance([1,2,3], Iterable) # list是否可叠代
True
isinstance(123, Iterable) # 整數是否可叠代
False

總結:

1.叠代器一定是叠代對象,叠代對象不一定是叠代器(list等)

2.生成器一定是叠代器,叠代器中特殊的一種是生成器

3.使用for...in...來遍歷叠代對象是最常用的方式

叠代器_可叠代對象_生成器