python中的迭代器


yield關(guān)鍵字

用法

普通函數(shù):

>>> def f1(): return 'f1'
>>> f1()
'f1'

帶有yield關(guān)鍵字的函數(shù):

>>> def f2(): yield 'f2'
>>> f2()
<generator object f2 at 0x7f453255e4c0>
>>> next(f2())
'f2'

yield將函數(shù)的返回值變成了迭代器,其相當(dāng)于獲取函數(shù)運(yùn)算結(jié)果的入口
next()為python的內(nèi)置函數(shù),用于從迭代器獲取函數(shù)運(yùn)算結(jié)果


機(jī)制

>>> def func():
...     i = 0
...     while True:
...             yield i
...             i += 1
... 
>>> f = func()
>>> [next(f), next(f), next(f)]
[0, 1, 2]

相當(dāng)于將函數(shù)“暫?!痹趛ield處,再次調(diào)用next()則執(zhí)行到下一個(gè)yield


用法舉例

for...in

>>> def func():
...     i = 0
...     while i < 3:
...             yield i
...             i += 1
...     raise StopIteration # 該行替換成return或者不寫(xiě)有同樣的效果
... 
>>> for i in func():
...     print(i)
... 
0
1
2

與range(n)相比省很大內(nèi)存空間


內(nèi)置send()函數(shù)

>>> def func():
...     i = 0
...     while True:
...             i += yield i
... 
>>> f = func()
>>> next(f)
0
>>> f.send(5)
5
>>> f.send(5)
10
>>> f.send(5)
15

send(X)調(diào)用將X作為上次執(zhí)行到的yield表達(dá)式的值(此處相當(dāng)于i += X),并再次執(zhí)行next()。用于介入迭代過(guò)程

注意第一次執(zhí)行next()后函數(shù)停止的位置,此時(shí)“+=”運(yùn)算還未被執(zhí)行:


image.png-14kB
image.png-14kB

!!必須執(zhí)行至少一次next()后才能執(zhí)行send(),如下:

>>> f.send(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't send non-None value to a just-started generator

類的_iter() 、_next()方法

除了包含yield的函數(shù),還可以自己定義迭代器對(duì)象

內(nèi)置函數(shù)iter(obj)調(diào)用相當(dāng)于通過(guò)執(zhí)行obj對(duì)象的_iter()方法獲取迭代器對(duì)象
內(nèi)置函數(shù)next(obj)調(diào)用相當(dāng)于通過(guò)執(zhí)行obj對(duì)象的_next
()方法獲取迭代結(jié)果

>>> class counter:
    def __init__(self):
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.i += 1
        if self.i <= 3: return self.i
        else: raise StopIteration


>>> f = iter(counter())
>>> print([next(f), next(f), next(f)])
[1, 2, 3]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 迭代器(Iterable) 簡(jiǎn)單來(lái)說(shuō),迭代器對(duì)象(my_list)可以讓以下代碼正常工作: 如果對(duì)象實(shí)現(xiàn)了__it...
    SOLAREST閱讀 645評(píng)論 0 1
  • 簡(jiǎn)要引入:迭代一詞,我們?cè)偈煜げ贿^(guò)了,它經(jīng)常出現(xiàn)在算法中,在數(shù)學(xué)中也有很多的使用,比如一個(gè)算法經(jīng)過(guò)多少次的迭代,執(zhí)...
    panxd閱讀 1,158評(píng)論 0 6
  • 對(duì)于不少Python的編程人員而言,使用迭代器早已經(jīng)是家常便飯,而至于迭代器的概念和實(shí)施細(xì)節(jié)則不甚清楚。畢竟,Py...
    MontyOak閱讀 203評(píng)論 0 0
  • 姓名:沈華立 公司:慈溪市創(chuàng)鑫車輛零部件有限公司 六項(xiàng)精進(jìn)224期利他二組學(xué)員 【日精進(jìn)打卡266天】 【知~學(xué)習(xí)...
    沈華立閱讀 80評(píng)論 0 0
  • “我一直想要打開(kāi)鄰居家的那個(gè)隱藏的金庫(kù)門(mén),這件事終于實(shí)現(xiàn)了,一切都結(jié)束了?!薄?記于 2500年1月1日 每天起...
    阿尢蜜蟹醬閱讀 721評(píng)論 7 4

友情鏈接更多精彩內(nèi)容