最簡單、直觀的認識,將 yield 看做 return 對待,只是 return 返回一個值,而 yield 返回一個生成器。
要理解 yield 的作用,必須理解生成器是什么?
在理解生成器之前,必須先理解迭代器。
一、迭代器
逐項讀取列表,稱為迭代。
1
2
3
|
mylist = [ 1 , 2 , 3 ] for i in mylist: # 可迭代對象 print (i) |
列表解析式同樣是一個迭代器。
1
2
3
4
5
6
7
8
|
mylist = [x * x for x in range ( 3 )] for i in mylist: print (i) ''' 0 1 4 ''' |
所有 for...in... 都是迭代器,包括列表、字符串、文件等等。
但是,迭代器所有的值都存儲在內存中,十分浪費內存。
因此有了生成器的概念。
二、生成器
生成器是一種迭代器,這種迭代器只能迭代一次。
生成器不會一次性存儲所有的值,而是會動態的生成值。
1
2
3
|
mygenerator = (x * x for x in range ( 3 )) for i in mygenerator: print (i) |
生成器只可執行一次,再次執行時不會輸出任何東西。
三、yield
1.例子一
yield 類似于 return 關鍵字,只是函數將返回一個生成器。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 創建生成器 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.例子二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#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 方法。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://www.cnblogs.com/xxpythonxx/p/15463109.html