最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的迭代器和生成器

 更新時(shí)間:2015年07月29日 11:10:29   投稿:hebedich  
由于在看一個(gè)python項(xiàng)目,遇到了迭代器和生成器的使用,正好之前自己也沒有細(xì)看這部分,今天就稍微梳理一下吧!

先說迭代器,對(duì)于string、list、dict、tuple等這類容器對(duì)象,使用for循環(huán)遍歷是很方便的。在后臺(tái)for語句對(duì)容器對(duì)象調(diào)用iter()函數(shù),iter()是python的內(nèi)置函數(shù)。iter()會(huì)返回一個(gè)定義了next()方法的迭代器對(duì)象,它在容器中逐個(gè)訪問容器內(nèi)元素,next()也是python的內(nèi)置函數(shù)。在沒有后續(xù)元素時(shí),next()會(huì)拋出一個(gè)StopIteration異常,通知for語句循環(huán)結(jié)束。比如:

>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x7f71fefe9d68>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

上面說的都是python自帶的容器對(duì)象,它們都實(shí)現(xiàn)了相應(yīng)的迭代器方法,那如果是自定義類需要遍歷怎么辦?方法很簡單,對(duì)這個(gè)類AClass,實(shí)現(xiàn)一個(gè)__iter__(self)方法,使其返回一個(gè)帶有__next__(self)方法的對(duì)象就可以了。如果你在AClass剛好也定義了__next__(self)方法(一般使用迭代器都會(huì)定義),那在__iter__里只要返回self就可以。廢話少說,先上代碼:

class Fib(object):
  def __init__(self, max):
    super(Fib, self).__init__()
    self.max = max

  def __iter__(self):
    self.a = 0
    self.b = 1
    return self

  def __next__(self):
    fib = self.a
    if fib > self.max:
      raise StopIteration
    self.a, self.b = self.b, self.a + self.b
    return fib

def main():
  fib = Fib(100)
  for i in fib:
    print(i)

if __name__ == '__main__':
  main()

簡單講下代碼會(huì)干什么,定義了一個(gè)Fib類,用于生成fibonacci序列。用for遍歷時(shí)會(huì)逐個(gè)打印生成的fibonacci數(shù),max是生成的fibonacci序列中數(shù)字大小的上限。

在類的實(shí)現(xiàn)中,定義了一個(gè)__iter__(self)方法,這個(gè)方法是在遍歷時(shí)被iter()調(diào)用,返回一個(gè)迭代器。因?yàn)樵诒闅v的時(shí)候,是直接調(diào)用的python內(nèi)置函數(shù)iter(),由iter()通過調(diào)用__iter__(self)獲得對(duì)象的迭代器。有了迭代器,就可以逐個(gè)遍歷元素了。而逐個(gè)遍歷的時(shí)候,也是使用內(nèi)置的next()函數(shù)通過調(diào)用對(duì)象的__next__(self)方法對(duì)迭代器對(duì)象進(jìn)行遍歷。所以要實(shí)現(xiàn)__iter__(self)和__next__(self)。而且因?yàn)閷?shí)現(xiàn)了__next__(self),所以在實(shí)現(xiàn)__iter__(self)的時(shí)候,直接返回self就可以。

為了更好理解,我再簡單重復(fù)下上面說的那一段:在循環(huán)遍歷自定義容器對(duì)象時(shí),會(huì)使用python內(nèi)置函數(shù)iter()調(diào)用遍歷對(duì)象的__iter__(self)獲得一個(gè)迭代器,之后再循環(huán)對(duì)這個(gè)迭代器使用next()調(diào)用迭代器對(duì)象的__next__(self)。__iter__只會(huì)被調(diào)用一次,而__next__會(huì)被調(diào)用 n 次。

下面說生成器。

生成器(Generator)是創(chuàng)建迭代器的簡單而強(qiáng)大的工具。它們寫起來就像是正規(guī)的函數(shù),只是在需要返回?cái)?shù)據(jù)的時(shí)候使用yield語句。每次next()被調(diào)用時(shí),生成器會(huì)返回它脫離的位置(它記憶語句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)。以下示例演示了生成器可以很簡單的創(chuàng)建出來:

>>> def reverse(data):
...   for index in range(len(data)-1, -1, -1):
...     yield data[index]
... 
>>> for char in reverse('hello'):
...   print(char)
... 
o
l
l
e
h

關(guān)于迭代器和生成器的區(qū)別,生成器能做到迭代器能做的所有事,而且因?yàn)樽詣?dòng)創(chuàng)建了__iter__()和 next()方法,生成器顯得特別簡潔,而且生成器也是高效的。除了創(chuàng)建和保存程序狀態(tài)的自動(dòng)方法,當(dāng)發(fā)生器終結(jié)時(shí),還會(huì)自動(dòng)拋出StopIteration異常。一個(gè)帶有yield的函數(shù)就是一個(gè) 生成器,它和普通函數(shù)不同,生成一個(gè) generator 看起來像函數(shù)調(diào)用,但不會(huì)執(zhí)行任何函數(shù)代碼,直到對(duì)其調(diào)用next()(在 for 循環(huán)中會(huì)自動(dòng)調(diào)用next())才開始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個(gè)yield語句就會(huì)中斷,并返回一個(gè)迭代值,下次執(zhí)行時(shí)從yield的下一個(gè)語句繼續(xù)執(zhí)行??雌饋砭秃孟褚粋€(gè)函數(shù)在正常執(zhí)行的過程中被yield中斷了數(shù)次,每次中斷都會(huì)通過yield返回當(dāng)前的迭代值(yield暫停一個(gè)函數(shù),next()從其暫停處恢復(fù)其運(yùn)行)。

