Mic*_*hal 48 python iterator list range python-3.x
我理解函数如何在for循环中使用range()和zip()可以使用.但是我希望range()输出一个列表 - 就像seq在unix shell中一样.如果我运行以下代码:
a=range(10)
print(a)
Run Code Online (Sandbox Code Playgroud)
输出是range(10),表明它不是列表而是不同类型的对象.zip()打印时有类似的行为,输出类似的东西
<zip object at "hexadecimal number">
Run Code Online (Sandbox Code Playgroud)
所以我的问题是它们是什么,有什么优势使它们成为现实,如何在没有循环的情况下将它们的输出发送到列表?
wim*_*wim 77
你必须使用Python 3.
在Python 2中,对象zip和range行为与您建议的一样,返回列表.它们被更改为类似生成器的对象,这些对象按需生成元素,而不是将整个列表扩展到内存中.一个优点是其典型用例的效率更高(例如,迭代它们).
"懒惰"版本也存在于Python 2.x中,但它们具有不同的名称,即xrange和itertools.izip.
要一次将所有输出检索到熟悉的列表对象中,您可以简单地调用list迭代并使用内容:
>>> list(range(3))
[0, 1, 2]
>>> list(zip(range(3), 'abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
Run Code Online (Sandbox Code Playgroud)
iCo*_*dez 21
在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')]
>>>
Run Code Online (Sandbox Code Playgroud)
虽然它可能在最初看起来无益,这种变化的行为range,并zip真的提高了效率.这是因为zip和range对象会根据需要生成项目,而不是创建一个列表来同时保存它们.这样做可以节省内存消耗并提高操作速度.
Range(xrange在 python 2.* 中)对象是不可变序列,而 zip(分别itertools.izip)是一个生成器对象。要从生成器或序列制作列表,只需将其转换为列表即可。例如:
>>> x = range(10)
>>> list(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
但是它们在元素的生成方式上有所不同。普通生成器是可变的,并且在迭代时耗尽它们的内容,而范围是不可变的,并且不要:
>>> 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!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75370 次 |
| 最近记录: |