Python range()和zip()对象类型
我了解如何在for循环中使用Python range()和zip()对象类型,python,python-3.x,list,iterator,range,Python,Python 3.x,List,Iterator,Range,我了解如何在for循环中使用range()和zip()等函数。然而,我希望range()输出一个列表,就像unix shell中的seq一样。如果我运行以下代码: a=range(10) print(a) 输出为range(10),表明它不是列表,而是不同类型的对象zip()在打印时有类似的行为,输出类似 <zip object at "hexadecimal number"> 所以我的问题是它们是什么,这样做有什么好处,以及如何在不循环的情况下将它们输出到列表中?在Pyth
range()
和zip()
等函数。然而,我希望range()
输出一个列表,就像unix shell中的seq
一样。如果我运行以下代码:
a=range(10)
print(a)
输出为range(10)
,表明它不是列表,而是不同类型的对象zip()
在打印时有类似的行为,输出类似
<zip object at "hexadecimal number">
所以我的问题是它们是什么,这样做有什么好处,以及如何在不循环的情况下将它们输出到列表中?在Python3.x中,返回一个范围对象,而不是像Python2.x中那样返回列表。类似地,现在返回一个zip对象而不是列表
要将这些对象作为列表,请将它们放入:
>范围(10)
范围(0,10)
>>>名单(范围(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>zip('abc','abc')
>>>列表(zip('abc','abc'))
[('a','a'),('b','b'),('c','c')]
>>>
虽然一开始似乎没有什么帮助,但
range
和zip
行为的这种变化实际上提高了效率。这是因为zip和range对象根据需要生成项目,而不是创建一个列表来同时保存所有项目。这样做可以节省内存消耗并提高操作速度。您必须使用Python 3
在Python2中,对象zip
和range
确实按照您的建议运行,返回列表。它们被更改为类对象,根据需要生成元素,而不是将整个列表扩展到内存中。一个优点是在其典型用例(例如,迭代)中效率更高
Python2.x中也存在“惰性”版本,但它们有不同的名称,即xrange
和itertools.izip
要将所有输出一次检索到熟悉的列表对象中,只需调用list
即可迭代并使用内容:
>>> list(range(3))
[0, 1, 2]
>>> list(zip(range(3), 'abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
Range(Python2.*中的xrange
)对象是,而zip(itertools.izip
分别)是。要从生成器或序列生成列表,只需将其转换为列表即可。例如:
>>> x = range(10)
>>> list(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但它们在生成元素的方式上有所不同。普通生成器是可变的,在迭代时检查其内容,而范围是不可变的,并且不:
>>> list(x) # x is a range-object
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # second cast to list, contents is the same
>>> y = zip('abc', 'abc')
>>> list(y) # y is a generator
[('a', 'a'), ('b', 'b'), ('c', 'c')]
>>> list(y)
[] # second cast to list, content is empty!
看起来像Python 3。使用
a=list(范围(10))
。除了这里的好答案之外,我建议您阅读答案以了解生成器-这是一个很好的示例,说明了为什么您的函数可能不希望返回列表。。。还没有。虽然这些对象是懒惰的,但我认为将它们描述为类似于生成器是错误的,例如,请看@Chris_Rands。从最重要的意义上说,它们类似于生成器,即元素是按需生产的。我认为我的描述是公正的;我很小心没有把它们称为生成器,这些差异对于这个问题来说并不重要。是的,也许我第一次评论的语气不公平,对不起,我还是把它放在这里,因为这个链接为那些感兴趣的人提供了一些关于范围对象的详细信息zip是一个迭代器:>>>>z=zip((1,2),(3,4))>>>next(z)(1,3)我在REPL上玩这些例子,下面是对这个问题的早期回答。当我第一次使用我的发电机而不是zip生产的发电机时,我有点:facepalm:直到我读到你提到的第二个演员名单将导致空内容。谢谢你!
>>> list(x) # x is a range-object
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # second cast to list, contents is the same
>>> y = zip('abc', 'abc')
>>> list(y) # y is a generator
[('a', 'a'), ('b', 'b'), ('c', 'c')]
>>> list(y)
[] # second cast to list, content is empty!