[TOC]
### 课前准确:
* 在`Windows`系统里安装`python`,参考 [安装python](https://www.kancloud.cn/k12edu/k_12/785427#Windowspython_4)
*****
### 本节课参考书目
* `Teach Your Kids to Code.pdf` 第四章:有趣的循环
*****
### 用笨方法画画
例如我们画一个花瓣。
![](https://box.kancloud.cn/7ce310c2fb27b1ddd67984589e0b5c64_645x486.png)
笨方法如下:
```
>>> import turtle # 第1句:导入 turtle 画图工具
>>> t = turtle.Pen() # 第2句:打开一个画图板
>>> t.circle(100) # 第3句:画一个半径为 100 的圆圈
>>> t.left(90) # 第4句:将画笔转动90度
>>> t.circle(100) # 第5句:画一个半径为 100 的圆圈
>>> t.left(90) # 第6句:将画笔转动90度
>>> t.circle(100) # 第7句:画一个半径为 100 的圆圈
>>> t.left(90) # 第8句:将画笔转动90度
>>> t.circle(100) # 第9句:画一个半径为 100 的圆圈
>>> t.left(90) # 第10句:将画笔转动90度
```
这段代码中,反复出现的代码是:
```
>>> t.circle(100)
>>> t.left(90)
```
*****
### 使用“循环”画画
我们改一下上面的代码:
```
>>> import turtle
>>> t = turtle.Pen()
>>> for x in range(4):
t.circle(100)
t.left(90)
```
通过引入“循环”把代码量从10句减少至5句,这是很可观的进步。
解释一下“循环”代码的结构:
1. ` for x in range(4):` ,对于所有的`循环` 而言,这句都是类似的。
2. `range(4)` 表示一段数字范围,从 0 开始,连续 4 个数字,就是 0 , 1, 2,3 。这里表示我们想反复执行某些代码的数次,想执行 4次,就写`range(4)` ,如果想执行 7次,就写`range(7)` 。
3. 剩下的两句代码`t.circle(100)` 和`t.left(90)` ,是我们希望计算机反复执行的部分。
*****
### 引入变量简化“循环”
我们改下程序,再增加两个花瓣:
```
>>> for x in range(6):
t.circle(100)
t.left(60)
```
这里有两个地方发生了变化,一个是`range(4)` 变成了`range(6)` , 另一个是`t.left(90)` 变成了`t.left(60)` 。变成 `range(6)` 是因为,我们要画6个花瓣。 变成 `t.left(60)` 是因为,原先 4个花瓣的时候,花瓣之间的夹角是90度,6个花瓣的时候,花瓣之间的夹角是60度。
我们可以在程序中加一个变量`number_of_circles`,告诉计算机我们想画几个花瓣,这样就不用每次修改“循环”里的`range(.)` 和`t.left(.)` 。
```
import turtle
t = turtle.Pen()
number_of_circles = int(turtle.numinput("画圈圈","你想画几个圆圈",6))
for x in range(number_of_circles):
t.circle(100)
t.left(360/number_of_circles)
```
我们可以让这段代码更复杂一些:
```
import turtle
t = turtle.Pen()
turtle.bgcolor("black")
number_of_circles = int(turtle.numinput("画圈圈","你想画几个圆圈",6))
for x in range(number_of_circles):
t.pencolor("red")
t.circle(100)
t.pencolor("yellow")
t.circle(50)
t.left(360/number_of_circles)
```
*****
### 在“循环”中加入控制
有时候,我们希望在“循环”的外边再加上一些控制语句,这些控制语句的格式是:
```
while 条件:
要执行的代码
```
例如,我们希望计算机做这样一些事情:
1. 告诉计算机一个名字;
2. 计算机把这个名字打印 100次;
3. 重复步骤1~2;
4. 如果计算机没有再收到新的名字,就自动退出程序。
```
# 告诉计算机一个名字
name = input("What is your name? ")
# 一直打印名字,直到触发某个条件退出
while name != "":
# 打印名字100次
for x in range(100):
print(name, end = " ")
print()
# 输入一个新的名字, 或者按 [ENTER] 退出
name = input("输入另外一个名字,或者按 [ENTER] 退出: ")
print("Bye!")
```
*****
### 引入空列表变量和增加变量元素
我们可以通过`while 条件:` 来控制列表变量的内容。下面这段代码中,分别定义了一个空列表变量`family` 和一个名字变量 `name` ,并通过控制条件`while name != "":` 和`family.append(name)` 调整`family` 的内容。
```
family = []
name = turtle.textinput("我爱我家","输入一个名字,或者按[Enter]键结束:")
while name != "":
family.append(name)
print(family)
name = turtle.textinput("ok!","请输入另外一个名字: ")
```
*****
### 一个更完整的例子
```
import turtle
t = turtle.Pen()
turtle.bgcolor("black")
colors = ["red","yellow","blue","green","orange","purple","white","brown","gray","pink"]
family = []
name = turtle.textinput("我爱我家","输入一个名字,或者按[Enter]键结束:")
while name != "":
family.append(name)
name = turtle.textinput("我爱我家","输入一个名字,或者按[Enter]键结束:")
for x in range(100):
t.pencolor(colors[x%len(family)])
t.penup()
t.forward(x*4)
t.pendown()
t.write(family[x%len(family)],font = ( "Arial",int((x+4)/4),"bold"))
t.left(360/len(family)+2)
```
*****
### 课程小结
1. 创建一个可以反复执行某些代码的“循环”
2. `range(.)` 在“循环”中代表次数
3. `while 条件:` 可以用来控制程序
4. 创建一个列表变量,用 `append(.)` 增加变量中的元素