python map vs itertools.map:使迭代器版本的行为与前者相同

Cur*_*arn 4 python map python-itertools

请考虑以下示例代码.该示例仅用于突出显示map和之间的不同功能itertools.imap.我真正想做的事情不能用列表理解来完成,因为在我真正的问题中我不是创建一个列表而是用一个小数组填充一个更大的numpy数组.因此,为了回应下面的代码,请不要建议:[f(x) for x in range(3)]

例:

g = []

def f(x):
    g.append(x)
Run Code Online (Sandbox Code Playgroud)

我得到的结果map和itertools.map:

map(f, range(3)) # Results in g = [0,1,2]

itertools.imap(f, range(3)) # Does not change g
Run Code Online (Sandbox Code Playgroud)

我希望gmap函数完成更改.但是,我听说过map(或者确实)会像itertools.imapPython 3 一样 .即使我使用的是Python 2.7,我也想学习使用迭代器版本的地图的正确方法.我如何使用itertools.imap以获得与我相同的结果map

我可以:

b = itertools.imap(f, range(3))
list(b) # This gives g = [0,1,2] if starting with an empty g.
Run Code Online (Sandbox Code Playgroud)

这是正确的方法,还是有更好的方法?

提前致谢.

eca*_*mur 10

itertools函数返回生成器; 它们只在迭代时运行.因此,在你完成任务之前,itertools.imap(f, range(3))实际上不会做任何事情list.

根据http://docs.python.org/2/library/itertools.html#recipes,使用迭代器的最有效方法是使用零长度双端队列:

collections.deque(itertools.imap(f, range(3)), maxlen=0)
Run Code Online (Sandbox Code Playgroud)

但是,如果您为其副作用调用函数,则应该使用命令而不是函数语法:

for i in range(3):
    f(i)
Run Code Online (Sandbox Code Playgroud)