国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Python生成器generator原理及用法解析

瀏覽:79日期:2022-07-16 18:30:14

前言

生成器generator

生成器的本質是一個迭代器(iterator)

要理解生成器,就要在理解一下迭代,可迭代對象,迭代器,這三個概念

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原理及用法解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 特黄特色三级在线观看 | 欧美日本综合一区二区三区 | 亚洲视频在线观看免费 | 免费一级特黄欧美大片久久网 | 久草在线最新 | 亚洲素人在线 | 国产成人久久精品二区三区牛 | 国产90后美女露脸在线观看 | 久久成人午夜 | 国产精品爱久久久久久久 | 久久国产乱子伦精品免费不卡 | 在线视频一区二区三区 | 国产精品麻豆一区二区三区v视界 | 亚洲成人偷拍自拍 | 深夜国产 | 大量愉拍情侣在线视频 | 一区二区三区成人 | 欧美日本道免费一区二区三区 | 欧美一级视频在线观看欧美 | 国产精品亚洲精品一区二区三区 | 日本成人在线看 | 国产精品一国产精品免费 | 免费女人18毛片a级毛片视频 | 国产成人高清视频在线观看免费97 | 免费人成黄页网站在线观看国产 | 色综合精品 | 毛片在线不卡 | 亚洲午夜成激人情在线影院 | 国产日韩视频在线观看 | 69性欧美高清影院 | 99爱在线精品视频网站 | 免费人成网站在线播放 | 久久亚洲国产的中文 | 亚洲一区二区三区一品精 | 特黄特色三级在线播放 | 亚洲成a人片在线观看 欧美 | 在线成人精品国产区免费 | 日本在线视频免费看 | 精品日韩欧美一区二区三区 | 久久91精品国产99久久yfo | 99re5久久在热线播放 |