最簡單、直觀的認識,將 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... 都是迭代器,包括串列、字串、檔案等等,
但是,迭代器所有的值都存盤在記憶體中,十分浪費記憶體,
因此有了生成器的概念,
二、生成器
生成器是一種迭代器,這種迭代器只能迭代一次,
生成器不會一次性存盤所有的值,而是會動態的生成值,
mygenerator = (x*x for x in range(3))
for i in mygenerator:
print(i)
生成器只可執行一次,再次執行時不會輸出任何東西,
三、yield
1.例子一
yield 類似于 return 關鍵字,只是函式將回傳一個生成器,
# 創建生成器
def createGenerator():
mylist = range(10)
for i in mylist:
print(i) # 驗證函式呼叫時并無執行
yield i*i
mygenerator = createGenerator()
print(mygenerator)
# <generator object createGenerator at 0x0000029E88FDCA50>
# 使用生成器
for i in mygenerator:
print(i)
# 再次執行 回傳為空 沒有值了
函式將回傳一組只需要讀取一次的值,可以大大的提升代碼性能,
在呼叫函式時,函式體中的代碼并不會執行,函式只回傳生成器物件,
代碼每次從使用生成器時停止的地方繼續,
2.例子二
#Python學習交流群:531509025
# 學習另外一個例子
def foo():
print("starting...")
while True:
res = yield 4 # 函式并不真正執行
print("res:", res)
g = foo() # 得到一個生成器物件
print(next(g)) # 真正執行
print("*"*20)
print(next(g)) # 從上一次停止的地方繼續執行
'''
starting...
4
********************
res: None
4
'''
print(g.send(7))
執行 yield 之后,才會跳出 while 回圈,
-
next 函式用于執行下一步操作,
-
send 函式用于發送一個引數給生成器,且 send 方法中包含 next 方法,
結尾給大家推薦一個非常好的學習教程,希望對你學習Python有幫助!
Python基礎入門教程推薦:更多Python視頻教程-關注B站:Python學習者
https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web
Python爬蟲案例教程推薦:更多Python視頻教程-關注B站:Python學習者
https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336118.html
標籤:Python
