[TOC]
### 課前準確:
* 在`Windows`系統里安裝`python`,參考 [安裝python](http://www.hmoore.net/k12edu/k_12/785427#Windowspython_4)
*****
### 本節課參考書目
* `Teach Your Kids to Code.pdf` 第四章:有趣的循環
*****
### 用笨方法畫畫
例如我們畫一個花瓣。

笨方法如下:
```
>>> 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(.)` 增加變量中的元素