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

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

人生苦短,我選Python

迭代器

迭代器可以簡單的理解為 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() ,從名字上就能看出來,它的作用是下一個。

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

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

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
/<module>
小白學 Python(20):迭代器基礎

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

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

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

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

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

執行結果:

<class>
/<class>

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

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

執行結果:

1
2
3
4

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

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

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

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
/<module>

看到了咯,會拋出 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))

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

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

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

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

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

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

示例代碼

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

示例代碼-Github:https://github.com/meteor1993/python-learning/tree/master/base-iter

示例代碼-Gitee:https://github.com/meteor1993/python-learning/tree/master/base-iter


分享到:


相關文章: