python
  • yield
  • 2016-01-23 52 views 4 likes 
    4

    在下面的代碼中,一個計數是用一個兩元素列表壓縮的。我預計這個櫃檯被稱爲兩次,但它被稱爲三次。爲什麼?壓縮產生的壓縮過於頻繁嗎?

    def equivalent_count(start=0, step=1): 
        """From python docs for itertools.count.""" 
        n = start 
        while True: 
         print('count in loop =', n) 
         yield n 
         n += step 
    
    c = equivalent_count() 
    l = [0, 1] 
    
    for i, j in zip(c, l): 
        pass 
    

    的輸出是:

    count in loop = 0 
    count in loop = 1 
    count in loop = 2 
    

    zip狀態的文檔, 「當最短輸入可迭代耗盡該迭代停止。」

    回答

    2

    交換cl

    for i, j in zip(l, c): 
        pass 
    

    得到的只有兩個印記:

    count in loop = 0 
    count in loop = 1 
    

    現在l先用盡,next(c)不是第三次與您的版本一樣。

    +0

    這導致了一個新的規則(至少對我來說)'''itertools。 count'''生成器調用必須在'''zip'''的參數中最後。 – lemi57ssss

    3

    因爲c的每次迭代都是在l的等效值之前計算的,所以Python不知道l已用盡。你可以看到這一點,如果你有一臺發電機取代l還有:

    def gen_l(lst): 
        for l in lst: 
         print 'gen_l called' 
         yield l 
    
    c = equivalent_count() 
    l = gen_l([0, 1]) 
    for i, j in zip(c, l): 
        pass 
    

    ,輸出:

    count in loop = 0 
    gen_l called 
    count in loop = 1 
    gen_l called 
    count in loop = 2 
    
    +1

    您還可以看到,當您在zip(l,c):pass'中發出'for i,j時,只有兩次打印。 – timgeb

    +1

    在這裏你可以看到一個實現https://github.com/python/cpython/blob/1364858e6ec7abfe04d92b7796ae8431eda87a7a/Python/bltinmodule.c#L2480 –

    相關問題