Python中yield返回生成器的詳細(xì)方法
最簡(jiǎn)單、直觀的認(rèn)識(shí),將 yield 看做 return 對(duì)待,只是 return 返回一個(gè)值,而 yield 返回一個(gè)生成器。
要理解 yield 的作用,必須理解生成器是什么?
在理解生成器之前,必須先理解迭代器。
一、迭代器
逐項(xiàng)讀取列表,稱為迭代。
mylist = [1, 2, 3]
for i in mylist: # 可迭代對(duì)象
print(i)
列表解析式同樣是一個(gè)迭代器。
mylist = [x*x for x in range(3)]
for i in mylist:
print(i)
'''
0
1
4
'''
所有 for...in... 都是迭代器,包括列表、字符串、文件等等。
但是,迭代器所有的值都存儲(chǔ)在內(nèi)存中,十分浪費(fèi)內(nèi)存。
因此有了生成器的概念。
二、生成器
生成器是一種迭代器,這種迭代器只能迭代一次。
生成器不會(huì)一次性存儲(chǔ)所有的值,而是會(huì)動(dòng)態(tài)的生成值。
mygenerator = (x*x for x in range(3))
for i in mygenerator:
print(i)
生成器只可執(zhí)行一次,再次執(zhí)行時(shí)不會(huì)輸出任何東西。
三、yield
1.例子一
yield 類似于 return 關(guān)鍵字,只是函數(shù)將返回一個(gè)生成器。
# 創(chuàng)建生成器
def createGenerator():
mylist = range(10)
for i in mylist:
print(i) # 驗(yàn)證函數(shù)調(diào)用時(shí)并無(wú)執(zhí)行
yield i*i
mygenerator = createGenerator()
print(mygenerator)
# <generator object createGenerator at 0x0000029E88FDCA50>
# 使用生成器
for i in mygenerator:
print(i)
# 再次執(zhí)行 返回為空 沒有值了
函數(shù)將返回一組只需要讀取一次的值,可以大大的提升代碼性能。
在調(diào)用函數(shù)時(shí),函數(shù)體中的代碼并不會(huì)執(zhí)行,函數(shù)只返回生成器對(duì)象。
代碼每次從使用生成器時(shí)停止的地方繼續(xù)。
2.例子二
#Python學(xué)習(xí)交流群:531509025
# 學(xué)習(xí)另外一個(gè)例子
def foo():
print("starting...")
while True:
res = yield 4 # 函數(shù)并不真正執(zhí)行
print("res:", res)
g = foo() # 得到一個(gè)生成器對(duì)象
print(next(g)) # 真正執(zhí)行
print("*"*20)
print(next(g)) # 從上一次停止的地方繼續(xù)執(zhí)行
'''
starting...
4
********************
res: None
4
'''
print(g.send(7))
執(zhí)行 yield 之后,才會(huì)跳出 while 循環(huán)。
next 函數(shù)用于執(zhí)行下一步操作。
send 函數(shù)用于發(fā)送一個(gè)參數(shù)給生成器。且 send 方法中包含 next 方法。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能
平穩(wěn)性是時(shí)間序列分析與預(yù)測(cè)的核心概念,在平穩(wěn)條件下,時(shí)間序列的統(tǒng)計(jì)特性(如均值)在時(shí)間維度上保持不變,僅存在隨機(jī)波動(dòng),但是時(shí)間序列通常會(huì)經(jīng)歷結(jié)構(gòu)性斷裂或變化,本文給大家介紹了Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能,需要的朋友可以參考下2024-09-09
python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn)
公司使用的是企業(yè)微信,因此考慮Jenkins通知企業(yè)微信機(jī)器人的實(shí)現(xiàn)方式,本文主要介紹了python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn),感興趣的可以了解一下2021-06-06
Python反爬實(shí)戰(zhàn)掌握酷狗音樂(lè)排行榜加密規(guī)則
最新的酷狗音樂(lè)反爬來(lái)襲,本文介紹如何利用Python掌握酷狗排行榜加密規(guī)則,本章內(nèi)容只限學(xué)習(xí),切勿用作其他用途?。。。?! 有需要的朋友可以借鑒參考下2021-10-10
Python學(xué)習(xí)之名字,作用域,名字空間(下)
這篇文章主要介紹了Python學(xué)習(xí)之名字,作用域,名字空間,緊接上一篇文章內(nèi)容展開全文,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-05-05
Python實(shí)現(xiàn)批量獲取當(dāng)前文件夾下的文件名
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量獲取當(dāng)前文件夾下的文件名,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
Python中類創(chuàng)建和實(shí)例化的過(guò)程詳解
這篇文章主要介紹了Python中類創(chuàng)建和實(shí)例化過(guò)程,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
Python實(shí)現(xiàn)常見網(wǎng)絡(luò)通信的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)常見網(wǎng)絡(luò)通信的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴就跟隨小編一起學(xué)習(xí)一下吧2025-04-04

