1. 程式人生 > >2018-06-20-Python全棧開發day19-生成器函數詳解

2018-06-20-Python全棧開發day19-生成器函數詳解

IE 示例 yield 概念 一個 print 容易 for循環 __next__

1.生成器函數

  生成器函數,和普通函數的區別就是,

  1.在生成器函數中使用yield代替return,而且yield可以被調用多次

  2.當函數運行到yield時,會保留yield當前狀態,等待下一次next

用法示例:

  

def test():
    yield 1
    yield 2
    yield 3
a=test()
b=a.__next__()
c=a.__next__()
d=a.__next__()
#
print(b)
print(c)
print(d)

  test函數中,有三個yield,每使用一次next方法,函數進行到一個yield之後,分別用bcd來接收返回值,

2.生成器函數的好處

  和生成器一樣,好處就是可以隨時來進行運算,

  和普通函數進行對比:

  

def shengchengqi():
    for i in range(10000):
        yield 這是第%s個雞蛋 %i
a= shengchengqi()
b=a.__next__()
print(b)

  生成器函數,當你進行next函數時,才進行運算,每次運算時拿一個數據進內存,這樣可以很省內存空間

  如果是普通函數的話

  

def putonghanshu():
    s1=[]
    for i in range(10000):
        print
(這是第%s個雞蛋 %i) a=putonghanshu()

    只要函數運行,就將10000個數據全部放入內存,很容易占空間。

  ps:疑問:這樣的話,那生成器函數是不是很復雜,每運行一次都要寫一段代碼。

   引入for循環

3.將生成器函數引入for循環

  編寫一個生成器函數

  如果生成器函數運行的話,會從yield裏得到一個返回值,我們可以用abc來接收。

  然後,可以對生成器函數使用next方法,可以使函數內的光標移到下一個yield之後,僅此而已,還是需要自己去找值接收。

  

def shengchengqi():
    for i in range(10000):
        
yield 這是第%s個雞蛋 %i a= shengchengqi() for b in a: print(b)

這時是自動運行,

  分析:a=func().,開始運行函數,此時i=0,光標在yield之後。

  for循環的概念,對一個對象,加上iter,然後一個一個的使用next方法,直到需要異常,然後返回,在for循環中,b直接接收了next之後的值。

4.並發運行

需求分析:兩個函數,一個函數運行時調用另一個函數,然後保存狀態如此往復。

def chibaozi(name):
    print(我開始吃包子了)
    while 1:
        baozi=yield
        print(這是我吃的包子 %s %baozi)

def zuo():
    s1=chibaozi(yehaibin)
    s1.__next__()
    for i in range(10):
        s1.send(lvelvelve)
zuo()

運行zuo的時候, 每循環一次,chibaozi就會做一次動作,然後保存狀態,這就是yield。#其實我現在還不太懂,挖個坑。

2018-06-20-Python全棧開發day19-生成器函數詳解