Skip to main content
 首页 » 编程设计

python之强制对可迭代对象进行所有迭代

2025年05月04日7cyq1162

我使用 map 编写了一个 for 循环,其中的函数有副作用。这是我的意思的最小工作示例:

def someFunc(t): 
    n, d = t 
    d[n] = str(n) 
 
def main(): 
    d = {} 
    map(somefunc, ((i,d) for i in range(10**3))) 
    print(len(d)) 

很明显,映射到 1000 以下的非负数的 someFunc 具有填充字典的副作用,稍后用于其他用途。

现在,鉴于上述代码的结构方式,print(len(d)) 的预期输出为 0,因为 map 返回一个迭代器,而不是一个列表(与 python2.x 不同)。因此,如果我真的想看到应用于 d 的更改,那么我将不得不迭代该 map 对象直到完成。我可以这样做的一种方法是:

d = {} 
for i in map(somefunc, ((i,d) for i in range(10**3))): 
    pass 

但这似乎不是很优雅。我可以在 map 对象上调用 list,但这需要 O(n) 内存,效率很低。有没有办法强制对 map 对象进行完整迭代?

请您参考如下方法:

你不想这样做(运行 map() 只是为了副作用),但是有一个 itertools consume recipe这适用于此:

from collections import deque 
 
deque(map(somefunc, ((i,d) for i in range(10**3))), maxlen=0) 

collections.deque() object ,配置为 0 的最大大小,消耗 map() 可迭代,不使用额外的内存。 deque 对象是 specifically optimized对于这个用例。