Python 高級特性(5)- 迭代器 Iterator


前言

迭代器貌似是 Python3 才有的(猜的),在廖雪峰大神的網站中 Python2 是沒有迭代器一欄的

 

可 for 循環的對象

  • 常見集合數據類型(迭代對象):list、tuple、dict、set、str
  • 生成器 generator

 

可迭代對象(Iterable)

可以直接用 for 循環的對象都叫可迭代對象

 

關於 Iterable 的文章可以再看看這篇

https://www.cnblogs.com/poloyy/p/14658433.html

 

復習下生成器

它可以用 for 循環拿到下一個值,也可以用 .next() 函數來拿到下一個值

 

迭代器(Iterator)

可以通過 .next() 函數調用並不斷返回下一個值的對象就是迭代器

 

如何判斷是不是迭代器

可以使用 isinstance() 判斷一個對象是否是 Iterator 對象

print(isinstance([], Iterator))
print(isinstance({}, Iterator))
print(isinstance("test", Iterator))
print(isinstance(1234, Iterator))
print(isinstance([x for x in range(2)], Iterator))
print(isinstance((x for x in range(2)), Iterator))
print(isinstance(enumerate([]), Iterator))

# 輸出結果
False
False
False
False
False
True
True

生成器都是 Iterator 對象,但 list、dict、str 雖然是 Iterable ,卻不是 Iterator 

 

如何變成 Iterator

把 list、dict、str 等 Iterable 變成 Iterator 可以使用 iter() 函數

print(isinstance(iter([]), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter("test"), Iterator))
print(isinstance(iter([x for x in range(2)]), Iterator))

# 輸出結果
True
True
True
True

注意:非 iterable 對象不能調用這個方法哦,比如整型

 

為什么 list、dict、str 等數據類型不是 Iterator

  • Iterator 對象表示的是一個數據流,Iterator 對象可以被  next() 函數調用並不斷返回下一個數據,直到沒有數據時拋出  StopIteration 錯誤
  • 可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過 next() 函數實現按需計算下一個數據,所以 Iterator 的計算是惰性的,只有在需要返回下一個數據時它才會計算
  • Iterator 甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的

 

總結

  • 凡是可作用於 for 循環的對象都是 Iterable 類型
  • 凡是可作用於 next() 函數的對象都是 Iterator 類型,它們表示一個惰性計算的序列
  • 集合數據類型如 list、dict、str 等是 Iterable 但不是 Iterator,不過可以通過 iter() 函數獲得一個 Iterator 對象
  • Python 的 for 循環本質上就是通過不斷調用 next() 函數實現的

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM