迭代器

前言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

  總結

  1. 凡是能夠做用於for循環的對象都是Iterable類型。
  2. 凡是做用於__next__()函數的對象都是Iterator類型,它們表示一個惰性計算的序列。
  3. 集合數據類型,例如:list、dict、str等,是Iterable但不是Iterator
  4. 集合數據類型能夠經過iter()函數得到一個Iterator對象。
相關文章
相關標籤/搜索