range对象定义

range类型表示一个不可变的数字序列,通常用于在for循环中,循环特定次数。range构造函数生成range对象。

range构造函数有两种形式。
range(stop)
range(start, stop[, step])

start参数:起始位置(如果未提供参数,则为0)
stop参数:终止位置
step参数:步长(如果未提供参数,则为1)
range构造函数的参数必须是整数(内置int或任何实现__index__方法的对象)。如果step参数为零,则会引发ValueError。用list()函数将range对象转换成列表。

例如:

1
2
3
4
5
r = range(10)
l = list(r)
print(type(r))
print(r)
print(l)

执行以上程序会输出如下结果:

1
2
3
<class 'range'>
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

e = range(10.1)会报错,详细如下。

1
2
3
4
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    e = range(10.1)
TypeError: 'float' object cannot be interpreted as an integer

如果 step 为正值,确定 range r 内容的公式为 r[i] = start + step*i 其中 i >= 0 且 r[i] < stop。 如果 step 为负值,确定 range 内容的公式仍然为 r[i] = start + step*i,但限制条件改为 i >= 0 且 r[i] > stop. 如果 r[0] 不符合值的限制条件,则该 range 对象为空。 range 对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。 元素绝对值大于 sys.maxsize 的 range 对象是被允许的,但某些特性 (例如 len()) 可能引发 OverflowError。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))  # 不满足约束条件,结果为空。
[]

与常规列表或元组相比,range类型的优点是,range对象将始终占用相同(小)的内存量,而不管它表示的范围大小(因为它只存储开始、停止和步骤值,根据需要计算单个项和子范围)。

range对象实现collections.abc.sequence ABC,并提供包含测试,元素索引查找,切片和对负索引的支持等功能。

例如:

1
2
3
4
5
6
7
8
r = range(0, 20, 2)
print(r)            # range(0, 20, 2)
print(11 in r)      # 包含测试 结果是False
print(10 in r)      # 包含测试 结果是True
print(r.index(10))  # 5
print(r[5])         # 10
print(r[:5])        # 切片操作 结果是range(0, 10, 2)
print(r[-1])        # 索引取值 结果是18

使用==和!=测试range对象是否相等时,将它们作为序列进行比较。也就是说,如果两个range对象表示相同的值序列,则认为它们是相等的。(注意,比较相等的两个range对象可能具有不同的start、stop和step属性。)

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
r1 = range(0)
l1 =list(r1)
r2 = range(2, 1, 3)
l2 =list(r2)
print(r1)
print(l1)
print(r2)
print(l2)
print(r1==r2)

r3 = range(0, 3, 2)
l3 =list(r3)
r4 = range(0, 4, 2)
l4 =list(r4)
print(r3)
print(l3)
print(r4)
print(l4)
print(r3==r4)

执行以上程序会输出如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
range(0, 0)
[]
range(2, 1, 3)
[]
True
range(0, 3, 2)
[0, 2]
range(0, 4, 2)
[0, 2]
True

转载请注明本网址。