本文讨论Python下的数值列表 - range(x,y,z)函数的应用,并分析其计数过程。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

1. range(x)、range(x,y)

1
2
3
4
5
6
7
print("output of range(5):")
for i in range(5):
print(i)

print("output of range(2,5):")
for x in range(2,5):
print(x)

执行结果:

1
2
3
4
5
6
7
8
9
10
output of range(5):
0
1
2
3
4
output of range(2,5):
2
3
4
range(x,y)
- range(x,y)函数从x开始计数,到y-1停止,不含y,产生一个整数集合;
- 可以看到,range(2,5)产生了数值列表[2,3,4](4即5-1);
- range(x)是range(0,x)的简写形式,range(5)等效于range(0,5)。

range(x,y)在解释器内部并不是一个严格意义上的列表,而是一个称为range的不常用的数据类型。如下述代码所示:

1
2
3
4
5
#rangelist2.py
x = range(5)
print(x[2])
print(x)
print(type(x))

执行结果:

1
2
3
2
range(0, 5)
<class 'range'>

如果真的需要把range转换成列表,可以通过类型转换实现:

1
2
3
4
#range2list.py
x = range(5)
x = list(x)
print(type(x),x)

执行结果:

1
<class 'list'> [0, 1, 2, 3, 4]

2. range(x,y,z)

更复杂的range形式:

1
2
3
#fours.py
fours = list(range(0,17,4))
print(fours)

执行结果:

1
[0, 4, 8, 12, 16]
range(x,y,z)
- 可以看出,range(0,17,4)从0开始计数,每计数1次,计数值加4,直到计数值>=17为止。但需要注意,仅那些小于17的计数值会被输出;
- range(x,y)等价于range(x,y,1);
- range(x)等价于range(0,x,1)。

3 理解range计数过程

读者或许对range(x,y,z)的输出结果感到疑惑,看看下面这个流程图。

1561206038979

现以range(0,17,4)为例,依上述流程图说明输出集合为什么是[0,4,8,12,16]。首先,计数取值x=0,然后开始循环:

1
2
3
4
5
6
7
8
9
10
11
- 0 < 17,输出0;
- 计数 = 0 + 4 = 4;
- 4 < 17,输出4;
- 计数 = 4 + 4 = 8;
- 8 < 17, 输出8;
- 计数 = 8 + 4 = 12;
- 12 < 17, 输出12;
- 计数 = 12 + 4 = 16;
- 16 < 17, 输出16;
- 16 + 4 = 20;
- 20 < 17不满足,循环结束。

如果你有C/C++经验,下述代码更容易描述range(x,y,z)的计数过程,事实上,Python的解释器就是用C/C++编写的。

1
2
3
for (int i=x;i<y;i+=z){
output(i);
}

上述range(x,y,z),如果z<0,相应流程图如下:

1561206094622

作者试了试如下代码:

1
2
numbers = list(range(9,2,-2))
print(numbers)

执行结果:

1
[9, 7, 5, 3]

该你了,请依上述流程图,人肉执行range(9,2,-2)的计数过程,验证上述输出。

如果你有C/C++经验,下面的代码能更容易地解释z小于0时range(9,2,-2)的计数过程:

1
2
3
for (int i=x;i>y;i+=z){
output(i);
}

本文内容节选自作者编著的《Python编程基础及应用》(高等教育出版社)一书。

Python编程基础及应用

免费随书B站MOOC: