- 在 Python 3.0 中,诸如内置函数map等函数返回一个单次可迭代对象。也就是说,其返回的迭代器是边获取下一个值,边遗忘前面迭代出来的值的。这点在实际代码中可能会带来意想不到的效果。
- 例如,我们看下面这段代码:
iter = map(ord, 'abc')
print(list(iter)) # => [97, 98, 99]
print(list(iter)) # => []
- 这里我们原本希望用 iter 迭代器每次都产生列表 [97, 98, 99],但实际上它被 list 第一次激活后就无法再从头迭代了。
- 为了处理这个问题,我们可以将 list 后的结果储存在一个变量里,随后反复使用;或者将产生迭代器的代码封装成函数,每次都使用一个新的迭代器。
# 1
iter = map(ord, 'abc')
L = list(iter)
print(L)
print(L)
#2
gen_iter = (lambda : map(ord, 'abc'))
print(list(gen_iter()))
print(list(gen_iter()))