Python range()函数--有代码实例的解释

544 阅读6分钟

在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)

image-24

  • 如果你不指定start ,就会使用默认的起始索引0
  • 如果你不指定step ,就会使用默认的步骤大小1

在随后的章节中,你将了解到使用range() 函数的不同方法。

如何使用Python的range() 函数来循环任何迭代器

正如上一节所提到的,你只需要一个正整数就可以使用range() 函数。语法如下所示:

range(stop)

你可以使用上面这行代码,从0stop-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 来获得任何可迭代的长度。在上面的代码中,你既使用了有效的索引,又使用了这些有效索引的列表项。这里是输出结果。

image-25

请注意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 参数是不行的。然而,当你明确指定startstop 指数时,你也可以用负整数工作。

在这个例子中,你想从-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 的跨度从startstop-1

  • 你会得到这样的序列。start,start + step,start + 2*step, 以此类推,直到start + k*step ,这样start + k*step <stopstart + (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() 函数, 并使用负的步长

到目前为止,你已经学会了用startstop 指数以及一个特定的步长来使用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 >stopstart - (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()

编码愉快!直到下一个教程。