0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python yield的作用

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-02 11:21 ? 次閱讀

要理解yield的作用,你必須理解生成器是什么。在理解生成器之前,必須先理解迭代器。

迭代器

當(dāng)您創(chuàng)建一個(gè)列表時(shí),你可以逐個(gè)讀取它的項(xiàng)。逐項(xiàng)讀取其項(xiàng)稱為迭代:

圖片

mylist是一個(gè)可迭代的對象。當(dāng)你使用列表解析式時(shí),你創(chuàng)建了一個(gè)列表,因此也是一個(gè)迭代器:

圖片

所有你可以用"for... in ...."都是迭代器,包括列表、字符串、文件…等等。

這些迭代器非常方便,因?yàn)槟憧梢噪S心所欲地讀取它們,但是你將所有的值都存儲(chǔ)在內(nèi)存中,當(dāng)你有很多值時(shí),這就非常浪費(fèi)內(nèi)存了。

為了解決這樣的問題,Python有了生成器的概念。

生成器

生成器是迭代器,這種迭代器只能迭代一次。生成器不會(huì)將所有值都存儲(chǔ)在內(nèi)存中,它們會(huì)動(dòng)態(tài)生成這些值:

圖片

它和列表解析式是類似的,只是用()代替了[]。但是,你不能在mygenerator中對i執(zhí)行第二次,因?yàn)樯善髦荒苁褂靡淮危核黳rint(0),然后忘記它,print(1),最后是4。

Yield

yield是一個(gè)與return類似的關(guān)鍵字,只是函數(shù)將返回一個(gè) 生成器 。

認(rèn)真看完下面這個(gè)例子,你應(yīng)該能完全明白。

圖片

函數(shù)將返回一組只需要讀取一次的值。如果你能將這個(gè)特性理解清楚,并將其應(yīng)用到你的代碼中,可能可以極大地提高性能,下次我們將介紹在什么時(shí)候該用它。

請注意示例中的第6行,在調(diào)用函數(shù)時(shí),在函數(shù)體中編寫的代碼不會(huì)運(yùn)行。函數(shù)只返回生成器對象,可別忘了這個(gè)重點(diǎn)。

最后,你的代碼將從每次使用生成器時(shí)停止的地方繼續(xù)。因此示例中第二次使用生成器的時(shí)候,我們的生成器已經(jīng)完全沒有值了。

