我的教授和这个家伙都声称range创造了价值清单。
range
“注意:范围函数仅返回包含从x到y-1的数字的列表。例如,range(5,10)返回列表[5、6、7、8、9]。”
我认为这是不准确的,因为:
type(range(5, 10)) <class 'range'>
此外,访问由创建的整数的唯一显而易见的方法range是遍历它们,这使我认为标记range为列表是不正确的。
在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
优势xrange超过range在Python 2.x的:
xrange()over的优点range()是最小的(因为xrange()在要求输入值时仍必须创建值),除非在内存不足的机器上使用了很大的范围或从未使用过所有范围的元素(例如当循环被使用时)。通常以中断终止)。
xrange()
range()
注意:
此外,访问由创建的整数的唯一明显方法range()是遍历它们,
不。由于rangePython 3中的对象是不可变的序列,因此它们也支持索引。引用range功能文档,
范围实现除连接和重复之外的所有通用序列操作 … 范围对象实现collections.abc.SequenceABC,并提供诸如包含测试, 元素索引查找 ,切片和对负索引的支持等功能。
范围实现除连接和重复之外的所有通用序列操作
…
范围对象实现collections.abc.SequenceABC,并提供诸如包含测试, 元素索引查找 ,切片和对负索引的支持等功能。
collections.abc.Sequence
例如,
>>> 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 islice numbers = range(100) items = list(islice(numbers, 10)) while items: items = list(islice(numbers, 10)) print(items)
人们会希望此代码将每十个数字作为列表打印,直到99。但是,它将无限运行。你能解释为什么吗?
解
Because the range returns an immutable sequence , not an iterator object. So, whenever islice is done on a range object, 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 change numbers = range(100) to numbers = iter(range(100)) Now, numbers is an iterator object and it remembers how long it has been iterated before. So, when the islice iterates it, it just starts from the place where it previously ended.
Because the range returns an immutable sequence , not an iterator object. So, whenever islice is done on a range object, 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 change
islice
numbers = range(100)
to
numbers = iter(range(100))
Now, numbers is an iterator object and it remembers how long it has been iterated before. So, when the islice iterates it, it just starts from the place where it previously ended.
numbers