2013-12-18 2 views
3

У меня есть функция:почтовые генераторы передачи параметров из списка кортежей

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

И некоторые i и k экземпляров:

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() применяет произвольную длину pairs в качестве аргументов func, которые вам затем может перейти к 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

Он застревает во время цикла, несмотря на урожай, я что-то упускаю? – 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 
Смежные вопросы