在Python
2.x中,
range返回一个列表,但在Python
3.x中,
range返回一个不可变序列,类型为
range。
Python 2.x:
>>> type(range(10))<type 'list'>>>> type(xrange(10))<type 'xrange'>
Python 3.x:
>>> type(range(10))<class 'range'>
在Python 2.x中,如果要获得可迭代对象(如在Python
3.x中),则可以使用
xrangefunction,该函数返回type的不可变序列
xrange。
优势
xrange超过
range在Python 2.x的:
xrange()over的优点range()是最小的(因为xrange()在要求输入值时仍必须创建值),除非在内存不足的机器上使用了很大的范围或从未使用过所有范围的元素(例如当循环被使用时)。通常以中断终止)。
注意:
此外,访问由创建的整数的唯一明显方法
range()是遍历它们,
不。由于
rangePython 3中的对象是不可变的序列,因此它们也支持索引。引用
range功能文档,
范围实现除连接和重复之外的所有通用序列 *** 作
…
范围对象实现
collections.abc.SequenceABC,并提供诸如包含测试,
元素索引查找 ,切片和对负索引的支持等功能。
例如,
>>> range(10, 20)[5]15>>> range(10, 20)[2:5]range(12, 15)>>> list(range(10, 20)[2:5])[12, 13, 14]>>> list(range(10, 20, 2))[10, 12, 14, 16, 18]>>> 18 in range(10, 20)True>>> 100 in range(10, 20)False
通过不变的
range序列,所有这些都是可能的。
最近,我遇到了一个问题,我认为将其包含在此处是适当的。考虑此Python 3.x代码
from itertools import islicenumbers = range(100)items = list(islice(numbers, 10))while items: items = list(islice(numbers, 10)) print(items)
人们会希望此代码将每十个数字作为列表打印,直到99。但是,它将无限运行。你能解释为什么吗?
解
Because the
rangereturns an immutable sequence , not an iterator
object. So, wheneverisliceis done on arangeobject, it always starts
from the beginning. Think of it as a drop-in replacement for an immutable
list. Now the question comes, how will you fix it? Its simple, you just have
to get an iterator out of it. Simply changenumbers = range(100)to
numbers = iter(range(100))Now,
numbersis an iterator object and it remembers how long it has been
iterated before. So, when theisliceiterates it, it just starts from the
place where it previously ended.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)