中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 中可迭代對象和迭代器生成器的區別是什么

發布時間:2021-07-06 18:20:19 來源:億速云 閱讀:257 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關Python 中可迭代對象和迭代器生成器的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Python 中可迭代對象和迭代器生成器的區別是什么

 生成器是一種特殊的迭代器,生成器自動實現了“迭代器協議”(即__iter__和next方法),不需要再手動實現兩方法。

首先從字面意思來解釋Iterable和Iterator的區別
Iterable:由英文的命名規則知道,后綴是able的意思就是可怎么樣的,因此iterable就是可迭代的意思 可迭代對象。
Iterator:由英文的命名規則知道,后綴是or或者er的都是指代名詞,所以iterator的意思是迭代器。
這兩個概念之間有一個包含與被包含的關系,如果一個對象是迭代器,那么這個對象肯定是可迭代的;但是反過來,如果一個對象是可迭代的,那么這個對象不一定是迭代器。
下面我們來具體了解下可迭代對象和迭代器:
可迭代
如果給定一個list或者tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱之為迭代,在python中,迭代是通過for……in來完成的,它不僅可以用在list或tuple上,還可以用在其他可迭代對象上,那么我們怎么知道一個對象是否可迭代呢?方法是通過collections模塊的 Iterable 類型判斷:

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數是否可迭代
False


可以直接作用于for循環的對象統稱為可迭代對象,一共有兩類,一類是我們平時常用的python數據類型,如list,tuple,dict,set都是可迭代對象,字符串也是可迭代對象,但是整數就不是可迭代對象;另一類是generator(下面會給出簡單講解)
迭代器:
對于列表這種數據結構,里面的每一個元素我們都要在內存中為之開辟一個空間,不管你以后是否能用到它,如果要創建一個包含100萬個元素的列表,但是只會用到其中幾個元素,那么這樣顯然就很浪費內存,所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在python中這種一邊循環一邊計算的機制,稱為生成器:generator。
要創建一個一個generator,有很多種方法,最簡單的方法就是直接把一個列表生成器的[]改成()

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>


可以看到創建的列表是將所有的元素都輸出出來,而生成器只是生成一個對象,如果使用其中的元素,可以通過生成器的next來調用

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

next方法太費勁,也可以通過for循環

>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
... 
0
1
4
9
16
25
36
49
64
81


以上是為后面要說的迭代器做鋪墊,下面是重點
生成器不但可以作用于for循環,還可以被next()函數不斷調用并返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續返回下一個值了。
可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。
可以使用isinstance()判斷一個對象是否是Iterator對象

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False


生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True


為什么list、dict、str等數據類型不是Iterator?
這時 因為python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用并不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前直到序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator甚至可以表示一個無限大的數據流,如全體自然數,而列表是永遠不可能存儲全體自然數的。
總結:
凡是可作用于for循環的對象都是Iterable類型,可迭代對象;
凡是可用作next()函數的對象都是Iterator類型,它表示一個惰性計算的序列。
集合數據類型如list,dict,str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象

生成器的創建:1.使用 for 循環的生成器推導式。2.調用帶 yield 語句的生成器函數

迭代器生辰器異同

一.迭代器

通過iter()方法獲得了list的迭代器對象,然后就可以通過next()方法來訪問list中的元素了。當容器中沒有可訪問的元素后,next()方法將會拋出一個StopIteration異常終止迭代器。

二.生成器

如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator)

以上就是Python 中可迭代對象和迭代器生成器的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦东新区| 上思县| 将乐县| 肃北| 温泉县| 林西县| 固阳县| 札达县| 昆明市| 平和县| 红河县| 巧家县| 绥芬河市| 钟山县| 交口县| 莱州市| 彰化县| 盘山县| 淮南市| 竹山县| 乡城县| 陇西县| 乌恰县| 深水埗区| 临漳县| 保定市| 正定县| 托里县| 民和| 梧州市| 贵阳市| 安顺市| 金寨县| 高雄县| 县级市| 巴中市| 林州市| 肥乡县| 东明县| 高邑县| 长岛县|