小白學 Python(20):迭代器基礎

  • 2019 年 11 月 13 日
  • 筆記

人生苦短,我選Python

前文傳送門

小白學 Python(1):開篇

小白學 Python(2):基礎數據類型(上)

小白學 Python(3):基礎數據類型(下)

小白學 Python(4):變數基礎操作

小白學 Python(5):基礎運算符(上)

小白學 Python(6):基礎運算符(下)

小白學 Python(7):基礎流程式控制制(上)

小白學 Python(8):基礎流程式控制制(下)

小白學 Python(9):基礎數據結構(列表)(上)

小白學 Python(10):基礎數據結構(列表)(下)

小白學 Python(11):基礎數據結構(元組)

小白學 Python(12):基礎數據結構(字典)(上)

小白學 Python(13):基礎數據結構(字典)(下)

小白學 Python(14):基礎數據結構(集合)(上)

小白學 Python(15):基礎數據結構(集合)(下)

小白學 Python(16):基礎數據類型(函數)(上)

小白學 Python(17):基礎數據類型(函數)(下)

小白學 Python(18):基礎文件操作

小白學 Python(18):基礎文件操作

小白學 Python(19):基礎異常處理

迭代器

迭代器可以簡單的理解為 for 循環, Python 除了 for 循環為我們準備了另一種訪問集合元素的方式。

特點:

  • 可以記住遍歷的位置的對象。
  • 迭代器從集合的第一個元素開始訪問,直到所有的元素訪問結束。
  • 迭代器只能向前不能後退。

但是判斷一個對象是否有迭代器,除了看它能不能使用 for 循環外, Python 也為我們提供了更加專業的方法—— isinstance()

我們可以使用 isinstance() 來判斷當前的對象是否可以迭代。

在使用迭代器之前,需要先將迭代器引入,因為迭代器不是 Python 的內置方法。

from collections.abc import Iterable    print(isinstance('geekdigging', Iterable))  print(isinstance([], Iterable))  print(isinstance([], Iterable))  print(isinstance({x for x in range(5)}, Iterable))  print(isinstance(123, Iterable))

列印結果如下:

True  True  True  True  False

這裡有一個小點注意一下,當我們在引入 Iterable 的時候,在之前的版本引入方式都是 from collections import Iterable ,但是在 Python3.7 的時候拋了一個異常出來,如下:

D:/Development/Projects/python-learning/base-iter/Demo.py:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working    from collections import Iterable

含義是這種引入方式將在 Python3.8 中停止使用,現在 Python3.8 已經發布了,我們就按照提示中的方式來引入,使用 from collections.abc import Iterable

迭代器中,最重要的方法一定是 next() ,從名字上就能看出來,它的作用是下一個。

我們現在來嘗試迭代一個列表:

list1 = [1, 2, 3, 4]  next(list1)

執行結果:

Traceback (most recent call last):    File "D:/Development/Projects/python-learning/base-iter/Demo.py", line 12, in <module>      next(list1)  TypeError: 'list' object is not an iterator

不是說好的列表是可以迭代的么,為什麼又報錯了。

這位同學,先消消氣,看看報錯資訊說的是啥,這是在提示我們列表並不是一個迭代器。

所以,可迭代對象不一定是迭代器!

我們導入 Iterator 模組,先將列錶轉換成迭代器,再試試看。

list1 = iter(list1)  print(type(list1))

執行結果:

<class 'list_iterator'>

從類型上來看,現在已經是一個可以迭代的列表了,我們再試試 next() 方法。

print(next(list1))  print(next(list1))  print(next(list1))  print(next(list1))

執行結果:

1  2  3  4

你看,現在就能正常列印了吧。

剛才我們將整個列表中的元素迭代完了,如果這時候再迭代一次會怎麼樣呢?

print(next(list1))

執行結果:

Traceback (most recent call last):    File "D:/Development/Projects/python-learning/base-iter/Demo.py", line 23, in <module>      print(next(list1))  StopIteration

看到了咯,會拋出 StopIteration 的異常。

可能看到這裡,大家還是感覺迭代器沒什麼用,下面我再來舉個例子,如果我們現在有一個 set 集合,我想要獲取一個一個 set 集合中的元素,這時迭代器就派上用場了,因為在 set 集合中,是沒有索引的,如果想要取到某個值,就只能使用 for 循環整個集合,但是有了迭代器以後,我們就無需循環整個集合了。

set1 = {1, 2, 3, 4, 5}  set1 = iter(set1)  print(next(set1))  print(next(set1))  print(next(set1))  print(next(set1))  print(next(set1))

結果我就不放出來了,大家應該都知道結果了。

除此之外,迭代器有一個非常巨大的優勢是在迭代之前,無需準備好所有的元素,迭代器僅在迭代到某個元素的時候才開始計算這個元素,在這之前或者之後,元素是可以不存在或者被銷毀的。

這個特性使得它在遍歷一些體積巨大的集合的時候,具有非常大的優勢。

今天的內容到這裡就結束,希望各位同學可以自己動手嘗試一下迭代其他集合類型,如元組,字典等。

感謝各位同學長久以來對我的支援,你們的轉發和關注是我最大的動力。

示例程式碼

本系列的所有程式碼小編都會放在程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例程式碼-Github

示例程式碼-Gitee