簡單了解下生成器generator,主要是yield的返回值和send的傳參,記錄下。
生成器的基本屬性
generator = 函數 + yield
簡單說,就是一個函數,里面用到了關鍵字yield,就成為了一個生成器
生成器和函數的不同主要在于:
直接調用生成器,不會執行;
舉個栗子:a = f() #這里f()是個生成器
運行上面這句,f()不會執行,首次執行需要使用next(a)或a.send(None),后面會細講
每次執行,會暫時中斷在yield關鍵字處,而且通過yield可以返回一個參數
下次再接著執行,會從上次中斷的yield處接著執行,并可以通過send()傳遞參數,當然繼續中斷在下一個yield處
如果通過send()或next()執行generator,而沒有找到下一個yield,會報錯
yield返回值&&傳參
總結就是:
return = send(msg)
傳遞參數msg給當前中斷yield前面的變量
同時返回下一個yield后面的參數給return
return = next(a)
沒有傳遞參數或者說傳遞參數None給當前中斷yield前面的變量
同時返回下一個yield后面的參數給return
直接看下面的栗子,直觀明了
#生成器
def f():
print('start')
a = yield 1 #可以返回參數1,并接收傳遞的參數給a
print(a)
print('middle')
b = yield 2 #可以返回參數2,并接收傳遞的參數給b
print(b)
print('next')
c = yield 3 #可以返回參數3,并接收傳遞的參數給c
print(c) #這里貌似永遠不會執行,因為總會在上一行的yield處結束
a = f() #這里不會執行,即沒有任何打印信息
#a.next() #這種寫法在python3里面會報錯
return1 = next(a)#輸出start,中斷在yield 1處,返回yield后面的1給return1
#return1 = a.send(None) #效果同上一條語句
#return1 = a.send('test') #這里會報錯
#如果首次執行generator,就傳遞一個非None的參數,因為第一次執行不是從一般的中斷yield處執行起,所以沒有yield關鍵字來接收傳參,就會報錯
print(return1)
return2 = next(a)#傳入參數為None,即a=None,返回2給return2
print(return2)
return3 = a.send('msg')#傳入參數msg,即b=msg,返回3給return3
print(return3)
執行結果如下:
start
1
None
middle
2
msg
next
3
[Finished in 0.7s]