python高級-迭代器(18)

1、什麼是迭代器

  • 迭代是訪問集合元素的⼀種⽅式。
  • 迭代器是⼀個能夠記住遍歷的位置的對象。
  • 迭代器對象從集合的第⼀個元素開始訪問,直到全部的元素被訪問完結束。
  • 迭代器只能往前不會後退

 

2、可迭代對象

直接做⽤於 for 循環的數據類型有如下⼏種:函數

  • ⼀類是集合數據類型:如 list 、 tuple 、 dict 、 set 、 str 等;
  • ⼀類是generator ,包括⽣成器和帶 yield 的generator function。

這些能夠直接做⽤於 for 循環的對象統稱爲可迭代對象: Iterable工具

 

3、判斷是否能夠迭代

能夠使⽤ isinstance() 判斷⼀個對象是不是 Iterable 對象:spa

#從collections.abc模塊導入Iterable工具
from collections.abc import Iterable #判斷列表是否能夠迭代
print(isinstance([],Iterable)) #判斷字典是否能夠迭代
print(isinstance({},Iterable)) #判斷生成器是否能夠迭代
print(isinstance((x for x in range(1,10)),Iterable)) #判斷字符串是否能夠迭代
print(isinstance("abc",Iterable)) #判斷整形是否能夠迭代
print(isinstance(100,Iterable))

運行結果爲:code

True
True
True
True
False

能夠看出,列表、字典、生成器、字符串都是能夠被迭代的,而整形常量不能夠被迭代對象

 

4、迭代器

能夠被next()函數調⽤並不斷返回下⼀個值的對象稱爲迭代器:Iterator。
能夠使⽤ isinstance() 判斷⼀個對象是不是 Iterator 對象:blog

#從collections.abc模塊導入Iterator工具
from collections.abc import Iterator #判斷列表是否能夠迭代
print(isinstance([],Iterator)) #判斷字典是否能夠迭代
print(isinstance({},Iterator)) #判斷生成器是否能夠迭代
print(isinstance((x for x in range(1,10)),Iterator)) #判斷字符串是否能夠迭代
print(isinstance("abc",Iterator)) #判斷整形是否能夠迭代
print(isinstance(100,Iterator))

運行結果爲:內存

False
False
True
False
False

注意:ci

  • 判斷是否能夠被迭代使用的是 Iterable,而判斷是不是迭代器使用的是 Iterator,不同的 。
  • 生成器也是迭代器
  • 列表、字典、字符串雖然能夠被迭代,可是不是迭代器,這就說明了,迭代器必定能夠迭代,可是能夠迭代的不必定是迭代器。這個道理就和魚會游泳,可是會游泳的不必定是魚,一個道理。

 

5、iter()函數

⽣成器是迭代器對象,但列表、字典 、字符串雖然是可迭代的,卻不是迭代器。把列表、字典、字符串等可迭代對象變成迭代器能夠使⽤ iter() 函數:字符串

#從collections.abc模塊導入Iterator工具
from collections.abc import Iterator #沒有使用iter()函數
print(isinstance([],Iterator)) print(isinstance("abc",Iterator)) #使用iter()函數
print(isinstance(iter([]),Iterator)) print(isinstance(iter("abc"),Iterator))

運行結果爲:generator

False
False
True
True

 

6、使用迭代器完成for循環的底層實現

for x in [1,2,3,4,5]: print(x) #徹底等價於

# 首先得到Iterator對象:
it = iter([1, 2, 3, 4, 5]) # 循環:
while True: try: # 得到下一個值:
        x = next(it) print(x) except StopIteration: # 遇到StopIteration就退出循環
        break

總結

 

  • 凡是可做⽤於 for 循環的對象都是 Iterable 類型;
  • 凡是可做⽤於 next() 函數的對象都是 Iterator 類型
  • 集合數據類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過能夠經過 iter() 函數得到⼀個 Iterator 對象。
  • 迭代器對象就是實現了iter() 和 next()方法的對象.其中iter()返回迭代器自己,而next()返回容器的下一個元素,在結尾處引起StopInteration異常.
  • 迭代器的優勢:省內存.它是一種經過延時建立的方式生成一個序列,只有在須要的時候才被建立.
  • 迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問結束,只能往前不能後退
相關文章
相關標籤/搜索