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

解析Python中的生成器及其與迭代器的差異

 更新時間:2016年06月20日 16:58:54   作者:catHeart  
生成器是一種特殊的迭代器,而反過來說則就不對了,迭代器在Python中是一個更抽象的概念,以下我們就來詳細(xì)解析Python中的生成器及其與迭代器的差異

生成器
生成器是一種迭代器,是一種特殊的函數(shù),使用yield操作將函數(shù)構(gòu)造成迭代器。普通的函數(shù)有一個入口,有一個返回值;當(dāng)函數(shù)被調(diào)用時,從入口開始執(zhí)行,結(jié)束時返回相應(yīng)的返回值。生成器定義的函數(shù),有多個入口和多個返回值;對生成器執(zhí)行next()操作,進(jìn)行生成器的入口開始執(zhí)行代碼,yield操作向調(diào)用者返回一個值,并將函數(shù)掛起;掛起時,函數(shù)執(zhí)行的環(huán)境和參數(shù)被保存下來;對生成器執(zhí)行另一個next()操作時,參數(shù)從掛起狀態(tài)被重新調(diào)用,進(jìn)入上次掛起的執(zhí)行環(huán)境繼續(xù)下面的操作,到下一個yield操作時重復(fù)上面的過程。Python的循環(huán)操作與C語言的實現(xiàn)不同,如果使用List等數(shù)據(jù)結(jié)構(gòu)需要耗費大量的內(nèi)容;循環(huán)操作中使用生成器只需要在內(nèi)存中實例化一個對象,可以減少內(nèi)存占用,提高循環(huán)操作的執(zhí)行速度。

>>>def myG():
...  yield 1
...  yield 2
...  yield 3
...
>>>g=myG()
>>>next(g)
1
>>>next(g)
2
>>>next(g)
3
>>>next(g)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration
>>>g2=myG()
>>>for i in g2:
...  print(i)
1
2
3

生成器表達(dá)式
for...[if]...語句可以簡潔的構(gòu)建一個List,同時也可以用來構(gòu)建生成器。

>>>a=[7,8,9]
>>>b=[i**2 for i in a]
>>>b
[49, 64, 81]
>>>ib=(i**2 for i in a)
>>>ib
<generator object <genexpr> at 0x7f72291217e0>
>>>next(ib)
49
>>>next(ib)
64
>>>next(ib)
81
>>>next(ib)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

迭代器(Iterator)與生成器(Generator)的區(qū)別
迭代器是一個更抽象的概念,任何對象,如果它的類有next方法(next python3)和iter方法返回自己本身。

每個生成器都是一個迭代器,但是反過來不行。通常生成器是通過調(diào)用一個或多個yield表達(dá)式構(gòu)成的函數(shù)s生成的。同時滿足迭代器的定義。

當(dāng)你需要一個類除了有生成器的特性之外還要有一些自定義的方法時,可以使用自定義的迭代器,一般來說生成器更方便,更簡單。

def squares(start, stop):
  for i in xrange(start, stop):
    yield i*i

等同于生成器表達(dá)式:

(i*i for i in xrange(start, stop))

列表推倒式是:

[i*i for i in xrange(start, stop)]

如果是構(gòu)建一個自定義的迭代器:

class Squares(object):
  def __init__(self, start, stop):
    self.start = start
    self.stop = stop
  def __iter__(self):
    return self
  def next(self):
    if self.start >= self.stop:
      raise StopIteration
    current = self.start * self.start
    self.start += 1
    return current

此時,你還可以定義自己的方法如:

def current(self):
  return self.start

兩者的相同點:對象迭代完后就不能重寫迭代了。

相關(guān)文章

  • Python基于LightGBM進(jìn)行時間序列預(yù)測

    Python基于LightGBM進(jìn)行時間序列預(yù)測

    LightGBM是擴(kuò)展機器學(xué)習(xí)系統(tǒng)。是一款基于GBDT(梯度提升決策樹)算法的分布梯度提升框架。其設(shè)計思路主要集中在減少數(shù)據(jù)對內(nèi)存與計算性能的使用上,以及減少多機器并行計算時的通訊代價。本文將通過LightGBM進(jìn)行時間序列預(yù)測,感興趣的可以了解一下
    2022-03-03
  • 4行Python代碼生成圖像驗證碼(2種)

    4行Python代碼生成圖像驗證碼(2種)

    這篇文章主要介紹了4行Python代碼生成圖像驗證碼(2種),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python自動化測試pytest中fixtureAPI簡單說明

    Python自動化測試pytest中fixtureAPI簡單說明

    這篇文章主要為大家介紹了Python自動化測試pytest中fixtureAPI的簡單說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Python進(jìn)行密碼學(xué)反向密碼教程

    Python進(jìn)行密碼學(xué)反向密碼教程

    這篇文章主要為大家介紹了Python進(jìn)行密碼學(xué)反向密碼的教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python3使用PyQt5制作簡單的畫板/手寫板實例

    Python3使用PyQt5制作簡單的畫板/手寫板實例

    下面小編就為大家?guī)硪黄狿ython3使用PyQt5制作簡單的畫板/手寫板實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Python編程實現(xiàn)的圖片識別功能示例

    Python編程實現(xiàn)的圖片識別功能示例

    這篇文章主要介紹了Python編程實現(xiàn)的圖片識別功能,涉及Python PIL模塊的安裝與使用技巧,需要的朋友可以參考下
    2017-08-08
  • python實現(xiàn)全盤掃描搜索功能的方法

    python實現(xiàn)全盤掃描搜索功能的方法

    今天小編就為大家分享一篇python實現(xiàn)全盤掃描搜索功能的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python操作MongoDB詳解及實例

    Python操作MongoDB詳解及實例

    這篇文章主要介紹了Python操作MongoDB詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 使用Python實現(xiàn)視頻封面批量下載器

    使用Python實現(xiàn)視頻封面批量下載器

    在視頻網(wǎng)站上,每個視頻都有一個獨特的封面圖像,本文主要為大家詳細(xì)如何使用Python編寫一個視頻封面批量下載器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Django切換數(shù)據(jù)庫和遷移數(shù)據(jù)詳解

    Django切換數(shù)據(jù)庫和遷移數(shù)據(jù)詳解

    這篇文章主要介紹了Django切換數(shù)據(jù)庫和遷移數(shù)據(jù)詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論

平阳县| 元氏县| 法库县| 泸州市| 吐鲁番市| 清苑县| 涡阳县| 南昌市| 葵青区| 迁西县| 合作市| 本溪市| 蒙山县| 天气| 连平县| 缙云县| 大渡口区| 崇明县| 双桥区| 工布江达县| 和硕县| 安宁市| 镇坪县| 醴陵市| 湄潭县| 青阳县| 红桥区| 柳河县| 固阳县| 临桂县| 威信县| 渑池县| 精河县| 霞浦县| 屏南县| 沾益县| 中西区| 高要市| 舞钢市| 娄底市| 团风县|