前言python
使用for循環去遍歷序列,可是for循環的效率很低,並且佔用了大量的硬件資源。python2.7
生成器能夠提升for循環遍歷效率,並且節省硬件資源。函數
1、可迭代對象spa
一、for循環數據類型code
(1)集合數據類型,如:list(列表)、tuple(元祖)、dict(字典)、set(集合)、str(字符串)、bytes(字節)等。對象
(2)生成器(generator),包括生成器和帶yield的生成器函數。blog
二、可迭代對象(Iterable
):直接用於for循環遍歷數據的對象。資源
三、用isinstance()方法判斷一個對象是不是
字符串Iterable
對象
>>> from collections import Iterable __main__:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working >>> isinstance([],Iterable) True >>> isinstance((),Iterable) True >>> isinstance(100,Iterable) False >>> isinstance('a',Iterable) True
生成器不但能夠做用於for循環,還能夠被__next__()函數不斷調用,而且返回下一個值,直到最後拋出StopIteration
錯誤表示沒法繼續返回下一個值而拋出的異常。generator
2、迭代器
一、定義
迭代器(Iterator
):能夠用__next__()函數調用並不斷的返回下一個值的對象稱爲迭代器。
二、用isinstance()方法判斷一個對象是不是
Iterator
對象
>>> from collections import Iterator >>> isinstance({},Iterator) False >>> isinstance([],Iterator) False >>> isinstance((i+2 for i in range(5)),Iterator)#生成器 True >>> isinstance('hhsh',Iterator) False
生成器都是Iterator
對象,可是list、dict、str雖然是Iterable
對象,卻不是Iterator
對象。
由於python的Iterator
對象表示的是一個數據流,Iterator對象能夠被__next__()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。能夠把這個數據流看作是一個有序序列,但咱們卻不能提早知道序列的長度,只能不斷經過__next__()函數實現按需計算下一個數據,因此Iterator
的計算是惰性的,只有在須要返回下一個數據時纔會計算。
因此Iterator
甚至能夠表示一個無限大的數據流,例如:全體天然數。而使用list是永遠不可能存儲全體天然數的。
三、iter()函數
iter()函數能夠
把list、dict、str等Iterable
對象變成Iterator
對象。
>>> isinstance(iter('hhsh'),Iterator) True >>> isinstance(iter({}),Iterator) True >>> isinstance(iter([]),Iterator)
true
四、rang()方法
在python2.7中rang()只是一個list,在python3中是一個迭代器,python2.7中xrange()跟python3中的range()功能是同樣的。
>>> range(5) range(0, 5)
運行原理:
x = iter([1,2,3,4,5]) # 首先得到Iterator對象 while True: # 循環 try: i = next(x) # 得到下一個值 except StopIteration: # 遇到StopIteration就退出循環 break
總結
Iterable
類型。Iterator
類型,它們表示一個惰性計算的序列。Iterable
但不是Iterator
iter
()函數得到一個Iterator
對象。