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

人生苦短,我選Pythonpython

前文傳送門git

小白學 Python(1):開篇github

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

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

小白學 Python(4):變量基礎操做3d

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

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

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

小白學 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

相關文章
相關標籤/搜索