国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

前言

生成器generator

生成器的本質(zhì)是一個(gè)迭代器(iterator)

要理解生成器,就要在理解一下迭代,可迭代對(duì)象,迭代器,這三個(gè)概念

Python生成器generator簡(jiǎn)介

iteration, iterable, iterator

迭代(iteration):在python中迭代通常是通過(guò)for...in...來(lái)實(shí)現(xiàn)的.而且只要是可迭代對(duì)象iterable,都能進(jìn)行迭代.

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

迭代器(iterator ) : 簡(jiǎn)單的說(shuō),迭代器就是實(shí)現(xiàn)了iterator.__iter__() 和iterator.__next__() 的對(duì)象,iterator.__iter__()方法返回的是iterator對(duì)象本身.根據(jù)官方的說(shuō)法,正是這個(gè)方法,實(shí)現(xiàn)了for ... in ...語(yǔ)句.而iterator.__next__()是iterator區(qū)別于iterable的關(guān)鍵了,它允許我們顯式地獲取一個(gè)元素.當(dāng)調(diào)用next()方法時(shí),實(shí)際上產(chǎn)生了2個(gè)操作:

更新iterator狀態(tài),令其指向后一項(xiàng),以便下一次調(diào)用,每一個(gè)值過(guò)后,指針移動(dòng)到下一位,對(duì)iterator遍歷完后,其變成了一個(gè)空的容器,但不是None ,需要注意的是,迭代結(jié)束后,指針不會(huì)自動(dòng)返回到首位,而是依舊停留在末位置,想要在開(kāi)始,需要重新載入迭代對(duì)象.

實(shí)例理解:

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

可見(jiàn),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__ 這個(gè)方法,可迭代對(duì)象具有__getitem__

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

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

使用迭代器的內(nèi)置方法 __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:

當(dāng)遍歷完畢時(shí),會(huì)返回一個(gè)StopIteration 的錯(cuò)誤.

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

當(dāng)我們對(duì)一個(gè)iterable 使用for ....in... 進(jìn)行遍歷時(shí),實(shí)際上是想調(diào)用iter() 方法得到一個(gè)iterator ,假設(shè)為x ,然后循環(huán)的調(diào)用x 的__next__() (next())方法,取得每一次的值,直到iterator為空,返回StopIteration 作為循環(huán)的結(jié)束的標(biāo)準(zhǔn).for....in...會(huì)自動(dòng)處理 StopIteration 異常,從而避免了拋出異常,從而使程序中斷.流程圖為:

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 沅陵县| 加查县| 禹州市| 娱乐| 西宁市| 宣恩县| 新建县| 文山县| 武川县| 南木林县| 宜君县| 拉萨市| 德阳市| 长宁县| 确山县| 遂昌县| 蓬莱市| 苗栗市| 夏河县| 西吉县| 泌阳县| 外汇| 涞水县| 永丰县| 依安县| 扎鲁特旗| 灵石县| 独山县| 洮南市| 宿州市| 余江县| 肃南| 綦江县| 白沙| 温泉县| 自治县| 乐至县| 麻江县| 酒泉市| 乐清市| 罗平县|