首頁 後端開發 Python教學 有關yield的詳細介紹

有關yield的詳細介紹

Sep 04, 2017 am 11:36 AM
ie yield 介紹

yield的英文單字意思是生產,剛接觸Python的時候感到非常困惑,一直沒弄清楚yield的用法。

只是粗略的知道yield可以用來為一個函數傳回值塞數據,例如下面的例子:

def addlist(alist):
    for i in alist:
        yield i + 1
登入後複製

取出alist的每一項,然後把i + 1塞進去。然後透過呼叫取出每一項:

alist = [1, 2, 3, 4]
for x in addlist(alist):
    print x,
登入後複製

這的確是yield應用的一個例子

#1. 包含yield的函數

假如你看到某個函數包含了yield,這表示這個函數已經是一個Generator,它的執行會和其他普通的函數有很多不同。例如下面的簡單的函數:

def h():
    print 'To be brave'
    yield 5
h()
登入後複製

可以看到,呼叫h()之後,print 語句並沒有執行!這就是yield,那麼,要如何讓print 語句執行呢?這就是後面要討論的問題,透過後面的討論和學習,就會明白yield的工作原理了。

2. yield是一個表達式

Python2.5以前,yield是一個語句,但現在2.5中,yield是一個表達式(Expression),例如:

m = yield 5

表達式(yield 5)的回傳值將賦值給m,所以,認為m = 5 是錯誤的。那麼要如何取得(yield 5)的回傳值呢?需要用到後面要介紹的send(msg)方法。

3. 透過next()語句看原理

現在,我們來揭曉yield的工作原理。我們知道,我們上面的h()被呼叫後並沒有執行,因為它有yield表達式,因此,我們透過next()語句讓它執行。 next()語句將還原Generator執行,並直到下一個yield表達式處。例如:

def h():
    print 'Wen Chuan'
    yield 5
    print 'Fighting!'
c = h()
c.next()
登入後複製

c.next()呼叫後,h()開始執行,直到遇到yield 5,因此輸出結果:

Wen Chuan

當我們再次當呼叫c.next()時,會繼續執行,直到找到下一個yield表達式。由於後面沒有yield了,因此會拋出異常:

Wen Chuan
Fighting!
Traceback (most recent call last):
  File "/home/evergreen/Codes/yidld.py", line 11, in <module>
    c.next()
StopIteration
登入後複製

4. send(msg) 與next()

了解了next()如何讓包含yield的函數執行後,我們再來看另外一個非常重要的函數send(msg)。其實next()和send()在某個意義上作用是相似的,差別是send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。因此,我們可以看做

c.next() 和 c.send(None) 作用是一樣的。

來看這個範例:

def h():
    print &#39;Wen Chuan&#39;,
    m = yield 5  # Fighting!
    print m
    d = yield 12
    print &#39;We are together!&#39;
