8.3 一条捷径—— range()

在上面的例子中,我们只循环了 5 次:

  1. for looper in [1, 2, 3, 4, 5]:

如果希望循环运行 100 次或者 1000 次呢?这就得键入很多很多的数!

{%}

很幸运,这里有一条捷径。利用 range() 函数,你可以只输入起始值和结束值,它就会为你创建这二者之间的所有值。range() 会创建一个列表,其中包含某个范围内的数。

代码清单 8-4 仍然使用我们在乘法表中用到的例子,不过这里使用了 range() 函数。

代码清单 8-4 使用 range() 的循环

  1. for looper in range (1, 5):
  2. print looper, "times 8 =", looper * 8

把这个程序保存为 Loop4.py 并运行(可以使用 Run(运行) > Run Module(运行模块)菜单,或者按下快捷键 F5)。你会看到这样的结果:

  1. >>> ================= RESTART =================
  2. >>>
  3. 1 times 8 = 8
  4. 2 times 8 = 16
  5. 3 times 8 = 24
  6. 4 times 8 = 32

基本上与第一个结果完全相同……不过少了最后一次循环!为什么呢?

答案在于,range (1, 5) 给出的列表是 [1, 2, 3, 4]。你可以在交互模式中试试看:

  1. >>> print range(1, 5)
  2. [1, 2, 3, 4]

为什么没有 5 呢?

嗯,这正是 range() 函数的做法。它会提供一个数字列表,从给定的第一个数开始,在给定的最后一个数之前结束。必须考虑到这一点,调整范围来得到想要的循环次数。

{%}

Range

如果你在 Python 3 中这样做,结果会有点不一样:

  1. >>> print(range(1, 5))
  2. range(1,5)

这是因为在 Python 3 中 range() 函数不会提供一个数字列表,而是会提供一个“可迭代”(iterable)的东西,你可以使用循环来遍历它。(前文的“术语箱”中提到过的。)

如果在 for 循环中使用 range(),则其工作方式是完全一样的,只是内部机制略有不同而已。

代码清单 8-5 给出了修改后的程序,它会给出 8 的乘法表(从 1 到 10)。

代码清单 8-5 使用 range() 打印 8 的乘法表(从 1 到 10)

  1. for looper in range(1, 11):
  2. print looper, "times 8 =", looper * 8

运行这个程序时会得到下面的结果:

  1. >>> ================== RESTART ==================
  2. >>>
  3. 1 times 8 = 8
  4. 2 times 8 = 16
  5. 3 times 8 = 24
  6. 4 times 8 = 32
  7. 5 times 8 = 40
  8. 6 times 8 = 48
  9. 7 times 8 = 56
  10. 8 times 8 = 64
  11. 9 times 8 = 72
  12. 10 times 8 = 80

在代码清单 8-5 的程序中,range(1, 11) 给出从 1 到 10 的一个数字列表,对于列表中的每一个数会完成一次循环迭代。每次循环时,变量 looper 就取列表中的下一个值。

顺便说一句,我们把循环变量叫做 looper,不过也可以取你喜欢的任何名字。