Python中yield的用法和實(shí)際應(yīng)用示例
Python中yield的用法詳解
一、引言
在Python中,yield是一個(gè)特殊的關(guān)鍵字,它使得函數(shù)能夠返回一個(gè)值,并在下一次從該點(diǎn)繼續(xù)執(zhí)行,而不是像return那樣結(jié)束函數(shù)執(zhí)行。這種特性使得yield在創(chuàng)建迭代器和生成器時(shí)非常有用,尤其是在處理大數(shù)據(jù)集或需要懶加載(lazy loading)的場(chǎng)景中。本文將詳細(xì)介紹yield的用法和一些實(shí)際應(yīng)用示例。

二、yield的基本用法
1、yield與生成器
yield關(guān)鍵字可以將一個(gè)普通函數(shù)轉(zhuǎn)變?yōu)樯善骱瘮?shù)。當(dāng)函數(shù)中包含yield時(shí),該函數(shù)不再是一個(gè)普通函數(shù),而是一個(gè)生成器(generator)。生成器允許函數(shù)在保持狀態(tài)的同時(shí),一次返回一個(gè)值,而不是一次性返回所有值。
1.1、代碼示例
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
counter = count_up_to(5)
for num in counter:
print(num)
這段代碼將輸出:
1
2
3
4
5
每次循環(huán)時(shí),生成器都會(huì)在yield處暫停,并在下一次循環(huán)時(shí)從yield的下一條語(yǔ)句繼續(xù)執(zhí)行。
2、yield與內(nèi)存效率
使用yield的一個(gè)主要優(yōu)勢(shì)是內(nèi)存效率。由于生成器一次只產(chǎn)生一個(gè)值,而不是一次性生成所有值,因此對(duì)于處理大型數(shù)據(jù)集或無(wú)限序列時(shí),可以大大減少內(nèi)存使用。
2.1、代碼示例
squares = (x**2 for x in range(10))
for square in squares:
print(square)
這段代碼將輸出0到9的平方數(shù),而不需要將所有平方數(shù)一次性存儲(chǔ)在內(nèi)存中。
三、yield的高級(jí)用法
1、鏈接生成器
生成器可以被鏈接在一起,允許組成復(fù)雜的數(shù)據(jù)處理管道。以下是如何鏈接兩個(gè)生成器的方法。
1.1、代碼示例
def even_numbers(numbers):
for number in numbers:
if number % 2 == 0:
yield number
def multiply_by_three(numbers):
for number in numbers:
yield number * 3
numbers = range(10)
even_nums = even_numbers(numbers)
result = multiply_by_three(even_nums)
for item in result:
print(item)這段代碼將輸出0到8的偶數(shù),并將它們乘以3。
2、在遞歸中使用yield
yield也可以在遞歸函數(shù)中使用,以遍歷數(shù)據(jù)結(jié)構(gòu)。以下是一個(gè)遍歷簡(jiǎn)單二叉樹(shù)的例子。
2.1、代碼示例
class TreeNode:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def traverse_in_order(node):
if node is not None:
yield from traverse_in_order(node.left)
yield node.value
yield from traverse_in_order(node.right)
root = TreeNode(1, TreeNode(2), TreeNode(3))
for value in traverse_in_order(root):
print(value)這段代碼將按照中序遍歷的方式輸出二叉樹(shù)的節(jié)點(diǎn)值。
四、總結(jié)
- yield函數(shù)屬性
- 當(dāng)一個(gè)函數(shù)包含yield關(guān)鍵字時(shí),這個(gè)函數(shù)就變成了一個(gè)生成器函數(shù)。
- 調(diào)用生成器函數(shù)并不會(huì)立即執(zhí)行函數(shù)體內(nèi)的代碼,而是返回一個(gè)生成器對(duì)象。
- 生成器對(duì)象可以被迭代,每次迭代時(shí),生成器函數(shù)會(huì)從上次離開(kāi)的地方繼續(xù)執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句,然后返回一個(gè)值,并保存當(dāng)前狀態(tài),以便下次繼續(xù)執(zhí)行。
- 這種行為使得生成器非常適合處理大量數(shù)據(jù)或流式數(shù)據(jù),因?yàn)樗恍枰淮涡詫⑺袛?shù)據(jù)加載到內(nèi)存中,從而節(jié)省了內(nèi)存資源。
- yield vs return
- return:當(dāng)函數(shù)執(zhí)行到return語(yǔ)句時(shí),它會(huì)立即停止執(zhí)行,并返回一個(gè)值給調(diào)用。
- 這意味著函數(shù)的局部變量會(huì)被銷毀,且函數(shù)的執(zhí)行狀態(tài)不會(huì)被保存。
- 因此,如果再次調(diào)用同一個(gè)函數(shù),它將從頭開(kāi)始執(zhí)行。
- yield:與return不同,當(dāng)執(zhí)行到y(tǒng)ield語(yǔ)句時(shí),函數(shù)會(huì)暫停執(zhí)行,返回一個(gè)值給調(diào)用者,并保存當(dāng)前的所有局部變量狀態(tài)。
- 下次調(diào)用生成器時(shí),函數(shù)將從上次暫停的地方恢復(fù)執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句或函數(shù)結(jié)束。
- 生成器的使用場(chǎng)景
- 處理大數(shù)據(jù)集:由于生成器是惰性求值的,它可以在需要時(shí)才生成數(shù)據(jù),因此非常適合處理大數(shù)據(jù)集,避免了一次性加載所有數(shù)據(jù)導(dǎo)致的內(nèi)存不足問(wèn)題。
- 簡(jiǎn)化代碼結(jié)構(gòu):使用生成器可以簡(jiǎn)化代碼結(jié)構(gòu),尤其是當(dāng)需要處理復(fù)雜的狀態(tài)機(jī)或遞歸結(jié)構(gòu)時(shí)。
- 協(xié)程與并發(fā):雖然Python的標(biāo)準(zhǔn)庫(kù)中已經(jīng)提供了多種并發(fā)模型,但生成器可以作為一種輕量級(jí)的協(xié)程實(shí)現(xiàn),用于實(shí)現(xiàn)簡(jiǎn)單的并發(fā)任務(wù)。
yield關(guān)鍵字是Python中創(chuàng)建生成器的強(qiáng)大工具,它允許函數(shù)在保持狀態(tài)的同時(shí),一次返回一個(gè)值。這不僅使得代碼更加簡(jiǎn)潔,而且提高了內(nèi)存效率,特別是在處理大型數(shù)據(jù)集或需要懶加載的場(chǎng)景中。通過(guò)本文的介紹和示例,你應(yīng)該對(duì)yield的用法有了更深入的理解。
版權(quán)聲明:本博客內(nèi)容為原創(chuàng),轉(zhuǎn)載請(qǐng)保留原文鏈接及作者信息。
參考文章:
到此這篇關(guān)于Python中yield的用法和實(shí)際應(yīng)用示例的文章就介紹到這了,更多相關(guān)Python yield用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
cython加速python代碼的方法實(shí)現(xiàn)
本文主要介紹了cython加速python代碼的方法實(shí)現(xiàn),特別是在涉及到數(shù)值計(jì)算密集型任務(wù)時(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
python統(tǒng)計(jì)字符串中字母出現(xiàn)次數(shù)代碼實(shí)例
這篇文章主要介紹了python統(tǒng)計(jì)字符串中字母出現(xiàn)次數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python中shutil模塊的學(xué)習(xí)筆記教程
shutil模塊是一種高層次的文件操作工具,類似于高級(jí)API,主要強(qiáng)大之處在于其對(duì)文件的復(fù)制與刪除操作更是比較支持好。下面這篇文章主要介紹了Python中shutil模塊的相關(guān)教程,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-04-04
實(shí)現(xiàn)python?namedtuple元類編程
這篇文章主要為大家介紹了實(shí)現(xiàn)python?namedtuple元類編程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
12個(gè)Pandas/NumPy中的加速函數(shù)使用總結(jié)
在本文中,數(shù)據(jù)和分析工程師?Kunal?Dhariwal?為我們介紹了?12?種?Numpy?和?Pandas?函數(shù),這些高效的函數(shù)會(huì)令數(shù)據(jù)分析更為容易、便捷2022-09-09
python數(shù)據(jù)分析之如何刪除value=0的行
這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)分析之如何刪除value=0的行的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-12-12
Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解
這篇文章主要介紹了Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解,argparse?是?Python?的一個(gè)標(biāo)準(zhǔn)庫(kù),用于命令行參數(shù)的解析,這意味著我們無(wú)需在代碼中手動(dòng)為變量賦值,而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù),需要的朋友可以參考下2023-08-08