c = h()
c.next()  #相当于c.send(None)
c.send(&#39;Fighting!&#39;)  #(yield 5)表达式被赋予了&#39;Fighting!&#39;
登入後複製

輸出的結果為:

Wen Chuan Fighting!

需要提醒的是,第一次呼叫時,請使用next()語句或是send(None),不能使用send傳送一個非None的值,否則會出錯的,因為沒有yield語句來接收這個值。

5. send(msg) 與next()的回傳值

send(msg) 和next()是有傳回值的,它們的回傳值很特殊,回傳的是下一個yield表達式的參數。如yield 5,則回傳 5 。到這裡,是不是明白了什麼?本文第一個例子中,透過for i in alist 遍歷Generator,其實是每次都呼叫了alist.Next(),而每次alist.Next()的回傳值正是yield的參數,即我們開始認為被壓進去的東東。我們再延續上面的範例:

def h():
    print &#39;Wen Chuan&#39;,
    m = yield 5  # Fighting!
    print m
    d = yield 12
    print &#39;We are together!&#39;
c = h()
m = c.next()  #m 获取了yield 5 的参数值 5
d = c.send(&#39;Fighting!&#39;)  #d 获取了yield 12 的参数值12
print &#39;We will never forget the date&#39;, m, &#39;.&#39;, d
登入後複製

輸出結果:

Wen Chuan Fighting!
We will never forget the date 5 . 12
登入後複製

6. throw() 與close()中斷Generator

中斷Generator是一個非常靈活的技巧,可以透過throw拋出一個GeneratorExit異常來終止Generator。 Close()方法作用是一樣的,其實內部它是呼叫了throw(GeneratorExit)的。我們看:

def close(self):
    try:
        self.throw(GeneratorExit)
    except (GeneratorExit, StopIteration):
        pass
    else:
        raise RuntimeError("generator ignored GeneratorExit")
# Other exceptions are not caught
登入後複製

因此,當我們呼叫了close()方法後,再呼叫next()或是send(msg)的話會拋出一個例外:

Traceback (most recent call last):
  File "/home/evergreen/Codes/yidld.py", line 14, in <module>
    d = c.send(&#39;Fighting!&#39;)  #d 获取了yield 12 的参数值12
StopIteration
登入後複製

以上是有關yield的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

wapi是什麼東西詳細介紹 wapi是什麼東西詳細介紹 Jan 07, 2024 pm 09:14 PM

wapi這個名詞使用者可能在使用網路得時候見過過,但是對於一部分人來說肯定都不知道wapi是什麼,下面就帶來了詳細介紹,幫助不知道小伙伴去了解。 wapi是什麼東西:答:wapi是無線區域網路鑑別和保密的基礎架構。這就像紅外線和藍牙等功能一樣,一般都覆蓋在辦公大樓等地方的附近。基本上都是為一個小部門所有的,所以這個功能涉及的範圍只有幾公里。 wapi相關介紹:1、wapi是無線區域網路裡面的一種傳輸協定。 2.這款技術是可以去避免窄頻帶通訊的問題,可以更好的去進行傳播。 3.只要只需要一個代碼就可以去傳送訊號了

詳解win11能否運行PUBG遊戲 詳解win11能否運行PUBG遊戲 Jan 06, 2024 pm 07:17 PM

pubg又稱絕地求生,是一款非常經典的射擊大逃殺類型遊戲,從2016年火爆以來一直擁有非常多的玩家。在最近的win11系統推出後,就有不少玩家想要在win11上游玩它,下面就跟著小編來看看win11是否可以玩pubg吧。 win11能玩pubg嗎:答:win11可以玩pubg。 1.在win11推出之初,因為win11需要開啟tpm的緣故,所以導致很多玩家被pubg封號處理了。 2.不過後來根據玩家的回饋,藍洞方面已經解決了這個問題,目前已經可以在win11中正常玩pubg了。 3.如果大家遇到了pub

Python函數介紹:exec函數的介紹及範例 Python函數介紹:exec函數的介紹及範例 Nov 03, 2023 pm 02:09 PM

Python函數介紹:exec函數的介紹及範例引言:在Python中,exec是一種內建函數,它用於執行儲存在字串或檔案中的Python程式碼。 exec函數提供了一種動態執行程式碼的方式,使得程式可以在執行時間根據需要產生、修改和執行程式碼。本文將介紹exec函數的使用方法,並給出一些實際的程式碼範例。 exec函式的使用方法:exec函式的基本語法如下圖所示:exec

i5處理器是否能裝win11詳細介紹 i5處理器是否能裝win11詳細介紹 Dec 27, 2023 pm 05:03 PM

i5是英特爾旗下的一系列處理器,擁有到現在11代i5的各種不同版本,每一代都有不同效能。因此對於i5處理器是否能夠安裝win11,還要看是第幾代的處理器,下面就跟著小編一起來分別了解一下吧。 i5處理器能裝win11嗎:答:i5處理器能裝win11。一、第八代及之後的i51、第八代及後續的i5處理器是能夠滿足微軟的最低配置需求的。 2.因此我們只需要進入微軟網站,下載一個「win11安裝助手」3、下載完成後,運行該安裝助手,根據提示進行操作就可以安裝win11了。二、第八代之前的i51、第八代之

介紹最新的Win 11聲音調法方法 介紹最新的Win 11聲音調法方法 Jan 08, 2024 pm 06:41 PM

很多用戶更新了最新的win11之後發現自己系統的聲音有了些許的變化,但是又不知道該怎麼去進行調整,所以今天本站就給你們帶來了電腦最新win11聲音調法介紹,操作不難而且選擇多樣,快來一起下載試試吧。電腦最新系統windows11聲音如何調1、先右鍵點選桌面右下角的聲音圖標,並選擇「播放設定」。 2、然後進入設定中點選播放列中的「揚聲器」。 3、隨後點選右下方的「屬性」。 4.點選屬性中的「增強」選項列。 5.此時如果「禁用所有聲音效果」前的√勾上了就把他取消。 6、之後就可以選擇下面的聲音效果來進行設定並點

edge快捷鍵的介紹 edge快捷鍵的介紹 Jul 12, 2023 pm 05:57 PM

在現今快速的生活,為了提高工作效率,快捷鍵是必備的工作需求。快捷鍵是指按鍵或按鍵組合,可提供另一種方式來執行通常使用滑鼠執行的操作。那麼edge快捷鍵有哪些呢? edge快捷鍵的功能又有哪些呢?下面小編整理了一個edge快捷鍵的介紹,有興趣的朋友快來看看吧! Ctrl+D:將目前頁面新增至收藏夾或閱讀清單Ctrl+E:在網址列中執行搜尋查詢Ctrl+F:在頁面上尋找Ctrl+H:開啟歷史記錄面板Ctrl+G:開啟閱讀清單面板Ctrl +I:打開收藏夾列表面板(測試好像不起作用)Ctrl+J:打開

win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) Feb 10, 2024 am 10:30 AM

越來越多的用戶開始升級win11系統,由於每個用戶的使用習慣不同,還是有不少用戶在使用ie11瀏覽器,那麼win11系統用不了ie瀏覽器,該怎麼辦呢? windows11還支援ie11嗎?下面就來看看解決方法。 win11無法使用ie11瀏覽器的解決方法1、先右鍵開始選單,選擇「命令提示字元(管理員)」開啟。 2.開啟之後,直接輸入“Netshwinsockreset”,回車確定。 3.確定之後再輸入「netshadvfirewallreset&rdqu

PyCharm新手指南:取代功能全面解析 PyCharm新手指南:取代功能全面解析 Feb 25, 2024 am 11:15 AM

PyCharm是一款功能強大的Python整合開發環境,具有豐富的功能與工具,能夠大幅提升開發效率。其中,替換功能是開發過程中常用的功能之一,能夠幫助開發者快速修改程式碼並提高程式碼品質。本文將詳細介紹PyCharm的替換功能,並結合具體的程式碼範例,幫助新手更好地掌握和使用該功能。替換功能簡介PyCharm的替換功能可以幫助開發者在程式碼中快速替換指定的文本

See all articles