生成器中yield和next()的用法解析


生成器概念:

python使用生成器對延遲操作提供了支持,就是需要的時候才產生結果,而不是產生結果.

  • 生成器函數:

    和其他函數編寫方式相同,使用yield語句一次返回一次結果,在每個結果之間掛起當前狀態,下次調用直接繼續當前的狀態.

  • 生成器表達式:

    類似於列表解析,不同的是他返回的是一個迭代對象而不是一個列表.

#列表生成器:
L = [x for x in range(5)]
print(L)
#簡單生成器:
G= (x for x in range(5))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
當我們輸出結果是一個一個的輸出時:
  • 1.創建一個迭代器類,把代碼寫進去,用類來創建可迭代對象,然后用next()函數來把結果迭代出來.
    class test_Iterator():
        def __init__(self):
            self.a=0
            self.b=1
        def __iter__(self):
            return self
        def __next__(self):
            num = self.a
            self.a,self.b=self.b,self.b+self.a
            return num
            
    itera = test_Iterator()
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    ########################################################
    0
    1
    1
    2
    3
    5      
    
  • 2.代碼函數的合適位置加上yield,這時候這個函數就變成一個生成器了
    def test():
        a = 1
        b = 2
        while True:
            yield a 
            a,b = b,a*b
    
    
    generator = test()
    
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    #######################################
    1
    2
    2
    4
    8
    32
    256
    8192
    第一次用next()喚醒生成器時,從函數的開頭開始運行,遇到yield a,返回a,然后暫停函數,並記住函數是運行到這個位置的。
    
    第二次喚醒生成器,從yield a斷點處開始,然后a,b開始賦值,while True循環又遇見yield a,返回a,然后暫停函數,並記住函數是運行到這個位置的
    
  • 3.生成器yield接收參數,send()方法:
    #b = yield,會把yield接收的值賦值給b。
    def test():
        a = 1
        while True:
            recv = yield a
            print('接收值:',recv)
    
    
    gen = test()
    
    print(next(gen))
    print(gen.send('Jhonsenry'))
    print(gen.send('a bad guy'))
    ##############################################################################
    1
    接收值: Jhonsenry
    1
    接收值: a bad guy
    1
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM