习题 33: While 循环 ************************ 接下来是一个更在你意料之外的概念: ``while-loop``(while 循环)。``while-loop`` 会一直执行它下面的代码片段,直到它对应的布尔表达式为 ``False`` 时才会停下来。 等等,你还能跟得上这些术语吧?如果你的某一行是以 ``:`` (冒号, colon)结尾,\ 那就意味着接下来的内容是一个新的代码片段,新的代码片段是需要被缩进的。只有将\ 代码用这样的方式格式化,Python 才能知道你的目的。如果你不太明白这一点,就回去\ 看看“if 语句”和“函数”的章节,直到你明白为止。 接下来的练习将训练你的大脑去阅读这些结构化的代码。这和我们将布尔表达式烧录\ 到你的大脑中的过程有点类似。 回到 while 循环,它所作的和 if 语句类似,也是去检查一个布尔表达式的真假,不\ 一样的是它下面的代码片段不是只被执行一次,而是执行完后再调回到 ``while`` 所在\ 的位置,如此重复进行,直到 while 表达式为 ``False`` 为止。 While 循环有一个问题,那就是有时它会永不结束。如果你的目的是循环到宇宙毁灭为止,\ 那这样也挺好的,不过其他的情况下你的循环总需要有一个结束点。 为了避免这样的问题,你需要遵循下面的规定: 1. 尽量少用 ``while-loop``\,大部分时候 for-loop 是更好的选择。 2. 重复检查你的 while 语句,确定你测试的布尔表达式最终会变成 ``False`` 。 3. 如果不确定,就在 ``while-loop`` 的结尾打印出你要测试的值。看看它的变化。 在这节练习中,你将通过上面的三样事情学会 ``while-loop`` : .. literalinclude:: ex/ex33.py :linenos: 你应该看到的结果 =================== .. literalinclude:: ex/ex33.txt :language: console 加分习题 ============ 1. 将这个 while 循环改成一个函数,将测试条件(``i < 6``)中的 ``6`` 换成一个变量。 2. 使用这个函数重写你的脚本,并用不同的数字进行测试。 3. 为函数添加另外一个参数,这个参数用来定义第 8 行的加值 ``+ 1`` ,这样你就可以\ 让它任意加值了。 4. 再使用该函数重写一遍这个脚本。看看效果如何。 5. 接下来使用 ``for-loop`` 和 ``range`` 把这个脚本再写一遍。你还需要中间的加值操作吗?\ 如果你不去掉它,会有什么样的结果? 很有可能你会碰到程序跑着停不下来了,这时你只要按着 ``CTRL`` 再敲 ``c`` (CTRL-c),\ 这样程序就会中断下来了。 常见问题回答 ========================== ``for-loop`` 和 ``while-loop`` 有何不同? ``for-loop`` 只能对一些东西的集合进行循环, ``while-loop`` 可以对任何对象进行驯化。然而,\ ``while-loop`` 比起来更难弄对,而一般的任务用 ``for-loop`` 更容易一些。 循环好难理解啊,我该怎样理解? 觉得循环不好理解,很大程度上是因为不会顺着代码的运行方式去理解代码。当循环开始时,它会运行\ 整个区块,区块结束后回到开始的循环语句。如果想把整个过程视觉化,你可以在循环的各处塞入 print 语句,用来追踪变量的变化过程。你可以在循环之前、循环的第一句、循环中间、以及循环结尾\ 都放一些 print 语句,研究最后的输出,并试着理解循环的工作过程。