亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python3.6生成器yield用法實(shí)例分析

 更新時(shí)間:2019年08月23日 11:35:30   作者:thormas1996  
這篇文章主要介紹了python3.6生成器yield用法,結(jié)合實(shí)例形式分析了Python3.6中生成器yield的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了python3.6生成器yield用法。分享給大家供大家參考,具體如下:

今天看源碼的時(shí)候看到了一個(gè)比較有意思的函數(shù):yield

功能與return類似,都是返回定義的函數(shù)的一個(gè)結(jié)果,不同的是return返回后這次調(diào)用函數(shù)就結(jié)束了,除了返回值,其余臨時(shí)變量都會(huì)被清除。而yield會(huì)停止在當(dāng)前步,并保留其余變量的值,等下次調(diào)用該函數(shù)時(shí),從yield的下一步繼續(xù)往下運(yùn)行。

yield的好處是如果函數(shù)需要很大的內(nèi)存,比方說(shuō)需要計(jì)算并返回一個(gè)很大的數(shù)列,如果用return,我們只能用一個(gè)list來(lái)存儲(chǔ)每一步再輸出,而用yield的話,只需要一個(gè)變量的內(nèi)存即可,每次輸出當(dāng)前步的值,下次調(diào)用函數(shù)接著從這一步繼續(xù)。

文字不太好說(shuō)明,看一個(gè)很容易理解的例子:(python3.6)

我們定義一個(gè)函數(shù)test(),看看return的效果

def test(n):
  for i in range(n):
    return i
    print('mark')

測(cè)試結(jié)果

for i in range(5):
  print(test(3))

輸出

0
0
0
0
0

每次調(diào)用函數(shù)時(shí)碰到return就自動(dòng)結(jié)束了,返回當(dāng)前i值

再來(lái)看看yield的效果:

def test2(n):
  for i in range(n):
    yield i
    print('mark')

測(cè)試

for i in range(5):
  print(test2(3))

輸出

<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>

只要函數(shù)中含有yield,python就會(huì)默認(rèn)這個(gè)函數(shù)是一個(gè)生成器,這個(gè)測(cè)試相當(dāng)于重復(fù)打開了三次生成器

生成器需要用next()調(diào)用

測(cè)試

t = test2(3)
for i in range(3):
  print('i=',i)
  print(next(t))

next(t) 等同于 t.__next__()

結(jié)果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回i=0之后,第二次再調(diào)用函數(shù)時(shí),從yield i的下一步繼續(xù),即print('mark')。

生成器還支持用send()將值傳遞進(jìn)函數(shù):

def test3():
  value = (yield 1)
  print(value)
  print('mark1')
  value = (yield value)
  print(value)
  print('mark2')

測(cè)試

t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))

輸出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-102-56e62df29d71> in <module>()
      4 print(t2.send(2))
      5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在當(dāng)前停止,send(2)會(huì)將2傳輸給當(dāng)前停止的那一步y(tǒng)ield處,即相當(dāng)于value = (yield 1)變?yōu)?code>value = (2)

然后繼續(xù)運(yùn)行

print(value)
print('mark1')
value = (yield value)

碰到y(tǒng)ield再次停止,返回此時(shí)的vlue值2,之后send(3)將3傳輸給當(dāng)前停止那一步y(tǒng)ield處,即第二個(gè)yield value處,繼續(xù)運(yùn)行

print(value)
print('mark2')

生成器運(yùn)行結(jié)束后生成StopIteration

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python+django實(shí)現(xiàn)文件下載

    Python+django實(shí)現(xiàn)文件下載

    本文是python+django系列的第二篇文章,主要是講述是先文件下載的方法和代碼,有需要的小伙伴可以參考下。
    2016-01-01
  • Python運(yùn)算符重載的簡(jiǎn)單實(shí)例代碼

    Python運(yùn)算符重載的簡(jiǎn)單實(shí)例代碼

    什么是運(yùn)算符重載,就是讓自定義的類生成的對(duì)象(實(shí)例)能夠使用運(yùn)算符進(jìn)行操作,這篇文章主要給大家介紹了關(guān)于Python運(yùn)算符重載的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • django2.0擴(kuò)展用戶字段示例

    django2.0擴(kuò)展用戶字段示例

    今天小編就為大家分享一篇關(guān)于django2.0擴(kuò)展用戶字段示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • tracemalloc分析內(nèi)存使用情況與泄露方式

    tracemalloc分析內(nèi)存使用情況與泄露方式

    這篇文章主要介紹了tracemalloc分析內(nèi)存使用情況與泄露方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • python爬蟲模擬瀏覽器訪問(wèn)-User-Agent過(guò)程解析

    python爬蟲模擬瀏覽器訪問(wèn)-User-Agent過(guò)程解析

    這篇文章主要介紹了python爬蟲模擬瀏覽器訪問(wèn)-User-Agent過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Flask 上傳自定義頭像的實(shí)例詳解

    Flask 上傳自定義頭像的實(shí)例詳解

    今天小編就為大家分享一篇Flask 上傳自定義頭像的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Django內(nèi)容增加富文本功能的實(shí)例

    Django內(nèi)容增加富文本功能的實(shí)例

    下面小編就為大家?guī)?lái)一篇Django內(nèi)容增加富文本功能的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Python抽象類的新寫法

    Python抽象類的新寫法

    這篇文章主要介紹了Python抽象類的新寫法,本文講解了老版本中的hack方式實(shí)現(xiàn)抽象類,以及2.7以后使用abstractmethod模塊寫抽象類的方法,需要的朋友可以參考下
    2015-06-06
  • Python實(shí)現(xiàn)線程池代碼分享

    Python實(shí)現(xiàn)線程池代碼分享

    這篇文章主要介紹了Python實(shí)現(xiàn)線程池代碼分享,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-06-06
  • Cpython解釋器中的GIL全局解釋器鎖

    Cpython解釋器中的GIL全局解釋器鎖

    這篇文章主要介紹了Cpython解釋器中的GIL全局解釋器鎖的相關(guān)資料,幫助大家更好的了解Cpython解釋器,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論