嵌套与可变循环 ——父与子的编程之旅 学习笔记(9)2018-0
第十一章 嵌套与可变循环
我们在之前的猜数字以及其他程序中,都可以发现:循环中可以放入其他代码块(不一定是循环,只要是能实现功能的代码块都可以),这种“一环套一环”的循环,我们称它为嵌套循环(nested loop)。

11.1 嵌套循环
之前我们写过自动打印乘法表的代码,要想一次打印三个乘法表,需要运行三次:

现在我们想要一次性打印三个乘法表,只需要将原来的循环(打印一个表),嵌套到一个外循环中(重复运行3次)。这样,一次就可以打印三次:


11.2 可变循环
在谈“可变”之前,我们先看看“不变”:
不变的数,也就是固定的数。在python中,我们将固定不变的数叫做“常数”。
同样的,一个程序被限定运行的次数,这样的循环,我们称之为“硬编码的(hard-coded)”,因为代码被定义了,并且永远不会改变——这是不会变通的代码。
有时候,我们需要代码自己会变通。这可能是需要用户定义循环次数,或是在游戏中,根据用户的行为,代码自己判断需要循环多少次。
下面是一个简单的,使用可变循环画星星的程序:


11.3 可变嵌套循环
现在我们试试将“嵌套”和“可变”加起来理解:其实它就是一个嵌套循环,其中一个或多个循环,使用了range函数等变量。
下面是其中一个可变嵌套循环的例子:
(1)请求用户输入行数,以30行为例;
(2)请求用户输入每行的星星数,以5为例;
(3)外循环:打印行数(在这里重复30次)
(4)内循环:打印星星数(在这里重复5次)


另外,我们还可以有更多重的循环,以下面的三重循环为例:


11.4 更多的可变嵌套循环
下面是画星星的更复杂的版本:


有时候,打印出循环变量会对我们有帮助(例如帮助我们调试程序):


11.5 使用嵌套循环
嵌套循环一个很重要的应用,是帮我们找出所有可能的排列和组合。
例如:赛百味有售热狗,我想知道所有热狗、小面包、芥末酱和番茄酱的搭配,一共有多少种可能。
我们可以有很多种方法解决问题,一种比较好的方法是画决策树(decision tree),感兴趣的可以在这里详细了解;现在,我们可以在程序中,将决策树表达出来。为了方便编写程序,我们使用0代表“有”,1代表“没有”。
以下是一个五层的嵌套循环:
(1)热狗循环(外循环):运行两次(因为只有0,1两种选项)。
(2)对热狗循环的每一次迭代,小面包循环都运行2次,因此一共运行2*2=4次。
(3)对小面包循环的每一次迭代,番茄酱循环都运行2次,因此一共运行2*2*2=8次…
以此类推,最内层循环(洋葱循环)一共运行了2的5次方,也就是32次。
另外,下面我们用了“\t”这个制表符,让程序显得更美观。


当然,这个程序有些运行结果显得没意义,但换一种目的,却会是非常有实际价值。
卡路里计算器
现在,我们将每部分食物附上卡路里值:
需要注意的是,加上卡路里这一个变量,并不只是打几个字那么简单:
(1)红色圈,注意将卡路里加上表头;
(2)蓝色圈,onion并不是最后一个变量,所以需要加上逗号,连接后面的卡路里;
(3)最后注意将卡路里print出来。


学到的东西
(1)嵌套循环
(2)可变循环
(3)排列、组合
(4)决策树
练习
(1)使用可变循环修改第八章的倒计时程序:
(2)在第一题基础上,打出对应的星号:
小结
这章也是比较难,继续在以后的练习中掌握吧!