跟着廖大學python3一段日子了,這裏簡單瞭解下生成器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]