我有一个功能:
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
我想象地图,zip,lambda,*
的一些组合?
答案 0 :(得分: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
答案 1 :(得分: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()
,因为它只支持带有一个参数的callables。
这假设你使用的是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