说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
range 对象是(rangeobject) Python 内置的对象,它可以认为是一个不可变的数字序列,通常用于在 for 循环中指定循环的次数。虽然被称为函数,但 range 实际上是一个不可变的序列类型。
以下案例为定义了一个 range
类型数据,需要迭代展开。
# 定义 range 对象
r = range(4)
r
# range(0, 4)
# 展开方法
[i for i in range(4)]
list(r)
[*r]
# [0, 1, 2, 3]
tuple(r)
# (0, 1, 2, 3)
# 定义示例
range(4) # [0, 1, 2, 3]
range(0, 4) # [0, 1, 2, 3]
range(2, 6) # [2, 3, 4, 5]
range(2, 10, 3) # [2, 5, 8]
# 负数
range(-10, 10, 5) # [-10, -5, 0, 5]
range(10, 1, -2) # [10, 8, 6, 4, 2]
range(1, 10, -1) # []
# 展开方法
语法形式有两种:
range(stop)
和 range(start, stop[, step])
__index__()
特殊方法的对象r[i] = start + step*i
其中 i >= 0
且 r[i] < stop
。r[i] = start + step*i
,但限制条件改为 i >= 0
且 r[i] > stop
。sys.maxsize
的 range 对象是被允许的,但某些特性 (例如 len()) 可能引发 OverflowError。相比常规 list 或 tuple,range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大,因为它只保存了 start、stop 和 step 值,并会根据需要计算具体单项或子范围的值。
range() 函数创建的 rangeobject,有三个属性和两个方法,不过相对使用较少。
# 定义范围对象 rangeobject
r = range(1, 10, 2)
list(r) # 转为列表
# [1, 3, 5, 7, 9]
# 属性
r.start # 1 开始值
r.stop # 10 终止值
r.step # 2 步长
# 返回值的出现次数
r.count(1) # 1
r.count(10) # 0
# 返回值的索引
r.index(3) # 1
# 如果该值不存在,则引发值错误
r.index(10) # ValueError: 10 is not in range
可用列表推导式来展开 range 对象:
[i for i in range(4)] # [0, 1, 2, 3]
用在 for 循环中:
for i in range(2, 10, 2):
print(i, end=' ')
# 4 6 8
如果,不知道要生成多长的 range, 可以通过 len()
来获取长度:
var = 'hello'
for i in range(len(var)):
print(var[i])
range 对象实现了 collections.abc.Sequence
抽象基类(ABC),提供如包含检测、元素索引查找、切片等特性,并支持负索引。
from collections import abc
isinstance(r, abc.Sequence)
# True
type(r)
# range
issubclass(range, abc.Sequence)
# True
range 对象实现了 一般 序列的所有操作,但拼接和重复除外(这是由于 range 对象只能表示符合严格模式的序列,而重复和拼接通常都会违反这样的模式)。
r = range(0, 20, 2)
r
# range(0, 20, 2)
list(r)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
len(r)
# 10
max(r)
# 18
sum(r)
# 90
iter(r)
# <range_iterator at 0x7f9b3a7ad4a0>
11 in r
# False
10 in r
# True
r.index(10)
# 5
r[5]
# 10
r[:5]
# range(0, 10, 2)
r[-1]
# 18
不支持拼接和重复:
r + [1,2]
# TypeError: unsupported operand type(s) for +: 'range' and 'list'
r + r
# TypeError: unsupported operand type(s) for +: 'range' and 'range'
r*3
# TypeError: unsupported operand type(s) for *: 'range' and 'int'
使用 == 和 != 检测 range 对象是否相等是将其作为序列来比较。 也就是说,如果两个 range 对象表示相同的值序列就认为它们是相等的。 (请注意比较结果相等的两个 range 对象可能会具有不同的 start, stop 和 step 属性,例如 range(0) == range(2, 1, 3) 而 range(0, 3, 2) == range(0, 4, 2)。)
主要有:
range 对象的步长只能为整型,但实际需求中可能需要浮点型,可以考虑 numpy.linspace,或者参考 纯 Python 实现的支持浮点的惰性序列。
更新时间:2022-02-20 13:41:50 标签:python range