【问题标题】:Why map returns an iterator [closed]为什么map返回一个迭代器[关闭]
【发布时间】:2014-08-06 16:50:56
【问题描述】:

问题很清楚,为什么map()(以及zip()filter(),而不是不返回迭代器的range())返回一个迭代器?我的意思是我希望它只返回一个 iterable,为什么选择这个?

【问题讨论】:

  • 为什么不应该返回一个迭代器?
  • 迭代器可迭代的。
  • 你混淆了你的术语,你所有的例子都是可迭代的。 range() 是一个序列,而其他不是。可迭代的意思是:你可以在它上面调用iter(),得到一个迭代器。

标签: python python-3.x iterator


【解决方案1】:

因为返回一个可迭代序列需要预先生成所有新值

如果 input 也是一个迭代器,那不是一个好主意,尤其是如果该迭代器是 infinite

通过可调用对象逐一映射值,并不要求一次性处理所有值,因此map() 不这样做,而是应用可调用对象on需求。这样一来,它同样可以很好地用于序列和潜在的无限迭代。

如果您想要一个可迭代的序列作为输出,请改用列表推导:

[callable(elem) for elem in inputiterator]

请注意,我使用了术语可迭代序列,而不是更通用的术语可迭代迭代器 已经 iterable了。 iterable 对象是可以产生迭代器的任何对象,并且迭代器始终是其自己的迭代器。

【讨论】:

  • 一个问题,根据“因为返回一个可迭代序列需要预先生成所有新值”range(5) 不返回迭代器并且它不会预先生成所有值,而是生成它们按需但不返回迭代器
  • 那是因为 range 可以根据索引计算那些值;这是一个特例。 map() 不能 因为它不能指望具有索引的底层迭代。
  • 如果我写m = map(my_func, [1, 2, 3]) 不能map() 根据索引计算值?
  • 可以,但这意味着它必须根据输入改变行为;相反,它只做一件事,而且做得很好。您可以创建自己的 map() 实现,它是一个序列,可以很容易地完成您想要的操作。实现__len____getitem__,后者在访问索引时进行函数调用。
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 2016-10-02
  • 1970-01-01
  • 2017-03-19
  • 2010-10-04
  • 2016-09-23
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多