Python中yield返回生成器的详细方法
最簡單、直觀的認識,將 yield 看做 return 對待,只是 return 返回一個值,而 yield 返回一個生成器。
要理解 yield 的作用,必須理解生成器是什么?
在理解生成器之前,必須先理解迭代器。
一、迭代器
逐項讀取列表,稱為迭代。
mylist = [1, 2, 3] for i in mylist: # 可迭代對象print(i)列表解析式同樣是一個迭代器。
mylist = [x*x for x in range(3)] for i in mylist:print(i) ''' 0 1 4 '''所有 for…in… 都是迭代器,包括列表、字符串、文件等等。
但是,迭代器所有的值都存儲在內(nèi)存中,十分浪費內(nèi)存。
因此有了生成器的概念。
二、生成器
生成器是一種迭代器,這種迭代器只能迭代一次。
生成器不會一次性存儲所有的值,而是會動態(tài)的生成值。
mygenerator = (x*x for x in range(3)) for i in mygenerator:print(i)生成器只可執(zhí)行一次,再次執(zhí)行時不會輸出任何東西。
三、yield
1.例子一
yield 類似于 return 關(guān)鍵字,只是函數(shù)將返回一個生成器。
# 創(chuàng)建生成器 def createGenerator():mylist = range(10)for i in mylist:print(i) # 驗證函數(shù)調(diào)用時并無執(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ù)體中的代碼并不會執(zhí)行,函數(shù)只返回生成器對象。
代碼每次從使用生成器時停止的地方繼續(xù)。
2.例子二
''' 學習中遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 學習另外一個例子 def foo():print("starting...")while True:res = yield 4 # 函數(shù)并不真正執(zhí)行print("res:", res)g = foo() # 得到一個生成器對象 print(next(g)) # 真正執(zhí)行 print("*"*20) print(next(g)) # 從上一次停止的地方繼續(xù)執(zhí)行 ''' starting... 4 ******************** res: None 4 '''print(g.send(7))執(zhí)行 yield 之后,才會跳出 while 循環(huán)。
-
next 函數(shù)用于執(zhí)行下一步操作。
-
send 函數(shù)用于發(fā)送一個參數(shù)給生成器。且 send 方法中包含 next 方法。
結(jié)尾給大家推薦一個非常好的學習教程,希望對你學習Python有幫助!
Python基礎(chǔ)入門教程推薦:更多Python視頻教程-關(guān)注B站:Python學習者
【Python教程】全網(wǎng)最容易聽懂的1000集python系統(tǒng)學習教程(答疑在最后四期,滿滿干貨)
Python爬蟲案例教程推薦:更多Python視頻教程-關(guān)注B站:Python學習者
2021年P(guān)ython最新最全100個爬蟲完整案例教程,數(shù)據(jù)分析,數(shù)據(jù)可視化,記得收藏哦
總結(jié)
以上是生活随笔為你收集整理的Python中yield返回生成器的详细方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础教程:pd.drop_d
- 下一篇: Python函数中apply、map、a