成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯]yield關(guān)鍵字都做了什么?

elisa.yang / 3058人閱讀

摘要:原文我的微信公眾號每日一練要理解什么是,必須理解什么是生成器。在理解生成器之前,讓我們先了解迭代。直到運行到函數(shù)結(jié)尾處停止,此時如果是用則會拋出異常,如果是用則會結(jié)束循環(huán)并且不會有異常

原文:https://stackoverflow.com/que...

我的微信公眾號:python每日一練

要理解什么是 yield,必須理解什么是生成器(generator)。在理解生成器之前,讓我們先了解迭代。

迭代

當(dāng)你建立了一個列表,你可以逐個地訪問這個列表的元素,而這個訪問的過程叫做迭代(iteration)

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

代碼中的mylist就是一個可迭代對象(iterable),當(dāng)你使用列表生成式時,你就創(chuàng)建了一個list,同時也創(chuàng)建了一個可迭代對象:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

凡是能使用for...in...語句的對象,都叫做可迭代對象,例如:list、string、文件等等

這些可迭代對象非常方便,因為你可以根據(jù)自己的需要來訪問它們。但是同時也需要將所有的值存入內(nèi)存當(dāng)中,無論你是不是需要所有的值,可能對于一個列表[x for x in range(100000)],你僅僅想拿到里面的素數(shù),但當(dāng)這個列表生成式被執(zhí)行的時候,已經(jīng)將所有100000個數(shù)字存入了內(nèi)存中。

生成器

生成器是一種只能迭代一次的迭代器,生成器不會一次將所有的元素存入內(nèi)存中,而是一邊迭代一邊運算:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

這份代碼看起來和上面的代碼沒有什么區(qū)別。但是你不能再次執(zhí)行for i in mygenerator,因為生成器只能使用一次:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...     print(i)
...
0
1
4
>>> for i in mygenerator:
...     print(i)
...
>>>

Yield

yield的使用和return的使用沒什么區(qū)別,只是yield會返回一個生成器

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # 創(chuàng)建一個生成器
>>> print(mygenerator) # mygenerator是一個對象!

>>> for i in mygenerator:
...     print(i)
0
1
4

當(dāng)你的函數(shù)需要返回一個很大的元素集合,并且每個元素只需要用到一次的時候,使用yield會非常方便

要想理解yield,你必須理解當(dāng)你調(diào)用一個包含yield的函數(shù)的時候,函數(shù)體代碼并不會執(zhí)行,這個函數(shù)僅僅是返回一個生成器而已

>>> def createGenerator():
...     print("head")
...     for i in range(5):
...         yield i*i
...     print("tail")
...
>>> createGenerator()

當(dāng)你第一次向后迭代(用nextfor...in...語句時)這個生成器時,函數(shù)體才會從最開始執(zhí)行到yield處然后返回yield的值,隨后再次向后迭代,會執(zhí)行剩余的代碼然后再次遇到yield停止并返回值。直到運行到函數(shù)結(jié)尾處停止,此時如果是用next()則會拋出StopIteration異常,如果是用for...in...則會結(jié)束循環(huán)并且不會有異常

>>> def createGenerator():
...     print("head")
...     for i in range(5):
...         yield i*i
...     print("tail")
...
>>> g = createGenerator()
>>> next(g)
head
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
tail
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41617.html

相關(guān)文章

  • [] PEP 255--簡單的生成器

    摘要:第四種選擇是在不同的線程中運行生產(chǎn)者和消費者。包含語句的函數(shù)被稱為生成器函數(shù)。然后引發(fā)一個異常,表明迭代器已經(jīng)耗盡。換句話說,未捕獲的異常終結(jié)了生成器的使用壽命。 showImg(https://segmentfault.com/img/bVbntUq?w=4272&h=2848);我正打算寫寫 Python 的生成器,然而查資料時發(fā)現(xiàn),引入生成器的 PEP 沒人翻譯過,因此就花了點時...

    tracymac7 評論0 收藏0
  • []PEP 380--子生成器的語法

    摘要:提議以下的新的生成器語法將被允許在生成器的內(nèi)部使用其中表達式作用于可迭代對象,從迭代器中提取元素。子迭代器而非生成器的語義被選擇成為生成器案例的合理泛化。建議如果關(guān)閉一個子迭代器時,引發(fā)了帶返回值的異常,則將該值從調(diào)用中返回給委托生成器。 導(dǎo)語: PEP(Python增強提案)幾乎是 Python 社區(qū)中最重要的文檔,它們提供了公告信息、指導(dǎo)流程、新功能的設(shè)計及使用說明等內(nèi)容。對于學(xué)習(xí)...

    fevin 評論0 收藏0

發(fā)表評論

0條評論

elisa.yang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<