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

溫馨提示×

溫馨提示×

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

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

Python中generator生成器的作用是什么

發布時間:2021-07-10 14:13:45 來源:億速云 閱讀:117 作者:Leah 欄目:大數據

Python中generator生成器的作用是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

iteration, iterable, iterator

迭代(iteration):在python中迭代通常是通過for...in...來實現的.而且只要是可迭代對象iterable,都能進行迭代.

可迭代對象(iterable):Python中的任意的對象,只要它定義了可以返回一個迭代器的 __iter__方法,或者定義了可以支持下標索引的__getitem __方法,那么它就是一個可迭代對象。簡單說,可迭代對象就是能提供迭代器的任意對象.返回的是一個iterator 對象.官方解釋

迭代器(iterator ) : 簡單的說,迭代器就是實現了iterator.__iter__() 和iterator.__next__() 的對象,iterator.__iter__()方法返回的是iterator對象本身.根據官方的說法,正是這個方法,實現了for ... in ...語句.而iterator.__next__()是iterator區別于iterable的關鍵了,它允許我們顯式地獲取一個元素.當調用next()方法時,實際上產生了2個操作:

更新iterator狀態,令其指向后一項,以便下一次調用,每一個值過后,指針移動到下一位,對iterator遍歷完后,其變成了一個空的容器,但不是None ,需要注意的是,迭代結束后,指針不會自動返回到首位,而是依舊停留在末位置,想要在開始,需要重新載入迭代對象.

實例理解:

 >>> from collections import Iterable, Iterator
 >>> a = [1,2,3]   # 眾所周知,list是一個iterable
 >>> b = iter(a)   # 通過iter()方法,得到iterator,iter()實際上調用了__iter__(),
 >>> isinstance(a, Iterable)
 True
 >>> isinstance(a, Iterator)
 False
 >>> isinstance(b, Iterable)
 True
 >>> isinstance(b, Iterator)
 True

可見,itertor 一定是iterable ,但iterable不一定是itertor

 >>> dir(a)
 ['__add__','__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__', '__reversed__','__rmul__', '__setattr__','__setitem__','__sizeof__','__str__', '__subclasshook__','append','clear' 'copy','count','extend','index','insert', 'pop','remove', 'reverse','sort']
 
 >>>dir(b)
 ['__class__','__delattr__', '__dir__', '__doc__','__eq__', '__format__','__ge__' ,'__getattribute__', '__gt__','__hash__','__init__','__iter__','__le__','__length_hint__',
 '__lt__','__ne__','__new__','__next__','__reduce__','__reduce_ex__','__repr__','__setattr__', '__setstate__','__sizeof__','__str__','__subclasshook__']

可以看到迭代器具有__next__ 這個方法,可迭代對象具有__getitem__

迭代器是消耗型的,隨著指針的移動,遍歷完畢以后,就為空,但是不是None

 >>> c = list(b)
 >>> c
 [1, 2, 3]
 >>> d = list(b)
 >>> d
 []
 
 
 # 空的iterator并不等于None.
 >>> if b:
 ...   print(1)
 ...
 1
 >>> if b == None:
 ...   print(1)
 ...

使用迭代器的內置方法 __next__ 和 next() 方法,遍歷元素

 In [73]: e = iter(a)
 
 In [74]: next(e)
 Out[74]: 1
 
 In [75]: e.__next__
 Out[75]: <method-wrapper '__next__' of list_iterator object at 0x7f05571c8518>
 
 In [76]: e.__next__()
 Out[76]: 2
 
 In [77]: e.__next__()
 Out[77]: 3
 
 In [78]: e.__next__()
 ---------------------------------------------------------------------------
 StopIteration                             Traceback (most recent call last)
 <ipython-input-78-6024b5bd9bd2> in <module>()
 ----> 1 e.__next__()
 
 StopIteration:

當遍歷完畢時,會返回一個StopIteration 的錯誤.

for...in.... 遍歷迭代

當我們對一個iterable 使用for ....in... 進行遍歷時,實際上是想調用iter() 方法得到一個iterator ,假設為x ,然后循環的調用x 的__next__() (next())方法,取得每一次的值,直到iterator為空,返回StopIteration 作為循環的結束的標準.for....in...會自動處理 StopIteration 異常,從而避免了拋出異常,從而使程序中斷.流程圖為:

 x = [1, 2, 3]
 for i in x:
 print(x)

看完上述內容,你們掌握Python中generator生成器的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

嫩江县| 临洮县| 五指山市| 尚义县| 佛学| 城口县| 汝阳县| 达拉特旗| 门源| 华宁县| 滕州市| 荔波县| 舞阳县| 邯郸县| 绩溪县| 凭祥市| 伊吾县| 额尔古纳市| 中宁县| 绥中县| 冀州市| 黄龙县| 梅河口市| 来宾市| 昂仁县| 贞丰县| 潍坊市| 长泰县| 合川市| 宁武县| 清涧县| 都昌县| 行唐县| 改则县| 凌海市| 元阳县| 桐柏县| 清水县| 会昌县| 宝鸡市| 锡林浩特市|