另外對(duì)于生成器,python還提供了一個(gè)生成器表達(dá)式:類似與一個(gè)yield值的匿名函數(shù)。表達(dá)式本身看起來像列表推到, 但不是用方括號(hào)而是用圓括號(hào)包圍起來:

>>> unique_characters = {'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}
>>> gen = (ord(c) for c in unique_characters)
>>> gen
<generator object <genexpr> at 0x7f2be4668678>
>>> for i in gen:
...   print(i)
... 
69
79
83
77
82
78
89
68
>>> 

如果需要,可以將生成器表達(dá)式傳給tuple、list或是set來迭代所有的值并且返回元組、列表或是集合。在這種情況下,不需要一對(duì)額外的括號(hào) ———— 直接將生成器表達(dá)式 ord(c) for c in unique_characters傳給tuple()等函數(shù)就可以了, Python 會(huì)推斷出它是一個(gè)生成器表達(dá)式。

最后,為什么要使用生成器?因?yàn)樾?。使用生成器表達(dá)式取代列表解析可以同時(shí)節(jié)省 cpu 和 內(nèi)存(ram)。如果你構(gòu)造一個(gè)列表的目的僅僅是傳遞給別的函數(shù),(比如 傳遞給tuple()或者set()), 那就用生成器表達(dá)式替代吧!

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • Python超有用的多版本管理工具pyenv

    Python超有用的多版本管理工具pyenv

    使用不同的Python版本,如果我們把需要的不同版本的Python都下載到服務(wù)器上,管理起來會(huì)非常困難,多版本并存又容易互相干擾,接下來就來介紹一個(gè)Python環(huán)境管理工具:pyenv,就可輕松的在多個(gè)版本的Python之間自由切換,需要的朋友可以參考下
    2021-09-09
  • python矩陣基本運(yùn)算的實(shí)現(xiàn)

    python矩陣基本運(yùn)算的實(shí)現(xiàn)

    本文主要介紹了python?矩陣的基本運(yùn)算,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python數(shù)據(jù)分析模塊pandas用法詳解

    Python數(shù)據(jù)分析模塊pandas用法詳解

    這篇文章主要介紹了Python數(shù)據(jù)分析模塊pandas用法,結(jié)合實(shí)例形式詳細(xì)分析了Python數(shù)據(jù)分析模塊pandas的功能、常見用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • python 自動(dòng)去除空行的實(shí)例

    python 自動(dòng)去除空行的實(shí)例

    今天小編就為大家分享一篇python 自動(dòng)去除空行的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • appium測試之APP元素定位及基本工具介紹

    appium測試之APP元素定位及基本工具介紹

    看了我文章了相信都了解了web端的元素定位了,沒看的,既然進(jìn)來了那么肯定多多少少知道些,本文主要來介紹APP的元素定位有哪些定位方式,我們又怎么去連接APP,然后通過工具去獲取元素
    2021-09-09
  • Python實(shí)現(xiàn)Web指紋識(shí)別實(shí)例

    Python實(shí)現(xiàn)Web指紋識(shí)別實(shí)例

    這篇文章主要來帶大家探索Web指紋識(shí)別:了解主流識(shí)別方式,從標(biāo)題到指紋讀取網(wǎng)站信息的簡單方法,揭秘Web指紋識(shí)別 關(guān)鍵字、哈希和URL的魔力
    2023-10-10
  • python的函數(shù)參數(shù)你了解嗎

    python的函數(shù)參數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了python的函數(shù)參數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python API len函數(shù)操作過程解析

    Python API len函數(shù)操作過程解析

    這篇文章主要介紹了Python API len函數(shù)操作過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python實(shí)現(xiàn)粒子群算法詳解

    Python實(shí)現(xiàn)粒子群算法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)粒子群算法詳解,粒子群算法,縮寫為PSO(Particle Swarm Optimization),是一種非線性尋優(yōu)算法,其特點(diǎn)是實(shí)現(xiàn)簡單、收斂速度快,對(duì)多元函數(shù)的局部最優(yōu)有較好的克服能力,需要的朋友可以參考下
    2023-07-07
  • Python中六大超時(shí)處理方法介紹

    Python中六大超時(shí)處理方法介紹

    在?Python?中,超時(shí)處理是一項(xiàng)非常常見的需求,尤其是在處理阻塞任務(wù)或并發(fā)任務(wù)時(shí),本文整理了大家常用的六大超時(shí)處理方法,感興趣的小伙伴可以參考下
    2025-01-01

最新評(píng)論

旅游| 乌兰浩特市| 万载县| 当阳市| 蓝田县| 苏州市| 桦甸市| 故城县| 元谋县| 阜康市| 明水县| 报价| 望城县| 工布江达县| 福建省| 隆化县| 炉霍县| 涟水县| 贺州市| 中阳县| 璧山县| 宾阳县| 黄大仙区| 富宁县| 囊谦县| 电白县| 武城县| 扎鲁特旗| 芦溪县| 锡林郭勒盟| 大新县| 铁岭县| 福贡县| 孙吴县| 广安市| 金溪县| 镇巴县| 南陵县| 阜阳市| 永德县| 泽库县|