2013-12-18 46 views
3

我有一個函數:從元組的列表傳遞參數拉鍊發電機

def func(i, k): 
    j = 0 
    while True: 
    yield j * i + k 
    j += 1 

而一些ik實例:

pars = [(2, 4), (1, 5), (7, 2)] 

我怎麼能壓縮在標準桿的FUNC不知道長度的部分?就像這樣:

for func_tups in zip(func(2, 4), func(1, 5), func(7, 2)): 
    print func_tups 

我想象圖,拉鍊,λ,*的某種組合?

回答

7

您正在尋找itertools.starmap()

from itertools import starmap 

for func_tups in zip(*starmap(func, pairs)): 
    # warning, infinite loop unless you have a break condition 

這裏starmap()適用作爲參數任意長度pairsfunc,你然後可以作爲單獨的參數傳遞給zip()。你不能在這裏使用map(),因爲它只支持一個參數。

這假定你正在使用Python 3 zip();在Python 2裏你顯然需要使用itertools.izip()處理由func()發電機產生的元組的無限序列的迭代:

from itertools import starmap, izip 

for func_tups in izip(*starmap(func, pairs)): 
    # warning, infinite loop unless you have a break condition 
+1

剛纔編輯,當我發佈 - 現在看起來罰款 – Eric

+0

@Eric:是的,起初我忘了'zip()'部分。 –

+0

儘管有良率,它仍然陷入while循環,我錯過了什麼嗎? – perreal

7
for func_tup in zip(*(func(*p) for p in pairs)): 
    print func_tup 

雖然這可能讀取更好,因爲兩行:

iterators = (func(*pair) for pair in pairs) # aka starmap 
for func_tup in zip(*iterators): 
    print func_tup