Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么map返回迭代器_Python_Python 3.x_Iterator - Fatal编程技术网

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
,后者在访问索引时执行函数调用。