python3學習筆記:生成器generator

跟着廖大學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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章