Python range() 和 zip() 对象类型

新手上路,请多包涵

我了解如何在 for 循环中使用 range()zip() 等函数。但是我希望 range() 输出一个列表 - 很像 unix shell 中的 seq 。如果我运行以下代码:

 a=range(10)
print(a)

输出是 range(10) ,表明它不是列表而是不同类型的对象。 zip() 打印时有类似的行为,输出类似

<zip object at "hexadecimal number">

所以我的问题是它们是什么,使它们成为这样有什么好处,以及如何在不循环遍历它们的情况下将它们的输出输出到列表中?

原文由 Michal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 627
2 个回答

您必须使用 Python 3。

在 Python 2 中,对象 ziprange 确实按照您的建议运行,返回列表。它们被更改为类似 生成器 的对象,这些对象按需生成元素,而不是将整个列表扩展到内存中。一个优势是在他们的典型用例中效率更高(例如迭代它们)。

“惰性”版本也存在于 Python 2.x 中,但它们具有不同的名称,即 xrangeitertools.izip

要一次将所有输出检索到熟悉的列表对象中,您可以简单地调用 list 来迭代和使用内容:

 >>> list(range(3))
[0, 1, 2]
>>> list(zip(range(3), 'abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]

原文由 wim 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 Python 3.x. 中, range 返回一个范围对象,而不是像在 Python 2.x 中那样返回一个列表。同样, zip 现在返回一个 zip 对象而不是列表。

要将这些对象作为列表获取,请将它们放入 list

 >>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> zip('abc', 'abc')
<zip object at 0x01DB7120>
>>> list(zip('abc', 'abc'))
[('a', 'a'), ('b', 'b'), ('c', 'c')]
>>>

虽然乍一看似乎没有帮助,但 rangezip 的行为变化实际上提高了效率。这是因为 zip 和 range 对象会根据需要生成项目,而不是创建一个列表来一次保存所有项目。这样做可以节省内存消耗并提高运行速度。

原文由 user2555451 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题