在Python中,可以使用range()
函数来获得一个索引序列来循环一个可迭代的数据。你经常将range()
与for
循环结合使用。
在本教程中,你将学习使用range()
函数的不同方法 - 明确的开始和停止索引,自定义步长和负步长。
让我们开始吧。
了解 Python 的range()
函数
在研究使用range()
函数的不同方法之前,你必须了解它是如何工作的:
range()
函数返回一个范围对象。
当你迭代时,这个范围对象又返回序列中的连续项目
如上所述,range函数并不返回一个索引列表。相反,它返回一个范围对象,在你需要的时候返回指数。这使得它的内存效率也很高。
你可以用下面的一般语法来使用range()
函数:
range(start,stop,step)
当你把这个语法和一个循环结合起来使用时,你可以得到一个从start
到但不包括stop
的指数序列,步长为step
。
- 你必须指定所需的参数
stop
,它可以是任何正整数。如果你指定一个浮点数来代替,你会遇到一个TypeError
,如图所示:
my_range = range(2.5)
- 如果你不指定
start
,就会使用默认的起始索引0
。 - 如果你不指定
step
,就会使用默认的步骤大小1
。
在随后的章节中,你将了解到使用range()
函数的不同方法。
如何使用Python的range()
函数来循环任何迭代器
正如上一节所提到的,你只需要一个正整数就可以使用range()
函数。语法如下所示:
range(stop)
你可以使用上面这行代码,从0
到stop-1
得到一个序列:0
,1
,2
,3
, ...,stop-1
。
▶考虑下面的例子,你以5为参数调用range()
。然后你使用for
循环通过返回的范围对象,以获得预期的索引0,1,2,3,4:
for index in range(5):
print(index)
#Output
0
1
2
3
4
如果你还记得,Python 中所有的迭代对象都遵循零索引。这就是为什么使用range()
循环遍历可迭代对象很方便。
一个长度为len
的迭代表有0
,1
,2
, ...,len-1
作为有效索引。因此,要遍历任何迭代表,你需要做的就是把stop
的值设置为等于len
。你将得到的序列 -0
,1
,2
, ...,len-1
- 是有效指数的序列。
▶让我们举一个更有用的例子。你有一个列表my_list
。你可以通过知道它们的索引来访问列表中的所有项目,你可以使用range()
得到这些索引,如下所示:
my_list = ["Python","C","C++","JavaScript","Julia","Rust","Go"]
for index in range(len(my_list)):
print(f"At index {index}, we have {my_list[index]}")
记住,你可以使用 Python 的内置函数len
来获得任何可迭代的长度。在上面的代码中,你既使用了有效的索引,又使用了这些有效索引的列表项。这里是输出结果。
请注意my_list
是7个项目的长度,而获得的索引是从0到6,正如预期的那样。
有时,你可能需要使用负整数来代替。在这种情况下,如果你只使用stop
参数,你将不会得到期望的输出,尽管代码没有抛出错误。
这是因为默认的start
值被假定为0
,而你不能从0
向上数到-5
:
for index in range(-5):
print (index)
#Output
#NOTHING HERE
如何使用Python的range()
函数,并有明确的开始和结束索引
你可能不总是想从零开始。你可以通过将start
的值设置为你想开始的索引,从任何任意的索引开始。语法如下:
range(start,stop)
在这种情况下,你就可以得到这个序列。start
,start + 1
,start + 2
, 以此类推,直到stop-1
。
▶在下面的例子中,你从10开始,一直数到但不包括15,步数为1:
for index in range(10,15):
print(index)
#Output
10
11
12
13
14
在上一节中,你看到当你需要负整数时,只使用stop
参数是不行的。然而,当你明确指定start
和stop
指数时,你也可以用负整数工作。
在这个例子中,你想从-5开始向上计数,步长为1。请记住,计数会在比stop
索引少1的值上停止:
for index in range(-5,0):
print(index)
#Output
-5
-4
-3
-2
-1
如何使用Python的range()
函数****和** 自定义步骤大小
有时,你可能想跨过一个可迭代的东西,访问每一个k
-th 元素,而不是按顺序遍历它。这时可选的step
参数就派上用场了。一般的语法如下所示:
range(start,stop,step)
当你使用这种语法并循环通过范围对象时,你可以用大小为step
的跨度从start
到stop-1
。
- 你会得到这样的序列。
start
,start + step
,start + 2*step
, 以此类推,直到start + k*step
,这样start + k*step
<stop
和start + (k+1)*step
>stop
。
在下面的例子中,你想以2为单位从0到20。注意最后打印出来的索引是19。这是因为,如果你再走一步,你就会到21,这比20大。
永远记住,你得到的最后一个值可以尽可能地接近stop
,但绝对不能是stop
for index in range(1,20,2):
print(index)
#Output
1
3
5
7
9
11
13
15
17
19
如何使用Python的range()
函数, 并使用负的步长
到目前为止,你已经学会了用start
和stop
指数以及一个特定的步长来使用range()
函数,同时从start
向上数到stop
。
如果你需要从一个整数开始倒数,你可以为step
指定一个负值。一般的语法是:
range(start,stop,<negative_step>)
- 现在可以使用范围对象来返回一个序列,该序列从
start
开始向下计数,步长为negative_step
,直到但不包括stop
。 - 返回的序列是
start
,start - negative_step
,start - 2*negative_step
, 以此类推,直到start - k*negative_step
,这样start - k*negative_step
>stop
和start - (k+1)*negative_step
<stop
。 - 负数的步长没有默认值--你必须设置
negative_step = -1
,使其涵盖每个数字的倒计时。
在这个例子中,你想从20开始倒数,步数为-2,所以序列是20、18、16,一直倒数到2。如果你再往下走2步,你就会碰到0,因为它比停止值1小:
for index in range(20,1,-2):
print(index)
#Output
20
18
16
14
12
10
8
6
4
2
很容易看出,start
>stop
,才能够倒数:
for index in range(10,20,-1):
print(index)
#Ouput
#Nothing is printed - the sequence is empty.
▶在上面的例子中,你尝试从10倒数到20,这是不可能的。而且你没有得到任何预期的输出。
如何使用Python的range()
和reversed()
函数来反转一个序列?
如果你需要以相反的顺序访问一个可迭代的元素,你可以使用range()
函数和reversed()
函数。
Python 内置的
reversed()
函数在给定序列的值上返回一个反向迭代器。
▶让我们来看看我们的第一个例子,我们使用了range(5)
。在下面的例子中,我们在range对象上调用reversed()
。我们看到,我们从4倒数到0。
for index in reversed(range(5)):
print (index)
#Output
4
3
2
1
0
正如你所看到的,这等同于使用range(4,-1,-1)
。如果你愿意,你可以使用reversed()
,而不是上一节中讨论的negative_step
参数。
总结
在本教程中,你已经学会了使用range()
函数的不同方法。你可以尝试几个例子,每次都能得到不同的序列。这种练习将帮助你在循环遍历迭代表时有效地使用range()
。
编码愉快!直到下一个教程。