2016-07-04 32 views
1

看起來PEP 479(更改發生器中的StopIteration處理)帶來了許多不便。拉鍊等效的實施例的代碼(從python的2.7文檔,由我自己稍微改變):PEP 479,map()和StopIteration

def izip(*iterables): 
    # izip('ABCD', 'xy') --> Ax By 
    iterators = list(map(iter, iterables)) 
    while True: 
     yield tuple(map(next,iterators)) 

拉鍊= izip([1,2],[3,4])

下(拉鍊)

(1,3)

下(拉鍊)

(2,4)

下(拉鍊)

()

下(拉鍊)

()

地圖()內置發生器飛燕由下凸起StopIteration異常(),因此拉鍊發生器從未結束。我甚至無法捕捉izip中的異常,因爲問題駐留在map()本身內部。有沒有什麼pythonic的方式來解決這個問題,而不寫一個自定義地圖()?

回答

1

在這種情況下,你可以檢查你要yield的的tuple長度和破環的情況下,它小於iterators長度:

def izip(*iterables): 
    iterators = list(map(iter, iterables)) 
    while True: 
     t = tuple(map(next,iterators)) 
     if len(t) != len(iterators): 
      break 
     yield t 

zipper = izip([1, 2], [3, 4]) 
print(next(zipper)) # (1, 2) 
print(next(zipper)) # (3, 4) 
print(next(zipper)) # StopIteration