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

Python編程中實現(xiàn)迭代器的一些技巧小結(jié)

 更新時間:2016年06月21日 15:25:57   作者:TypingQuietly  
只談迭代器的話在Python中只是一個泛指的概念,具體的可以用yield、生成器表達式、iter等多種方式來構(gòu)建,這里我們整理了Python編程中實現(xiàn)迭代器的一些技巧小結(jié):

yield實現(xiàn)迭代器
如引言中的描述,實現(xiàn)一個可迭代的功能要是每次都手動實現(xiàn)iter,next稍稍有點麻煩,所需的代碼也是比較客觀。在python中也能通過借助yield的方式來實現(xiàn)一個迭代器。yield有一個關(guān)鍵的作能,它能夠中斷當前的執(zhí)行邏輯,保持住現(xiàn)場(各種值的狀態(tài),執(zhí)行的位置等等),返回相應(yīng)的值,下一次執(zhí)行的時候能夠無縫的接著上次的地方繼續(xù)執(zhí)行,如此循環(huán)反復(fù)知道滿足事先設(shè)置的退出條件或者發(fā)生錯誤強制被中斷。
其具體功能是可以當return使用,從函數(shù)里返回一個值,不同之處是用yield返回之后,可以讓函數(shù)從上回yield返回的地點繼續(xù)執(zhí)行。也就是說,yield返回函數(shù),交給調(diào)用者一個返回值,然后再“瞬移”回去,讓函數(shù)繼續(xù)運行, 直到嚇一跳yield語句再返回一個新的值。使用yield返回后,調(diào)用者實際得到的是一個迭代器對象,迭代器的值就是返回值,而調(diào)用該迭代器的next()方法會導致該函數(shù)恢復(fù)yield語句的執(zhí)行環(huán)境繼續(xù)往下跑,直到遇到下一個yield為止,如果遇不到y(tǒng)ield,就會拋出異常表示迭代結(jié)束。
看一個例子:

>>> def test_yield():
... yield 1
... yield 2
... yield (1,2)
...
>>> a = test_yield()
>>> a.next()
1
>>> a.next()
2
>>> a.next()
(1, 2)
>>> a.next()
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
StopIteration

光聽描述就覺得和迭代器的工作方式很一致是吧,的確,yield能把它所在的函索變成一個迭代器,拿最經(jīng)典的菲波那切數(shù)列的例子聊簡述一下工作的方式:

def fab(max): 
 n, a, b = 0, 0, 1 
 while n < max:
 print b, "is generated" 
 yield b
 a, b = b, a + b 
 n = n + 1 

>>> for item in fab(5):
... print item
... 
1 is generated
1
1 is generated
1
2 is generated
2
3 is generated
3
5 is generated
5

我們有回想一下for關(guān)鍵字的語法糖,在這里遍歷5以內(nèi)的菲波那切數(shù)列值的時候,很顯然fab(5)生成了一個可迭代的對象,遍歷開始的時候它的iter方法被調(diào)用返回一個實際工作的迭代器對象,然后每一次調(diào)用它的next方法返回一個菲波那切數(shù)列值然后打印出來。
我們可以將調(diào)用生成器函數(shù)返回的對象的屬性打印出來,看一下到底發(fā)生了什么:

>>> temp_gen = fab(5)
>>> dir(temp_gen)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']

正如上面的描述,單純調(diào)用fab并不會讓函數(shù)立刻開始返回任何值,并且從打印出的fab(5)的屬性列表能夠看到,生成器函數(shù)返回的對象包含有__iter__,next的實現(xiàn)。與我們手動實現(xiàn)相比,使用yield很方便的就能夠?qū)崿F(xiàn)我們想要的功能,代碼量縮減不少。

Generator Expression
python中另一種能更優(yōu)雅生成迭代器對象的方式就是使用生成器表達式Generator expression,它和列表解析表達式有著非常相似的寫法,僅僅是把中括號[]變成()而已,不過小小改變產(chǎn)生的實際效果確實大大的不一樣:

>>> temp_gen = (x for x in range(5))
>>> temp_gen
<generator object <genexpr> at 0x7192d8>
>>> for item in temp_gen:
... print item
... 
0
1
2
3
4
>>> dir(temp_gen)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']

看過上面對yield的描述,這個例子以及對應(yīng)的輸出日志還是相當直接明了的,無論是temp_gen的打印日志描述,for語句遍歷的輸出結(jié)果還是調(diào)用dir輸出的屬性列表,都赤裸裸的表明生成器表達式確實生成了能夠支持迭代的對象。另外表達式里面也能夠調(diào)用函數(shù),增加適量的過濾條件。

