Python 为什么map返回迭代器
问题很清楚,为什么Python 为什么map返回迭代器,python,python-3.x,iterator,Python,Python 3.x,Iterator,问题很清楚,为什么map()(以及zip()和filter()而不是range()不返回迭代器)返回迭代器?我的意思是,我希望它只返回一个iterable,为什么选择这个选项?因为返回iterable序列需要预先生成所有新值 如果输入也是迭代器,那么这不是一个好主意,尤其是如果迭代器是无限的 通过可调用函数逐个映射值并不需要一次性处理所有值,因此map()不会这样做,而是按需应用可调用函数。通过这种方式,它同样可以很好地用于序列和潜在的无限可重用性 如果要将iterable序列作为输出,请改用列
map()
(以及zip()
和filter()
而不是range()
不返回迭代器)返回迭代器?我的意思是,我希望它只返回一个iterable,为什么选择这个选项?因为返回iterable序列需要预先生成所有新值
如果输入也是迭代器,那么这不是一个好主意,尤其是如果迭代器是无限的
通过可调用函数逐个映射值并不需要一次性处理所有值,因此map()
不会这样做,而是按需应用可调用函数。通过这种方式,它同样可以很好地用于序列和潜在的无限可重用性
如果要将iterable序列作为输出,请改用列表理解:
[callable(elem) for elem in inputiterator]
请注意,我使用了术语iterable序列,而不是更通用的术语iterable;迭代器也已经可以使用了。iterable对象是任何可以生成迭代器的对象,迭代器总是它自己的迭代器。为什么它不应该返回迭代器?迭代器是iterable的。你把术语弄混了,你所有的例子都是iterable的
range()
是一个序列,而其他序列则不是。Iterable的意思是:你可以调用iter(),得到一个迭代器。一个问题,根据“因为返回Iterable序列需要预先生成所有新值”range(5)
不会返回迭代器,也不会预先生成所有值,它根据需要生成它们,但不返回迭代器,因为range可以根据索引计算这些值;这是一个特例map()
不能,因为它不能依赖于具有索引的底层iterable。如果我写m=map(my_func[1,2,3])
不能map()
基于索引计算值?它可以,但这意味着它必须根据输入改变行为;相反,它只做一件事,而且做得很好。您可以创建自己的map()
实现,它是一个序列,可以很容易地执行您想要的操作。实现\uuu len\uuu
和\uu getitem\uuuu
,后者在访问索引时执行函数调用。