4.3. range() 函数

如果你确实需要遍历一个数字序列,内置函数 range() 会派上用场。它生成算术级数:

  1. >>> for i in range(5):
  2. ... print(i)
  3. ...
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4

给定的终止数值并不在要生成的序列里;range(10) 会生成10个值,并且是以合法的索引生成一个长度为10的序列。range也可以以另一个数字开头,或者以指定的幅度增加(甚至是负数;有时这也被叫做 ‘步进’)

  1. range(5, 10)
  2. 5, 6, 7, 8, 9
  3. range(0, 10, 3)
  4. 0, 3, 6, 9
  5. range(-10, -100, -30)
  6. -10, -40, -70

要以序列的索引来迭代,您可以将 range()len() 组合如下:

  1. >>> a = ['Mary', 'had', 'a', 'little', 'lamb']
  2. >>> for i in range(len(a)):
  3. ... print(i, a[i])
  4. ...
  5. 0 Mary
  6. 1 had
  7. 2 a
  8. 3 little
  9. 4 lamb

然而,在大多数这类情况下,使用 enumerate() 函数比较方便,请参见 循环的技巧

如果你只打印 range,会出现奇怪的结果:

  1. >>> print(range(10))
  2. range(0, 10)

range() 所返回的对象在许多方面表现得像一个列表,但实际上却并不是。此对象会在你迭代它时基于所希望的序列返回连续的项,但它没有真正生成列表,这样就能节省空间。

我们称这样对象为 iterable,也就是说,适合作为这样的目标对象:函数和结构期望从中获取连续的项直到所提供的项全部耗尽。 我们已经看到 for 语句就是这样一种结构,而接受可迭代对象的函数的一个例子是 sum():

  1. >>> sum(range(4)) # 0 + 1 + 2 + 3
  2. 6

稍后我们将看到更多返回可迭代对象以及将可迭代对象作为参数的函数。 最后,也许你会很好奇如何从一个指定范围内获取一个列表。 以下是解决方案:

  1. >>> list(range(4))
  2. [0, 1, 2, 3]

数据结构 章节中,我们将讨论 list() 的更多细节。