內(nèi)置庫itertools 和 iter
python內(nèi)置的庫itertools提供了大量的工具方法,這些方法能夠幫助我們創(chuàng)建能進行高效遍歷和迭代的對象,里面包含不少有意思并且有用的方法,比如像chain, izip/izip_longest, combinations, ifilter等等。在python中還有一個內(nèi)置的iter函數(shù)非常有用,能夠返回一個迭代器對象,之后也就能夠進行可以查看對應(yīng)的幫助文檔簡單看一下:

>>> iter('abc')
<iterator object at 0x718590>
>>> str_iterator = iter('abc')
>>> next(str_iterator)
'a'
>>> next(str_iterator)
'b'
>>> lst_gen = iter([1,2,3,4])
>>> lst_gen
<listiterator object at 0x728e30>
>>> dir(lst_gen)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__length_hint__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'next']

>>> help(iter)
Help on built-in function iter in module builtins:

iter(...)
 iter(iterable) -> iterator
 iter(callable, sentinel) -> iterator

 Get an iterator from an object. In the first form, the argument must
 supply its own iterator, or be a sequence.
 In the second form, the callable is called until it returns the sentinel.

相關(guān)文章

  • python函數(shù)的5種參數(shù)詳解

    python函數(shù)的5種參數(shù)詳解

    昨天看《Python核心編程》的時候,剛好看到了函數(shù)部分,于是順勢將目前接觸到的集中參數(shù)類型都總結(jié)一下吧^^
    2017-02-02
  • Python Numpy庫datetime類型的處理詳解

    Python Numpy庫datetime類型的處理詳解

    這篇文章主要介紹了Python Numpy庫datetime類型的處理詳解,Python中自帶的處理時間的模塊就有time 、datetime、calendar,另外還有擴展的第三方庫,如dateutil等等。。當我們用NumPy庫做數(shù)據(jù)分析時,如何轉(zhuǎn)換時間呢?需要的朋友可以參考下
    2019-07-07
  • 使用python將mysql數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)的方法

    使用python將mysql數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)的方法

    這篇文章主要介紹了使用python將mysql數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python機器學習庫Scikit-learn實戰(zhàn)教程

    Python機器學習庫Scikit-learn實戰(zhàn)教程

    文章介紹了Python在機器學習領(lǐng)域的應(yīng)用,重點介紹了Scikit-learn庫的使用方法,并通過實際案例展示了如何使用Scikit-learn進行分類、回歸、聚類和文本挖掘等任務(wù),同時,文章還討論了特征工程、超參數(shù)調(diào)整、避免過擬合和交叉驗證等進階技巧
    2025-01-01
  • Python中不同類之間調(diào)用方法的四種方式小結(jié)

    Python中不同類之間調(diào)用方法的四種方式小結(jié)

    類是一種面向?qū)ο蟮木幊谭妒?它允許我們將數(shù)據(jù)和功能封裝在一個實體中,本文主要介紹了Python中不同類之間調(diào)用方法的四種方式小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 使用python對多個txt文件中的數(shù)據(jù)進行篩選的方法

    使用python對多個txt文件中的數(shù)據(jù)進行篩選的方法

    今天小編就為大家分享一篇使用python對多個txt文件中的數(shù)據(jù)進行篩選的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 手把手教你Windows如何在cmd中切換python版本

    手把手教你Windows如何在cmd中切換python版本

    通常在Windows系統(tǒng)下我們可能安裝了多個Python版本,那么該如何進行版本的切換呢?下面這篇文章主要給大家介紹了關(guān)于Windows如何在cmd中切換python版本的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 基于pygame實現(xiàn)貪吃蛇小游戲示例

    基于pygame實現(xiàn)貪吃蛇小游戲示例

    大家好,本篇文章主要講的是基于pygame實現(xiàn)貪吃蛇小游戲示例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 20行python代碼的入門級小游戲的詳解

    20行python代碼的入門級小游戲的詳解

    這篇文章主要介紹了python入門級小游戲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • python實現(xiàn)網(wǎng)頁錄音效果

    python實現(xiàn)網(wǎng)頁錄音效果

    這篇文章主要為大家詳細介紹了python實現(xiàn)網(wǎng)頁錄音效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評論

乾安县| 安图县| 台湾省| 溆浦县| 崇信县| 临高县| 商南县| 托里县| 盖州市| 祁阳县| 长汀县| 五华县| 奈曼旗| 伊宁市| 黑龙江省| 大港区| 衡东县| 温宿县| 棋牌| 康马县| 宜良县| 大荔县| 万州区| 竹山县| 武乡县| 隆昌县| 牙克石市| 赤水市| 武冈市| 禹城市| 澜沧| 潮州市| 昌平区| 买车| 济宁市| 同江市| 阿瓦提县| 普陀区| 烟台市| 手机| 阜康市|