所以最核心的邏輯如下:

  1. for函數(shù)第一次調(diào)用從函數(shù)創(chuàng)建的生成器對象時(shí),它將從頭運(yùn)行函數(shù)中的代碼,直到達(dá)到y(tǒng)ield,返回循環(huán)的第一個(gè)值。
  2. 隨后的調(diào)用都將再次運(yùn)行你在函數(shù)中編寫的循環(huán),并yield返回下一個(gè)值,直到?jīng)]有要返回的值為止,就如我們上面的例子所示。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4320

    瀏覽量

    85906
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    316

    瀏覽量

    21040
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84757
收藏 人收藏

    評論

    相關(guān)推薦

    Pythonyield表達(dá)式及其批量獲得minibatches的應(yīng)用

    Python 小談 yield 表達(dá)式及其批量獲得 minibatches 的應(yīng)用
    發(fā)表于 05-21 08:20

    Python虛擬環(huán)境的作用和搭建方法

    Python虛擬環(huán)境的作用及搭建方法
    發(fā)表于 06-08 07:32

    Python在實(shí)時(shí)嵌入式系統(tǒng)中有什么作用?

    如何用Python語言去控制單片機(jī)?Python在實(shí)時(shí)嵌入式系統(tǒng)中有什么作用?
    發(fā)表于 07-14 06:33

    python生成器

    python生成器1. 什么是生成器?生成器(英文名 Generator ),是一個(gè)可以像迭代器那樣使用for循環(huán)來獲取元素的函數(shù)。生成器的出現(xiàn)(Python 2.2 +),實(shí)現(xiàn)了延時(shí)計(jì)算,從而緩解
    發(fā)表于 02-24 15:56

    python變量的作用

    python變量的作用域1. 作用Python作用域可以分為四種:L (Local) 局部作用
    發(fā)表于 03-03 16:50

    yield 開始入門python協(xié)程

    簡單介紹 yield本篇文章會(huì)先向你介紹一個(gè)陌生的 Python 關(guān)鍵詞,他和 return 就像一對新兄弟,有相似之處,又各有不同。相似的是:yield 和 return 都可以在一個(gè)函數(shù)里將值
    發(fā)表于 03-16 16:21

    Python教程之Python中的yield關(guān)鍵字能做什么詳細(xì)程序說明

    要理解yield做了什么,就必須明白生成器(generators)為何物,而在明白生成器之前還要知道迭代器(iterables)。
    發(fā)表于 12-25 11:21 ?12次下載
    <b class='flag-5'>Python</b>教程之<b class='flag-5'>Python</b>中的<b class='flag-5'>yield</b>關(guān)鍵字能做什么詳細(xì)程序說明

    python變量的作用

    python變量的作用域 1. 作用Python作用域可以分為四種: L (Local) 局部作用
    的頭像 發(fā)表于 03-03 16:50 ?1619次閱讀

    yield開始入門python協(xié)程

    本篇文章會(huì)先向你介紹一個(gè)陌生的 Python 關(guān)鍵詞,他和 return 就像一對新兄弟,有相似之處,又各有不同。
    的頭像 發(fā)表于 03-16 16:20 ?1017次閱讀

    通過例子由淺入深的理解yield協(xié)程

    send:send() 方法致使協(xié)程前進(jìn)到下一個(gè)yield 語句,另外,生成器可以作為協(xié)程使用
    的頭像 發(fā)表于 08-23 11:12 ?2034次閱讀

    python語言之使用async關(guān)鍵字來定義函數(shù)

    早期的協(xié)程是用yield來實(shí)現(xiàn)的,但是代碼特別難懂, python3.5之后的版本, 使用 async 關(guān)鍵字來定義的函數(shù)。調(diào)用該函數(shù),會(huì)返回一個(gè)協(xié)程對象
    的頭像 發(fā)表于 08-24 11:12 ?2750次閱讀

    python語言之a(chǎn)wait和yield from的對比

    不同點(diǎn):yield from 后面的值,要么是生成器,要么是最終為可迭代對象,而await后面只能跟async開頭的方法
    的頭像 發(fā)表于 08-24 12:02 ?2609次閱讀

    python中eval的用法和作用

    `eval()`函數(shù)的作用是將字符串作為Python表達(dá)式進(jìn)行求值。它可以執(zhí)行包括算術(shù)運(yùn)算、邏輯運(yùn)算、函數(shù)調(diào)用以及定義在當(dāng)前命名空間中的變量等在內(nèi)的各種表達(dá)式。使用`eval()`可以動(dòng)態(tài)地執(zhí)行代碼,并在代碼中使用變量或函數(shù)。
    的頭像 發(fā)表于 09-28 16:26 ?3929次閱讀

    如何學(xué)會(huì) Python yield 關(guān)鍵詞

    要理解yield作用,你必須理解生成器是什么。在理解生成器之前,必須先理解迭代器。 1.迭代器 當(dāng)您創(chuàng)建一個(gè)列表時(shí),你可以逐個(gè)讀取它的項(xiàng)。逐項(xiàng)讀取其項(xiàng)稱為迭代: mylist是一個(gè)可迭代的對象
    的頭像 發(fā)表于 10-31 11:06 ?332次閱讀
    如何學(xué)會(huì) <b class='flag-5'>Python</b> <b class='flag-5'>yield</b> 關(guān)鍵詞

    Python中元類的作用

    1.什么是類 在理解元類之前,我們必須先掌握Python中的類(class)。 和大多數(shù)語言一樣,Python中的類知識用來描述如何“生成一個(gè)對象”: 但是,在Python中,類不僅能用來描述
    的頭像 發(fā)表于 11-02 11:18 ?544次閱讀
    <b class='flag-5'>Python</b>中元類的<b class='flag-5'>作用</b>